typesql-cli 0.15.0-experimental.4 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/code-generator.d.ts.map +1 -1
- package/code-generator.js +4 -2
- package/code-generator.js.map +1 -1
- package/code-generator2.d.ts.map +1 -1
- package/code-generator2.js +56 -29
- package/code-generator2.js.map +1 -1
- package/describe-query.d.ts.map +1 -1
- package/describe-query.js +8 -2
- package/describe-query.js.map +1 -1
- package/dialects/postgres.d.ts.map +1 -1
- package/dialects/postgres.js +40 -2
- package/dialects/postgres.js.map +1 -1
- package/drivers/postgres.d.ts.map +1 -1
- package/drivers/postgres.js +14 -4
- package/drivers/postgres.js.map +1 -1
- package/drivers/types.d.ts +1 -0
- package/drivers/types.d.ts.map +1 -1
- package/mysql-mapping.d.ts +1 -1
- package/mysql-mapping.d.ts.map +1 -1
- package/mysql-mapping.js.map +1 -1
- package/package.json +52 -52
- package/postgres-query-analyzer/describe.d.ts.map +1 -1
- package/postgres-query-analyzer/describe.js +10 -41
- package/postgres-query-analyzer/describe.js.map +1 -1
- package/postgres-query-analyzer/parser.d.ts +2 -0
- package/postgres-query-analyzer/parser.d.ts.map +1 -1
- package/postgres-query-analyzer/parser.js +12 -0
- package/postgres-query-analyzer/parser.js.map +1 -1
- package/postgres-query-analyzer/traverse.d.ts +2 -0
- package/postgres-query-analyzer/traverse.d.ts.map +1 -1
- package/postgres-query-analyzer/traverse.js +339 -69
- package/postgres-query-analyzer/traverse.js.map +1 -1
- package/sqlite-query-analyzer/code-generator.js +4 -2
- package/sqlite-query-analyzer/code-generator.js.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.js +31 -7
- package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
- package/sqlite-query-analyzer/traverse.d.ts +2 -2
- package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
- package/sqlite-query-analyzer/traverse.js +55 -21
- package/sqlite-query-analyzer/traverse.js.map +1 -1
- package/sqlite-query-analyzer/types.d.ts +1 -1
- package/sqlite-query-analyzer/types.d.ts.map +1 -1
- package/types.d.ts +1 -0
- package/types.d.ts.map +1 -1
@@ -7,7 +7,8 @@ const select_columns_1 = require("../mysql-query-analyzer/select-columns");
|
|
7
7
|
function traverseSmt(stmt, dbSchema) {
|
8
8
|
const traverseResult = {
|
9
9
|
columnsNullability: [],
|
10
|
-
|
10
|
+
parameters: [],
|
11
|
+
singleRow: false
|
11
12
|
};
|
12
13
|
const selectstmt = stmt.selectstmt();
|
13
14
|
if (selectstmt) {
|
@@ -45,12 +46,16 @@ function traverseSelectstmt(selectstmt, dbSchema, fromColumns, traverseResult) {
|
|
45
46
|
const result = collectContextsOfType(selectstmt, PostgreSQLParser_1.C_expr_exprContext).filter(c_expr => c_expr.PARAM());
|
46
47
|
const paramIsListResult = result.map(param => paramIsList(param));
|
47
48
|
const columns = traverse_selectstmt(selectstmt, dbSchema, fromColumns, traverseResult);
|
49
|
+
//select parameters are collected after from paramters
|
50
|
+
traverseResult.parameters.sort((param1, param2) => param1.paramIndex - param2.paramIndex);
|
48
51
|
const columnsNullability = columns.map(col => !col.is_nullable);
|
52
|
+
const multipleRowsResult = !isSingleRowResult(selectstmt, dbSchema);
|
49
53
|
const limit = checkLimit(selectstmt);
|
50
54
|
return {
|
51
55
|
queryType: 'Select',
|
56
|
+
multipleRowsResult,
|
52
57
|
columnsNullability,
|
53
|
-
parametersNullability: traverseResult.
|
58
|
+
parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
|
54
59
|
parameterList: paramIsListResult,
|
55
60
|
limit
|
56
61
|
};
|
@@ -112,6 +117,7 @@ function traverse_simple_select_intersect(simple_select_intersect, dbSchema, fro
|
|
112
117
|
return [];
|
113
118
|
}
|
114
119
|
function traverse_simple_select_pramary(simple_select_pramary, dbSchema, parentFromColumns, traverseResult) {
|
120
|
+
var _a;
|
115
121
|
const fromColumns = [];
|
116
122
|
const from_clause = simple_select_pramary.from_clause();
|
117
123
|
if (from_clause) {
|
@@ -125,6 +131,10 @@ function traverse_simple_select_pramary(simple_select_pramary, dbSchema, parentF
|
|
125
131
|
const valuesColumns = traverse_values_clause(values_clause, dbSchema, parentFromColumns, traverseResult);
|
126
132
|
return valuesColumns;
|
127
133
|
}
|
134
|
+
const where_a_expr = (_a = simple_select_pramary.where_clause()) === null || _a === void 0 ? void 0 : _a.a_expr();
|
135
|
+
if (where_a_expr) {
|
136
|
+
traverse_a_expr(where_a_expr, dbSchema, parentFromColumns.concat(fromColumns), traverseResult);
|
137
|
+
}
|
128
138
|
const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, dbSchema, parentFromColumns.concat(fromColumns), traverseResult);
|
129
139
|
return filteredColumns;
|
130
140
|
}
|
@@ -153,12 +163,16 @@ function filterColumns_simple_select_pramary(simple_select_pramary, dbSchema, fr
|
|
153
163
|
if (target_list_) {
|
154
164
|
const target_list = target_list_.target_list();
|
155
165
|
if (target_list) {
|
156
|
-
return
|
166
|
+
return traverse_target_list(target_list, dbSchema, fromColumns, traverseResult);
|
157
167
|
}
|
158
168
|
}
|
169
|
+
const target_list = simple_select_pramary.target_list();
|
170
|
+
if (target_list) {
|
171
|
+
return traverse_target_list(target_list, dbSchema, fromColumns, traverseResult);
|
172
|
+
}
|
159
173
|
return [];
|
160
174
|
}
|
161
|
-
function
|
175
|
+
function traverse_target_list(target_list, dbSchema, fromColumns, traverseResult) {
|
162
176
|
const columns = target_list.target_el_list().flatMap(target_el => {
|
163
177
|
const fieldName = (0, select_columns_1.splitName)(target_el.getText());
|
164
178
|
if (fieldName.name == '*') {
|
@@ -219,11 +233,11 @@ function traverse_expr_or(a_expr_or, dbSchema, fromColumns, traverseResult) {
|
|
219
233
|
throw Error('traverse_expr_or - Not expected:' + a_expr_or.getText());
|
220
234
|
}
|
221
235
|
function traverse_expr_and(a_expr_and, dbSchema, fromColumns, traverseResult) {
|
222
|
-
const
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
236
|
+
const result = a_expr_and.a_expr_between_list().map(a_expr_between => traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseResult));
|
237
|
+
return {
|
238
|
+
column_name: a_expr_and.getText(),
|
239
|
+
is_nullable: result.some(col => col.is_nullable)
|
240
|
+
};
|
227
241
|
}
|
228
242
|
function traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseResult) {
|
229
243
|
const a_expr_in = a_expr_between.a_expr_in_list()[0];
|
@@ -234,10 +248,31 @@ function traverse_expr_between(a_expr_between, dbSchema, fromColumns, traverseRe
|
|
234
248
|
}
|
235
249
|
function traverse_expr_in(a_expr_in, dbSchema, fromColumns, traverseResult) {
|
236
250
|
const a_expr_unary = a_expr_in.a_expr_unary_not();
|
251
|
+
let leftExprResult = undefined;
|
237
252
|
if (a_expr_unary) {
|
238
|
-
|
253
|
+
leftExprResult = traverse_expr_unary(a_expr_unary, dbSchema, fromColumns, traverseResult);
|
254
|
+
}
|
255
|
+
const in_expr = a_expr_in.in_expr();
|
256
|
+
if (in_expr) {
|
257
|
+
traverse_in_expr(in_expr, dbSchema, fromColumns, traverseResult);
|
258
|
+
}
|
259
|
+
return {
|
260
|
+
column_name: a_expr_in.getText(),
|
261
|
+
//id in (...) -> is_nullable: false
|
262
|
+
// value -> is_nullable = leftExprResult.is_nullable
|
263
|
+
is_nullable: in_expr != null ? false : leftExprResult.is_nullable
|
264
|
+
};
|
265
|
+
}
|
266
|
+
function traverse_in_expr(in_expr, dbSchema, fromColumns, traverseResult) {
|
267
|
+
if (in_expr instanceof PostgreSQLParser_1.In_expr_selectContext) {
|
268
|
+
const select_with_parens = in_expr.select_with_parens();
|
269
|
+
traverse_select_with_parens(select_with_parens, dbSchema, fromColumns, traverseResult);
|
270
|
+
}
|
271
|
+
if (in_expr instanceof PostgreSQLParser_1.In_expr_listContext) {
|
272
|
+
in_expr.expr_list().a_expr_list().forEach(a_expr => {
|
273
|
+
traverse_a_expr(a_expr, dbSchema, fromColumns, traverseResult);
|
274
|
+
});
|
239
275
|
}
|
240
|
-
throw Error('traverse_expr_in - Not expected:' + a_expr_in.getText());
|
241
276
|
}
|
242
277
|
function traverse_expr_unary(a_expr_unary, dbSchema, fromColumns, traverseResult) {
|
243
278
|
const a_expr_isnull = a_expr_unary.a_expr_isnull();
|
@@ -261,16 +296,24 @@ function traverse_expr_is_not(a_expr_is_not, dbSchema, fromColumns, traverseResu
|
|
261
296
|
throw Error('traverse_expr_is_not - Not expected:' + a_expr_is_not.getText());
|
262
297
|
}
|
263
298
|
function traverse_expr_compare(a_expr_compare, dbSchema, fromColumns, traverseResult) {
|
264
|
-
const
|
265
|
-
if (
|
266
|
-
|
299
|
+
const a_expr_like_list = a_expr_compare.a_expr_like_list();
|
300
|
+
if (a_expr_like_list) {
|
301
|
+
const result = a_expr_like_list.map(a_expr_like => traverse_expr_like(a_expr_like, dbSchema, fromColumns, traverseResult));
|
302
|
+
return {
|
303
|
+
column_name: a_expr_compare.getText(),
|
304
|
+
is_nullable: result.some(col => col.is_nullable)
|
305
|
+
};
|
267
306
|
}
|
268
307
|
throw Error('traverse_expr_compare - Not expected:' + a_expr_compare.getText());
|
269
308
|
}
|
270
309
|
function traverse_expr_like(a_expr_like, dbSchema, fromColumns, traverseResult) {
|
271
|
-
const
|
272
|
-
if (
|
273
|
-
|
310
|
+
const a_expr_qual_op_list = a_expr_like.a_expr_qual_op_list();
|
311
|
+
if (a_expr_qual_op_list) {
|
312
|
+
const result = a_expr_qual_op_list.map(a_expr_qual_op => traverse_expr_qual_op(a_expr_qual_op, dbSchema, fromColumns, traverseResult));
|
313
|
+
return {
|
314
|
+
column_name: a_expr_like.getText(),
|
315
|
+
is_nullable: result.some(col => col.is_nullable)
|
316
|
+
};
|
274
317
|
}
|
275
318
|
throw Error('traverse_expr_like - Not expected:' + a_expr_like.getText());
|
276
319
|
}
|
@@ -346,13 +389,17 @@ function traverse_expr_typecast(a_expr_typecast, dbSchema, fromColumns, traverse
|
|
346
389
|
}
|
347
390
|
throw Error('traverse_expr_typecast - Not expected:' + a_expr_typecast.getText());
|
348
391
|
}
|
392
|
+
function traverseColumnRef(columnref, fromColumns) {
|
393
|
+
const fieldName = (0, select_columns_1.splitName)(columnref.getText());
|
394
|
+
const col = findColumn(fieldName, fromColumns);
|
395
|
+
return col;
|
396
|
+
}
|
349
397
|
function traversec_expr(c_expr, dbSchema, fromColumns, traverseResult) {
|
350
398
|
var _a, _b;
|
351
399
|
if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
|
352
400
|
const columnref = c_expr.columnref();
|
353
401
|
if (columnref) {
|
354
|
-
const
|
355
|
-
const col = findColumn(fieldName, fromColumns);
|
402
|
+
const col = traverseColumnRef(columnref, fromColumns);
|
356
403
|
return col;
|
357
404
|
}
|
358
405
|
const aexprconst = c_expr.aexprconst();
|
@@ -364,7 +411,10 @@ function traversec_expr(c_expr, dbSchema, fromColumns, traverseResult) {
|
|
364
411
|
};
|
365
412
|
}
|
366
413
|
if (c_expr.PARAM()) {
|
367
|
-
traverseResult.
|
414
|
+
traverseResult.parameters.push({
|
415
|
+
paramIndex: c_expr.start.start,
|
416
|
+
isNotNull: true
|
417
|
+
});
|
368
418
|
return {
|
369
419
|
column_name: c_expr.PARAM().getText(),
|
370
420
|
is_nullable: false
|
@@ -471,7 +521,7 @@ function traversefunc_expr_common_subexpr(func_expr_common_subexpr, dbSchema, fr
|
|
471
521
|
const result = func_arg_list.map(func_arg_expr => {
|
472
522
|
const paramResult = traverse_a_expr(func_arg_expr, dbSchema, fromColumns, traverseResult);
|
473
523
|
if (isParameter(paramResult.column_name)) {
|
474
|
-
traverseResult.
|
524
|
+
traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = false;
|
475
525
|
paramResult.is_nullable = true;
|
476
526
|
}
|
477
527
|
return paramResult;
|
@@ -519,11 +569,11 @@ function traverse_table_ref(table_ref, dbSchema, fromColumns, traverseResult) {
|
|
519
569
|
const allColumns = [];
|
520
570
|
const relation_expr = table_ref.relation_expr();
|
521
571
|
const aliasClause = table_ref.alias_clause();
|
522
|
-
const alias = aliasClause ? aliasClause.getText() : undefined;
|
572
|
+
const alias = aliasClause ? aliasClause.colid().getText() : undefined;
|
523
573
|
if (relation_expr) {
|
524
574
|
const tableName = traverse_relation_expr(relation_expr, dbSchema);
|
525
|
-
const tableNameWithAlias = alias ? alias : tableName;
|
526
|
-
const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName).map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
|
575
|
+
const tableNameWithAlias = alias ? alias : tableName.name;
|
576
|
+
const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName.name).map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
|
527
577
|
allColumns.push(...fromColumnsResult);
|
528
578
|
}
|
529
579
|
const table_ref_list = table_ref.table_ref_list();
|
@@ -572,11 +622,19 @@ function traverse_relation_expr(relation_expr, dbSchema) {
|
|
572
622
|
return name;
|
573
623
|
}
|
574
624
|
function traverse_qualified_name(qualified_name, dbSchema) {
|
575
|
-
|
576
|
-
|
577
|
-
|
625
|
+
var _a, _b;
|
626
|
+
const colid_name = qualified_name.colid() ? traverse_colid(qualified_name.colid(), dbSchema) : '';
|
627
|
+
const indirection_el_list = (_a = qualified_name.indirection()) === null || _a === void 0 ? void 0 : _a.indirection_el_list();
|
628
|
+
if (indirection_el_list && indirection_el_list.length === 1) {
|
629
|
+
return {
|
630
|
+
name: ((_b = indirection_el_list[0].attr_name()) === null || _b === void 0 ? void 0 : _b.getText()) || '',
|
631
|
+
alias: colid_name
|
632
|
+
};
|
578
633
|
}
|
579
|
-
return
|
634
|
+
return {
|
635
|
+
name: colid_name,
|
636
|
+
alias: ''
|
637
|
+
};
|
580
638
|
}
|
581
639
|
function traverse_colid(colid, dbSchema) {
|
582
640
|
const identifier = colid.identifier();
|
@@ -626,6 +684,11 @@ function paramIsList(c_expr) {
|
|
626
684
|
return in_expr_list instanceof PostgreSQLParser_1.In_expr_listContext;
|
627
685
|
}
|
628
686
|
function traverseInsertstmt(insertstmt, dbSchema) {
|
687
|
+
const traverseResult = {
|
688
|
+
columnsNullability: [],
|
689
|
+
parameters: [],
|
690
|
+
singleRow: false
|
691
|
+
};
|
629
692
|
const insert_target = insertstmt.insert_target();
|
630
693
|
const tableName = insert_target.getText();
|
631
694
|
const insertColumns = dbSchema.filter(col => col.table_name === tableName);
|
@@ -634,47 +697,64 @@ function traverseInsertstmt(insertstmt, dbSchema) {
|
|
634
697
|
.insert_column_item_list()
|
635
698
|
.map(insert_column_item => traverse_insert_column_item(insert_column_item, insertColumns));
|
636
699
|
const selectstmt = insert_rest.selectstmt();
|
637
|
-
|
638
|
-
|
700
|
+
traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnsList, traverseResult);
|
701
|
+
const on_conflict = insertstmt.on_conflict_();
|
702
|
+
if (on_conflict) {
|
703
|
+
const set_clause_list = on_conflict.set_clause_list().set_clause_list() || [];
|
704
|
+
set_clause_list.forEach(set_clause => traverse_set_clause(set_clause, dbSchema, insertColumns, traverseResult));
|
705
|
+
}
|
706
|
+
const returning_clause = insertstmt.returning_clause();
|
707
|
+
const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), dbSchema, insertColumns, traverseResult) : [];
|
708
|
+
const result = {
|
639
709
|
queryType: 'Insert',
|
640
|
-
|
641
|
-
|
710
|
+
multipleRowsResult: false,
|
711
|
+
parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
|
712
|
+
columnsNullability: returninColumns.map(col => !col.is_nullable),
|
642
713
|
parameterList: []
|
643
714
|
};
|
715
|
+
if (returning_clause) {
|
716
|
+
result.returning = true;
|
717
|
+
}
|
718
|
+
return result;
|
644
719
|
}
|
645
|
-
function traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnlist) {
|
646
|
-
var _a, _b, _c, _d;
|
720
|
+
function traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnlist, traverseResult) {
|
721
|
+
var _a, _b, _c, _d, _e;
|
647
722
|
const simple_select = (_c = (_b = (_a = selectstmt.select_no_parens()) === null || _a === void 0 ? void 0 : _a.select_clause()) === null || _b === void 0 ? void 0 : _b.simple_select_intersect_list()) === null || _c === void 0 ? void 0 : _c[0];
|
648
723
|
if (simple_select) {
|
649
724
|
const simple_select_pramary = (_d = simple_select === null || simple_select === void 0 ? void 0 : simple_select.simple_select_pramary_list()) === null || _d === void 0 ? void 0 : _d[0];
|
650
725
|
if (simple_select_pramary) {
|
651
|
-
|
652
|
-
|
726
|
+
const values_clause = simple_select_pramary.values_clause();
|
727
|
+
if (values_clause) {
|
728
|
+
values_clause.expr_list_list()
|
729
|
+
.forEach(expr_list => traverse_insert_a_expr_list(expr_list, dbSchema, insertColumnlist, traverseResult));
|
730
|
+
}
|
731
|
+
const target_list = (_e = simple_select_pramary.target_list_()) === null || _e === void 0 ? void 0 : _e.target_list();
|
732
|
+
if (target_list) {
|
733
|
+
const from_clause = simple_select_pramary.from_clause();
|
734
|
+
const fromColumns = from_clause ? traverse_from_clause(from_clause, dbSchema, [], traverseResult) : [];
|
735
|
+
target_list.target_el_list().forEach((target_el, index) => {
|
736
|
+
const targetResult = isNotNull_target_el(target_el, dbSchema, fromColumns, traverseResult);
|
737
|
+
if (isParameter(targetResult.column_name)) {
|
738
|
+
traverseResult.parameters.at(-1).isNotNull = !insertColumnlist[index].is_nullable;
|
739
|
+
}
|
740
|
+
});
|
741
|
+
}
|
653
742
|
}
|
654
743
|
}
|
655
|
-
return [];
|
656
744
|
}
|
657
|
-
function traverse_insert_a_expr_list(expr_list, dbSchema, insertColumns) {
|
658
|
-
const parametersNullability = [];
|
745
|
+
function traverse_insert_a_expr_list(expr_list, dbSchema, insertColumns, traverseResult) {
|
659
746
|
expr_list.a_expr_list().forEach((a_expr, index) => {
|
660
|
-
const traverseResult = {
|
661
|
-
columnsNullability: [],
|
662
|
-
parametersNullability: []
|
663
|
-
};
|
664
747
|
const result = traverse_a_expr(a_expr, dbSchema, insertColumns, traverseResult);
|
665
748
|
if (isParameter(result.column_name)) {
|
666
|
-
|
667
|
-
}
|
668
|
-
else {
|
669
|
-
parametersNullability.push(...traverseResult.parametersNullability);
|
749
|
+
traverseResult.parameters.at(-1).isNotNull = !insertColumns[index].is_nullable;
|
670
750
|
}
|
671
751
|
});
|
672
|
-
return parametersNullability;
|
673
752
|
}
|
674
753
|
function traverseDeletestmt(deleteStmt, dbSchema, traverseResult) {
|
675
754
|
return {
|
676
755
|
queryType: 'Delete',
|
677
|
-
|
756
|
+
multipleRowsResult: false,
|
757
|
+
parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
|
678
758
|
columnsNullability: [],
|
679
759
|
parameterList: []
|
680
760
|
};
|
@@ -684,20 +764,21 @@ function traverseUpdatestmt(updatestmt, dbSchema, traverseResult) {
|
|
684
764
|
const tableName = relation_expr_opt_alias.getText();
|
685
765
|
const updateColumns = dbSchema.filter(col => col.table_name === tableName);
|
686
766
|
updatestmt.set_clause_list().set_clause_list()
|
687
|
-
.
|
688
|
-
const
|
767
|
+
.forEach(set_clause => traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult));
|
768
|
+
const parametersBefore = traverseResult.parameters.length;
|
689
769
|
const where_clause = updatestmt.where_or_current_clause();
|
690
770
|
if (where_clause) {
|
691
771
|
const a_expr = where_clause.a_expr();
|
692
772
|
traverse_a_expr(a_expr, dbSchema, updateColumns, traverseResult);
|
693
773
|
}
|
694
|
-
const whereParameters = traverseResult.
|
774
|
+
const whereParameters = traverseResult.parameters.slice(parametersBefore);
|
695
775
|
return {
|
696
776
|
queryType: 'Update',
|
697
|
-
|
777
|
+
multipleRowsResult: false,
|
778
|
+
parametersNullability: traverseResult.parameters.slice(0, parametersBefore).map(param => param.isNotNull),
|
698
779
|
columnsNullability: [],
|
699
780
|
parameterList: [],
|
700
|
-
whereParamtersNullability: whereParameters
|
781
|
+
whereParamtersNullability: whereParameters.map(param => param.isNotNull)
|
701
782
|
};
|
702
783
|
}
|
703
784
|
function traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult) {
|
@@ -705,11 +786,11 @@ function traverse_set_clause(set_clause, dbSchema, updateColumns, traverseResult
|
|
705
786
|
const columnName = (0, select_columns_1.splitName)(set_target.getText());
|
706
787
|
const column = findColumn(columnName, updateColumns);
|
707
788
|
const a_expr = set_clause.a_expr();
|
708
|
-
const
|
789
|
+
const excludedColumns = updateColumns.map((col) => (Object.assign(Object.assign({}, col), { table_name: 'excluded' })));
|
790
|
+
const a_exprResult = traverse_a_expr(a_expr, dbSchema, updateColumns.concat(excludedColumns), traverseResult);
|
709
791
|
if (isParameter(a_exprResult.column_name)) {
|
710
|
-
traverseResult.
|
792
|
+
traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = !column.is_nullable;
|
711
793
|
}
|
712
|
-
return !column.is_nullable;
|
713
794
|
}
|
714
795
|
function traverse_insert_column_item(insert_column_item, dbSchema) {
|
715
796
|
const colid = insert_column_item.colid();
|
@@ -905,20 +986,10 @@ function isNotNull_c_expr(c_expr, field) {
|
|
905
986
|
}
|
906
987
|
return false;
|
907
988
|
}
|
908
|
-
function checkLimit(selectstmt) {
|
909
|
-
const select_no_parens = selectstmt.select_no_parens();
|
910
|
-
if (select_no_parens) {
|
911
|
-
return checkLimit_select_no_parens(select_no_parens);
|
912
|
-
}
|
913
|
-
const select_with_parens = selectstmt.select_with_parens();
|
914
|
-
if (select_with_parens) {
|
915
|
-
return checkLimit_select_with_parens(select_with_parens);
|
916
|
-
}
|
917
|
-
return undefined;
|
918
|
-
}
|
919
989
|
function checkLimit_select_no_parens(select_no_parens) {
|
920
990
|
var _a, _b, _c;
|
921
|
-
|
991
|
+
const limitText = (_c = (_b = (_a = select_no_parens.select_limit()) === null || _a === void 0 ? void 0 : _a.limit_clause()) === null || _b === void 0 ? void 0 : _b.select_limit_value()) === null || _c === void 0 ? void 0 : _c.getText();
|
992
|
+
return limitText ? +limitText : undefined;
|
922
993
|
}
|
923
994
|
function checkLimit_select_with_parens(select_with_parens) {
|
924
995
|
return checkLimit(select_with_parens);
|
@@ -928,4 +999,203 @@ function isParameter(str) {
|
|
928
999
|
const paramPattern = /^\$[0-9]+(::[a-zA-Z_][a-zA-Z0-9_]*)?$/;
|
929
1000
|
return paramPattern.test(str);
|
930
1001
|
}
|
1002
|
+
function isSingleRowResult(selectstmt, dbSchema) {
|
1003
|
+
var _a;
|
1004
|
+
const limit = checkLimit(selectstmt);
|
1005
|
+
if (limit === 1) {
|
1006
|
+
return true;
|
1007
|
+
}
|
1008
|
+
const select_no_parens = selectstmt.select_no_parens();
|
1009
|
+
const simple_select_pramary_list = (_a = select_no_parens.select_clause()
|
1010
|
+
.simple_select_intersect_list()) === null || _a === void 0 ? void 0 : _a[0].simple_select_pramary_list();
|
1011
|
+
if (simple_select_pramary_list.length > 1) {
|
1012
|
+
return false;
|
1013
|
+
}
|
1014
|
+
const simple_select_pramary = simple_select_pramary_list[0];
|
1015
|
+
const from_clause = simple_select_pramary.from_clause();
|
1016
|
+
if (!from_clause) {
|
1017
|
+
const hasSetReturningFunction = simple_select_pramary.target_list_().target_list().target_el_list().some(target_el => isSetReturningFunction_target_el(target_el));
|
1018
|
+
return !hasSetReturningFunction;
|
1019
|
+
}
|
1020
|
+
if (!simple_select_pramary.group_clause()) {
|
1021
|
+
const agreegateFunction = hasAggregateFunction(simple_select_pramary);
|
1022
|
+
if (agreegateFunction) {
|
1023
|
+
return true;
|
1024
|
+
}
|
1025
|
+
}
|
1026
|
+
const table_ref_list = from_clause.from_list().table_ref_list();
|
1027
|
+
if (table_ref_list.length > 1) {
|
1028
|
+
return false;
|
1029
|
+
}
|
1030
|
+
if (table_ref_list[0].JOIN_list().length > 0 || table_ref_list[0].select_with_parens() != null) {
|
1031
|
+
return false;
|
1032
|
+
}
|
1033
|
+
const tableName = getTableName(table_ref_list[0]);
|
1034
|
+
const uniqueKeys = dbSchema.filter(col => col.table_name.toLowerCase() === tableName.name.toLowerCase()
|
1035
|
+
&& (col.column_key === 'PRI' || col.column_key === 'UNI'))
|
1036
|
+
.map(col => col.column_name);
|
1037
|
+
const where_clause = simple_select_pramary.where_clause();
|
1038
|
+
if (where_clause) {
|
1039
|
+
return isSingleRowResult_where(where_clause.a_expr(), uniqueKeys);
|
1040
|
+
}
|
1041
|
+
return false;
|
1042
|
+
}
|
1043
|
+
function hasAggregateFunction(simple_select_pramary) {
|
1044
|
+
const target_list_ = simple_select_pramary.target_list_();
|
1045
|
+
if (target_list_) {
|
1046
|
+
return target_list_.target_list().target_el_list().some(target_el => isAggregateFunction_target_el(target_el));
|
1047
|
+
}
|
1048
|
+
const target_list = simple_select_pramary.target_list();
|
1049
|
+
return target_list.target_el_list().some(target_el => isAggregateFunction_target_el(target_el));
|
1050
|
+
}
|
1051
|
+
function getTableName(table_ref) {
|
1052
|
+
const relation_expr = table_ref.relation_expr();
|
1053
|
+
const tableName = relation_expr.qualified_name().getText();
|
1054
|
+
const aliasClause = table_ref.alias_clause();
|
1055
|
+
const tableAlias = aliasClause ? aliasClause.colid().getText() : '';
|
1056
|
+
return {
|
1057
|
+
name: tableName,
|
1058
|
+
alias: tableAlias
|
1059
|
+
};
|
1060
|
+
}
|
1061
|
+
function isAggregateFunction_target_el(target_el) {
|
1062
|
+
if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
|
1063
|
+
const c_expr_list = collectContextsOfType(target_el, PostgreSQLParser_1.Func_exprContext);
|
1064
|
+
const aggrFunction = c_expr_list.some(func_expr => isAggregateFunction_c_expr(func_expr));
|
1065
|
+
return aggrFunction;
|
1066
|
+
}
|
1067
|
+
return false;
|
1068
|
+
}
|
1069
|
+
// SELECT distinct '''' || p.proname || '''' || ',' as aggregate_function
|
1070
|
+
// FROM pg_catalog.pg_proc p
|
1071
|
+
// JOIN pg_catalog.pg_aggregate a ON a.aggfnoid = p.oid
|
1072
|
+
// ORDER BY aggregate_function;
|
1073
|
+
const aggregateFunctions = new Set([
|
1074
|
+
'array_agg',
|
1075
|
+
'avg',
|
1076
|
+
'bit_and',
|
1077
|
+
'bit_or',
|
1078
|
+
'bool_and',
|
1079
|
+
'bool_or',
|
1080
|
+
'corr',
|
1081
|
+
'count',
|
1082
|
+
'covar_pop',
|
1083
|
+
'covar_samp',
|
1084
|
+
'cume_dist',
|
1085
|
+
'dense_rank',
|
1086
|
+
'every',
|
1087
|
+
'json_agg',
|
1088
|
+
'json_object_agg',
|
1089
|
+
'jsonb_agg',
|
1090
|
+
'jsonb_object_agg',
|
1091
|
+
'max',
|
1092
|
+
'min',
|
1093
|
+
'mode',
|
1094
|
+
'percent_rank',
|
1095
|
+
'percentile_cont',
|
1096
|
+
'percentile_disc',
|
1097
|
+
'rank',
|
1098
|
+
'regr_avgx',
|
1099
|
+
'regr_avgy',
|
1100
|
+
'regr_count',
|
1101
|
+
'regr_intercept',
|
1102
|
+
'regr_r2',
|
1103
|
+
'regr_slope',
|
1104
|
+
'regr_sxx',
|
1105
|
+
'regr_sxy',
|
1106
|
+
'regr_syy',
|
1107
|
+
'stddev',
|
1108
|
+
'stddev_pop',
|
1109
|
+
'stddev_samp',
|
1110
|
+
'string_agg',
|
1111
|
+
'sum',
|
1112
|
+
'var_pop',
|
1113
|
+
'var_samp',
|
1114
|
+
'variance',
|
1115
|
+
'xmlagg'
|
1116
|
+
]);
|
1117
|
+
function isAggregateFunction_c_expr(func_expr) {
|
1118
|
+
var _a, _b, _c;
|
1119
|
+
const funcName = (_c = (_b = (_a = func_expr === null || func_expr === void 0 ? void 0 : func_expr.func_application()) === null || _a === void 0 ? void 0 : _a.func_name()) === null || _b === void 0 ? void 0 : _b.getText()) === null || _c === void 0 ? void 0 : _c.toLowerCase();
|
1120
|
+
return aggregateFunctions.has(funcName);
|
1121
|
+
}
|
1122
|
+
function isSetReturningFunction_target_el(target_el) {
|
1123
|
+
if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
|
1124
|
+
const c_expr_list = collectContextsOfType(target_el, PostgreSQLParser_1.Func_exprContext);
|
1125
|
+
const setReturningFunction = c_expr_list.some(func_expr => isSetReturningFunction_c_expr(func_expr));
|
1126
|
+
return setReturningFunction;
|
1127
|
+
}
|
1128
|
+
return false;
|
1129
|
+
}
|
1130
|
+
function isSetReturningFunction_c_expr(func_expr) {
|
1131
|
+
var _a, _b, _c;
|
1132
|
+
const funcName = (_c = (_b = (_a = func_expr === null || func_expr === void 0 ? void 0 : func_expr.func_application()) === null || _a === void 0 ? void 0 : _a.func_name()) === null || _b === void 0 ? void 0 : _b.getText()) === null || _c === void 0 ? void 0 : _c.toLowerCase();
|
1133
|
+
return funcName === 'generate_series';
|
1134
|
+
}
|
1135
|
+
function isSingleRowResult_where(a_expr, uniqueKeys) {
|
1136
|
+
var _a, _b;
|
1137
|
+
const a_expr_or_list = ((_b = (_a = a_expr.a_expr_qual()) === null || _a === void 0 ? void 0 : _a.a_expr_lessless()) === null || _b === void 0 ? void 0 : _b.a_expr_or_list()) || [];
|
1138
|
+
if (a_expr_or_list.length > 1 || a_expr_or_list[0].OR_list().length > 0) {
|
1139
|
+
return false;
|
1140
|
+
}
|
1141
|
+
const someInSingleRow = a_expr_or_list[0].a_expr_and_list().some(a_expr_and => {
|
1142
|
+
const a = isSingleRowResult_a_expr_and(a_expr_and, uniqueKeys);
|
1143
|
+
return a;
|
1144
|
+
});
|
1145
|
+
return someInSingleRow;
|
1146
|
+
}
|
1147
|
+
function isSingleRowResult_a_expr_and(a_expr_and, uniqueKeys) {
|
1148
|
+
const a_expr_between_list = a_expr_and.a_expr_between_list();
|
1149
|
+
if (a_expr_between_list && a_expr_between_list.length > 0) {
|
1150
|
+
return a_expr_between_list.some(a_expr_between => isSingleRowResult_a_expr_between(a_expr_between, uniqueKeys));
|
1151
|
+
}
|
1152
|
+
return false;
|
1153
|
+
}
|
1154
|
+
function isSingleRowResult_a_expr_between(a_expr_between, uniqueKeys) {
|
1155
|
+
const isSingleRow = a_expr_between.a_expr_in_list().every(a_expr_in => isSingleRowResult_a_expr_in(a_expr_in, uniqueKeys));
|
1156
|
+
return isSingleRow;
|
1157
|
+
}
|
1158
|
+
function isSingleRowResult_a_expr_in(a_expr_in, uniqueKeys) {
|
1159
|
+
var _a, _b, _c;
|
1160
|
+
const a_expr_compare = (_c = (_b = (_a = a_expr_in.a_expr_unary_not()) === null || _a === void 0 ? void 0 : _a.a_expr_isnull()) === null || _b === void 0 ? void 0 : _b.a_expr_is_not()) === null || _c === void 0 ? void 0 : _c.a_expr_compare();
|
1161
|
+
if (a_expr_compare) {
|
1162
|
+
if (a_expr_compare.EQUAL() != null) {
|
1163
|
+
const a_expr_like_list = a_expr_compare.a_expr_like_list();
|
1164
|
+
if (a_expr_like_list && a_expr_like_list.length == 2) {
|
1165
|
+
const left = a_expr_like_list[0];
|
1166
|
+
const right = a_expr_like_list[1];
|
1167
|
+
const result = (isUniqueColumn(left, uniqueKeys) + isUniqueColumn(right, uniqueKeys));
|
1168
|
+
return result == 1;
|
1169
|
+
}
|
1170
|
+
}
|
1171
|
+
;
|
1172
|
+
}
|
1173
|
+
return false;
|
1174
|
+
}
|
1175
|
+
//1 = yes
|
1176
|
+
//0 = no
|
1177
|
+
function isUniqueColumn(a_expr_like, uniqueKeys) {
|
1178
|
+
var _a, _b;
|
1179
|
+
const c_expr = (_b = (_a = a_expr_like.a_expr_qual_op_list()) === null || _a === void 0 ? void 0 : _a[0].a_expr_unary_qualop_list()) === null || _b === void 0 ? void 0 : _b[0].a_expr_add().a_expr_mul_list()[0].a_expr_caret_list()[0].a_expr_unary_sign_list()[0].a_expr_at_time_zone().a_expr_collate().a_expr_typecast().c_expr();
|
1180
|
+
if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
|
1181
|
+
const columnref = c_expr.columnref();
|
1182
|
+
if (columnref) {
|
1183
|
+
const fieldName = (0, select_columns_1.splitName)(columnref.getText());
|
1184
|
+
// const col = traverseColumnRef(columnref, dbSchema);
|
1185
|
+
return uniqueKeys.includes(fieldName.name) ? 1 : 0;
|
1186
|
+
}
|
1187
|
+
}
|
1188
|
+
return 0;
|
1189
|
+
}
|
1190
|
+
function checkLimit(selectstmt) {
|
1191
|
+
const select_no_parens = selectstmt.select_no_parens();
|
1192
|
+
if (select_no_parens) {
|
1193
|
+
return checkLimit_select_no_parens(select_no_parens);
|
1194
|
+
}
|
1195
|
+
const select_with_parens = selectstmt.select_with_parens();
|
1196
|
+
if (select_with_parens) {
|
1197
|
+
return checkLimit_select_with_parens(select_with_parens);
|
1198
|
+
}
|
1199
|
+
return undefined;
|
1200
|
+
}
|
931
1201
|
//# sourceMappingURL=traverse.js.map
|