typesql-cli 0.15.0 → 0.15.2
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/cli.js +33 -15
- package/cli.js.map +1 -1
- package/code-generator.d.ts +1 -1
- package/code-generator.d.ts.map +1 -1
- package/code-generator.js +19 -9
- package/code-generator.js.map +1 -1
- package/code-generator2.d.ts +4 -1
- package/code-generator2.d.ts.map +1 -1
- package/code-generator2.js +299 -51
- package/code-generator2.js.map +1 -1
- package/drivers/postgres.d.ts +3 -3
- package/drivers/postgres.d.ts.map +1 -1
- package/drivers/postgres.js +18 -10
- package/drivers/postgres.js.map +1 -1
- package/drivers/sqlite.d.ts +5 -0
- package/drivers/sqlite.d.ts.map +1 -0
- package/drivers/sqlite.js +37 -0
- package/drivers/sqlite.js.map +1 -0
- package/drivers/types.d.ts +1 -0
- package/drivers/types.d.ts.map +1 -1
- package/mysql-query-analyzer/types.d.ts +2 -2
- package/mysql-query-analyzer/types.d.ts.map +1 -1
- package/package.json +22 -18
- package/postgres-query-analyzer/describe.d.ts.map +1 -1
- package/postgres-query-analyzer/describe.js +30 -10
- 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 +16 -2
- package/postgres-query-analyzer/traverse.d.ts.map +1 -1
- package/postgres-query-analyzer/traverse.js +352 -170
- package/postgres-query-analyzer/traverse.js.map +1 -1
- package/sqlite-query-analyzer/code-generator.d.ts +10 -2
- package/sqlite-query-analyzer/code-generator.d.ts.map +1 -1
- package/sqlite-query-analyzer/code-generator.js +14 -45
- package/sqlite-query-analyzer/code-generator.js.map +1 -1
- package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts +2 -0
- package/sqlite-query-analyzer/sqlite-describe-nested-query.d.ts.map +1 -1
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js +12 -7
- package/sqlite-query-analyzer/sqlite-describe-nested-query.js.map +1 -1
- package/sqlite-query-analyzer/traverse.d.ts +5 -1
- package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
- package/sqlite-query-analyzer/traverse.js +11 -2
- package/sqlite-query-analyzer/traverse.js.map +1 -1
- package/ts-nested-descriptor.js +1 -1
- package/ts-nested-descriptor.js.map +1 -1
- package/types.d.ts +1 -1
- package/types.d.ts.map +1 -1
@@ -4,15 +4,23 @@ exports.traverseSmt = traverseSmt;
|
|
4
4
|
const PostgreSQLParser_1 = require("@wsporto/typesql-parser/postgres/PostgreSQLParser");
|
5
5
|
const typesql_parser_1 = require("@wsporto/typesql-parser");
|
6
6
|
const select_columns_1 = require("../mysql-query-analyzer/select-columns");
|
7
|
-
function traverseSmt(stmt, dbSchema) {
|
7
|
+
function traverseSmt(stmt, dbSchema, generateNestedInfo) {
|
8
8
|
const traverseResult = {
|
9
9
|
columnsNullability: [],
|
10
10
|
parameters: [],
|
11
11
|
singleRow: false
|
12
12
|
};
|
13
|
+
if (generateNestedInfo) {
|
14
|
+
traverseResult.relations = [];
|
15
|
+
}
|
16
|
+
const traverseContext = {
|
17
|
+
dbSchema,
|
18
|
+
generateNestedInfo,
|
19
|
+
fromColumns: []
|
20
|
+
};
|
13
21
|
const selectstmt = stmt.selectstmt();
|
14
22
|
if (selectstmt) {
|
15
|
-
const result = traverseSelectstmt(selectstmt,
|
23
|
+
const result = traverseSelectstmt(selectstmt, traverseContext, traverseResult);
|
16
24
|
return result;
|
17
25
|
}
|
18
26
|
const insertstmt = stmt.insertstmt();
|
@@ -42,114 +50,126 @@ function collectContextsOfType(ctx, targetType) {
|
|
42
50
|
});
|
43
51
|
return results;
|
44
52
|
}
|
45
|
-
function traverseSelectstmt(selectstmt,
|
53
|
+
function traverseSelectstmt(selectstmt, context, traverseResult) {
|
46
54
|
const result = collectContextsOfType(selectstmt, PostgreSQLParser_1.C_expr_exprContext).filter(c_expr => c_expr.PARAM());
|
47
55
|
const paramIsListResult = result.map(param => paramIsList(param));
|
48
|
-
const columns = traverse_selectstmt(selectstmt,
|
56
|
+
const columns = traverse_selectstmt(selectstmt, context, traverseResult);
|
49
57
|
//select parameters are collected after from paramters
|
50
58
|
traverseResult.parameters.sort((param1, param2) => param1.paramIndex - param2.paramIndex);
|
51
|
-
const
|
52
|
-
const multipleRowsResult = !isSingleRowResult(selectstmt, dbSchema);
|
59
|
+
const multipleRowsResult = !isSingleRowResult(selectstmt, context.dbSchema);
|
53
60
|
const limit = checkLimit(selectstmt);
|
54
|
-
|
61
|
+
const postgresTraverseResult = {
|
55
62
|
queryType: 'Select',
|
56
63
|
multipleRowsResult,
|
57
|
-
|
64
|
+
columns,
|
58
65
|
parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
|
59
66
|
parameterList: paramIsListResult,
|
60
67
|
limit
|
61
68
|
};
|
69
|
+
if (traverseResult.relations) {
|
70
|
+
postgresTraverseResult.relations = traverseResult.relations;
|
71
|
+
}
|
72
|
+
return postgresTraverseResult;
|
62
73
|
}
|
63
|
-
function traverse_selectstmt(selectstmt,
|
74
|
+
function traverse_selectstmt(selectstmt, context, traverseResult) {
|
64
75
|
const select_no_parens = selectstmt.select_no_parens();
|
65
76
|
if (select_no_parens) {
|
66
|
-
return traverse_select_no_parens(select_no_parens,
|
77
|
+
return traverse_select_no_parens(select_no_parens, context, traverseResult);
|
67
78
|
}
|
68
79
|
return [];
|
69
80
|
}
|
70
|
-
function traverse_select_no_parens(select_no_parens,
|
81
|
+
function traverse_select_no_parens(select_no_parens, context, traverseResult) {
|
71
82
|
let withColumns = [];
|
72
83
|
const with_clause = select_no_parens.with_clause();
|
73
84
|
if (with_clause) {
|
74
85
|
with_clause.cte_list().common_table_expr_list()
|
75
86
|
.forEach(common_table_expr => {
|
76
|
-
const
|
87
|
+
const newContext = Object.assign(Object.assign({}, context), { fromColumns: withColumns.concat(context.fromColumns) });
|
88
|
+
const withResult = traverse_common_table_expr(common_table_expr, newContext, traverseResult);
|
77
89
|
withColumns.push(...withResult);
|
78
90
|
});
|
79
91
|
}
|
80
92
|
const select_clause = select_no_parens.select_clause();
|
81
93
|
if (select_clause) {
|
82
|
-
|
94
|
+
const newContext = Object.assign(Object.assign({}, context), { fromColumns: withColumns.concat(context.fromColumns) });
|
95
|
+
return traverse_select_clause(select_clause, newContext, traverseResult);
|
83
96
|
}
|
84
97
|
return [];
|
85
98
|
}
|
86
|
-
function traverse_common_table_expr(common_table_expr,
|
99
|
+
function traverse_common_table_expr(common_table_expr, context, traverseResult) {
|
87
100
|
const tableName = common_table_expr.name().getText();
|
88
101
|
const select_stmt = common_table_expr.preparablestmt().selectstmt();
|
89
102
|
if (select_stmt) {
|
90
|
-
const columns = traverse_selectstmt(select_stmt,
|
103
|
+
const columns = traverse_selectstmt(select_stmt, context, traverseResult);
|
91
104
|
const columnsWithTalbeName = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: tableName })));
|
92
105
|
return columnsWithTalbeName;
|
93
106
|
}
|
94
107
|
return [];
|
95
108
|
}
|
96
|
-
function traverse_select_clause(select_clause,
|
109
|
+
function traverse_select_clause(select_clause, context, traverseResult) {
|
97
110
|
const simple_select_intersect_list = select_clause.simple_select_intersect_list();
|
98
111
|
let selectColumns = [];
|
99
112
|
if (simple_select_intersect_list) {
|
100
|
-
selectColumns = traverse_simple_select_intersect(simple_select_intersect_list[0],
|
113
|
+
selectColumns = traverse_simple_select_intersect(simple_select_intersect_list[0], context, traverseResult);
|
101
114
|
}
|
102
115
|
//union
|
103
116
|
for (let index = 1; index < simple_select_intersect_list.length; index++) {
|
104
|
-
const unionNotNull = traverse_simple_select_intersect(simple_select_intersect_list[index],
|
117
|
+
const unionNotNull = traverse_simple_select_intersect(simple_select_intersect_list[index], context, traverseResult);
|
105
118
|
selectColumns = selectColumns.map((value, columnIndex) => {
|
106
|
-
const col =
|
119
|
+
const col = {
|
120
|
+
column_name: value.column_name,
|
121
|
+
is_nullable: value.is_nullable || unionNotNull[columnIndex].is_nullable,
|
122
|
+
table_name: '',
|
123
|
+
table_schema: ''
|
124
|
+
};
|
107
125
|
return col;
|
108
126
|
});
|
109
127
|
}
|
110
128
|
return selectColumns;
|
111
129
|
}
|
112
|
-
function traverse_simple_select_intersect(simple_select_intersect,
|
130
|
+
function traverse_simple_select_intersect(simple_select_intersect, context, traverseResult) {
|
113
131
|
const simple_select_pramary = simple_select_intersect.simple_select_pramary_list()[0];
|
114
132
|
if (simple_select_pramary) {
|
115
|
-
return traverse_simple_select_pramary(simple_select_pramary,
|
133
|
+
return traverse_simple_select_pramary(simple_select_pramary, context, traverseResult);
|
116
134
|
}
|
117
135
|
return [];
|
118
136
|
}
|
119
|
-
function traverse_simple_select_pramary(simple_select_pramary,
|
137
|
+
function traverse_simple_select_pramary(simple_select_pramary, context, traverseResult) {
|
120
138
|
var _a;
|
121
139
|
const fromColumns = [];
|
122
140
|
const from_clause = simple_select_pramary.from_clause();
|
123
141
|
if (from_clause) {
|
124
142
|
const where_clause = simple_select_pramary.where_clause();
|
125
|
-
const fields = traverse_from_clause(from_clause,
|
143
|
+
const fields = traverse_from_clause(from_clause, context, traverseResult);
|
126
144
|
const fieldsNotNull = where_clause != null ? fields.map(field => checkIsNullable(where_clause, field)) : fields;
|
127
145
|
fromColumns.push(...fieldsNotNull);
|
128
146
|
}
|
129
147
|
const values_clause = simple_select_pramary.values_clause();
|
130
148
|
if (values_clause) {
|
131
|
-
const valuesColumns = traverse_values_clause(values_clause,
|
149
|
+
const valuesColumns = traverse_values_clause(values_clause, context, traverseResult);
|
132
150
|
return valuesColumns;
|
133
151
|
}
|
134
152
|
const where_a_expr = (_a = simple_select_pramary.where_clause()) === null || _a === void 0 ? void 0 : _a.a_expr();
|
153
|
+
//fromColumns has precedence
|
154
|
+
const newContext = Object.assign(Object.assign({}, context), { fromColumns: fromColumns.concat(context.fromColumns) });
|
135
155
|
if (where_a_expr) {
|
136
|
-
traverse_a_expr(where_a_expr,
|
156
|
+
traverse_a_expr(where_a_expr, newContext, traverseResult);
|
137
157
|
}
|
138
|
-
const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary,
|
158
|
+
const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, newContext, traverseResult);
|
139
159
|
return filteredColumns;
|
140
160
|
}
|
141
|
-
function traverse_values_clause(values_clause,
|
161
|
+
function traverse_values_clause(values_clause, context, traverseResult) {
|
142
162
|
const expr_list_list = values_clause.expr_list_list();
|
143
163
|
if (expr_list_list) {
|
144
|
-
return expr_list_list.flatMap(expr_list => traverse_expr_list(expr_list,
|
164
|
+
return expr_list_list.flatMap(expr_list => traverse_expr_list(expr_list, context, traverseResult));
|
145
165
|
}
|
146
166
|
return [];
|
147
167
|
}
|
148
|
-
function traverse_expr_list(expr_list,
|
168
|
+
function traverse_expr_list(expr_list, context, traverseResult) {
|
149
169
|
const columns = expr_list.a_expr_list().map(a_expr => {
|
150
|
-
const notNull = traverse_a_expr(a_expr,
|
170
|
+
const notNull = traverse_a_expr(a_expr, context, traverseResult);
|
151
171
|
const result = {
|
152
|
-
column_name:
|
172
|
+
column_name: '?column?',
|
153
173
|
is_nullable: !notNull,
|
154
174
|
table_name: '',
|
155
175
|
table_schema: ''
|
@@ -158,234 +178,279 @@ function traverse_expr_list(expr_list, dbSchema, fromColumns, traverseResult) {
|
|
158
178
|
});
|
159
179
|
return columns;
|
160
180
|
}
|
161
|
-
function filterColumns_simple_select_pramary(simple_select_pramary,
|
181
|
+
function filterColumns_simple_select_pramary(simple_select_pramary, context, traverseResult) {
|
162
182
|
const target_list_ = simple_select_pramary.target_list_();
|
163
183
|
if (target_list_) {
|
164
184
|
const target_list = target_list_.target_list();
|
165
185
|
if (target_list) {
|
166
|
-
return traverse_target_list(target_list,
|
186
|
+
return traverse_target_list(target_list, context, traverseResult);
|
167
187
|
}
|
168
188
|
}
|
169
189
|
const target_list = simple_select_pramary.target_list();
|
170
190
|
if (target_list) {
|
171
|
-
return traverse_target_list(target_list,
|
191
|
+
return traverse_target_list(target_list, context, traverseResult);
|
172
192
|
}
|
173
193
|
return [];
|
174
194
|
}
|
175
|
-
function traverse_target_list(target_list,
|
195
|
+
function traverse_target_list(target_list, context, traverseResult) {
|
176
196
|
const columns = target_list.target_el_list().flatMap(target_el => {
|
177
197
|
const fieldName = (0, select_columns_1.splitName)(target_el.getText());
|
178
198
|
if (fieldName.name == '*') {
|
179
|
-
const columns = filterColumns(fromColumns, fieldName);
|
199
|
+
const columns = filterColumns(context.fromColumns, fieldName);
|
180
200
|
return columns;
|
181
201
|
}
|
182
|
-
const column = isNotNull_target_el(target_el,
|
202
|
+
const column = isNotNull_target_el(target_el, context, traverseResult);
|
183
203
|
return [column];
|
184
204
|
});
|
185
205
|
return columns;
|
186
206
|
}
|
187
|
-
function isNotNull_target_el(target_el,
|
207
|
+
function isNotNull_target_el(target_el, context, traverseResult) {
|
208
|
+
var _a;
|
188
209
|
if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
|
189
210
|
const a_expr = target_el.a_expr();
|
190
|
-
const exprResult = traverse_a_expr(a_expr,
|
211
|
+
const exprResult = traverse_a_expr(a_expr, context, traverseResult);
|
191
212
|
const colLabel = target_el.colLabel();
|
192
213
|
const alias = colLabel != null ? colLabel.getText() : '';
|
193
|
-
|
214
|
+
if (alias) {
|
215
|
+
(_a = traverseResult.relations) === null || _a === void 0 ? void 0 : _a.forEach(relation => {
|
216
|
+
if ((relation.name === exprResult.table_name || relation.alias === exprResult.table_name)
|
217
|
+
&& relation.joinColumn === exprResult.column_name) {
|
218
|
+
relation.joinColumn = alias;
|
219
|
+
}
|
220
|
+
});
|
221
|
+
}
|
194
222
|
return {
|
195
|
-
column_name: alias ||
|
223
|
+
column_name: alias || exprResult.column_name,
|
196
224
|
is_nullable: exprResult.is_nullable,
|
197
|
-
table_name:
|
198
|
-
table_schema:
|
225
|
+
table_name: exprResult.table_name,
|
226
|
+
table_schema: exprResult.table_schema
|
199
227
|
};
|
200
228
|
}
|
201
229
|
throw Error('Column not found');
|
202
230
|
}
|
203
|
-
function traverse_a_expr(a_expr,
|
231
|
+
function traverse_a_expr(a_expr, context, traverseResult) {
|
204
232
|
const a_expr_qual = a_expr.a_expr_qual();
|
205
233
|
if (a_expr_qual) {
|
206
|
-
const notNull = traverse_a_expr_qual(a_expr_qual,
|
234
|
+
const notNull = traverse_a_expr_qual(a_expr_qual, context, traverseResult);
|
207
235
|
return notNull;
|
208
236
|
}
|
209
237
|
return {
|
210
238
|
column_name: '',
|
211
|
-
is_nullable: true
|
239
|
+
is_nullable: true,
|
240
|
+
table_name: '',
|
241
|
+
table_schema: ''
|
212
242
|
};
|
213
243
|
}
|
214
|
-
function traverse_a_expr_qual(a_expr_qual,
|
244
|
+
function traverse_a_expr_qual(a_expr_qual, context, traverseResult) {
|
215
245
|
const a_expr_lessless = a_expr_qual.a_expr_lessless();
|
216
246
|
if (a_expr_lessless) {
|
217
|
-
return traverse_a_expr_lessless(a_expr_lessless,
|
247
|
+
return traverse_a_expr_lessless(a_expr_lessless, context, traverseResult);
|
218
248
|
}
|
219
249
|
throw Error('traverse_a_expr_qual - Not expected:' + a_expr_qual.getText());
|
220
250
|
}
|
221
|
-
function traverse_a_expr_lessless(a_expr_lessless,
|
251
|
+
function traverse_a_expr_lessless(a_expr_lessless, context, traverseResult) {
|
222
252
|
const a_expr_or = a_expr_lessless.a_expr_or_list()[0];
|
223
253
|
if (a_expr_or) {
|
224
|
-
return traverse_expr_or(a_expr_or,
|
254
|
+
return traverse_expr_or(a_expr_or, context, traverseResult);
|
225
255
|
}
|
226
256
|
throw Error('traverse_a_expr_lessless - Not expected:' + a_expr_lessless.getText());
|
227
257
|
}
|
228
|
-
function traverse_expr_or(a_expr_or,
|
258
|
+
function traverse_expr_or(a_expr_or, context, traverseResult) {
|
229
259
|
const a_expr_and = a_expr_or.a_expr_and_list()[0];
|
230
260
|
if (a_expr_and) {
|
231
|
-
return traverse_expr_and(a_expr_and,
|
261
|
+
return traverse_expr_and(a_expr_and, context, traverseResult);
|
232
262
|
}
|
233
263
|
throw Error('traverse_expr_or - Not expected:' + a_expr_or.getText());
|
234
264
|
}
|
235
|
-
function traverse_expr_and(a_expr_and,
|
236
|
-
const result = a_expr_and.a_expr_between_list().map(a_expr_between => traverse_expr_between(a_expr_between,
|
265
|
+
function traverse_expr_and(a_expr_and, context, traverseResult) {
|
266
|
+
const result = a_expr_and.a_expr_between_list().map(a_expr_between => traverse_expr_between(a_expr_between, context, traverseResult));
|
267
|
+
if (result.length === 1) {
|
268
|
+
return result[0];
|
269
|
+
}
|
237
270
|
return {
|
238
|
-
column_name:
|
239
|
-
is_nullable: result.some(col => col.is_nullable)
|
271
|
+
column_name: '?column?',
|
272
|
+
is_nullable: result.some(col => col.is_nullable),
|
273
|
+
table_name: '',
|
274
|
+
table_schema: ''
|
240
275
|
};
|
241
276
|
}
|
242
|
-
function traverse_expr_between(a_expr_between,
|
277
|
+
function traverse_expr_between(a_expr_between, context, traverseResult) {
|
243
278
|
const a_expr_in = a_expr_between.a_expr_in_list()[0];
|
244
279
|
if (a_expr_in) {
|
245
|
-
return traverse_expr_in(a_expr_in,
|
280
|
+
return traverse_expr_in(a_expr_in, context, traverseResult);
|
246
281
|
}
|
247
282
|
throw Error('traverse_expr_between - Not expected:' + a_expr_between.getText());
|
248
283
|
}
|
249
|
-
function traverse_expr_in(a_expr_in,
|
284
|
+
function traverse_expr_in(a_expr_in, context, traverseResult) {
|
250
285
|
const a_expr_unary = a_expr_in.a_expr_unary_not();
|
251
286
|
let leftExprResult = undefined;
|
252
287
|
if (a_expr_unary) {
|
253
|
-
leftExprResult = traverse_expr_unary(a_expr_unary,
|
288
|
+
leftExprResult = traverse_expr_unary(a_expr_unary, context, traverseResult);
|
254
289
|
}
|
255
290
|
const in_expr = a_expr_in.in_expr();
|
256
291
|
if (in_expr) {
|
257
|
-
traverse_in_expr(in_expr,
|
292
|
+
traverse_in_expr(in_expr, context, traverseResult);
|
293
|
+
}
|
294
|
+
if (in_expr === null && leftExprResult != null) {
|
295
|
+
return leftExprResult;
|
258
296
|
}
|
259
297
|
return {
|
260
298
|
column_name: a_expr_in.getText(),
|
261
299
|
//id in (...) -> is_nullable: false
|
262
300
|
// value -> is_nullable = leftExprResult.is_nullable
|
263
|
-
is_nullable: in_expr != null ? false : leftExprResult.is_nullable
|
301
|
+
is_nullable: in_expr != null ? false : leftExprResult.is_nullable,
|
302
|
+
table_name: '',
|
303
|
+
table_schema: ''
|
264
304
|
};
|
265
305
|
}
|
266
|
-
function traverse_in_expr(in_expr,
|
306
|
+
function traverse_in_expr(in_expr, context, traverseResult) {
|
267
307
|
if (in_expr instanceof PostgreSQLParser_1.In_expr_selectContext) {
|
268
308
|
const select_with_parens = in_expr.select_with_parens();
|
269
|
-
traverse_select_with_parens(select_with_parens,
|
309
|
+
traverse_select_with_parens(select_with_parens, context, traverseResult);
|
270
310
|
}
|
271
311
|
if (in_expr instanceof PostgreSQLParser_1.In_expr_listContext) {
|
272
312
|
in_expr.expr_list().a_expr_list().forEach(a_expr => {
|
273
|
-
traverse_a_expr(a_expr,
|
313
|
+
traverse_a_expr(a_expr, context, traverseResult);
|
274
314
|
});
|
275
315
|
}
|
276
316
|
}
|
277
|
-
function traverse_expr_unary(a_expr_unary,
|
317
|
+
function traverse_expr_unary(a_expr_unary, context, traverseResult) {
|
278
318
|
const a_expr_isnull = a_expr_unary.a_expr_isnull();
|
279
319
|
if (a_expr_isnull) {
|
280
|
-
return traverse_expr_isnull(a_expr_isnull,
|
320
|
+
return traverse_expr_isnull(a_expr_isnull, context, traverseResult);
|
281
321
|
}
|
282
322
|
throw Error('traverse_expr_unary - Not expected:' + a_expr_unary.getText());
|
283
323
|
}
|
284
|
-
function traverse_expr_isnull(a_expr_isnull,
|
324
|
+
function traverse_expr_isnull(a_expr_isnull, context, traverseResult) {
|
285
325
|
const a_expr_is_not = a_expr_isnull.a_expr_is_not();
|
286
326
|
if (a_expr_is_not) {
|
287
|
-
return traverse_expr_is_not(a_expr_is_not,
|
327
|
+
return traverse_expr_is_not(a_expr_is_not, context, traverseResult);
|
288
328
|
}
|
289
329
|
throw Error('traverse_expr_isnull - Not expected:' + a_expr_isnull.getText());
|
290
330
|
}
|
291
|
-
function traverse_expr_is_not(a_expr_is_not,
|
331
|
+
function traverse_expr_is_not(a_expr_is_not, context, traverseResult) {
|
292
332
|
const a_expr_compare = a_expr_is_not.a_expr_compare();
|
293
333
|
if (a_expr_compare) {
|
294
|
-
return traverse_expr_compare(a_expr_compare,
|
334
|
+
return traverse_expr_compare(a_expr_compare, context, traverseResult);
|
295
335
|
}
|
296
336
|
throw Error('traverse_expr_is_not - Not expected:' + a_expr_is_not.getText());
|
297
337
|
}
|
298
|
-
function traverse_expr_compare(a_expr_compare,
|
338
|
+
function traverse_expr_compare(a_expr_compare, context, traverseResult) {
|
299
339
|
const a_expr_like_list = a_expr_compare.a_expr_like_list();
|
300
340
|
if (a_expr_like_list) {
|
301
|
-
const result = a_expr_like_list.map(a_expr_like => traverse_expr_like(a_expr_like,
|
341
|
+
const result = a_expr_like_list.map(a_expr_like => traverse_expr_like(a_expr_like, context, traverseResult));
|
342
|
+
if (result.length === 1) {
|
343
|
+
return result[0];
|
344
|
+
}
|
302
345
|
return {
|
303
|
-
column_name:
|
304
|
-
is_nullable: result.some(col => col.is_nullable)
|
346
|
+
column_name: '?column?',
|
347
|
+
is_nullable: result.some(col => col.is_nullable),
|
348
|
+
table_name: '',
|
349
|
+
table_schema: ''
|
305
350
|
};
|
306
351
|
}
|
307
352
|
throw Error('traverse_expr_compare - Not expected:' + a_expr_compare.getText());
|
308
353
|
}
|
309
|
-
function traverse_expr_like(a_expr_like,
|
354
|
+
function traverse_expr_like(a_expr_like, context, traverseResult) {
|
310
355
|
const a_expr_qual_op_list = a_expr_like.a_expr_qual_op_list();
|
311
356
|
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,
|
357
|
+
const result = a_expr_qual_op_list.map(a_expr_qual_op => traverse_expr_qual_op(a_expr_qual_op, context, traverseResult));
|
358
|
+
if (result.length === 1) {
|
359
|
+
return result[0];
|
360
|
+
}
|
313
361
|
return {
|
314
|
-
column_name:
|
315
|
-
is_nullable: result.some(col => col.is_nullable)
|
362
|
+
column_name: '?column?',
|
363
|
+
is_nullable: result.some(col => col.is_nullable),
|
364
|
+
table_name: '',
|
365
|
+
table_schema: ''
|
316
366
|
};
|
317
367
|
}
|
318
368
|
throw Error('traverse_expr_like - Not expected:' + a_expr_like.getText());
|
319
369
|
}
|
320
|
-
function traverse_expr_qual_op(a_expr_qual_op,
|
370
|
+
function traverse_expr_qual_op(a_expr_qual_op, context, traverseResult) {
|
321
371
|
const a_expr_unary_qualop = a_expr_qual_op.a_expr_unary_qualop_list()[0];
|
322
372
|
if (a_expr_unary_qualop) {
|
323
|
-
return traverse_expr_unary_qualop(a_expr_unary_qualop,
|
373
|
+
return traverse_expr_unary_qualop(a_expr_unary_qualop, context, traverseResult);
|
324
374
|
}
|
325
375
|
throw Error('traverse_expr_qual_op - Not expected:' + a_expr_qual_op.getText());
|
326
376
|
}
|
327
|
-
function traverse_expr_unary_qualop(a_expr_unary_qualop,
|
377
|
+
function traverse_expr_unary_qualop(a_expr_unary_qualop, context, traverseResult) {
|
328
378
|
const a_expr_add = a_expr_unary_qualop.a_expr_add();
|
329
379
|
if (a_expr_add) {
|
330
|
-
const exprResult = a_expr_add.a_expr_mul_list().map(a_expr_mul => traverse_expr_mul(a_expr_mul,
|
380
|
+
const exprResult = a_expr_add.a_expr_mul_list().map(a_expr_mul => traverse_expr_mul(a_expr_mul, context, traverseResult));
|
381
|
+
if (exprResult.length === 1) {
|
382
|
+
return exprResult[0];
|
383
|
+
}
|
331
384
|
const result = {
|
332
|
-
column_name:
|
333
|
-
is_nullable: exprResult.some(col => col.is_nullable)
|
385
|
+
column_name: '?column?',
|
386
|
+
is_nullable: exprResult.some(col => col.is_nullable),
|
387
|
+
table_name: '',
|
388
|
+
table_schema: ''
|
334
389
|
};
|
335
390
|
return result;
|
336
391
|
}
|
337
392
|
throw Error('traverse_expr_unary_qualop - Not expected:' + a_expr_unary_qualop.getText());
|
338
393
|
}
|
339
|
-
function traverse_expr_mul(a_expr_mul,
|
394
|
+
function traverse_expr_mul(a_expr_mul, context, traverseResult) {
|
340
395
|
const a_expr_mul_list = a_expr_mul.a_expr_caret_list();
|
341
396
|
if (a_expr_mul_list) {
|
342
|
-
const notNullInfo = a_expr_mul.a_expr_caret_list().map(a_expr_caret => traverse_expr_caret(a_expr_caret,
|
397
|
+
const notNullInfo = a_expr_mul.a_expr_caret_list().map(a_expr_caret => traverse_expr_caret(a_expr_caret, context, traverseResult));
|
398
|
+
if (notNullInfo.length === 1) {
|
399
|
+
return notNullInfo[0];
|
400
|
+
}
|
343
401
|
const result = {
|
344
|
-
column_name:
|
345
|
-
is_nullable: notNullInfo.some(notNullInfo => notNullInfo.is_nullable)
|
402
|
+
column_name: '?column?',
|
403
|
+
is_nullable: notNullInfo.some(notNullInfo => notNullInfo.is_nullable),
|
404
|
+
table_name: '',
|
405
|
+
table_schema: ''
|
346
406
|
};
|
347
407
|
return result;
|
348
408
|
}
|
349
409
|
throw Error('traverse_expr_mul - Not expected:' + a_expr_mul.getText());
|
350
410
|
}
|
351
|
-
function traverse_expr_caret(a_expr_caret,
|
411
|
+
function traverse_expr_caret(a_expr_caret, context, traverseResult) {
|
352
412
|
const a_expr_unary_sign_list = a_expr_caret.a_expr_unary_sign_list();
|
353
413
|
if (a_expr_unary_sign_list) {
|
354
414
|
const notNullInfo = a_expr_caret.a_expr_unary_sign_list()
|
355
|
-
.map(a_expr_unary_sign => traverse_expr_unary_sign(a_expr_unary_sign,
|
415
|
+
.map(a_expr_unary_sign => traverse_expr_unary_sign(a_expr_unary_sign, context, traverseResult));
|
416
|
+
if (notNullInfo.length === 1) {
|
417
|
+
return notNullInfo[0];
|
418
|
+
}
|
356
419
|
const result = {
|
357
|
-
column_name:
|
358
|
-
is_nullable: notNullInfo.some(notNullInfo => notNullInfo.is_nullable)
|
420
|
+
column_name: '?column?',
|
421
|
+
is_nullable: notNullInfo.some(notNullInfo => notNullInfo.is_nullable),
|
422
|
+
table_name: '',
|
423
|
+
table_schema: ''
|
359
424
|
};
|
360
425
|
return result;
|
361
426
|
}
|
362
427
|
throw Error('traverse_expr_caret - Not expected:' + a_expr_caret.getText());
|
363
428
|
}
|
364
|
-
function traverse_expr_unary_sign(a_expr_unary_sign,
|
429
|
+
function traverse_expr_unary_sign(a_expr_unary_sign, context, traverseResult) {
|
365
430
|
const a_expr_at_time_zone = a_expr_unary_sign.a_expr_at_time_zone();
|
366
431
|
if (a_expr_at_time_zone) {
|
367
|
-
return traverse_expr_at_time_zone(a_expr_at_time_zone,
|
432
|
+
return traverse_expr_at_time_zone(a_expr_at_time_zone, context, traverseResult);
|
368
433
|
}
|
369
434
|
throw Error('traverse_expr_unary_sign - Not expected:' + a_expr_unary_sign.getText());
|
370
435
|
}
|
371
|
-
function traverse_expr_at_time_zone(a_expr_at_time_zone,
|
436
|
+
function traverse_expr_at_time_zone(a_expr_at_time_zone, context, traverseResult) {
|
372
437
|
const a_expr_collate = a_expr_at_time_zone.a_expr_collate();
|
373
438
|
if (a_expr_collate) {
|
374
|
-
return traverse_expr_collate(a_expr_collate,
|
439
|
+
return traverse_expr_collate(a_expr_collate, context, traverseResult);
|
375
440
|
}
|
376
441
|
throw Error('traverse_expr_at_time_zone - Not expected:' + a_expr_at_time_zone.getText());
|
377
442
|
}
|
378
|
-
function traverse_expr_collate(a_expr_collate,
|
443
|
+
function traverse_expr_collate(a_expr_collate, context, traverseResult) {
|
379
444
|
const a_expr_typecast = a_expr_collate.a_expr_typecast();
|
380
445
|
if (a_expr_typecast) {
|
381
|
-
return traverse_expr_typecast(a_expr_typecast,
|
446
|
+
return traverse_expr_typecast(a_expr_typecast, context, traverseResult);
|
382
447
|
}
|
383
448
|
throw Error('traverse_expr_collate - Not expected:' + a_expr_collate.getText());
|
384
449
|
}
|
385
|
-
function traverse_expr_typecast(a_expr_typecast,
|
450
|
+
function traverse_expr_typecast(a_expr_typecast, context, traverseResult) {
|
386
451
|
const c_expr = a_expr_typecast.c_expr();
|
387
452
|
if (c_expr) {
|
388
|
-
return traversec_expr(c_expr,
|
453
|
+
return traversec_expr(c_expr, context, traverseResult);
|
389
454
|
}
|
390
455
|
throw Error('traverse_expr_typecast - Not expected:' + a_expr_typecast.getText());
|
391
456
|
}
|
@@ -394,12 +459,12 @@ function traverseColumnRef(columnref, fromColumns) {
|
|
394
459
|
const col = findColumn(fieldName, fromColumns);
|
395
460
|
return col;
|
396
461
|
}
|
397
|
-
function traversec_expr(c_expr,
|
398
|
-
var _a, _b;
|
462
|
+
function traversec_expr(c_expr, context, traverseResult) {
|
463
|
+
var _a, _b, _c, _d, _e;
|
399
464
|
if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
|
400
465
|
const columnref = c_expr.columnref();
|
401
466
|
if (columnref) {
|
402
|
-
const col = traverseColumnRef(columnref, fromColumns);
|
467
|
+
const col = traverseColumnRef(columnref, context.fromColumns);
|
403
468
|
return col;
|
404
469
|
}
|
405
470
|
const aexprconst = c_expr.aexprconst();
|
@@ -407,7 +472,9 @@ function traversec_expr(c_expr, dbSchema, fromColumns, traverseResult) {
|
|
407
472
|
const is_nullable = aexprconst.NULL_P() != null;
|
408
473
|
return {
|
409
474
|
column_name: aexprconst.getText(),
|
410
|
-
is_nullable
|
475
|
+
is_nullable,
|
476
|
+
table_name: '',
|
477
|
+
table_schema: ''
|
411
478
|
};
|
412
479
|
}
|
413
480
|
if (c_expr.PARAM()) {
|
@@ -417,57 +484,77 @@ function traversec_expr(c_expr, dbSchema, fromColumns, traverseResult) {
|
|
417
484
|
});
|
418
485
|
return {
|
419
486
|
column_name: c_expr.PARAM().getText(),
|
420
|
-
is_nullable: false
|
487
|
+
is_nullable: false,
|
488
|
+
table_name: '',
|
489
|
+
table_schema: ''
|
421
490
|
};
|
422
491
|
}
|
423
492
|
const func_application = (_a = c_expr.func_expr()) === null || _a === void 0 ? void 0 : _a.func_application();
|
424
493
|
if (func_application) {
|
425
|
-
const isNotNull = traversefunc_application(func_application,
|
494
|
+
const isNotNull = traversefunc_application(func_application, context, traverseResult);
|
426
495
|
return {
|
427
|
-
column_name: func_application.getText(),
|
428
|
-
is_nullable: !isNotNull
|
496
|
+
column_name: ((_b = func_application.func_name()) === null || _b === void 0 ? void 0 : _b.getText()) || func_application.getText(),
|
497
|
+
is_nullable: !isNotNull,
|
498
|
+
table_name: '',
|
499
|
+
table_schema: ''
|
429
500
|
};
|
430
501
|
}
|
431
|
-
const func_expr_common_subexpr = (
|
502
|
+
const func_expr_common_subexpr = (_c = c_expr.func_expr()) === null || _c === void 0 ? void 0 : _c.func_expr_common_subexpr();
|
432
503
|
if (func_expr_common_subexpr) {
|
433
|
-
const isNotNull = traversefunc_expr_common_subexpr(func_expr_common_subexpr,
|
504
|
+
const isNotNull = traversefunc_expr_common_subexpr(func_expr_common_subexpr, context, traverseResult);
|
434
505
|
return {
|
435
|
-
column_name: func_expr_common_subexpr.getText(),
|
436
|
-
is_nullable: !isNotNull
|
506
|
+
column_name: ((_e = (_d = func_expr_common_subexpr.getText().split('(')) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.trim()) || func_expr_common_subexpr.getText(),
|
507
|
+
is_nullable: !isNotNull,
|
508
|
+
table_name: '',
|
509
|
+
table_schema: ''
|
437
510
|
};
|
438
511
|
}
|
439
512
|
const select_with_parens = c_expr.select_with_parens();
|
440
513
|
if (select_with_parens) {
|
441
|
-
traverse_select_with_parens(select_with_parens,
|
514
|
+
traverse_select_with_parens(select_with_parens, context, traverseResult);
|
442
515
|
return {
|
443
|
-
column_name:
|
444
|
-
is_nullable: true
|
516
|
+
column_name: '?column?',
|
517
|
+
is_nullable: true,
|
518
|
+
table_name: '',
|
519
|
+
table_schema: ''
|
445
520
|
};
|
446
521
|
}
|
447
522
|
const a_expr_in_parens = c_expr._a_expr_in_parens;
|
448
523
|
if (a_expr_in_parens) {
|
449
|
-
return traverse_a_expr(a_expr_in_parens,
|
524
|
+
return traverse_a_expr(a_expr_in_parens, context, traverseResult);
|
450
525
|
}
|
451
526
|
}
|
452
527
|
if (c_expr instanceof PostgreSQLParser_1.C_expr_caseContext) {
|
453
|
-
const isNotNull = traversec_expr_case(c_expr,
|
528
|
+
const isNotNull = traversec_expr_case(c_expr, context, traverseResult);
|
454
529
|
return {
|
455
|
-
column_name:
|
456
|
-
is_nullable: !isNotNull
|
530
|
+
column_name: '?column?',
|
531
|
+
is_nullable: !isNotNull,
|
532
|
+
table_name: '',
|
533
|
+
table_schema: ''
|
457
534
|
};
|
458
535
|
}
|
459
536
|
if (c_expr instanceof PostgreSQLParser_1.C_expr_existsContext) {
|
460
537
|
//todo - traverse
|
461
538
|
return {
|
462
|
-
column_name:
|
463
|
-
is_nullable: false
|
539
|
+
column_name: '?column?',
|
540
|
+
is_nullable: false,
|
541
|
+
table_name: '',
|
542
|
+
table_schema: ''
|
464
543
|
};
|
465
544
|
}
|
466
545
|
throw Error('traversec_expr - Not expected:' + c_expr.getText());
|
467
546
|
}
|
468
547
|
function filterColumns(fromColumns, fieldName) {
|
469
548
|
return fromColumns.filter(col => (fieldName.prefix === '' || col.table_name === fieldName.prefix)
|
470
|
-
&& (fieldName.name === '*' || col.column_name === fieldName.name))
|
549
|
+
&& (fieldName.name === '*' || col.column_name === fieldName.name)).map(col => {
|
550
|
+
const result = {
|
551
|
+
column_name: col.column_name,
|
552
|
+
is_nullable: col.is_nullable,
|
553
|
+
table_name: col.table_name,
|
554
|
+
table_schema: col.table_schema
|
555
|
+
};
|
556
|
+
return result;
|
557
|
+
});
|
471
558
|
}
|
472
559
|
function excludeColumns(fromColumns, excludeList) {
|
473
560
|
return fromColumns.filter(col => {
|
@@ -476,24 +563,41 @@ function excludeColumns(fromColumns, excludeList) {
|
|
476
563
|
return !found;
|
477
564
|
});
|
478
565
|
}
|
479
|
-
function traversec_expr_case(c_expr_case,
|
566
|
+
function traversec_expr_case(c_expr_case, context, traverseResult) {
|
480
567
|
var _a;
|
481
568
|
const case_expr = c_expr_case.case_expr();
|
482
|
-
const
|
569
|
+
const whenResult = case_expr.when_clause_list().when_clause_list().map(when_clause => traversewhen_clause(when_clause, context, traverseResult));
|
570
|
+
const whenIsNotNull = whenResult.every(when => when);
|
483
571
|
const elseExpr = (_a = case_expr.case_default()) === null || _a === void 0 ? void 0 : _a.a_expr();
|
484
|
-
const elseIsNotNull = elseExpr ? !traverse_a_expr(elseExpr,
|
572
|
+
const elseIsNotNull = elseExpr ? !traverse_a_expr(elseExpr, context, traverseResult).is_nullable : false;
|
485
573
|
return elseIsNotNull && whenIsNotNull;
|
486
574
|
}
|
487
|
-
function traversewhen_clause(when_clause,
|
575
|
+
function traversewhen_clause(when_clause, context, traverseResult) {
|
488
576
|
const a_expr_list = when_clause.a_expr_list();
|
489
|
-
const thenExprList = a_expr_list
|
490
|
-
|
577
|
+
const [whenExprList, thenExprList] = partition(a_expr_list, (index) => index % 2 === 0);
|
578
|
+
const whenExprResult = thenExprList.map((thenExpr, index) => {
|
579
|
+
traverse_a_expr(whenExprList[index], context, traverseResult);
|
580
|
+
const thenExprResult = traverse_a_expr(thenExpr, context, traverseResult);
|
581
|
+
return thenExprResult;
|
582
|
+
});
|
583
|
+
return whenExprResult.every(res => res);
|
491
584
|
}
|
492
|
-
function
|
585
|
+
function partition(array, predicate) {
|
586
|
+
return array.reduce((acc, curr, index) => {
|
587
|
+
if (predicate(index)) {
|
588
|
+
acc[0].push(curr);
|
589
|
+
}
|
590
|
+
else {
|
591
|
+
acc[1].push(curr);
|
592
|
+
}
|
593
|
+
return acc;
|
594
|
+
}, [[], []]);
|
595
|
+
}
|
596
|
+
function traversefunc_application(func_application, context, traverseResult) {
|
493
597
|
var _a;
|
494
598
|
const functionName = func_application.func_name().getText().toLowerCase();
|
495
599
|
const func_arg_expr_list = ((_a = func_application.func_arg_list()) === null || _a === void 0 ? void 0 : _a.func_arg_expr_list()) || [];
|
496
|
-
const argsResult = func_arg_expr_list.map(func_arg_expr => traversefunc_arg_expr(func_arg_expr,
|
600
|
+
const argsResult = func_arg_expr_list.map(func_arg_expr => traversefunc_arg_expr(func_arg_expr, context, traverseResult));
|
497
601
|
if (functionName === 'count') {
|
498
602
|
return true;
|
499
603
|
}
|
@@ -511,15 +615,15 @@ function traversefunc_application(func_application, dbSchema, fromColumns, trave
|
|
511
615
|
return true;
|
512
616
|
}
|
513
617
|
if (func_arg_expr_list) {
|
514
|
-
func_arg_expr_list.forEach(func_arg_expr => traversefunc_arg_expr(func_arg_expr,
|
618
|
+
func_arg_expr_list.forEach(func_arg_expr => traversefunc_arg_expr(func_arg_expr, context, traverseResult));
|
515
619
|
}
|
516
620
|
return false;
|
517
621
|
}
|
518
|
-
function traversefunc_expr_common_subexpr(func_expr_common_subexpr,
|
622
|
+
function traversefunc_expr_common_subexpr(func_expr_common_subexpr, context, traverseResult) {
|
519
623
|
if (func_expr_common_subexpr.COALESCE()) {
|
520
624
|
const func_arg_list = func_expr_common_subexpr.expr_list().a_expr_list();
|
521
625
|
const result = func_arg_list.map(func_arg_expr => {
|
522
|
-
const paramResult = traverse_a_expr(func_arg_expr,
|
626
|
+
const paramResult = traverse_a_expr(func_arg_expr, context, traverseResult);
|
523
627
|
if (isParameter(paramResult.column_name)) {
|
524
628
|
traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = false;
|
525
629
|
paramResult.is_nullable = true;
|
@@ -530,14 +634,14 @@ function traversefunc_expr_common_subexpr(func_expr_common_subexpr, dbSchema, fr
|
|
530
634
|
}
|
531
635
|
if (func_expr_common_subexpr.EXTRACT()) {
|
532
636
|
const a_expr = func_expr_common_subexpr.extract_list().a_expr();
|
533
|
-
const result = traverse_a_expr(a_expr,
|
637
|
+
const result = traverse_a_expr(a_expr, context, traverseResult);
|
534
638
|
return !result.is_nullable;
|
535
639
|
}
|
536
640
|
return false;
|
537
641
|
}
|
538
|
-
function traversefunc_arg_expr(func_arg_expr,
|
642
|
+
function traversefunc_arg_expr(func_arg_expr, context, traverseResult) {
|
539
643
|
const a_expr = func_arg_expr.a_expr();
|
540
|
-
return !traverse_a_expr(a_expr,
|
644
|
+
return !traverse_a_expr(a_expr, context, traverseResult).is_nullable;
|
541
645
|
}
|
542
646
|
function findColumn(fieldName, fromColumns) {
|
543
647
|
const col = fromColumns.find(col => (fieldName.prefix === '' || col.table_name.toLowerCase() === fieldName.prefix.toLowerCase()) && col.column_name.toLowerCase() === fieldName.name.toLowerCase());
|
@@ -554,18 +658,20 @@ function checkIsNullable(where_clause, field) {
|
|
554
658
|
const col = Object.assign(Object.assign({}, field), { is_nullable: !isNotNullResult });
|
555
659
|
return col;
|
556
660
|
}
|
557
|
-
function traverse_from_clause(from_clause,
|
661
|
+
function traverse_from_clause(from_clause, context, traverseResult) {
|
558
662
|
const from_list = from_clause.from_list();
|
559
663
|
if (from_list) {
|
560
|
-
return traverse_from_list(from_list,
|
664
|
+
return traverse_from_list(from_list, context, traverseResult);
|
561
665
|
}
|
562
666
|
return [];
|
563
667
|
}
|
564
|
-
function traverse_from_list(from_list,
|
565
|
-
const newColumns = from_list.table_ref_list().flatMap(table_ref => traverse_table_ref(table_ref,
|
668
|
+
function traverse_from_list(from_list, context, traverseResult) {
|
669
|
+
const newColumns = from_list.table_ref_list().flatMap(table_ref => traverse_table_ref(table_ref, context, traverseResult));
|
566
670
|
return newColumns;
|
567
671
|
}
|
568
|
-
function traverse_table_ref(table_ref,
|
672
|
+
function traverse_table_ref(table_ref, context, traverseResult) {
|
673
|
+
var _a, _b;
|
674
|
+
const { fromColumns, dbSchema } = context;
|
569
675
|
const allColumns = [];
|
570
676
|
const relation_expr = table_ref.relation_expr();
|
571
677
|
const aliasClause = table_ref.alias_clause();
|
@@ -573,8 +679,23 @@ function traverse_table_ref(table_ref, dbSchema, fromColumns, traverseResult) {
|
|
573
679
|
if (relation_expr) {
|
574
680
|
const tableName = traverse_relation_expr(relation_expr, dbSchema);
|
575
681
|
const tableNameWithAlias = alias ? alias : tableName.name;
|
576
|
-
const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName.name)
|
682
|
+
const fromColumnsResult = fromColumns.concat(dbSchema).filter(col => col.table_name === tableName.name)
|
683
|
+
.map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
|
577
684
|
allColumns.push(...fromColumnsResult);
|
685
|
+
if (context.generateNestedInfo) {
|
686
|
+
const key = fromColumnsResult.filter(col => col.column_key === 'PRI');
|
687
|
+
const renameAs = (aliasClause === null || aliasClause === void 0 ? void 0 : aliasClause.AS()) != null;
|
688
|
+
const relation = {
|
689
|
+
name: tableName.name,
|
690
|
+
alias: alias || '',
|
691
|
+
renameAs,
|
692
|
+
parentRelation: '',
|
693
|
+
joinColumn: ((_a = key[0]) === null || _a === void 0 ? void 0 : _a.column_name) || '',
|
694
|
+
cardinality: 'one',
|
695
|
+
parentCardinality: 'one'
|
696
|
+
};
|
697
|
+
(_b = traverseResult.relations) === null || _b === void 0 ? void 0 : _b.push(relation);
|
698
|
+
}
|
578
699
|
}
|
579
700
|
const table_ref_list = table_ref.table_ref_list();
|
580
701
|
const join_type_list = table_ref.join_type_list();
|
@@ -583,36 +704,67 @@ function traverse_table_ref(table_ref, dbSchema, fromColumns, traverseResult) {
|
|
583
704
|
const joinColumns = table_ref_list.flatMap((table_ref, joinIndex) => {
|
584
705
|
const joinType = join_type_list[joinIndex]; //INNER, LEFT
|
585
706
|
const joinQual = join_qual_list[joinIndex];
|
586
|
-
const joinColumns = traverse_table_ref(table_ref,
|
707
|
+
const joinColumns = traverse_table_ref(table_ref, context, traverseResult);
|
587
708
|
const isUsing = (joinQual === null || joinQual === void 0 ? void 0 : joinQual.USING()) ? true : false;
|
588
709
|
const isLeftJoin = joinType === null || joinType === void 0 ? void 0 : joinType.LEFT();
|
589
710
|
const filteredColumns = isUsing ? filterUsingColumns(joinColumns, joinQual) : joinColumns;
|
590
711
|
const resultColumns = isLeftJoin ? filteredColumns.map(col => (Object.assign(Object.assign({}, col), { is_nullable: true }))) : filteredColumns;
|
712
|
+
if (context.generateNestedInfo) {
|
713
|
+
collectNestedInfo(joinQual, resultColumns, traverseResult);
|
714
|
+
}
|
591
715
|
return resultColumns;
|
592
716
|
});
|
593
717
|
allColumns.push(...joinColumns);
|
594
718
|
}
|
595
719
|
const select_with_parens = table_ref.select_with_parens();
|
596
720
|
if (select_with_parens) {
|
597
|
-
const columns = traverse_select_with_parens(select_with_parens,
|
721
|
+
const columns = traverse_select_with_parens(select_with_parens, context, traverseResult);
|
598
722
|
const withAlias = columns.map(col => (Object.assign(Object.assign({}, col), { table_name: alias || col.table_name })));
|
599
723
|
return withAlias;
|
600
724
|
}
|
601
725
|
return allColumns;
|
602
726
|
}
|
727
|
+
function collectNestedInfo(joinQual, resultColumns, traverseResult) {
|
728
|
+
var _a;
|
729
|
+
const a_expr_or_list = joinQual ? collectContextsOfType(joinQual, PostgreSQLParser_1.A_expr_orContext) : [];
|
730
|
+
if (a_expr_or_list.length == 1) {
|
731
|
+
const a_expr_or = a_expr_or_list[0];
|
732
|
+
const a_expr_and = a_expr_or.a_expr_and_list()[0];
|
733
|
+
const columnref = collectContextsOfType(a_expr_and, PostgreSQLParser_1.ColumnrefContext);
|
734
|
+
const joinColumns = columnref.map(colRef => (0, select_columns_1.splitName)(colRef.getText()));
|
735
|
+
const currentRelation = (_a = traverseResult.relations) === null || _a === void 0 ? void 0 : _a.at(-1);
|
736
|
+
joinColumns.forEach(joinRef => {
|
737
|
+
if (currentRelation) {
|
738
|
+
const joinColumn = resultColumns.filter(col => col.column_name === joinRef.name)[0];
|
739
|
+
const unique = joinColumn && (joinColumn.column_key === 'PRI' || joinColumn.column_key === 'UNI');
|
740
|
+
if (joinRef.prefix === currentRelation.name || joinRef.prefix === currentRelation.alias) {
|
741
|
+
if (!unique) {
|
742
|
+
currentRelation.cardinality = 'many';
|
743
|
+
}
|
744
|
+
}
|
745
|
+
else {
|
746
|
+
currentRelation.parentRelation = joinRef.prefix;
|
747
|
+
if (!unique) {
|
748
|
+
currentRelation.parentCardinality = 'many';
|
749
|
+
}
|
750
|
+
}
|
751
|
+
}
|
752
|
+
});
|
753
|
+
}
|
754
|
+
}
|
603
755
|
function filterUsingColumns(fromColumns, joinQual) {
|
604
756
|
const excludeList = joinQual.name_list().name_list().map(name => (0, select_columns_1.splitName)(name.getText()));
|
605
757
|
const filteredColumns = excludeColumns(fromColumns, excludeList);
|
606
758
|
return filteredColumns;
|
607
759
|
}
|
608
|
-
function traverse_select_with_parens(select_with_parens,
|
760
|
+
function traverse_select_with_parens(select_with_parens, context, traverseResult) {
|
609
761
|
const select_with_parens2 = select_with_parens.select_with_parens();
|
610
762
|
if (select_with_parens2) {
|
611
|
-
return traverse_select_with_parens(select_with_parens2,
|
763
|
+
return traverse_select_with_parens(select_with_parens2, context, traverseResult);
|
612
764
|
}
|
613
765
|
const select_no_parens = select_with_parens.select_no_parens();
|
614
766
|
if (select_no_parens) {
|
615
|
-
return traverse_select_no_parens(select_no_parens,
|
767
|
+
return traverse_select_no_parens(select_no_parens, context, traverseResult);
|
616
768
|
}
|
617
769
|
return [];
|
618
770
|
}
|
@@ -696,20 +848,25 @@ function traverseInsertstmt(insertstmt, dbSchema) {
|
|
696
848
|
const insertColumnsList = insert_rest.insert_column_list()
|
697
849
|
.insert_column_item_list()
|
698
850
|
.map(insert_column_item => traverse_insert_column_item(insert_column_item, insertColumns));
|
851
|
+
const context = {
|
852
|
+
dbSchema,
|
853
|
+
fromColumns: insertColumns,
|
854
|
+
generateNestedInfo: false
|
855
|
+
};
|
699
856
|
const selectstmt = insert_rest.selectstmt();
|
700
|
-
traverse_insert_select_stmt(selectstmt,
|
857
|
+
traverse_insert_select_stmt(selectstmt, Object.assign(Object.assign({}, context), { fromColumns: insertColumnsList }), traverseResult);
|
701
858
|
const on_conflict = insertstmt.on_conflict_();
|
702
859
|
if (on_conflict) {
|
703
860
|
const set_clause_list = on_conflict.set_clause_list().set_clause_list() || [];
|
704
|
-
set_clause_list.forEach(set_clause => traverse_set_clause(set_clause,
|
861
|
+
set_clause_list.forEach(set_clause => traverse_set_clause(set_clause, context, traverseResult));
|
705
862
|
}
|
706
863
|
const returning_clause = insertstmt.returning_clause();
|
707
|
-
const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(),
|
864
|
+
const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), context, traverseResult) : [];
|
708
865
|
const result = {
|
709
866
|
queryType: 'Insert',
|
710
867
|
multipleRowsResult: false,
|
711
868
|
parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
|
712
|
-
|
869
|
+
columns: returninColumns,
|
713
870
|
parameterList: []
|
714
871
|
};
|
715
872
|
if (returning_clause) {
|
@@ -717,7 +874,7 @@ function traverseInsertstmt(insertstmt, dbSchema) {
|
|
717
874
|
}
|
718
875
|
return result;
|
719
876
|
}
|
720
|
-
function traverse_insert_select_stmt(selectstmt,
|
877
|
+
function traverse_insert_select_stmt(selectstmt, context, traverseResult) {
|
721
878
|
var _a, _b, _c, _d, _e;
|
722
879
|
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];
|
723
880
|
if (simple_select) {
|
@@ -726,68 +883,93 @@ function traverse_insert_select_stmt(selectstmt, dbSchema, insertColumnlist, tra
|
|
726
883
|
const values_clause = simple_select_pramary.values_clause();
|
727
884
|
if (values_clause) {
|
728
885
|
values_clause.expr_list_list()
|
729
|
-
.forEach(expr_list => traverse_insert_a_expr_list(expr_list,
|
886
|
+
.forEach(expr_list => traverse_insert_a_expr_list(expr_list, context, traverseResult));
|
730
887
|
}
|
731
888
|
const target_list = (_e = simple_select_pramary.target_list_()) === null || _e === void 0 ? void 0 : _e.target_list();
|
732
889
|
if (target_list) {
|
733
890
|
const from_clause = simple_select_pramary.from_clause();
|
734
|
-
const fromColumns = from_clause ? traverse_from_clause(from_clause,
|
891
|
+
const fromColumns = from_clause ? traverse_from_clause(from_clause, Object.assign(Object.assign({}, context), { fromColumns: [] }), traverseResult) : [];
|
735
892
|
target_list.target_el_list().forEach((target_el, index) => {
|
736
|
-
const targetResult = isNotNull_target_el(target_el,
|
893
|
+
const targetResult = isNotNull_target_el(target_el, Object.assign(Object.assign({}, context), { fromColumns }), traverseResult);
|
737
894
|
if (isParameter(targetResult.column_name)) {
|
738
|
-
traverseResult.parameters.at(-1).isNotNull = !
|
895
|
+
traverseResult.parameters.at(-1).isNotNull = !context.fromColumns[index].is_nullable;
|
739
896
|
}
|
740
897
|
});
|
741
898
|
}
|
742
899
|
}
|
743
900
|
}
|
744
901
|
}
|
745
|
-
function traverse_insert_a_expr_list(expr_list,
|
902
|
+
function traverse_insert_a_expr_list(expr_list, context, traverseResult) {
|
746
903
|
expr_list.a_expr_list().forEach((a_expr, index) => {
|
747
|
-
const result = traverse_a_expr(a_expr,
|
904
|
+
const result = traverse_a_expr(a_expr, context, traverseResult);
|
748
905
|
if (isParameter(result.column_name)) {
|
749
|
-
traverseResult.parameters.at(-1).isNotNull = !
|
906
|
+
traverseResult.parameters.at(-1).isNotNull = !context.fromColumns[index].is_nullable;
|
750
907
|
}
|
751
908
|
});
|
752
909
|
}
|
753
910
|
function traverseDeletestmt(deleteStmt, dbSchema, traverseResult) {
|
754
|
-
|
911
|
+
const relation_expr = deleteStmt.relation_expr_opt_alias().relation_expr();
|
912
|
+
const tableName = relation_expr.getText();
|
913
|
+
const deleteColumns = dbSchema.filter(col => col.table_name === tableName);
|
914
|
+
const returning_clause = deleteStmt.returning_clause();
|
915
|
+
const context = {
|
916
|
+
dbSchema,
|
917
|
+
fromColumns: deleteColumns,
|
918
|
+
generateNestedInfo: false
|
919
|
+
};
|
920
|
+
const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), context, traverseResult) : [];
|
921
|
+
const result = {
|
755
922
|
queryType: 'Delete',
|
756
923
|
multipleRowsResult: false,
|
757
924
|
parametersNullability: traverseResult.parameters.map(param => param.isNotNull),
|
758
|
-
|
925
|
+
columns: returninColumns,
|
759
926
|
parameterList: []
|
760
927
|
};
|
928
|
+
if (returning_clause) {
|
929
|
+
result.returning = true;
|
930
|
+
}
|
931
|
+
return result;
|
761
932
|
}
|
762
933
|
function traverseUpdatestmt(updatestmt, dbSchema, traverseResult) {
|
763
934
|
const relation_expr_opt_alias = updatestmt.relation_expr_opt_alias();
|
764
935
|
const tableName = relation_expr_opt_alias.getText();
|
765
936
|
const updateColumns = dbSchema.filter(col => col.table_name === tableName);
|
937
|
+
const context = {
|
938
|
+
dbSchema,
|
939
|
+
fromColumns: updateColumns,
|
940
|
+
generateNestedInfo: false
|
941
|
+
};
|
766
942
|
updatestmt.set_clause_list().set_clause_list()
|
767
|
-
.forEach(set_clause => traverse_set_clause(set_clause,
|
943
|
+
.forEach(set_clause => traverse_set_clause(set_clause, context, traverseResult));
|
768
944
|
const parametersBefore = traverseResult.parameters.length;
|
769
945
|
const where_clause = updatestmt.where_or_current_clause();
|
770
946
|
if (where_clause) {
|
771
947
|
const a_expr = where_clause.a_expr();
|
772
|
-
traverse_a_expr(a_expr,
|
948
|
+
traverse_a_expr(a_expr, context, traverseResult);
|
773
949
|
}
|
774
950
|
const whereParameters = traverseResult.parameters.slice(parametersBefore);
|
775
|
-
|
951
|
+
const returning_clause = updatestmt.returning_clause();
|
952
|
+
const returninColumns = returning_clause ? traverse_target_list(returning_clause.target_list(), context, traverseResult) : [];
|
953
|
+
const result = {
|
776
954
|
queryType: 'Update',
|
777
955
|
multipleRowsResult: false,
|
778
956
|
parametersNullability: traverseResult.parameters.slice(0, parametersBefore).map(param => param.isNotNull),
|
779
|
-
|
957
|
+
columns: returninColumns,
|
780
958
|
parameterList: [],
|
781
959
|
whereParamtersNullability: whereParameters.map(param => param.isNotNull)
|
782
960
|
};
|
961
|
+
if (returning_clause) {
|
962
|
+
result.returning = true;
|
963
|
+
}
|
964
|
+
return result;
|
783
965
|
}
|
784
|
-
function traverse_set_clause(set_clause,
|
966
|
+
function traverse_set_clause(set_clause, context, traverseResult) {
|
785
967
|
const set_target = set_clause.set_target();
|
786
968
|
const columnName = (0, select_columns_1.splitName)(set_target.getText());
|
787
|
-
const column = findColumn(columnName,
|
969
|
+
const column = findColumn(columnName, context.fromColumns);
|
788
970
|
const a_expr = set_clause.a_expr();
|
789
|
-
const excludedColumns =
|
790
|
-
const a_exprResult = traverse_a_expr(a_expr,
|
971
|
+
const excludedColumns = context.fromColumns.map((col) => (Object.assign(Object.assign({}, col), { table_name: 'excluded' })));
|
972
|
+
const a_exprResult = traverse_a_expr(a_expr, Object.assign(Object.assign({}, context), { fromColumns: context.fromColumns.concat(excludedColumns) }), traverseResult);
|
791
973
|
if (isParameter(a_exprResult.column_name)) {
|
792
974
|
traverseResult.parameters[traverseResult.parameters.length - 1].isNotNull = !column.is_nullable;
|
793
975
|
}
|