Skip to content

Commit 239d454

Browse files
Tables in any order with fk declarations postponed
1 parent 433663e commit 239d454

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+505
-317
lines changed

dist/quick-sql.js

+222-212
Large diffs are not rendered by default.

dist/quick-sql.umd.cjs

+49-47
Large diffs are not rendered by default.

src/ddl.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export const quicksql = (function () {
3636
overridesettings: {label: 'Ignore toDDL() second parameter', value:'no',check:['yes','no']},
3737
prefix: {label: 'Object Prefix', value:'' },
3838
//ondelete: {label: 'On Delete', value:'Cascade',check:['restrict','cascade','set null']},
39-
pk: { label: 'Primary Key Maintenance', value: identityDataType, check: [identityDataType, guid,'SEQ', 'NONE']},
39+
pk: { label: 'Primary Key Maintenance', value: guid, check: [identityDataType, guid,'SEQ', 'NONE']},
4040
prefixpkwithtname: {label:'Prefix primary keys with table name', value:'no',check:['yes','no']},
4141
rowkey: {label: 'Alphanumeric Row Identifier', value:'no',check:['yes','no']},
4242
rowversion: {label: 'Row Version Number', value:'no',check:['yes','no']},
@@ -74,6 +74,7 @@ export const quicksql = (function () {
7474
this.errors = null;
7575
this.options = JSON.parse(JSON.stringify(defaultOptions));
7676
this.input = fullInput;
77+
this.postponedAlters = [];
7778

7879
this.getOptionValue = function( kEy ) {
7980
const key = kEy.toLowerCase();
@@ -369,6 +370,10 @@ export const quicksql = (function () {
369370
output += this.forest[i].toDDL()+'\n';
370371
}
371372

373+
for ( let i = 0; i < this.postponedAlters.length; i++ ) {
374+
output += this.postponedAlters[i]+'\n';
375+
}
376+
372377
let j = 0;
373378
for( let i = 0; i < descendants.length; i++ ) {
374379
let trigger = descendants[i].generateTrigger();

src/json2qsql.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ var json2qsql = (function () {
142142
let output = tc.output(name+signature(obj), obj, 0);
143143

144144
//output += "\n\ndv "+name+"_dv "+name +"";
145-
output += '\n\n#settings = { genpk: false, drop: true }';
145+
output += '\n\n#settings = { genpk: false, drop: true, pk: identityDataType }';
146146

147147
output += '\n\n#flattened = \n';
148148
const tableContent = {};

src/tree.js

+26-19
Original file line numberDiff line numberDiff line change
@@ -741,27 +741,34 @@ let tree = (function(){
741741
}
742742
}
743743
pad = tab+' '.repeat(this.maxChildNameLen() - fk.length);
744-
ret += tab + fk + _id + pad + type + '\n';
745-
ret += tab + tab+' '.repeat(this.maxChildNameLen()) + 'constraint '+objName+'_'+fk+'_fk\n';
746-
let onDelete = '';
747-
if( this.isOption('cascade'))
748-
onDelete = ' on delete cascade';
749-
else if( this.isOption('setnull'))
750-
onDelete = ' on delete set null';
751-
let notNull = '';
752-
for( let c in this.children ) {
753-
let child = this.children[c];
754-
if( fk == child.parseName() ) {
755-
if( child.isOption('nn') || child.isOption('notnull') )
756-
notNull = ' NOT NULL'.toLowerCase();
757-
if( child.isOption('cascade') )
758-
onDelete = ' on delete cascade';
759-
else if( this.isOption('setnull'))
760-
onDelete = ' on delete set null';
761-
break;
744+
ret += tab + fk + _id + pad + type;
745+
if( refNode.line < this.line || refNode.isMany2One() ) {
746+
ret += tab + tab+' '.repeat(this.maxChildNameLen()) + 'constraint '+objName+'_'+fk+'_fk\n';
747+
let onDelete = '';
748+
if( this.isOption('cascade'))
749+
onDelete = ' on delete cascade';
750+
else if( this.isOption('setnull'))
751+
onDelete = ' on delete set null';
752+
let notNull = '';
753+
for( let c in this.children ) {
754+
let child = this.children[c];
755+
if( fk == child.parseName() ) {
756+
if( child.isOption('nn') || child.isOption('notnull') )
757+
notNull = ' NOT NULL'.toLowerCase();
758+
if( child.isOption('cascade') )
759+
onDelete = ' on delete cascade';
760+
else if( this.isOption('setnull'))
761+
onDelete = ' on delete set null';
762+
break;
763+
}
762764
}
765+
ret += tab + tab+' '.repeat(this.maxChildNameLen()) + 'references '+ddl.objPrefix()+parent+onDelete+notNull+',\n';
766+
} else {
767+
ret += ',\n';
768+
const alter = 'alter table '+objName+' add constraint '+objName+'_'+fk+'_fk foreign key ('+fk+') references '+ddl.objPrefix()+parent+';\n'
769+
if( !ddl.postponedAlters.includes(alter) )
770+
ddl.postponedAlters.push(alter);
763771
}
764-
ret += tab + tab+' '.repeat(this.maxChildNameLen()) + 'references '+ddl.objPrefix()+parent+onDelete+notNull+',\n';
765772
}
766773

767774
if( ddl.optionEQvalue('rowkey',true) || this.isOption('rowkey') ) {

test/Bug35756025/2.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
create table bug35756025 (
2-
id number generated by default on null as identity
2+
id number default on null to_number(sys_guid(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
33
constraint bug35756025_id_pk primary key,
44
deptno number,
55
dname varchar2(14 char),

test/Bug35756025/3.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
create table bug35756025 (
2-
id number generated by default on null as identity
2+
id number default on null to_number(sys_guid(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
33
constraint bug35756025_id_pk primary key,
44
deptno number not null,
55
dname varchar2(14 char),

test/Bug35756025/4.qsql

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
bug35756025
22
deptno num /nn /pk
33
dname vc14
4-
loc vc13
4+
loc vc13
5+
6+
#pk: identityDataType

test/JSON/car_racing/1.qsql

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ team /insert 1
77
name
88
points num
99

10-
#settings = { genpk: false, drop: true }
10+
#settings = { genpk: false, drop: true, pk: identityDataType }
1111

1212
#flattened =
1313
{

test/JSON/car_racing/2.qsql

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ driver /insert 2
1212
name
1313
finalPosition num
1414

15-
#settings = { genpk: false, drop: true }
15+
#settings = { genpk: false, drop: true, pk: identityDataType }
1616

1717
#flattened =
1818
{

test/JSON/donuts.qsql

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ donuts /insert 3
1212
id vc32 /pk
1313
type
1414

15-
#settings = { genpk: false, drop: true }
15+
#settings = { genpk: false, drop: true, pk: identityDataType }
1616

1717
#flattened =
1818
{

test/apex/department_employees.quicksql

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ departments /insert 2
1111

1212
emp_v = departments employees
1313

14-
# settings = { "prefix": null, "semantics": "CHAR", "DV": false }
14+
# settings = { "prefix": null, "semantics": "CHAR", "DV": false, pk: identityDataType }

test/apex/departments_employees_skills.quicksql

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ departments /insert 2
1212
proficiency num /check 1, 2, 3, 4, 5 [with 1 being a novice and 5 being a guru]
1313

1414
# "schema": null
15-
# "semantics": "char"
15+
# "semantics": "char"
16+
# pk: identityDataType
1617
--# DV : no

test/apex/empty_emp.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
dept
22
name
33

4-
emp
4+
emp
5+
6+
#pk: identityDataType

test/apex/forrestclinic.quicksql

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ doctor_procedures
3838
medical_procedure vc30
3939

4040
# settings = { "prefix": "FRC", "ondelete": "RESTRICT", "semantics": "CHAR",
41-
"auditcols": true, "language": "EN", "APEX": true }
41+
"auditcols": true, "language": "EN", "APEX": true, pk: identityDataType }

test/apex/medipay.quicksql

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,4 @@ lead_meetings
7474
notes vc4000
7575
confirmed vc1 /default N
7676

77-
# settings = { prefix: "MED", semantics: "CHAR", auditCols: true, rowVersion: true, language: "EN", APEX: true }
77+
# settings = { prefix: "MED", semantics: "CHAR", auditCols: true, rowVersion: true, language: "EN", APEX: true, pk: identityDataType }

test/apex/project_management.quicksql

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#apex: true, auditcols: true
2+
#pk: identityDataType
23
projects /insert 5
34
name /nn
45
owner

test/apex/timecard.quicksql

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ employees /insert 50 /api
1919

2020
view employee_timecards employees timecards
2121

22-
# settings = { semantics: "CHAR", API: true, rowVersion: true, drop: true, language: "EN", APEX: true, dv: false }
22+
# settings = { semantics: "CHAR", API: true, rowVersion: true, drop: true, language: "EN", APEX: true, dv: false, pk: identityDataType }

test/apex/to_dos.quicksql

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#apex: true, auditcols: true
2+
#pk: identityDataType
23
assignees /insert 10
34
full_name /nn
45
email

test/bugs/35.qsql

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ app_feature_items
55
feature_master_id number /fk feature_masters
66
name vc255 /nn
77

8-
#api:y
8+
#api:y
9+
#pk: identityDataType

test/bugs/35923103.qsql

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
BOOKS
22
NAME
33
AUTHOR
4-
AVAILABLE /NN /default Y
4+
AVAILABLE /NN /default Y
5+
6+
#pk: identityDataType

test/bugs/35950582.qsql

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ team_members
22
username
33
projects /insert 2
44
name
5-
project_lead /nn /references team_members /cascade
5+
project_lead /nn /references team_members /cascade
6+
7+
#pk: identityDataType

test/bugs/Bug35063257.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ order_lines
1818

1919
line_fulfillments
2020
warehouse_id /fk warehouses
21-
line_id /cascade /fk order_lines
21+
line_id /cascade /fk order_lines
22+
23+
#pk: identityDataType

test/bugs/Bug35637603.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ dept /unique name, email /insert 0
44
state
55
emp /unique name, email
66
name
7-
email
7+
email
8+
9+
#pk: identityDataType

test/bugs/Bug35637611.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ departments /api
55
employees /api
66
name /nn vc50
77
email /lower
8-
cost center num
8+
cost center num
9+
10+
#pk: identityDataType

test/bugs/Bug35637614.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ customers /colprefix cust
22
name
33
email
44
phone1
5-
phone2
5+
phone2
6+
7+
#pk: identityDataType

test/bugs/Bug35637619.quicksql

+2
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ departments /insert 2
99
cost center num
1010
date hired
1111
job vc255
12+
13+
#pk: identityDataType

test/bugs/Bug35637622.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ departments /rest
66
name
77
email
88
job vc255
9-
hiredate
9+
hiredate
10+
11+
#pk: identityDataType

test/bugs/Bug35637632.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ departments /audit
66
name
77
email
88
job vc255
9-
hiredate
9+
hiredate
10+
11+
#pk: identityDataType

test/bugs/Bug35649666.quicksql

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ departments /insert 2
99
date hired
1010
job vc255
1111

12-
# settings = { semantics: "CHAR", language: "EN", prefixPKwithTname: true }
12+
# settings = { semantics: "CHAR", language: "EN", prefixPKwithTname: true }
13+
#pk: identityDataType

test/bugs/Bug35650535.quicksql

+1
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ departments /insert 2
1111
view emp_v departments employees
1212

1313
# settings = { semantics: "CHAR", DB: "23c", editionable: true, language: "EN", APEX: true }
14+
#pk: identityDataType

test/bugs/Bug35659128.quicksql

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ departments
88
job vc255
99
hiredate
1010

11-
# settings = { semantics: "CHAR", auditCols: true, language: "EN", APEX: true, DB:"12c" }
11+
# settings = { semantics: "CHAR", auditCols: true, language: "EN", APEX: true, DB:"12c" }
12+
#pk: identityDataType

test/bugs/Bug35665146.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
dept
22
name
3-
created_on
3+
created_on
4+
5+
#pk: identityDataType

test/bugs/Bug35669377.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ sales
1010
product_id
1111
customer_id
1212
promotion id
13-
channel id
13+
channel id
14+
15+
#pk: identityDataType

test/bugs/Bug35714343.quicksql

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ departments
22
dname
33
emp /cascade
44
department_id /fk departments
5-
ename
5+
ename
6+
7+
#pk: identityDataType

test/bugs/Bug35775070.qsql

+2
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ session_speakers
99
speaker_id num /fk speakers /nn /lower
1010
speaker_role_id num /fk speaker_role /nn
1111
sort_sequence num
12+
13+
#pk: identityDataType

test/bugs/Bug35901476.qsql

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ dept
22
name
33
emp
44
name
5-
other_table_id
5+
other_table_id
6+
7+
#pk: identityDataType

test/constraints.qsql

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ issues36_37 /check not (c1 = 'B' and c2 is null)
22
c1 /check (c1 in ('A','B','C'))
33
c2 /check 'A','B','C'
44
c3 /check A,B,C
5-
c4 /check (c4='A1' or c4 = 'A2')
5+
c4 /check (c4='A1' or c4 = 'A2')
6+
7+
#pk: identityDataType

0 commit comments

Comments
 (0)