Skip to content

Commit 645713b

Browse files
Merge pull request taozhi8833998#2019 from taozhi8833998/feat-create-type-pg
refactor: support create type range and columns in pg
2 parents 0f28057 + 8a74527 commit 645713b

3 files changed

Lines changed: 50 additions & 19 deletions

File tree

pegjs/postgresql.pegjs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -732,20 +732,36 @@ create_function_stmt
732732
}
733733
}
734734

735+
create_type_stmt_option
736+
= KW_AS __ r:(KW_ENUM / 'RANGE'i) __ LPAREN __ e:expr_list? __ RPAREN {
737+
e.parentheses = true
738+
return {
739+
as: 'as',
740+
resource: r.toLowerCase(),
741+
create_definitions: e,
742+
}
743+
}
744+
/ KW_AS __ LPAREN __ e:create_column_definition_list? __ RPAREN {
745+
return {
746+
as: 'as',
747+
create_definitions: e,
748+
}
749+
}
750+
735751
create_type_stmt
736-
= a:KW_CREATE __ k:'TYPE'i __ s:table_name __ as:KW_AS __ r:KW_ENUM __ LPAREN __ e:expr_list? __ RPAREN {
752+
= a:KW_CREATE __ k:'TYPE'i __ s:table_name __ e:create_type_stmt_option? {
737753
/*
738754
export type create_type_stmt_t = {
739755
type: 'create',
740756
keyword: 'type',
741757
name: { schema: string; name: string },
742758
as?: string,
743759
resource?: string,
744-
create_definitions?: any
760+
create_definitions?: expr_list | create_column_definition_list;
745761
}
746762
=> AstStatement<create_type_stmt_t>
747763
*/
748-
e.parentheses = true
764+
749765
customTypes.add([s.db, s.table].filter(v => v).join('.'))
750766
return {
751767
tableList: Array.from(tableList),
@@ -754,25 +770,11 @@ create_type_stmt
754770
type: a[0].toLowerCase(),
755771
keyword: k.toLowerCase(),
756772
name: { schema: s.db, name: s.table },
757-
as: as && as[0] && as[0].toLowerCase(),
758-
resource: r.toLowerCase(),
759-
create_definitions: e,
773+
...e,
760774
}
761775
}
762776
}
763-
/ a:KW_CREATE __ k:'TYPE'i __ s:table_name {
764-
// => AstStatement<create_type_stmt_t>
765-
customTypes.add([s.db, s.table].filter(v => v).join('.'))
766-
return {
767-
tableList: Array.from(tableList),
768-
columnList: columnListTableAlias(columnList),
769-
ast: {
770-
type: a[0].toLowerCase(),
771-
keyword: k.toLowerCase(),
772-
name: { schema: s.db, name: s.table },
773-
}
774-
}
775-
}
777+
776778
create_domain_stmt
777779
= a:KW_CREATE __ k:'DOMAIN'i __ s:table_name __ as:KW_AS? __ d:data_type __ ce:collate_expr? __ de:default_expr? __ ccc: create_constraint_check? {
778780
/*
@@ -1303,6 +1305,12 @@ column_definition_opt_list
13031305
return opt
13041306
}
13051307

1308+
create_column_definition_list
1309+
= head:create_column_definition tail:(__ COMMA __ create_column_definition)* {
1310+
// => create_column_definition[]
1311+
return createList(head, tail)
1312+
}
1313+
13061314
create_column_definition
13071315
= c:column_ref __
13081316
d:data_type __

src/create.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,12 @@ function createTypeToSQL(stmt) {
298298
const definitionSQL = []
299299
switch (resource) {
300300
case 'enum':
301+
case 'range':
301302
definitionSQL.push(exprToSQL(createDefinition))
302303
break
304+
default:
305+
definitionSQL.push(`(${createDefinition.map(createDefinitionToSQL).join(', ')})`)
306+
break
303307
}
304308
sql.push(definitionSQL.filter(hasVal).join(' '))
305309
}

test/postgres.spec.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,25 @@ describe('Postgres', () => {
15691569
`SELECT id, collection::JSONB ?| ARRAY['val1','val2'] FROM "instances"`
15701570
]
15711571
},
1572+
{
1573+
title: 'create type',
1574+
sql: [
1575+
`CREATE TYPE address AS (
1576+
street VARCHAR(255),
1577+
city VARCHAR(100),
1578+
state VARCHAR(100),
1579+
zip_code VARCHAR(10)
1580+
);`,
1581+
'CREATE TYPE "address" AS (street VARCHAR(255), city VARCHAR(100), state VARCHAR(100), zip_code VARCHAR(10))'
1582+
]
1583+
},
1584+
{
1585+
title: 'create type as range',
1586+
sql: [
1587+
'CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);',
1588+
'CREATE TYPE "float8_range" AS RANGE (subtype = float8, subtype_diff = float8mi)'
1589+
]
1590+
},
15721591
]
15731592
function neatlyNestTestedSQL(sqlList){
15741593
sqlList.forEach(sqlInfo => {

0 commit comments

Comments
 (0)