typesql-cli 0.15.2 → 0.16.0-experimental.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 +1 -1
- package/cli.js +20 -94
- package/cli.js.map +1 -1
- package/code-generator2.d.ts.map +1 -1
- package/code-generator2.js +287 -24
- package/code-generator2.js.map +1 -1
- package/describe-query.js +3 -3
- package/describe-query.js.map +1 -1
- package/drivers/libsql.d.ts +2 -2
- package/drivers/libsql.d.ts.map +1 -1
- package/drivers/libsql.js +2 -2
- package/drivers/libsql.js.map +1 -1
- package/drivers/postgres.d.ts +2 -3
- package/drivers/postgres.d.ts.map +1 -1
- package/drivers/postgres.js +1 -2
- package/drivers/postgres.js.map +1 -1
- package/package.json +1 -1
- package/postgres-query-analyzer/describe.d.ts.map +1 -1
- package/postgres-query-analyzer/describe.js +8 -3
- package/postgres-query-analyzer/describe.js.map +1 -1
- package/postgres-query-analyzer/parser.d.ts +2 -2
- package/postgres-query-analyzer/parser.d.ts.map +1 -1
- package/postgres-query-analyzer/parser.js +4 -4
- package/postgres-query-analyzer/parser.js.map +1 -1
- package/postgres-query-analyzer/traverse.d.ts +8 -1
- package/postgres-query-analyzer/traverse.d.ts.map +1 -1
- package/postgres-query-analyzer/traverse.js +231 -76
- package/postgres-query-analyzer/traverse.js.map +1 -1
- package/queryExectutor.d.ts +4 -3
- package/queryExectutor.d.ts.map +1 -1
- package/queryExectutor.js +48 -33
- package/queryExectutor.js.map +1 -1
- package/schema-info.d.ts +17 -0
- package/schema-info.d.ts.map +1 -0
- package/schema-info.js +142 -0
- package/schema-info.js.map +1 -0
- package/sqlite-query-analyzer/query-executor.d.ts +5 -5
- package/sqlite-query-analyzer/query-executor.d.ts.map +1 -1
- package/sqlite-query-analyzer/query-executor.js +20 -30
- package/sqlite-query-analyzer/query-executor.js.map +1 -1
@@ -1,21 +1,39 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.defaultOptions = defaultOptions;
|
3
4
|
exports.traverseSmt = traverseSmt;
|
4
5
|
const PostgreSQLParser_1 = require("@wsporto/typesql-parser/postgres/PostgreSQLParser");
|
5
6
|
const typesql_parser_1 = require("@wsporto/typesql-parser");
|
6
7
|
const select_columns_1 = require("../mysql-query-analyzer/select-columns");
|
7
|
-
function
|
8
|
+
function defaultOptions() {
|
9
|
+
return {
|
10
|
+
collectNestedInfo: false,
|
11
|
+
collectDynamicQueryInfo: false
|
12
|
+
};
|
13
|
+
}
|
14
|
+
function traverseSmt(stmt, dbSchema, options) {
|
15
|
+
const { collectNestedInfo = false, collectDynamicQueryInfo = false } = options;
|
8
16
|
const traverseResult = {
|
9
17
|
columnsNullability: [],
|
10
18
|
parameters: [],
|
11
19
|
singleRow: false
|
12
20
|
};
|
13
|
-
if (
|
21
|
+
if (collectNestedInfo) {
|
14
22
|
traverseResult.relations = [];
|
15
23
|
}
|
24
|
+
if (collectDynamicQueryInfo) {
|
25
|
+
const dynamicQueryInfo = {
|
26
|
+
with: [],
|
27
|
+
select: [],
|
28
|
+
from: [],
|
29
|
+
where: []
|
30
|
+
};
|
31
|
+
traverseResult.dynamicQueryInfo = dynamicQueryInfo;
|
32
|
+
}
|
16
33
|
const traverseContext = {
|
17
34
|
dbSchema,
|
18
|
-
|
35
|
+
collectNestedInfo,
|
36
|
+
collectDynamicQueryInfo,
|
19
37
|
fromColumns: []
|
20
38
|
};
|
21
39
|
const selectstmt = stmt.selectstmt();
|
@@ -69,6 +87,9 @@ function traverseSelectstmt(selectstmt, context, traverseResult) {
|
|
69
87
|
if (traverseResult.relations) {
|
70
88
|
postgresTraverseResult.relations = traverseResult.relations;
|
71
89
|
}
|
90
|
+
if (traverseResult.dynamicQueryInfo) {
|
91
|
+
postgresTraverseResult.dynamicQueryInfo = traverseResult.dynamicQueryInfo;
|
92
|
+
}
|
72
93
|
return postgresTraverseResult;
|
73
94
|
}
|
74
95
|
function traverse_selectstmt(selectstmt, context, traverseResult) {
|
@@ -90,21 +111,54 @@ function traverse_select_no_parens(select_no_parens, context, traverseResult) {
|
|
90
111
|
});
|
91
112
|
}
|
92
113
|
const select_clause = select_no_parens.select_clause();
|
93
|
-
|
94
|
-
|
95
|
-
|
114
|
+
const newContext = Object.assign(Object.assign({}, context), { fromColumns: withColumns.concat(context.fromColumns) });
|
115
|
+
const selectResult = traverse_select_clause(select_clause, newContext, traverseResult);
|
116
|
+
const select_limit = select_no_parens.select_limit();
|
117
|
+
if (select_limit) {
|
118
|
+
const numParamsBefore = traverseResult.parameters.length;
|
119
|
+
const limit_clause = select_limit.limit_clause();
|
120
|
+
const limit_a_expr = limit_clause.select_limit_value().a_expr();
|
121
|
+
traverse_a_expr(limit_a_expr, context, traverseResult);
|
122
|
+
let fragment = '';
|
123
|
+
if (limit_clause) {
|
124
|
+
if (context.collectDynamicQueryInfo) {
|
125
|
+
fragment += (0, select_columns_1.extractOriginalSql)(limit_clause);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
const offset_clause = select_limit.offset_clause();
|
129
|
+
if (offset_clause) {
|
130
|
+
const offset_a_expr = offset_clause.select_offset_value().a_expr();
|
131
|
+
traverse_a_expr(offset_a_expr, context, traverseResult);
|
132
|
+
if (context.collectDynamicQueryInfo) {
|
133
|
+
fragment += ' ' + (0, select_columns_1.extractOriginalSql)(offset_clause);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
if (fragment) {
|
137
|
+
const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
|
138
|
+
traverseResult.dynamicQueryInfo.limitOffset = {
|
139
|
+
fragment,
|
140
|
+
parameters
|
141
|
+
};
|
142
|
+
}
|
96
143
|
}
|
97
|
-
return
|
144
|
+
return selectResult;
|
98
145
|
}
|
99
146
|
function traverse_common_table_expr(common_table_expr, context, traverseResult) {
|
147
|
+
var _a;
|
100
148
|
const tableName = common_table_expr.name().getText();
|
101
149
|
const select_stmt = common_table_expr.preparablestmt().selectstmt();
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
150
|
+
const numParamsBefore = traverseResult.parameters.length;
|
151
|
+
const columns = traverse_selectstmt(select_stmt, Object.assign(Object.assign({}, context), { collectDynamicQueryInfo: false }), traverseResult);
|
152
|
+
const columnsWithTalbeName = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: tableName })));
|
153
|
+
if (context.collectDynamicQueryInfo) {
|
154
|
+
const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
|
155
|
+
(_a = traverseResult.dynamicQueryInfo) === null || _a === void 0 ? void 0 : _a.with.push({
|
156
|
+
fragment: (0, select_columns_1.extractOriginalSql)(common_table_expr),
|
157
|
+
relationName: tableName,
|
158
|
+
parameters
|
159
|
+
});
|
106
160
|
}
|
107
|
-
return
|
161
|
+
return columnsWithTalbeName;
|
108
162
|
}
|
109
163
|
function traverse_select_clause(select_clause, context, traverseResult) {
|
110
164
|
const simple_select_intersect_list = select_clause.simple_select_intersect_list();
|
@@ -135,7 +189,7 @@ function traverse_simple_select_intersect(simple_select_intersect, context, trav
|
|
135
189
|
return [];
|
136
190
|
}
|
137
191
|
function traverse_simple_select_pramary(simple_select_pramary, context, traverseResult) {
|
138
|
-
var _a;
|
192
|
+
var _a, _b;
|
139
193
|
const fromColumns = [];
|
140
194
|
const from_clause = simple_select_pramary.from_clause();
|
141
195
|
if (from_clause) {
|
@@ -153,11 +207,32 @@ function traverse_simple_select_pramary(simple_select_pramary, context, traverse
|
|
153
207
|
//fromColumns has precedence
|
154
208
|
const newContext = Object.assign(Object.assign({}, context), { fromColumns: fromColumns.concat(context.fromColumns) });
|
155
209
|
if (where_a_expr) {
|
210
|
+
const numParamsBefore = traverseResult.parameters.length;
|
156
211
|
traverse_a_expr(where_a_expr, newContext, traverseResult);
|
212
|
+
if (context.collectDynamicQueryInfo) {
|
213
|
+
const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
|
214
|
+
const relations = extractRelations(where_a_expr);
|
215
|
+
(_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.where.push({
|
216
|
+
fragment: `AND ${(0, select_columns_1.extractOriginalSql)(where_a_expr)}`,
|
217
|
+
parameters,
|
218
|
+
dependOnRelations: relations
|
219
|
+
});
|
220
|
+
}
|
157
221
|
}
|
158
222
|
const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, newContext, traverseResult);
|
159
223
|
return filteredColumns;
|
160
224
|
}
|
225
|
+
function extractRelations(a_expr) {
|
226
|
+
const columnsRef = collectContextsOfType(a_expr, PostgreSQLParser_1.ColumnrefContext);
|
227
|
+
const relations = columnsRef
|
228
|
+
.map((colRefExpr) => {
|
229
|
+
const colRef = colRefExpr;
|
230
|
+
const tableName = (0, select_columns_1.splitName)(colRef.getText());
|
231
|
+
return tableName;
|
232
|
+
});
|
233
|
+
const uniqueRelations = [...new Set(relations.map(relation => relation.prefix))];
|
234
|
+
return uniqueRelations;
|
235
|
+
}
|
161
236
|
function traverse_values_clause(values_clause, context, traverseResult) {
|
162
237
|
const expr_list_list = values_clause.expr_list_list();
|
163
238
|
if (expr_list_list) {
|
@@ -197,17 +272,29 @@ function traverse_target_list(target_list, context, traverseResult) {
|
|
197
272
|
const fieldName = (0, select_columns_1.splitName)(target_el.getText());
|
198
273
|
if (fieldName.name == '*') {
|
199
274
|
const columns = filterColumns(context.fromColumns, fieldName);
|
275
|
+
if (context.collectDynamicQueryInfo) {
|
276
|
+
columns.forEach(col => {
|
277
|
+
var _a;
|
278
|
+
(_a = traverseResult.dynamicQueryInfo) === null || _a === void 0 ? void 0 : _a.select.push({
|
279
|
+
fragment: `${col.table_name}.${col.column_name}`,
|
280
|
+
fragmentWitoutAlias: `${col.table_name}.${col.column_name}`,
|
281
|
+
dependOnRelations: [col.table_name],
|
282
|
+
parameters: []
|
283
|
+
});
|
284
|
+
});
|
285
|
+
}
|
200
286
|
return columns;
|
201
287
|
}
|
202
|
-
const column =
|
288
|
+
const column = traverse_target_el(target_el, context, traverseResult);
|
203
289
|
return [column];
|
204
290
|
});
|
205
291
|
return columns;
|
206
292
|
}
|
207
|
-
function
|
208
|
-
var _a;
|
293
|
+
function traverse_target_el(target_el, context, traverseResult) {
|
294
|
+
var _a, _b;
|
209
295
|
if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
|
210
296
|
const a_expr = target_el.a_expr();
|
297
|
+
const numParamsBefore = traverseResult.parameters.length;
|
211
298
|
const exprResult = traverse_a_expr(a_expr, context, traverseResult);
|
212
299
|
const colLabel = target_el.colLabel();
|
213
300
|
const alias = colLabel != null ? colLabel.getText() : '';
|
@@ -219,6 +306,16 @@ function isNotNull_target_el(target_el, context, traverseResult) {
|
|
219
306
|
}
|
220
307
|
});
|
221
308
|
}
|
309
|
+
if (context.collectDynamicQueryInfo) {
|
310
|
+
const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
|
311
|
+
const relations = extractRelations(target_el.a_expr());
|
312
|
+
(_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.select.push({
|
313
|
+
fragment: (0, select_columns_1.extractOriginalSql)(target_el),
|
314
|
+
fragmentWitoutAlias: (0, select_columns_1.extractOriginalSql)(target_el.a_expr()),
|
315
|
+
dependOnRelations: relations,
|
316
|
+
parameters
|
317
|
+
});
|
318
|
+
}
|
222
319
|
return {
|
223
320
|
column_name: alias || exprResult.column_name,
|
224
321
|
is_nullable: exprResult.is_nullable,
|
@@ -256,11 +353,17 @@ function traverse_a_expr_lessless(a_expr_lessless, context, traverseResult) {
|
|
256
353
|
throw Error('traverse_a_expr_lessless - Not expected:' + a_expr_lessless.getText());
|
257
354
|
}
|
258
355
|
function traverse_expr_or(a_expr_or, context, traverseResult) {
|
259
|
-
|
260
|
-
|
261
|
-
|
356
|
+
// expr1 OR expr2
|
357
|
+
const result = a_expr_or.a_expr_and_list().map(a_expr_and => traverse_expr_and(a_expr_and, context, traverseResult));
|
358
|
+
if (result.length === 1) {
|
359
|
+
return result[0];
|
262
360
|
}
|
263
|
-
|
361
|
+
return {
|
362
|
+
column_name: '?column?',
|
363
|
+
is_nullable: result.some(col => col.is_nullable),
|
364
|
+
table_name: '',
|
365
|
+
table_schema: ''
|
366
|
+
};
|
264
367
|
}
|
265
368
|
function traverse_expr_and(a_expr_and, context, traverseResult) {
|
266
369
|
const result = a_expr_and.a_expr_between_list().map(a_expr_between => traverse_expr_between(a_expr_between, context, traverseResult));
|
@@ -480,11 +583,11 @@ function traversec_expr(c_expr, context, traverseResult) {
|
|
480
583
|
if (c_expr.PARAM()) {
|
481
584
|
traverseResult.parameters.push({
|
482
585
|
paramIndex: c_expr.start.start,
|
483
|
-
isNotNull:
|
586
|
+
isNotNull: !context.propagatesNull
|
484
587
|
});
|
485
588
|
return {
|
486
589
|
column_name: c_expr.PARAM().getText(),
|
487
|
-
is_nullable:
|
590
|
+
is_nullable: !!context.propagatesNull,
|
488
591
|
table_name: '',
|
489
592
|
table_schema: ''
|
490
593
|
};
|
@@ -523,6 +626,28 @@ function traversec_expr(c_expr, context, traverseResult) {
|
|
523
626
|
if (a_expr_in_parens) {
|
524
627
|
return traverse_a_expr(a_expr_in_parens, context, traverseResult);
|
525
628
|
}
|
629
|
+
const explicit_row = c_expr.explicit_row();
|
630
|
+
if (explicit_row) {
|
631
|
+
const expr_list = explicit_row.expr_list().a_expr_list()
|
632
|
+
.map(a_expr => traverse_a_expr(a_expr, context, traverseResult));
|
633
|
+
return {
|
634
|
+
column_name: '?column?',
|
635
|
+
is_nullable: expr_list.some(col => col.is_nullable),
|
636
|
+
table_name: '',
|
637
|
+
table_schema: ''
|
638
|
+
};
|
639
|
+
}
|
640
|
+
const implicit_row = c_expr.implicit_row();
|
641
|
+
if (implicit_row) {
|
642
|
+
const expr_list = implicit_row.expr_list().a_expr_list().concat(implicit_row.a_expr())
|
643
|
+
.map(a_expr => traverse_a_expr(a_expr, context, traverseResult));
|
644
|
+
return {
|
645
|
+
column_name: '?column?',
|
646
|
+
is_nullable: expr_list.some(col => col.is_nullable),
|
647
|
+
table_name: '',
|
648
|
+
table_schema: ''
|
649
|
+
};
|
650
|
+
}
|
526
651
|
}
|
527
652
|
if (c_expr instanceof PostgreSQLParser_1.C_expr_caseContext) {
|
528
653
|
const isNotNull = traversec_expr_case(c_expr, context, traverseResult);
|
@@ -614,20 +739,13 @@ function traversefunc_application(func_application, context, traverseResult) {
|
|
614
739
|
if (functionName === 'generate_series') {
|
615
740
|
return true;
|
616
741
|
}
|
617
|
-
if (func_arg_expr_list) {
|
618
|
-
func_arg_expr_list.forEach(func_arg_expr => traversefunc_arg_expr(func_arg_expr, context, traverseResult));
|
619
|
-
}
|
620
742
|
return false;
|
621
743
|
}
|
622
744
|
function traversefunc_expr_common_subexpr(func_expr_common_subexpr, context, traverseResult) {
|
623
|
-
if (func_expr_common_subexpr.COALESCE()) {
|
745
|
+
if (func_expr_common_subexpr.COALESCE() || func_expr_common_subexpr.GREATEST() || func_expr_common_subexpr.LEAST()) {
|
624
746
|
const func_arg_list = func_expr_common_subexpr.expr_list().a_expr_list();
|
625
747
|
const result = func_arg_list.map(func_arg_expr => {
|
626
|
-
const paramResult = traverse_a_expr(func_arg_expr, context, traverseResult);
|
627
|
-
if (isParameter(paramResult.column_name)) {
|
628
|
-
traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = false;
|
629
|
-
paramResult.is_nullable = true;
|
630
|
-
}
|
748
|
+
const paramResult = traverse_a_expr(func_arg_expr, Object.assign(Object.assign({}, context), { propagatesNull: true }), traverseResult);
|
631
749
|
return paramResult;
|
632
750
|
});
|
633
751
|
return result.some(col => !col.is_nullable);
|
@@ -675,19 +793,19 @@ function traverse_table_ref(table_ref, context, traverseResult) {
|
|
675
793
|
const allColumns = [];
|
676
794
|
const relation_expr = table_ref.relation_expr();
|
677
795
|
const aliasClause = table_ref.alias_clause();
|
678
|
-
const alias = aliasClause ? aliasClause.colid().getText() :
|
796
|
+
const alias = aliasClause ? aliasClause.colid().getText() : '';
|
679
797
|
if (relation_expr) {
|
680
798
|
const tableName = traverse_relation_expr(relation_expr, dbSchema);
|
681
799
|
const tableNameWithAlias = alias ? alias : tableName.name;
|
682
800
|
const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName.name)
|
683
801
|
.map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
|
684
802
|
allColumns.push(...fromColumnsResult);
|
685
|
-
if (context.
|
803
|
+
if (context.collectNestedInfo) {
|
686
804
|
const key = fromColumnsResult.filter(col => col.column_key === 'PRI');
|
687
805
|
const renameAs = (aliasClause === null || aliasClause === void 0 ? void 0 : aliasClause.AS()) != null;
|
688
806
|
const relation = {
|
689
807
|
name: tableName.name,
|
690
|
-
alias: alias
|
808
|
+
alias: alias,
|
691
809
|
renameAs,
|
692
810
|
parentRelation: '',
|
693
811
|
joinColumn: ((_a = key[0]) === null || _a === void 0 ? void 0 : _a.column_name) || '',
|
@@ -696,61 +814,95 @@ function traverse_table_ref(table_ref, context, traverseResult) {
|
|
696
814
|
};
|
697
815
|
(_b = traverseResult.relations) === null || _b === void 0 ? void 0 : _b.push(relation);
|
698
816
|
}
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
const
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
817
|
+
const table_ref_list = table_ref.table_ref_list();
|
818
|
+
const join_type_list = table_ref.join_type_list();
|
819
|
+
const join_qual_list = table_ref.join_qual_list();
|
820
|
+
if (context.collectDynamicQueryInfo && traverseResult.dynamicQueryInfo.from.length == 0) {
|
821
|
+
collectDynamicQueryInfoTableRef(table_ref, null, null, fromColumnsResult, [], traverseResult);
|
822
|
+
}
|
823
|
+
if (table_ref_list) {
|
824
|
+
const joinColumns = table_ref_list.flatMap((table_ref, joinIndex) => {
|
825
|
+
const joinType = join_type_list[joinIndex]; //INNER, LEFT
|
826
|
+
const joinQual = join_qual_list[joinIndex];
|
827
|
+
const numParamsBefore = traverseResult.parameters.length;
|
828
|
+
const joinColumns = traverse_table_ref(table_ref, context, traverseResult);
|
829
|
+
const isUsing = (joinQual === null || joinQual === void 0 ? void 0 : joinQual.USING()) ? true : false;
|
830
|
+
const isLeftJoin = joinType === null || joinType === void 0 ? void 0 : joinType.LEFT();
|
831
|
+
const filteredColumns = isUsing ? filterUsingColumns(joinColumns, joinQual) : joinColumns;
|
832
|
+
const resultColumns = isLeftJoin ? filteredColumns.map(col => (Object.assign(Object.assign({}, col), { is_nullable: true }))) : filteredColumns;
|
833
|
+
if (context.collectNestedInfo) {
|
834
|
+
collectNestedInfo(joinQual, resultColumns, traverseResult);
|
835
|
+
}
|
836
|
+
if (context.collectDynamicQueryInfo) {
|
837
|
+
const parameters = traverseResult.parameters.slice(numParamsBefore).map((_, index) => index + numParamsBefore);
|
838
|
+
collectDynamicQueryInfoTableRef(table_ref, joinType, joinQual, resultColumns, parameters, traverseResult);
|
839
|
+
}
|
840
|
+
return resultColumns;
|
841
|
+
});
|
842
|
+
allColumns.push(...joinColumns);
|
843
|
+
}
|
718
844
|
}
|
719
845
|
const select_with_parens = table_ref.select_with_parens();
|
720
846
|
if (select_with_parens) {
|
721
|
-
const columns = traverse_select_with_parens(select_with_parens, context, traverseResult);
|
847
|
+
const columns = traverse_select_with_parens(select_with_parens, Object.assign(Object.assign({}, context), { collectDynamicQueryInfo: false }), traverseResult);
|
722
848
|
const withAlias = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: alias || col.table_name })));
|
723
849
|
return withAlias;
|
724
850
|
}
|
725
851
|
return allColumns;
|
726
852
|
}
|
727
|
-
function
|
728
|
-
var _a;
|
853
|
+
function collectDynamicQueryInfoTableRef(table_ref, joinType, joinQual, columns, parameters, traverseResult) {
|
854
|
+
var _a, _b;
|
855
|
+
const alias = table_ref.alias_clause() ? (0, select_columns_1.extractOriginalSql)(table_ref.alias_clause()) : '';
|
856
|
+
const fromExpr = (0, select_columns_1.extractOriginalSql)(table_ref.relation_expr() || table_ref.select_with_parens());
|
857
|
+
const tableName = ((_a = table_ref.relation_expr()) === null || _a === void 0 ? void 0 : _a.getText()) || alias;
|
858
|
+
const fromOrJoin = joinType ? `${(0, select_columns_1.extractOriginalSql)(joinType)} JOIN` : 'FROM';
|
859
|
+
const join = joinQual ? ` ${(0, select_columns_1.extractOriginalSql)(joinQual)}` : '';
|
860
|
+
const fromFragment = `${fromOrJoin} ${fromExpr} ${alias}${join}`;
|
861
|
+
const fields = columns.map(col => col.column_name);
|
862
|
+
const joinColumns = joinQual ? getJoinColumns(joinQual) : [];
|
863
|
+
const parentList = joinColumns.filter(joinRef => joinRef.prefix !== tableName && joinRef.prefix !== alias);
|
864
|
+
const parentRelation = parentList.length === 1 ? parentList[0].prefix : '';
|
865
|
+
(_b = traverseResult.dynamicQueryInfo) === null || _b === void 0 ? void 0 : _b.from.push({
|
866
|
+
fragment: fromFragment,
|
867
|
+
fields,
|
868
|
+
parameters,
|
869
|
+
relationName: tableName,
|
870
|
+
relationAlias: alias,
|
871
|
+
parentRelation
|
872
|
+
});
|
873
|
+
}
|
874
|
+
function getJoinColumns(joinQual) {
|
729
875
|
const a_expr_or_list = joinQual ? collectContextsOfType(joinQual, PostgreSQLParser_1.A_expr_orContext) : [];
|
730
876
|
if (a_expr_or_list.length == 1) {
|
731
877
|
const a_expr_or = a_expr_or_list[0];
|
732
878
|
const a_expr_and = a_expr_or.a_expr_and_list()[0];
|
733
879
|
const columnref = collectContextsOfType(a_expr_and, PostgreSQLParser_1.ColumnrefContext);
|
734
880
|
const joinColumns = columnref.map(colRef => (0, select_columns_1.splitName)(colRef.getText()));
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
881
|
+
return joinColumns;
|
882
|
+
}
|
883
|
+
return [];
|
884
|
+
}
|
885
|
+
function collectNestedInfo(joinQual, resultColumns, traverseResult) {
|
886
|
+
var _a;
|
887
|
+
const joinColumns = getJoinColumns(joinQual);
|
888
|
+
const currentRelation = (_a = traverseResult.relations) === null || _a === void 0 ? void 0 : _a.at(-1);
|
889
|
+
joinColumns.forEach(joinRef => {
|
890
|
+
if (currentRelation) {
|
891
|
+
const joinColumn = resultColumns.filter(col => col.column_name === joinRef.name)[0];
|
892
|
+
const unique = joinColumn && (joinColumn.column_key === 'PRI' || joinColumn.column_key === 'UNI');
|
893
|
+
if (joinRef.prefix === currentRelation.name || joinRef.prefix === currentRelation.alias) {
|
894
|
+
if (!unique) {
|
895
|
+
currentRelation.cardinality = 'many';
|
744
896
|
}
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
897
|
+
}
|
898
|
+
else {
|
899
|
+
currentRelation.parentRelation = joinRef.prefix;
|
900
|
+
if (!unique) {
|
901
|
+
currentRelation.parentCardinality = 'many';
|
750
902
|
}
|
751
903
|
}
|
752
|
-
}
|
753
|
-
}
|
904
|
+
}
|
905
|
+
});
|
754
906
|
}
|
755
907
|
function filterUsingColumns(fromColumns, joinQual) {
|
756
908
|
const excludeList = joinQual.name_list().name_list().map(name => (0, select_columns_1.splitName)(name.getText()));
|
@@ -851,7 +1003,8 @@ function traverseInsertstmt(insertstmt, dbSchema) {
|
|
851
1003
|
const context = {
|
852
1004
|
dbSchema,
|
853
1005
|
fromColumns: insertColumns,
|
854
|
-
|
1006
|
+
collectNestedInfo: false,
|
1007
|
+
collectDynamicQueryInfo: false
|
855
1008
|
};
|
856
1009
|
const selectstmt = insert_rest.selectstmt();
|
857
1010
|
traverse_insert_select_stmt(selectstmt, Object.assign(Object.assign({}, context), { fromColumns: insertColumnsList }), traverseResult);
|
@@ -890,7 +1043,7 @@ function traverse_insert_select_stmt(selectstmt, context, traverseResult) {
|
|
890
1043
|
const from_clause = simple_select_pramary.from_clause();
|
891
1044
|
const fromColumns = from_clause ? traverse_from_clause(from_clause, Object.assign(Object.assign({}, context), { fromColumns: [] }), traverseResult) : [];
|
892
1045
|
target_list.target_el_list().forEach((target_el, index) => {
|
893
|
-
const targetResult =
|
1046
|
+
const targetResult = traverse_target_el(target_el, Object.assign(Object.assign({}, context), { fromColumns }), traverseResult);
|
894
1047
|
if (isParameter(targetResult.column_name)) {
|
895
1048
|
traverseResult.parameters.at(-1).isNotNull = !context.fromColumns[index].is_nullable;
|
896
1049
|
}
|
@@ -915,7 +1068,8 @@ function traverseDeletestmt(deleteStmt, dbSchema, traverseResult) {
|
|
915
1068
|
const context = {
|
916
1069
|
dbSchema,
|
917
1070
|
fromColumns: deleteColumns,
|
918
|
-
|
1071
|
+
collectNestedInfo: false,
|
1072
|
+
collectDynamicQueryInfo: false
|
919
1073
|
};
|
920
1074
|
const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), context, traverseResult) : [];
|
921
1075
|
const result = {
|
@@ -937,7 +1091,8 @@ function traverseUpdatestmt(updatestmt, dbSchema, traverseResult) {
|
|
937
1091
|
const context = {
|
938
1092
|
dbSchema,
|
939
1093
|
fromColumns: updateColumns,
|
940
|
-
|
1094
|
+
collectNestedInfo: false,
|
1095
|
+
collectDynamicQueryInfo: false
|
941
1096
|
};
|
942
1097
|
updatestmt.set_clause_list().set_clause_list()
|
943
1098
|
.forEach(set_clause => traverse_set_clause(set_clause, context, traverseResult));
|