Skip to content

Commit 8cb7119

Browse files
committed
fix: primary key missing when have unique in sqlify
1 parent b465133 commit 8cb7119

13 files changed

Lines changed: 240 additions & 131 deletions

pegjs/bigquery.pegjs

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -989,33 +989,64 @@ create_definition
989989
/ create_index_definition
990990
/ create_fulltext_spatial_index_definition
991991

992+
column_definition_opt
993+
= n:(literal_not_null / literal_null) {
994+
if (n && !n.value) n.value = 'null'
995+
return { nullable: n }
996+
}
997+
/ d:default_expr {
998+
return { default_val: d }
999+
}
1000+
/ a:('AUTO_INCREMENT'i) {
1001+
return { auto_increment: a.toLowerCase() }
1002+
}
1003+
/ 'UNIQUE'i __ k:('KEY'i)? {
1004+
const sql = ['unique']
1005+
if (k) sql.push(k)
1006+
return { unique: sql.join(' ').toLowerCase('') }
1007+
}
1008+
/ p:('PRIMARY'i)? __ 'KEY'i {
1009+
const sql = []
1010+
if (p) sql.push('primary')
1011+
sql.push('key')
1012+
return { primary_key: sql.join(' ').toLowerCase('') }
1013+
}
1014+
/ co:keyword_comment {
1015+
return { comment: co }
1016+
}
1017+
/ ca:collate_expr {
1018+
return { collate: ca }
1019+
}
1020+
/ cf:column_format {
1021+
return { column_format: cf }
1022+
}
1023+
/ s:storage {
1024+
return { storage: s }
1025+
}
1026+
/ re:reference_definition {
1027+
return { reference_definition: re }
1028+
}
1029+
1030+
column_definition_opt_list
1031+
= head:column_definition_opt __ tail:(__ column_definition_opt)* {
1032+
let opt = head
1033+
for (let i = 0; i < tail.length; i++) {
1034+
opt = { ...opt, ...tail[i][1] }
1035+
}
1036+
return opt
1037+
}
1038+
9921039
create_column_definition
9931040
= c:column_ref __
9941041
d:data_type __
995-
n:(literal_not_null / literal_null)? __
996-
df:default_expr? __
997-
a:('AUTO_INCREMENT'i)? __
998-
u:(('UNIQUE'i / 'PRIMARY'i)? __ 'KEY'i)? __
999-
co:keyword_comment? __
1000-
ca:collate_expr? __
1001-
cf:column_format? __
1002-
s:storage? __
1003-
re:reference_definition? {
1042+
cdo:column_definition_opt_list? {
10041043
columnList.add(`create::${c.table}::${c.column}`)
10051044
if (n && !n.value) n.value = 'null'
10061045
return {
10071046
column: c,
10081047
definition: d,
1009-
nullable: n,
1010-
default_val: df,
1011-
auto_increment: a && a.toLowerCase(),
1012-
unique_or_primary: u && `${u[0].toLowerCase()} ${u[2].toLowerCase()}`,
1013-
comment: co,
1014-
collate: ca,
1015-
column_format: cf,
1016-
storage:s,
1017-
reference_definition: re,
1018-
resource: 'column'
1048+
resource: 'column',
1049+
...(cdo || {})
10191050
}
10201051
}
10211052

pegjs/db2.pegjs

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -371,33 +371,63 @@ create_definition
371371
/ create_index_definition
372372
/ create_fulltext_spatial_index_definition
373373

374+
column_definition_opt
375+
= n:(literal_not_null / literal_null) {
376+
if (n && !n.value) n.value = 'null'
377+
return { nullable: n }
378+
}
379+
/ d:default_expr {
380+
return { default_val: d }
381+
}
382+
/ a:('AUTO_INCREMENT'i) {
383+
return { auto_increment: a.toLowerCase() }
384+
}
385+
/ 'UNIQUE'i __ k:('KEY'i)? {
386+
const sql = ['unique']
387+
if (k) sql.push(k)
388+
return { unique: sql.join(' ').toLowerCase('') }
389+
}
390+
/ p:('PRIMARY'i)? __ 'KEY'i {
391+
const sql = []
392+
if (p) sql.push('primary')
393+
sql.push('key')
394+
return { primary_key: sql.join(' ').toLowerCase('') }
395+
}
396+
/ co:keyword_comment {
397+
return { comment: co }
398+
}
399+
/ ca:collate_expr {
400+
return { collate: ca }
401+
}
402+
/ cf:column_format {
403+
return { column_format: cf }
404+
}
405+
/ s:storage {
406+
return { storage: s }
407+
}
408+
/ re:reference_definition {
409+
return { reference_definition: re }
410+
}
411+
412+
column_definition_opt_list
413+
= head:column_definition_opt __ tail:(__ column_definition_opt)* {
414+
let opt = head
415+
for (let i = 0; i < tail.length; i++) {
416+
opt = { ...opt, ...tail[i][1] }
417+
}
418+
return opt
419+
}
420+
374421
create_column_definition
375422
= c:column_ref __
376423
d:data_type __
377-
n:(literal_not_null / literal_null)? __
378-
df:default_expr? __
379-
a:('AUTO_INCREMENT'i)? __
380-
u:(('UNIQUE'i / 'PRIMARY'i)? __ 'KEY'i)? __
381-
co:keyword_comment? __
382-
ca:collate_expr? __
383-
cf:column_format? __
384-
s:storage? __
385-
re:reference_definition? {
424+
cdo:column_definition_opt_list? {
386425
columnList.add(`create::${c.table}::${c.column}`)
387-
if (n && !n.value) n.value = 'null'
388426
return {
389427
column: c,
390428
definition: d,
391-
nullable: n,
392-
default_val: df,
393-
auto_increment: a && a.toLowerCase(),
394-
unique_or_primary: u && `${u[0].toLowerCase()} ${u[2].toLowerCase()}`,
395-
comment: co,
396-
collate: ca,
397-
column_format: cf,
398-
storage:s,
399-
reference_definition: re,
400-
resource: 'column'
429+
resource: 'column',
430+
...(cdo || {})
401431
}
402432
}
403433

pegjs/flinksql.pegjs

Lines changed: 50 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -825,67 +825,66 @@ create_definition
825825
/ create_fulltext_spatial_index_definition
826826
/ create_constraint_definition
827827

828+
column_definition_opt
829+
= n:(literal_not_null / literal_null) {
830+
if (n && !n.value) n.value = 'null'
831+
return { nullable: n }
832+
}
833+
/ d:default_expr {
834+
return { default_val: d }
835+
}
836+
/ a:('AUTO_INCREMENT'i) {
837+
return { auto_increment: a.toLowerCase() }
838+
}
839+
/ 'UNIQUE'i __ k:('KEY'i)? {
840+
const sql = ['unique']
841+
if (k) sql.push(k)
842+
return { unique: sql.join(' ').toLowerCase('') }
843+
}
844+
/ p:('PRIMARY'i)? __ 'KEY'i {
845+
const sql = []
846+
if (p) sql.push('primary')
847+
sql.push('key')
848+
return { primary_key: sql.join(' ').toLowerCase('') }
849+
}
850+
/ co:keyword_comment {
851+
return { comment: co }
852+
}
853+
/ ca:collate_expr {
854+
return { collate: ca }
855+
}
856+
/ cf:column_format {
857+
return { column_format: cf }
858+
}
859+
/ s:storage {
860+
return { storage: s }
861+
}
862+
/ re:reference_definition {
863+
return { reference_definition: re }
864+
}
865+
866+
column_definition_opt_list
867+
= head:column_definition_opt __ tail:(__ column_definition_opt)* {
868+
let opt = head
869+
for (let i = 0; i < tail.length; i++) {
870+
opt = { ...opt, ...tail[i][1] }
871+
}
872+
return opt
873+
}
874+
828875
create_column_definition
829876
= c:column_ref __
830877
d:data_type __
831-
clc:column_constraint? __
832-
a:('AUTO_INCREMENT'i)? __
833-
u:('UNIQUE'i / ('PRIMARY'i __ 'KEY'i))? __
834-
co:keyword_comment? __
835-
ca:collate_expr? __
836-
cf:column_format? __
837-
s:storage? __
838-
re:reference_definition? {
839-
/*
840-
=> {
841-
column: column_ref;
842-
definition: data_type;
843-
nullable: column_constraint['nullable'];
844-
default_val: column_constraint['default_val'];
845-
auto_increment?: 'auto_increment';
846-
unique_or_primary?: 'unique' | 'primary key';
847-
comment?: keyword_comment;
848-
collate?: collate_expr;
849-
column_format?: column_format;
850-
storage?: storage;
851-
reference_definition?: reference_definition;
852-
resource: 'column';
853-
}
854-
*/
878+
cdo:column_definition_opt_list? {
855879
columnList.add(`create::${c.table}::${c.column}`)
856880
return {
857881
column: c,
858882
definition: d,
859-
nullable: clc && clc.nullable,
860-
default_val: clc && clc.default_val,
861-
auto_increment: a && a.toLowerCase(),
862-
unique_or_primary: Array.isArray(u) ? `${u[0].toLowerCase()} ${u[2].toLowerCase()}` : u,
863-
comment: co,
864-
collate: ca,
865-
column_format: cf,
866-
storage:s,
867-
reference_definition: re,
868-
resource: 'column'
883+
resource: 'column',
884+
...(cdo || {})
869885
}
870886
}
871887

872-
column_constraint
873-
= n:(literal_not_null / literal_null) __ df:default_expr? {
874-
// => { nullable: literal_null | literal_not_null; default_val: default_expr; }
875-
if (n && !n.value) n.value = 'null'
876-
return {
877-
default_val: df,
878-
nullable: n
879-
}
880-
}
881-
/ df:default_expr __ n:(literal_not_null / literal_null)? {
882-
// => { nullable: literal_null | literal_not_null; default_val: default_expr; }
883-
if (n && !n.value) n.value = 'null'
884-
return {
885-
default_val: df,
886-
nullable: n
887-
}
888-
}
889888

890889
collate_expr
891890
= KW_COLLATE __ ca:ident {

pegjs/hive.pegjs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,10 +383,16 @@ column_definition_opt
383383
/ a:('AUTO_INCREMENT'i) {
384384
return { auto_increment: a.toLowerCase() }
385385
}
386-
/ u:(('UNIQUE'i __ ('KEY'i)?) / (('PRIMARY'i)? __ 'KEY'i)) {
387-
const unique_or_primary = []
388-
if (u) unique_or_primary.push(u[0], u[2])
389-
return { unique_or_primary: unique_or_primary.filter(v => v).join(' ').toLowerCase('') }
386+
/ 'UNIQUE'i __ k:('KEY'i)? {
387+
const sql = ['unique']
388+
if (k) sql.push(k)
389+
return { unique: sql.join(' ').toLowerCase('') }
390+
}
391+
/ p:('PRIMARY'i)? __ 'KEY'i {
392+
const sql = []
393+
if (p) sql.push('primary')
394+
sql.push('key')
395+
return { primary_key: sql.join(' ').toLowerCase('') }
390396
}
391397
/ co:keyword_comment {
392398
return { comment: co }

pegjs/mariadb.pegjs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -489,10 +489,16 @@ column_definition_opt
489489
/ a:('AUTO_INCREMENT'i) {
490490
return { auto_increment: a.toLowerCase() }
491491
}
492-
/ u:(('UNIQUE'i __ ('KEY'i)?) / (('PRIMARY'i)? __ 'KEY'i)) {
493-
const unique_or_primary = []
494-
if (u) unique_or_primary.push(u[0], u[2])
495-
return { unique_or_primary: unique_or_primary.filter(v => v).join(' ').toLowerCase('') }
492+
/ 'UNIQUE'i __ k:('KEY'i)? {
493+
const sql = ['unique']
494+
if (k) sql.push(k)
495+
return { unique: sql.join(' ').toLowerCase('') }
496+
}
497+
/ p:('PRIMARY'i)? __ 'KEY'i {
498+
const sql = []
499+
if (p) sql.push('primary')
500+
sql.push('key')
501+
return { primary_key: sql.join(' ').toLowerCase('') }
496502
}
497503
/ co:keyword_comment {
498504
return { comment: co }

pegjs/mysql.pegjs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -685,10 +685,16 @@ column_definition_opt
685685
/ a:('AUTO_INCREMENT'i) {
686686
return { auto_increment: a.toLowerCase() }
687687
}
688-
/ u:(('UNIQUE'i __ ('KEY'i)?) / (('PRIMARY'i)? __ 'KEY'i)) {
689-
const unique_or_primary = []
690-
if (u) unique_or_primary.push(u[0], u[2])
691-
return { unique_or_primary: unique_or_primary.filter(v => v).join(' ').toLowerCase('') }
688+
/ 'UNIQUE'i __ k:('KEY'i)? {
689+
const sql = ['unique']
690+
if (k) sql.push(k)
691+
return { unique: sql.join(' ').toLowerCase('') }
692+
}
693+
/ p:('PRIMARY'i)? __ 'KEY'i {
694+
const sql = []
695+
if (p) sql.push('primary')
696+
sql.push('key')
697+
return { primary_key: sql.join(' ').toLowerCase('') }
692698
}
693699
/ co:keyword_comment {
694700
return { comment: co }

pegjs/postgresql.pegjs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,11 +1111,18 @@ column_definition_opt
11111111
// => { auto_increment: 'auto_increment'; }
11121112
return { auto_increment: a.toLowerCase() }
11131113
}
1114-
/ u:(('UNIQUE'i __ ('KEY'i)?) / (('PRIMARY'i)? __ 'KEY'i)) {
1115-
// => { unique_or_primary: 'unique' | 'primary key'; }
1116-
const unique_or_primary = []
1117-
if (u) unique_or_primary.push(u[0], u[2])
1118-
return { unique_or_primary: unique_or_primary.filter(v => v).join(' ').toLowerCase('') }
1114+
/ 'UNIQUE'i __ k:('KEY'i)? {
1115+
// => { unique: 'unique' | 'unique key'; }
1116+
const sql = ['unique']
1117+
if (k) sql.push(k)
1118+
return { unique: sql.join(' ').toLowerCase('') }
1119+
}
1120+
/ p:('PRIMARY'i)? __ 'KEY'i {
1121+
// => { unique: 'key' | 'primary key'; }
1122+
const sql = []
1123+
if (p) sql.push('primary')
1124+
sql.push('key')
1125+
return { primary_key: sql.join(' ').toLowerCase('') }
11191126
}
11201127
/ co:keyword_comment {
11211128
// => { comment: keyword_comment; }
@@ -1149,7 +1156,8 @@ column_definition_opt_list
11491156
nullable?: column_constraint['nullable'];
11501157
default_val?: column_constraint['default_val'];
11511158
auto_increment?: 'auto_increment';
1152-
unique_or_primary?: 'unique' | 'primary key';
1159+
unique?: 'unique' | 'unique key';
1160+
primary?: 'key' | 'primary key';
11531161
comment?: keyword_comment;
11541162
collate?: collate_expr;
11551163
column_format?: column_format;
@@ -1175,7 +1183,8 @@ create_column_definition
11751183
nullable: column_constraint['nullable'];
11761184
default_val: column_constraint['default_val'];
11771185
auto_increment?: 'auto_increment';
1178-
unique_or_primary?: 'unique' | 'primary key';
1186+
unique?: 'unique' | 'unique key';
1187+
primary?: 'key' | 'primary key';
11791188
comment?: keyword_comment;
11801189
collate?: collate_expr;
11811190
column_format?: column_format;

0 commit comments

Comments
 (0)