Skip to content

Commit ba42f51

Browse files
committed
refactor: support more geometry type in pg
1 parent c4e4654 commit ba42f51

3 files changed

Lines changed: 18 additions & 5 deletions

File tree

pegjs/postgresql.pegjs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,7 +1721,7 @@ alter_schema_stmt
17211721

17221722
alter_table_stmt
17231723
= KW_ALTER __
1724-
KW_TABLE __
1724+
KW_TABLE? __
17251725
ife:if_exists? __
17261726
o:'only'i? __
17271727
t:table_ref_list __
@@ -6050,8 +6050,15 @@ enum_type
60506050
json_type
60516051
= t:(KW_JSON / KW_JSONB) { /* => data_type */ return { dataType: t }; }
60526052

6053+
geometry_type_args
6054+
= t:('POINT'i / 'LINESTRING'i / 'POLYGON'i / 'MULTIPOINT'i / 'MULTILINESTRING'i / 'MULTIPOLYGON'i / 'GEOMETRYCOLLECTION'i) __ srid:(COMMA __ [0-9]+)? {
6055+
return {
6056+
length: t,
6057+
scale: srid && srid[2] && parseInt(srid[2].join(''), 10)
6058+
}
6059+
}
60536060
geometry_type
6054-
= t:KW_GEOMETRY {/* => data_type */ return { dataType: t }; }
6061+
= t:KW_GEOMETRY geo:(__ LPAREN __ geometry_type_args __ RPAREN )? {/* => data_type */ return { dataType: t, ...(geo && geo[3] || {}), parentheses: geo ? true : false }; }
60556062

60566063
serial_interval_type
60576064
= t:(KW_SERIAL / KW_INTERVAL) { /* => data_type */ return { dataType: t }; }

src/column.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
commonOptionConnector,
1010
commonTypeValue,
1111
commentToSQL,
12+
dataTypeToSQL,
1213
getParserOpt,
1314
hasVal,
1415
identifierToSql,
@@ -65,9 +66,7 @@ function columnRefToSQL(expr) {
6566
function columnDataType(definition) {
6667
if (!definition) return
6768
const { dataType, length, suffix, scale, expr } = definition
68-
let result = dataType
69-
if (length != null) result += `(${[length, scale].filter(val => val != null).join(', ')})`
70-
if (suffix && suffix.length) result += ` ${suffix.join(' ')}`
69+
let result = dataTypeToSQL({ dataType, length, suffix, scale, parentheses: length != null ? true : false })
7170
if (expr) result += exprToSQL(expr)
7271
if (definition.array) {
7372
const arrayExpr = arrayDimensionToSymbol(definition)

test/postgres.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,13 @@ describe('Postgres', () => {
17611761
`SELECT gid, '2020-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE + MAKE_INTERVAL(secs => ((gid - (SELECT MIN(gid) FROM "nyct20"))::FLOAT / (SELECT MAX(gid) - MIN(gid) FROM "nyct20")) * 31536000) AS "generated_timestamp" FROM "nyct20"`
17621762
]
17631763
},
1764+
{
1765+
title: 'geometry type',
1766+
sql: [
1767+
'ALTER table my_table ADD COLUMN geom geometry(Point, 4326);',
1768+
'ALTER TABLE "my_table" ADD COLUMN geom GEOMETRY(Point, 4326)'
1769+
]
1770+
},
17641771
]
17651772
function neatlyNestTestedSQL(sqlList){
17661773
sqlList.forEach(sqlInfo => {

0 commit comments

Comments
 (0)