diff --git a/package.json b/package.json index 76f3f24..4bcd790 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@oracle/quicksql", - "version": "1.1.0", + "version": "1.1.1", "description": "Quick SQL to DDL translator and GUI", "main": "src/index.js", "type": "module", diff --git a/src/tree.js b/src/tree.js index 6ad768e..0795bf3 100644 --- a/src/tree.js +++ b/src/tree.js @@ -1201,23 +1201,60 @@ let tree = (function(){ ret += 'insert into '+objName+' (\n'; let idColName = this.getGenIdColName(); if( idColName != null ) { - ret += tab + idColName +',\n'; + ret += tab + idColName +',\n'; + } else { + let pkNode = this.getExplicitPkNode(); + if( pkNode != null ) { + ret += tab + pkNode.parseName() +',\n'; + } } for( let fk in this.fks ) { - let parent = this.fks[fk]; - ret += tab+singular(parent)+'_id,\n'; + let parent = this.fks[fk]; + let refNode = ddl.find(parent); + let _id = ''; + if( refNode == null ) { + refNode = ddl.find(fk); + if( refNode.isMany2One() & !fk.endsWith('_id') ) { + parent = fk; + fk = singular(fk); + _id = '_id'; + } + } + ret += tab+fk+_id+',\n'; } for( let j = 0; j < this.children.length; j++ ) { - let child = this.children[j]; - if( 0 == child.children.length ) - ret += tab+child.parseName()+',\n'; + let child = this.children[j]; + if( idColName != null && child.parseName() == 'id' ) + continue; + if (child.refId() == null ) { + if( child == this.getExplicitPkNode() ) + continue; //ret += '--'; + if( 0 == child.children.length ) + ret += tab+child.parseName()+',\n'; + } } if( ret.lastIndexOf(',\n') == ret.length-2 ) ret = ret.substr(0,ret.length-2)+'\n'; + ret += ') values (\n'; - if( ddl.optionEQvalue('Auto Primary Key','yes') ) { - ret += tab + (i+1)+ ',\n'; + + if( idColName != null ) { + ret += tab + (i+1)+ ',\n'; + } else { + let pkNode = this.getExplicitPkNode(); + if( pkNode != null ) { + const field = pkNode.parseName(); + let tmp = getValue(ddl.data, null /*no name at level 0*/, field, this.parseName()); + let v = -1; + if( elem != null ) + v = elem[field]; + if( tmp != null && tmp[i] != null ) { + v = tmp[i]; + } + ret += tab + (v != null ? v : i+1)+ ',\n'; + } } + for( let fk in this.fks ) { let ref = this.fks[fk]; let refNode = ddl.find(ref); @@ -1246,23 +1283,29 @@ let tree = (function(){ } for( let j = 0; j < this.children.length; j++ ) { let child = this.children[j]; - if( 0 == child.children.length ) { - let values = child.parseValues(); - let cname = child.parseName(); - if( elem != null ) { - let v = elem[cname]; - if( v != null ) { + if( idColName != null && child.parseName() == 'id' ) + continue; + if (child.refId() == null ) { + if( child == this.getExplicitPkNode() ) + continue; //ret += '--'; + if( 0 == child.children.length ) { + let values = child.parseValues(); + let cname = child.parseName(); + if( elem != null ) { + let v = elem[cname]; + if( v != null ) { + values = []; + values[0] = v; + } + } + let tmp = getValue(ddl.data, null /*no name at level 0*/, cname, this.parseName()); + if( tmp != null && tmp[i] != null ) { values = []; - values[0] = v; - } - } - let tmp = getValue(ddl.data, null /*no name at level 0*/, cname, this.parseName()); - if( tmp != null && tmp[i] != null ) { - values = []; - values[0] = tmp[i]; + values[0] = tmp[i]; + } + let datum = sample(objName, cname, child.parseType(), values); + ret += tab + translate(ddl.getOptionValue('Data Language'), datum)+',\n'; } - let datum = sample(objName, cname, child.parseType(), values); - ret += tab + translate(ddl.getOptionValue('Data Language'), datum)+',\n'; } } if( ret.lastIndexOf(',\n') == ret.length-2 ) diff --git a/test/DV/car_racing/1.sql b/test/DV/car_racing/1.sql index 408ee63..967dff6 100644 --- a/test/DV/car_racing/1.sql +++ b/test/DV/car_racing/1.sql @@ -71,24 +71,24 @@ insert into team ( commit; insert into driver ( - team_id, driverid, + team_id, name, points ) values ( - 302, 103, + 302, 'Charles Leclerc', 192 ); insert into driver ( - team_id, driverid, + team_id, name, points ) values ( - 302, 104, + 302, 'Carlos Sainz Jr', 118 ); diff --git a/test/DV/car_racing/2.sql b/test/DV/car_racing/2.sql index 81d0c34..a3324b5 100644 --- a/test/DV/car_racing/2.sql +++ b/test/DV/car_racing/2.sql @@ -86,13 +86,13 @@ select JSON { -- load data insert into driver ( - teamInfo_id, driverId, + teamInfo_id, name, points ) values ( - 301, 101, + 301, 'Max Verstappen', 258 ); @@ -110,25 +110,25 @@ insert into teamInfo ( commit; insert into race ( + driverRaceMapId, raceInfo_id, driver_id, - driverRaceMapId, finalPosition ) values ( + 3, 201, 101, - 3, 19 ); insert into race ( + driverRaceMapId, raceInfo_id, driver_id, - driverRaceMapId, finalPosition ) values ( + 11, 202, 101, - 11, 1 ); diff --git a/test/bugs/35950582.qsql b/test/bugs/35950582.qsql new file mode 100644 index 0000000..4389009 --- /dev/null +++ b/test/bugs/35950582.qsql @@ -0,0 +1,5 @@ +team_members + username +projects /insert 2 + name + project_lead /nn /references team_members /cascade \ No newline at end of file diff --git a/test/bugs/35950582.sql b/test/bugs/35950582.sql new file mode 100644 index 0000000..7b60c24 --- /dev/null +++ b/test/bugs/35950582.sql @@ -0,0 +1,61 @@ +-- create tables +create table team_members ( + id number generated by default on null as identity + constraint team_members_id_pk primary key, + username varchar2(255 char) +) +; + +create table projects ( + id number generated by default on null as identity + constraint projects_id_pk primary key, + project_lead number + constraint projects_project_lead_fk + references team_members on delete cascade not null, + name varchar2(255 char) +) +; + +-- table index +create index projects_i1 on projects (project_lead); + +-- load data +-- load data + +insert into projects ( + id, + project_lead, + name +) values ( + 1, + 1, + 'Corporate Portal' +); + +insert into projects ( + id, + project_lead, + name +) values ( + 2, + 1, + 'System Burst Performance Review' +); + +commit; + +alter table projects +modify id generated always as identity restart start with 3; + + +-- Generated by Quick SQL Thursday October 26, 2023 21:59:23 + +/* +team_members + username +projects /insert 2 + name + project_lead /nn /references team_members + +# settings = { semantics: "CHAR", language: "EN", APEX: true } +*/ diff --git a/test/single_test.js b/test/single_test.js index 03a529f..9b54dc5 100644 --- a/test/single_test.js +++ b/test/single_test.js @@ -5,7 +5,7 @@ import json2qsql from "../src/json2qsql.js"; import fs from "fs"; try { - let file = '//erd/Bug35814250/4.qsql';//'DV/donuts.json'; + let file = '//DV/car_racing/2.qsql';//'DV/donuts.json'; let args = process.argv.slice(2); if( 0 < args.length ) file = args[0]; diff --git a/test/star/sales_product_customers.sql b/test/star/sales_product_customers.sql index 44e8aab..0796a1e 100644 --- a/test/star/sales_product_customers.sql +++ b/test/star/sales_product_customers.sql @@ -38,7 +38,7 @@ create table customers ( insert into sales ( id, product_id, - customer_id, + customers_id, quantity ) values ( 1, @@ -49,7 +49,7 @@ insert into sales ( insert into sales ( id, product_id, - customer_id, + customers_id, quantity ) values ( 2,