Skip to content

Commit eb078cf

Browse files
committed
Better support for getting create columns
Signed-off-by: worksofliam <[email protected]>
1 parent 7cc1671 commit eb078cf

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

src/language/sql/statement.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ export default class Statement {
302302

303303
for (const parameter of parameters) {
304304
// If the first token is the parm type, then the name follows
305+
if (tokenIs(parameter[0], `keyword`)) continue;
306+
305307
let nameIndex = tokenIs(parameter[0], `parmType`) ? 1 : 0;
306308
const name = parameter[nameIndex].value!;
307309
// Include parmType if it is provided

src/language/sql/tests/statements.test.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,96 @@ parserScenarios(`Object references`, ({newDoc}) => {
945945
expect(refs[1].object.schema).toBe(`LIB`);
946946
});
947947

948+
test('CREATE TABLE: routine parametes with primary key', () => {
949+
const content = [
950+
`-- Employee Master`,
951+
`-- Generated on: 11/03/21 14:32:20`,
952+
`CREATE OR REPLACE TABLE super_long_dept_name FOR SYSTEM NAME DEPT (`,
953+
`-- SQL150B 10 REUSEDLT(*NO) in table EMPMST in PAYROLL1 ignored.`,
954+
` COL_B CHAR(1) CCSID 37 NOT NULL DEFAULT '' ,`,
955+
` PRIMARY KEY( COL_B ) );`,
956+
].join(`\n`);
957+
958+
const document = newDoc(content);
959+
const groups = document.getStatementGroups();
960+
961+
expect(groups.length).toBe(1);
962+
const createStatement = groups[0].statements[0];
963+
964+
expect(createStatement.type).toBe(StatementType.Create);
965+
966+
const parms = createStatement.getRoutineParameters();
967+
expect(parms.length).toBe(1);
968+
expect(parms[0].alias).toBe(`COL_B`);
969+
});
970+
971+
test('CREATE TABLE: simple routine parametes test', () => {
972+
const content = [
973+
`CREATE TABLE ROSSITER.INVENTORY`,
974+
`(PARTNO SMALLINT NOT NULL,`,
975+
` DESCR VARCHAR(24),`,
976+
` QONHAND INT)`,
977+
].join(`\n`);
978+
979+
const document = newDoc(content);
980+
const groups = document.getStatementGroups();
981+
982+
expect(groups.length).toBe(1);
983+
const createStatement = groups[0].statements[0];
984+
985+
expect(createStatement.type).toBe(StatementType.Create);
986+
987+
const parms = createStatement.getRoutineParameters();
988+
expect(parms.length).toBe(3);
989+
990+
expect(parms[0].alias).toBe(`PARTNO`);
991+
expect(parms[0].createType).toBe(`SMALLINT NOT NULL`);
992+
993+
expect(parms[1].alias).toBe(`DESCR`);
994+
expect(parms[1].createType).toBe(`VARCHAR(24)`);
995+
996+
expect(parms[2].alias).toBe(`QONHAND`);
997+
expect(parms[2].createType).toBe(`INT`);
998+
});
999+
1000+
test('CREATE TABLE: generated types', () => {
1001+
const content = [
1002+
`CREATE TABLE policy_info`,
1003+
` (policy_id CHAR(10) NOT NULL,`,
1004+
` coverage INT NOT NULL,`,
1005+
` sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,`,
1006+
` sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,`,
1007+
` create_id TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID,`,
1008+
` PERIOD SYSTEM_TIME(sys_start,sys_end));`,
1009+
].join(`\n`);
1010+
1011+
const document = newDoc(content);
1012+
const groups = document.getStatementGroups();
1013+
1014+
expect(groups.length).toBe(1);
1015+
const createStatement = groups[0].statements[0];
1016+
1017+
expect(createStatement.type).toBe(StatementType.Create);
1018+
1019+
const parms = createStatement.getRoutineParameters();
1020+
expect(parms.length).toBe(5);
1021+
1022+
expect(parms[0].alias).toBe(`policy_id`);
1023+
expect(parms[0].createType).toBe(`CHAR(10) NOT NULL`);
1024+
1025+
expect(parms[1].alias).toBe(`coverage`);
1026+
expect(parms[1].createType).toBe(`INT NOT NULL`);
1027+
1028+
expect(parms[2].alias).toBe(`sys_start`);
1029+
expect(parms[2].createType).toBe(`TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN`);
1030+
1031+
expect(parms[3].alias).toBe(`sys_end`);
1032+
expect(parms[3].createType).toBe(`TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END`);
1033+
1034+
expect(parms[4].alias).toBe(`create_id`);
1035+
expect(parms[4].createType).toBe(`TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID`);
1036+
})
1037+
9481038
test(`DECLARE VARIABLE`, () => {
9491039
const document = newDoc(`declare watsonx_response Varchar(10000) CCSID 1208;`);
9501040
const groups = document.getStatementGroups();

src/language/sql/tokens.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export default class SQLTokeniser {
8282
{
8383
name: `KEYWORD`,
8484
match: [{ type: `word`, match: (value: string) => {
85-
return [`AS`, `FOR`, `OR`, `REPLACE`, `BEGIN`, `DO`, `THEN`, `LOOP`, `END`, `CURSOR`, `DEFAULT`, `HANDLER`, `REFERENCES`, `ON`, `UNIQUE`, `SPECIFIC`, `EXTERNAL`, `ELSE`].includes(value.toUpperCase());
85+
return [`AS`, `FOR`, `OR`, `REPLACE`, `BEGIN`, `DO`, `THEN`, `LOOP`, `END`, `CURSOR`, `DEFAULT`, `HANDLER`, `REFERENCES`, `ON`, `UNIQUE`, `PRIMARY`, `CONSTRAINT`, `SPECIFIC`, `PERIOD`, `EXTERNAL`, `ELSE`].includes(value.toUpperCase());
8686
} }],
8787
becomes: `keyword`,
8888
},

0 commit comments

Comments
 (0)