typesql-cli 0.14.2 → 0.15.0-experimental.1
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 +9 -0
- package/cli.js.map +1 -1
- package/code-generator.d.ts.map +1 -1
- package/code-generator.js +7 -0
- package/code-generator.js.map +1 -1
- package/code-generator2.d.ts +4 -0
- package/code-generator2.d.ts.map +1 -0
- package/code-generator2.js +219 -0
- package/code-generator2.js.map +1 -0
- package/describe-nested-query.d.ts +1 -1
- package/describe-nested-query.d.ts.map +1 -1
- package/describe-nested-query.js +4 -4
- package/describe-nested-query.js.map +1 -1
- package/describe-query.d.ts +1 -1
- package/describe-query.d.ts.map +1 -1
- package/describe-query.js +14 -4
- package/describe-query.js.map +1 -1
- package/dialects/postgres.d.ts +5 -0
- package/dialects/postgres.d.ts.map +1 -0
- package/dialects/postgres.js +91 -0
- package/dialects/postgres.js.map +1 -0
- package/drivers/postgres.d.ts +12 -0
- package/drivers/postgres.d.ts.map +1 -0
- package/drivers/postgres.js +109 -0
- package/drivers/postgres.js.map +1 -0
- package/drivers/types.d.ts +27 -0
- package/drivers/types.d.ts.map +1 -0
- package/drivers/types.js +3 -0
- package/drivers/types.js.map +1 -0
- package/mysql-mapping.d.ts +3 -3
- package/mysql-mapping.d.ts.map +1 -1
- package/mysql-query-analyzer/collect-constraints.d.ts +2 -2
- package/mysql-query-analyzer/collect-constraints.d.ts.map +1 -1
- package/mysql-query-analyzer/infer-column-nullability.d.ts +1 -1
- package/mysql-query-analyzer/infer-column-nullability.d.ts.map +1 -1
- package/mysql-query-analyzer/infer-column-nullability.js +29 -29
- package/mysql-query-analyzer/infer-column-nullability.js.map +1 -1
- package/mysql-query-analyzer/infer-param-nullability.d.ts +2 -2
- package/mysql-query-analyzer/infer-param-nullability.d.ts.map +1 -1
- package/mysql-query-analyzer/infer-param-nullability.js +6 -5
- package/mysql-query-analyzer/infer-param-nullability.js.map +1 -1
- package/mysql-query-analyzer/parse.d.ts +3 -2
- package/mysql-query-analyzer/parse.d.ts.map +1 -1
- package/mysql-query-analyzer/parse.js +16 -36
- package/mysql-query-analyzer/parse.js.map +1 -1
- package/mysql-query-analyzer/select-columns.d.ts +3 -3
- package/mysql-query-analyzer/select-columns.d.ts.map +1 -1
- package/mysql-query-analyzer/select-columns.js +33 -33
- package/mysql-query-analyzer/select-columns.js.map +1 -1
- package/mysql-query-analyzer/traverse.d.ts +1 -1
- package/mysql-query-analyzer/traverse.d.ts.map +1 -1
- package/mysql-query-analyzer/traverse.js +36 -36
- package/mysql-query-analyzer/traverse.js.map +1 -1
- package/mysql-query-analyzer/types.d.ts.map +1 -1
- package/mysql-query-analyzer/verify-multiple-result.d.ts +1 -1
- package/mysql-query-analyzer/verify-multiple-result.d.ts.map +1 -1
- package/mysql-query-analyzer/verify-multiple-result.js +7 -7
- package/mysql-query-analyzer/verify-multiple-result.js.map +1 -1
- package/package.json +52 -49
- package/postgres-query-analyzer/describe.d.ts +8 -0
- package/postgres-query-analyzer/describe.d.ts.map +1 -0
- package/postgres-query-analyzer/describe.js +100 -0
- package/postgres-query-analyzer/describe.js.map +1 -0
- package/postgres-query-analyzer/parser.d.ts +11 -0
- package/postgres-query-analyzer/parser.d.ts.map +1 -0
- package/postgres-query-analyzer/parser.js +11 -0
- package/postgres-query-analyzer/parser.js.map +1 -0
- package/postgres-query-analyzer/traverse.d.ts +5 -0
- package/postgres-query-analyzer/traverse.d.ts.map +1 -0
- package/postgres-query-analyzer/traverse.js +702 -0
- package/postgres-query-analyzer/traverse.js.map +1 -0
- package/sqlite-query-analyzer/code-generator.js +8 -1
- package/sqlite-query-analyzer/code-generator.js.map +1 -1
- package/sqlite-query-analyzer/enum-parser.js +1 -1
- package/sqlite-query-analyzer/enum-parser.js.map +1 -1
- package/sqlite-query-analyzer/parser.js +2 -2
- package/sqlite-query-analyzer/parser.js.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.d.ts +2 -0
- package/sqlite-query-analyzer/replace-list-params.d.ts.map +1 -1
- package/sqlite-query-analyzer/replace-list-params.js +39 -0
- package/sqlite-query-analyzer/replace-list-params.js.map +1 -1
- package/sqlite-query-analyzer/traverse.d.ts +1 -1
- package/sqlite-query-analyzer/traverse.d.ts.map +1 -1
- package/sqlite-query-analyzer/traverse.js +1 -1
- package/sqlite-query-analyzer/traverse.js.map +1 -1
- package/sqlite-query-analyzer/types.d.ts +1 -0
- package/sqlite-query-analyzer/types.d.ts.map +1 -1
- package/types.d.ts +10 -5
- package/types.d.ts.map +1 -1
@@ -0,0 +1,702 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.traverseSmt = traverseSmt;
|
4
|
+
const PostgreSQLParser_1 = require("@wsporto/typesql-parser/postgres/PostgreSQLParser");
|
5
|
+
const typesql_parser_1 = require("@wsporto/typesql-parser");
|
6
|
+
const select_columns_1 = require("../mysql-query-analyzer/select-columns");
|
7
|
+
function traverseSmt(stmt, dbSchema) {
|
8
|
+
const traverseResult = {
|
9
|
+
columnsNullability: [],
|
10
|
+
parametersNullability: []
|
11
|
+
};
|
12
|
+
const selectstmt = stmt.selectstmt();
|
13
|
+
if (selectstmt) {
|
14
|
+
const result = traverseSelectstmt(selectstmt, dbSchema, traverseResult);
|
15
|
+
return result;
|
16
|
+
}
|
17
|
+
const insertstmt = stmt.insertstmt();
|
18
|
+
if (insertstmt) {
|
19
|
+
return traverseInsertstmt(insertstmt, dbSchema);
|
20
|
+
}
|
21
|
+
const updatestmt = stmt.updatestmt();
|
22
|
+
if (updatestmt) {
|
23
|
+
return traverseUpdatestmt(updatestmt, dbSchema, traverseResult);
|
24
|
+
}
|
25
|
+
const deletestmt = stmt.deletestmt();
|
26
|
+
if (deletestmt) {
|
27
|
+
return traverseDeletestmt(deletestmt, dbSchema, traverseResult);
|
28
|
+
}
|
29
|
+
throw Error('Stmt not supported: ' + stmt.getText());
|
30
|
+
}
|
31
|
+
function collectContextsOfType(ctx, targetType) {
|
32
|
+
var _a;
|
33
|
+
const results = [];
|
34
|
+
if (ctx instanceof targetType) {
|
35
|
+
results.push(ctx);
|
36
|
+
}
|
37
|
+
(_a = ctx.children) === null || _a === void 0 ? void 0 : _a.forEach(child => {
|
38
|
+
if (child instanceof typesql_parser_1.ParserRuleContext) {
|
39
|
+
results.push(...collectContextsOfType(child, targetType));
|
40
|
+
}
|
41
|
+
});
|
42
|
+
return results;
|
43
|
+
}
|
44
|
+
function traverseSelectstmt(selectstmt, dbSchema, traverseResult) {
|
45
|
+
const result = collectContextsOfType(selectstmt, PostgreSQLParser_1.C_expr_exprContext).filter(c_expr => c_expr.PARAM());
|
46
|
+
const paramIsListResult = result.map(param => paramIsList(param));
|
47
|
+
const columns = traverse_selectstmt(selectstmt, dbSchema, traverseResult);
|
48
|
+
const columnsNullability = columns.map(col => !col.is_nullable);
|
49
|
+
return {
|
50
|
+
queryType: 'Select',
|
51
|
+
columnsNullability,
|
52
|
+
parametersNullability: [],
|
53
|
+
parameterList: paramIsListResult
|
54
|
+
};
|
55
|
+
}
|
56
|
+
function traverse_selectstmt(selectstmt, dbSchema, traverseResult) {
|
57
|
+
const select_no_parens = selectstmt.select_no_parens();
|
58
|
+
if (select_no_parens) {
|
59
|
+
return traverse_select_no_parens(select_no_parens, dbSchema, traverseResult);
|
60
|
+
}
|
61
|
+
return [];
|
62
|
+
}
|
63
|
+
function traverse_select_no_parens(select_no_parens, dbSchema, traverseResult) {
|
64
|
+
const select_clause = select_no_parens.select_clause();
|
65
|
+
if (select_clause) {
|
66
|
+
return traverse_select_clause(select_clause, dbSchema, traverseResult);
|
67
|
+
}
|
68
|
+
return [];
|
69
|
+
}
|
70
|
+
function traverse_select_clause(select_clause, dbSchema, traverseResult) {
|
71
|
+
const simple_select_intersect_list = select_clause.simple_select_intersect_list();
|
72
|
+
let selectColumns = [];
|
73
|
+
if (simple_select_intersect_list) {
|
74
|
+
selectColumns = traverse_simple_select_intersect(simple_select_intersect_list[0], dbSchema, traverseResult);
|
75
|
+
}
|
76
|
+
//union
|
77
|
+
for (let index = 1; index < simple_select_intersect_list.length; index++) {
|
78
|
+
const unionNotNull = traverse_simple_select_intersect(simple_select_intersect_list[index], dbSchema, traverseResult);
|
79
|
+
selectColumns = selectColumns.map((value, columnIndex) => {
|
80
|
+
const col = Object.assign(Object.assign({}, value), { is_nullable: value.is_nullable || unionNotNull[columnIndex].is_nullable });
|
81
|
+
return col;
|
82
|
+
});
|
83
|
+
}
|
84
|
+
return selectColumns;
|
85
|
+
}
|
86
|
+
function traverse_simple_select_intersect(simple_select_intersect, dbSchema, traverseResult) {
|
87
|
+
const simple_select_pramary = simple_select_intersect.simple_select_pramary_list()[0];
|
88
|
+
if (simple_select_pramary) {
|
89
|
+
return traverse_simple_select_pramary(simple_select_pramary, dbSchema, traverseResult);
|
90
|
+
}
|
91
|
+
return [];
|
92
|
+
}
|
93
|
+
function traverse_simple_select_pramary(simple_select_pramary, dbSchema, traverseResult) {
|
94
|
+
const fromColumns = [];
|
95
|
+
const from_clause = simple_select_pramary.from_clause();
|
96
|
+
if (from_clause) {
|
97
|
+
const where_clause = simple_select_pramary.where_clause();
|
98
|
+
const fields = traverse_from_clause(from_clause, dbSchema, traverseResult);
|
99
|
+
const fieldsNotNull = where_clause != null ? fields.map(field => checkIsNullable(where_clause, field)) : fields;
|
100
|
+
fromColumns.push(...fieldsNotNull);
|
101
|
+
}
|
102
|
+
const filteredColumns = filterColumns_simple_select_pramary(simple_select_pramary, fromColumns, traverseResult);
|
103
|
+
return filteredColumns;
|
104
|
+
}
|
105
|
+
function filterColumns_simple_select_pramary(simple_select_pramary, fromColumns, traverseResult) {
|
106
|
+
const target_list_ = simple_select_pramary.target_list_();
|
107
|
+
if (target_list_) {
|
108
|
+
const target_list = target_list_.target_list();
|
109
|
+
if (target_list) {
|
110
|
+
return filterColumns_target_list(target_list, fromColumns, traverseResult);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
return [];
|
114
|
+
}
|
115
|
+
function filterColumns_target_list(target_list, fromColumns, traverseResult) {
|
116
|
+
const columns = target_list.target_el_list().flatMap(target_el => {
|
117
|
+
const fieldName = (0, select_columns_1.splitName)(target_el.getText());
|
118
|
+
if (fieldName.name == '*') {
|
119
|
+
const columns = filterColumns(fromColumns, fieldName);
|
120
|
+
return columns;
|
121
|
+
}
|
122
|
+
const column = isNotNull_target_el(target_el, fromColumns, traverseResult);
|
123
|
+
return [column];
|
124
|
+
});
|
125
|
+
return columns;
|
126
|
+
}
|
127
|
+
function isNotNull_target_el(target_el, fromColumns, traverseResult) {
|
128
|
+
if (target_el instanceof PostgreSQLParser_1.Target_labelContext) {
|
129
|
+
const a_expr = target_el.a_expr();
|
130
|
+
const isNotNull = traverse_a_expr(a_expr, fromColumns, traverseResult);
|
131
|
+
const colLabel = target_el.colLabel();
|
132
|
+
const alias = colLabel != null ? colLabel.getText() : '';
|
133
|
+
return {
|
134
|
+
column_name: alias || a_expr.getText(),
|
135
|
+
is_nullable: !isNotNull,
|
136
|
+
table_name: '',
|
137
|
+
table_schema: ''
|
138
|
+
};
|
139
|
+
}
|
140
|
+
throw Error('Column not found');
|
141
|
+
}
|
142
|
+
function traverse_a_expr(a_expr, fromColumns, traverseResult) {
|
143
|
+
const a_expr_qual = a_expr.a_expr_qual();
|
144
|
+
if (a_expr_qual) {
|
145
|
+
return traverse_a_expr_qual(a_expr_qual, fromColumns, traverseResult);
|
146
|
+
}
|
147
|
+
return false;
|
148
|
+
}
|
149
|
+
function traverse_a_expr_qual(a_expr_qual, fromColumns, traverseResult) {
|
150
|
+
const a_expr_lessless = a_expr_qual.a_expr_lessless();
|
151
|
+
if (a_expr_lessless) {
|
152
|
+
return traverse_a_expr_lessless(a_expr_lessless, fromColumns, traverseResult);
|
153
|
+
}
|
154
|
+
return false;
|
155
|
+
}
|
156
|
+
function traverse_a_expr_lessless(a_expr_lessless, fromColumns, traverseResult) {
|
157
|
+
const a_expr_or = a_expr_lessless.a_expr_or_list()[0];
|
158
|
+
if (a_expr_or) {
|
159
|
+
return traverse_expr_or(a_expr_or, fromColumns, traverseResult);
|
160
|
+
}
|
161
|
+
return false;
|
162
|
+
}
|
163
|
+
function traverse_expr_or(a_expr_or, fromColumns, traverseResult) {
|
164
|
+
const a_expr_and = a_expr_or.a_expr_and_list()[0];
|
165
|
+
if (a_expr_and) {
|
166
|
+
return traverse_expr_and(a_expr_and, fromColumns, traverseResult);
|
167
|
+
}
|
168
|
+
return false;
|
169
|
+
}
|
170
|
+
function traverse_expr_and(a_expr_and, fromColumns, traverseResult) {
|
171
|
+
const a_expr_between = a_expr_and.a_expr_between_list()[0];
|
172
|
+
if (a_expr_between) {
|
173
|
+
return traverse_expr_between(a_expr_between, fromColumns, traverseResult);
|
174
|
+
}
|
175
|
+
return false;
|
176
|
+
}
|
177
|
+
function traverse_expr_between(a_expr_between, fromColumns, traverseResult) {
|
178
|
+
const a_expr_in = a_expr_between.a_expr_in_list()[0];
|
179
|
+
if (a_expr_in) {
|
180
|
+
return traverse_expr_in(a_expr_in, fromColumns, traverseResult);
|
181
|
+
}
|
182
|
+
return false;
|
183
|
+
}
|
184
|
+
function traverse_expr_in(a_expr_in, fromColumns, traverseResult) {
|
185
|
+
const a_expr_unary = a_expr_in.a_expr_unary_not();
|
186
|
+
if (a_expr_unary) {
|
187
|
+
return traverse_expr_unary(a_expr_unary, fromColumns, traverseResult);
|
188
|
+
}
|
189
|
+
return false;
|
190
|
+
}
|
191
|
+
function traverse_expr_unary(a_expr_unary, fromColumns, traverseResult) {
|
192
|
+
const a_expr_isnull = a_expr_unary.a_expr_isnull();
|
193
|
+
if (a_expr_isnull) {
|
194
|
+
return traverse_expr_isnull(a_expr_isnull, fromColumns, traverseResult);
|
195
|
+
}
|
196
|
+
return false;
|
197
|
+
}
|
198
|
+
function traverse_expr_isnull(a_expr_isnull, fromColumns, traverseResult) {
|
199
|
+
const a_expr_is_not = a_expr_isnull.a_expr_is_not();
|
200
|
+
if (a_expr_is_not) {
|
201
|
+
return traverse_expr_is_not(a_expr_is_not, fromColumns, traverseResult);
|
202
|
+
}
|
203
|
+
return false;
|
204
|
+
}
|
205
|
+
function traverse_expr_is_not(a_expr_is_not, fromColumns, traverseResult) {
|
206
|
+
const a_expr_compare = a_expr_is_not.a_expr_compare();
|
207
|
+
if (a_expr_compare) {
|
208
|
+
return traverse_expr_compare(a_expr_compare, fromColumns, traverseResult);
|
209
|
+
}
|
210
|
+
return false;
|
211
|
+
}
|
212
|
+
function traverse_expr_compare(a_expr_compare, fromColumns, traverseResult) {
|
213
|
+
const a_expr_like = a_expr_compare.a_expr_like_list()[0];
|
214
|
+
if (a_expr_like) {
|
215
|
+
return traverse_expr_like(a_expr_like, fromColumns, traverseResult);
|
216
|
+
}
|
217
|
+
return false;
|
218
|
+
}
|
219
|
+
function traverse_expr_like(a_expr_like, fromColumns, traverseResult) {
|
220
|
+
const a_expr_qual_op = a_expr_like.a_expr_qual_op_list()[0];
|
221
|
+
if (a_expr_qual_op) {
|
222
|
+
return traverse_expr_qual_op(a_expr_qual_op, fromColumns, traverseResult);
|
223
|
+
}
|
224
|
+
return false;
|
225
|
+
}
|
226
|
+
function traverse_expr_qual_op(a_expr_qual_op, fromColumns, traverseResult) {
|
227
|
+
const a_expr_unary_qualop = a_expr_qual_op.a_expr_unary_qualop_list()[0];
|
228
|
+
if (a_expr_unary_qualop) {
|
229
|
+
return traverse_expr_unary_qualop(a_expr_unary_qualop, fromColumns, traverseResult);
|
230
|
+
}
|
231
|
+
return false;
|
232
|
+
}
|
233
|
+
function traverse_expr_unary_qualop(a_expr_unary_qualop, fromColumns, traverseResult) {
|
234
|
+
const a_expr_add = a_expr_unary_qualop.a_expr_add();
|
235
|
+
if (a_expr_add) {
|
236
|
+
const isNotNull = a_expr_add.a_expr_mul_list().every(a_expr_mul => traverse_expr_mul(a_expr_mul, fromColumns, traverseResult));
|
237
|
+
return isNotNull;
|
238
|
+
}
|
239
|
+
return false;
|
240
|
+
}
|
241
|
+
function traverse_expr_mul(a_expr_mul, fromColumns, traverseResult) {
|
242
|
+
const a_expr_mul_list = a_expr_mul.a_expr_caret_list();
|
243
|
+
if (a_expr_mul_list) {
|
244
|
+
return a_expr_mul.a_expr_caret_list().every(a_expr_caret => traverse_expr_caret(a_expr_caret, fromColumns, traverseResult));
|
245
|
+
}
|
246
|
+
return false;
|
247
|
+
}
|
248
|
+
function traverse_expr_caret(a_expr_caret, fromColumns, traverseResult) {
|
249
|
+
const a_expr_unary_sign_list = a_expr_caret.a_expr_unary_sign_list();
|
250
|
+
if (a_expr_unary_sign_list) {
|
251
|
+
return a_expr_caret.a_expr_unary_sign_list().every(a_expr_unary_sign => traverse_expr_unary_sign(a_expr_unary_sign, fromColumns, traverseResult));
|
252
|
+
;
|
253
|
+
}
|
254
|
+
return false;
|
255
|
+
}
|
256
|
+
function traverse_expr_unary_sign(a_expr_unary_sign, fromColumns, traverseResult) {
|
257
|
+
const a_expr_at_time_zone = a_expr_unary_sign.a_expr_at_time_zone();
|
258
|
+
if (a_expr_at_time_zone) {
|
259
|
+
return traverse_expr_at_time_zone(a_expr_at_time_zone, fromColumns, traverseResult);
|
260
|
+
}
|
261
|
+
return false;
|
262
|
+
}
|
263
|
+
function traverse_expr_at_time_zone(a_expr_at_time_zone, fromColumns, traverseResult) {
|
264
|
+
const a_expr_collate = a_expr_at_time_zone.a_expr_collate();
|
265
|
+
if (a_expr_collate) {
|
266
|
+
return traverse_expr_collate(a_expr_collate, fromColumns, traverseResult);
|
267
|
+
}
|
268
|
+
return false;
|
269
|
+
}
|
270
|
+
function traverse_expr_collate(a_expr_collate, fromColumns, traverseResult) {
|
271
|
+
const a_expr_typecast = a_expr_collate.a_expr_typecast();
|
272
|
+
if (a_expr_typecast) {
|
273
|
+
return traverse_expr_typecast(a_expr_typecast, fromColumns, traverseResult);
|
274
|
+
}
|
275
|
+
return false;
|
276
|
+
}
|
277
|
+
function traverse_expr_typecast(a_expr_typecast, fromColumns, traverseResult) {
|
278
|
+
const c_expr = a_expr_typecast.c_expr();
|
279
|
+
if (c_expr) {
|
280
|
+
return traversec_expr(c_expr, fromColumns, traverseResult);
|
281
|
+
}
|
282
|
+
return false;
|
283
|
+
}
|
284
|
+
function traversec_expr(c_expr, fromColumns, traverseResult) {
|
285
|
+
var _a;
|
286
|
+
if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
|
287
|
+
const columnref = c_expr.columnref();
|
288
|
+
if (columnref) {
|
289
|
+
const fieldName = (0, select_columns_1.splitName)(columnref.getText());
|
290
|
+
const col = findColumn(fieldName.name, fromColumns);
|
291
|
+
return !col.is_nullable;
|
292
|
+
}
|
293
|
+
const aexprconst = c_expr.aexprconst();
|
294
|
+
if (aexprconst) {
|
295
|
+
return aexprconst.NULL_P() === null;
|
296
|
+
}
|
297
|
+
if (c_expr.PARAM()) {
|
298
|
+
traverseResult.parametersNullability.push(false);
|
299
|
+
}
|
300
|
+
const func_application = (_a = c_expr.func_expr()) === null || _a === void 0 ? void 0 : _a.func_application();
|
301
|
+
if (func_application) {
|
302
|
+
return traversefunc_application(func_application, fromColumns, traverseResult);
|
303
|
+
}
|
304
|
+
}
|
305
|
+
if (c_expr instanceof PostgreSQLParser_1.C_expr_caseContext) {
|
306
|
+
return traversec_expr_case(c_expr, fromColumns, traverseResult);
|
307
|
+
}
|
308
|
+
return false;
|
309
|
+
}
|
310
|
+
function filterColumns(fromColumns, fieldName) {
|
311
|
+
return fromColumns.filter(col => (fieldName.prefix === '' || col.table_name === fieldName.prefix)
|
312
|
+
&& (fieldName.name === '*' || col.column_name === fieldName.name));
|
313
|
+
}
|
314
|
+
function traversec_expr_case(c_expr_case, fromColumns, traverseResult) {
|
315
|
+
var _a;
|
316
|
+
const case_expr = c_expr_case.case_expr();
|
317
|
+
const whenIsNotNull = case_expr.when_clause_list().when_clause_list().every(when_clause => traversewhen_clause(when_clause, fromColumns, traverseResult));
|
318
|
+
const elseExpr = (_a = case_expr.case_default()) === null || _a === void 0 ? void 0 : _a.a_expr();
|
319
|
+
const elseIsNotNull = elseExpr ? traverse_a_expr(elseExpr, fromColumns, traverseResult) : false;
|
320
|
+
return elseIsNotNull && whenIsNotNull;
|
321
|
+
}
|
322
|
+
function traversewhen_clause(when_clause, fromColumns, traverseResult) {
|
323
|
+
const a_expr_list = when_clause.a_expr_list();
|
324
|
+
const thenExprList = a_expr_list.filter((_, index) => index % 2 == 1);
|
325
|
+
return thenExprList.every(thenExpr => traverse_a_expr(thenExpr, fromColumns, traverseResult));
|
326
|
+
}
|
327
|
+
function traversefunc_application(func_application, fromColumns, traverseResult) {
|
328
|
+
const functionName = func_application.func_name().getText().toLowerCase();
|
329
|
+
if (functionName === 'count') {
|
330
|
+
return true;
|
331
|
+
}
|
332
|
+
if (functionName === 'concat') {
|
333
|
+
const func_arg_expr_list = func_application.func_arg_list().func_arg_expr_list();
|
334
|
+
if (func_arg_expr_list) {
|
335
|
+
return func_arg_expr_list.every(func_arg_expr => traversefunc_arg_expr(func_arg_expr, fromColumns, traverseResult));
|
336
|
+
}
|
337
|
+
return false;
|
338
|
+
}
|
339
|
+
return false;
|
340
|
+
}
|
341
|
+
function traversefunc_arg_expr(func_arg_expr, fromColumns, traverseResult) {
|
342
|
+
const a_expr = func_arg_expr.a_expr();
|
343
|
+
return traverse_a_expr(a_expr, fromColumns, traverseResult);
|
344
|
+
}
|
345
|
+
function findColumn(fieldName, fromColumns) {
|
346
|
+
const col = fromColumns.find(col => col.column_name === fieldName);
|
347
|
+
if (col == null) {
|
348
|
+
throw Error('Column not found: ' + fieldName);
|
349
|
+
}
|
350
|
+
return col;
|
351
|
+
}
|
352
|
+
function checkIsNullable(where_clause, field) {
|
353
|
+
const isNotNullResult = !field.is_nullable || isNotNull(field, where_clause);
|
354
|
+
const col = Object.assign(Object.assign({}, field), { is_nullable: !isNotNullResult });
|
355
|
+
return col;
|
356
|
+
}
|
357
|
+
function traverse_from_clause(from_clause, dbSchema, traverseResult) {
|
358
|
+
const from_list = from_clause.from_list();
|
359
|
+
if (from_list) {
|
360
|
+
return traverse_from_list(from_list, dbSchema, traverseResult);
|
361
|
+
}
|
362
|
+
return [];
|
363
|
+
}
|
364
|
+
function traverse_from_list(from_list, dbSchema, traverseResult) {
|
365
|
+
const fromColumns = from_list.table_ref_list().flatMap(table_ref => traverse_table_ref(table_ref, dbSchema, traverseResult));
|
366
|
+
return fromColumns;
|
367
|
+
}
|
368
|
+
function traverse_table_ref(table_ref, dbSchema, traverseResult) {
|
369
|
+
const allColumns = [];
|
370
|
+
const relation_expr = table_ref.relation_expr();
|
371
|
+
const aliasClause = table_ref.alias_clause();
|
372
|
+
const alias = aliasClause ? aliasClause.getText() : undefined;
|
373
|
+
if (relation_expr) {
|
374
|
+
const tableName = traverse_relation_expr(relation_expr, dbSchema);
|
375
|
+
const tableNameWithAlias = alias ? alias : tableName;
|
376
|
+
const fromColumns = dbSchema.filter(col => col.table_name === tableName).map(col => (Object.assign(Object.assign({}, col), { table_name: tableNameWithAlias })));
|
377
|
+
allColumns.push(...fromColumns);
|
378
|
+
}
|
379
|
+
const table_ref_list = table_ref.table_ref_list();
|
380
|
+
if (table_ref_list) {
|
381
|
+
const joinColumns = table_ref_list.flatMap(table_ref => traverse_table_ref(table_ref, dbSchema, traverseResult));
|
382
|
+
allColumns.push(...joinColumns);
|
383
|
+
}
|
384
|
+
const select_with_parens = table_ref.select_with_parens();
|
385
|
+
if (select_with_parens) {
|
386
|
+
return traverse_select_with_parens(select_with_parens, dbSchema, traverseResult);
|
387
|
+
}
|
388
|
+
return allColumns;
|
389
|
+
}
|
390
|
+
function traverse_join_qual(join_qual, dbSchema) {
|
391
|
+
const a = join_qual;
|
392
|
+
return [];
|
393
|
+
}
|
394
|
+
function traverse_select_with_parens(select_with_parens, dbSchema, traverseResult) {
|
395
|
+
const select_with_parens2 = select_with_parens.select_with_parens();
|
396
|
+
if (select_with_parens2) {
|
397
|
+
return traverse_select_with_parens(select_with_parens2, dbSchema, traverseResult);
|
398
|
+
}
|
399
|
+
const select_no_parens = select_with_parens.select_no_parens();
|
400
|
+
if (select_no_parens) {
|
401
|
+
return traverse_select_no_parens(select_no_parens, dbSchema, traverseResult);
|
402
|
+
}
|
403
|
+
return [];
|
404
|
+
}
|
405
|
+
function traverse_relation_expr(relation_expr, dbSchema) {
|
406
|
+
const qualified_name = relation_expr.qualified_name();
|
407
|
+
const name = traverse_qualified_name(qualified_name, dbSchema);
|
408
|
+
return name;
|
409
|
+
}
|
410
|
+
function traverse_qualified_name(qualified_name, dbSchema) {
|
411
|
+
const colid = qualified_name.colid();
|
412
|
+
if (colid) {
|
413
|
+
return traverse_colid(colid, dbSchema);
|
414
|
+
}
|
415
|
+
return '';
|
416
|
+
}
|
417
|
+
function traverse_colid(colid, dbSchema) {
|
418
|
+
const identifier = colid.identifier();
|
419
|
+
return traverse_identifier(identifier, dbSchema);
|
420
|
+
}
|
421
|
+
function traverse_identifier(identifier, dbSchema) {
|
422
|
+
const tableName = identifier.Identifier().getText();
|
423
|
+
return tableName;
|
424
|
+
}
|
425
|
+
function paramIsList(c_expr) {
|
426
|
+
// Traverse up the parent chain until we find an IN clause
|
427
|
+
// This guarentee the param is a direct child of the in clause. Ex. id IN ($1);
|
428
|
+
// Must return false for nested expressions. Ex. id IN (1, 2, CASE WHEN id = 1 THEN $1 ELSE $2);
|
429
|
+
const a_expr_typecast = c_expr.parentCtx;
|
430
|
+
const a_expr_collate = a_expr_typecast === null || a_expr_typecast === void 0 ? void 0 : a_expr_typecast.parentCtx;
|
431
|
+
const a_expr_at_time_zone = a_expr_collate === null || a_expr_collate === void 0 ? void 0 : a_expr_collate.parentCtx;
|
432
|
+
const a_expr_unary_sign = a_expr_at_time_zone === null || a_expr_at_time_zone === void 0 ? void 0 : a_expr_at_time_zone.parentCtx;
|
433
|
+
const a_expr_caret = a_expr_unary_sign === null || a_expr_unary_sign === void 0 ? void 0 : a_expr_unary_sign.parentCtx;
|
434
|
+
const a_expr_mul = a_expr_caret === null || a_expr_caret === void 0 ? void 0 : a_expr_caret.parentCtx;
|
435
|
+
const a_expr_add = a_expr_mul === null || a_expr_mul === void 0 ? void 0 : a_expr_mul.parentCtx;
|
436
|
+
const a_expr_unary_qualop = a_expr_add === null || a_expr_add === void 0 ? void 0 : a_expr_add.parentCtx;
|
437
|
+
const a_expr_qual_op = a_expr_unary_qualop === null || a_expr_unary_qualop === void 0 ? void 0 : a_expr_unary_qualop.parentCtx;
|
438
|
+
const a_expr_like = a_expr_qual_op === null || a_expr_qual_op === void 0 ? void 0 : a_expr_qual_op.parentCtx;
|
439
|
+
const a_expr_compare = a_expr_like === null || a_expr_like === void 0 ? void 0 : a_expr_like.parentCtx;
|
440
|
+
const a_expr_is_not = a_expr_compare === null || a_expr_compare === void 0 ? void 0 : a_expr_compare.parentCtx;
|
441
|
+
const a_expr_isnull = a_expr_is_not === null || a_expr_is_not === void 0 ? void 0 : a_expr_is_not.parentCtx;
|
442
|
+
const a_expr_unary_not = a_expr_isnull === null || a_expr_isnull === void 0 ? void 0 : a_expr_isnull.parentCtx;
|
443
|
+
const a_expr_in = a_expr_unary_not === null || a_expr_unary_not === void 0 ? void 0 : a_expr_unary_not.parentCtx;
|
444
|
+
const a_expr_between = a_expr_in === null || a_expr_in === void 0 ? void 0 : a_expr_in.parentCtx;
|
445
|
+
const a_expr_and = a_expr_between === null || a_expr_between === void 0 ? void 0 : a_expr_between.parentCtx;
|
446
|
+
const a_epxr_or = a_expr_and === null || a_expr_and === void 0 ? void 0 : a_expr_and.parentCtx;
|
447
|
+
const a_expr_lessless = a_epxr_or === null || a_epxr_or === void 0 ? void 0 : a_epxr_or.parentCtx;
|
448
|
+
const a_expr_qual = a_expr_lessless === null || a_expr_lessless === void 0 ? void 0 : a_expr_lessless.parentCtx;
|
449
|
+
const a_expr = a_expr_qual === null || a_expr_qual === void 0 ? void 0 : a_expr_qual.parentCtx;
|
450
|
+
const expr_list = a_expr === null || a_expr === void 0 ? void 0 : a_expr.parentCtx;
|
451
|
+
return expr_list instanceof PostgreSQLParser_1.Expr_listContext;
|
452
|
+
}
|
453
|
+
function traverseInsertstmt(insertstmt, dbSchema) {
|
454
|
+
const insert_target = insertstmt.insert_target();
|
455
|
+
const tableName = insert_target.getText();
|
456
|
+
const insertColumns = dbSchema.filter(col => col.table_name === tableName);
|
457
|
+
const insert_rest = insertstmt.insert_rest();
|
458
|
+
const parametersNullability = insert_rest.insert_column_list()
|
459
|
+
.insert_column_item_list()
|
460
|
+
.map(insert_column_item => traverse_insert_column_item(insert_column_item, insertColumns));
|
461
|
+
return {
|
462
|
+
queryType: 'Insert',
|
463
|
+
parametersNullability,
|
464
|
+
columnsNullability: [],
|
465
|
+
parameterList: []
|
466
|
+
};
|
467
|
+
}
|
468
|
+
function traverseDeletestmt(deleteStmt, dbSchema, traverseResult) {
|
469
|
+
return {
|
470
|
+
queryType: 'Delete',
|
471
|
+
parametersNullability: traverseResult.parametersNullability,
|
472
|
+
columnsNullability: [],
|
473
|
+
parameterList: []
|
474
|
+
};
|
475
|
+
}
|
476
|
+
function traverseUpdatestmt(updatestmt, dbSchema, traverseResult) {
|
477
|
+
const relation_expr_opt_alias = updatestmt.relation_expr_opt_alias();
|
478
|
+
const tableName = relation_expr_opt_alias.getText();
|
479
|
+
const updateColumns = dbSchema.filter(col => col.table_name === tableName);
|
480
|
+
updatestmt.set_clause_list().set_clause_list()
|
481
|
+
.map(set_clause => traverse_set_clause(set_clause, updateColumns, traverseResult));
|
482
|
+
const dataParameters = traverseResult.parametersNullability;
|
483
|
+
const where_clause = updatestmt.where_or_current_clause();
|
484
|
+
if (where_clause) {
|
485
|
+
const a_expr = where_clause.a_expr();
|
486
|
+
traverse_a_expr(a_expr, updateColumns, traverseResult);
|
487
|
+
}
|
488
|
+
const whereParameters = traverseResult.parametersNullability.slice(dataParameters.length);
|
489
|
+
return {
|
490
|
+
queryType: 'Update',
|
491
|
+
parametersNullability: traverseResult.parametersNullability,
|
492
|
+
columnsNullability: [],
|
493
|
+
parameterList: [],
|
494
|
+
whereParamtersNullability: whereParameters
|
495
|
+
};
|
496
|
+
}
|
497
|
+
function traverse_set_clause(set_clause, updateColumns, traverseResult) {
|
498
|
+
const set_target = set_clause.set_target();
|
499
|
+
const columnName = set_target.getText();
|
500
|
+
const column = findColumn(columnName, updateColumns);
|
501
|
+
const a_expr = set_clause.a_expr();
|
502
|
+
const paramsBefore = traverseResult.parametersNullability.length;
|
503
|
+
traverse_a_expr(a_expr, updateColumns, traverseResult);
|
504
|
+
for (let i = paramsBefore; i < traverseResult.parametersNullability.length; i++) {
|
505
|
+
traverseResult.parametersNullability[i] = traverseResult.parametersNullability[i] || !column.is_nullable;
|
506
|
+
}
|
507
|
+
return !column.is_nullable;
|
508
|
+
}
|
509
|
+
function traverse_insert_column_item(insert_column_item, dbSchema) {
|
510
|
+
const colid = insert_column_item.colid();
|
511
|
+
return isNotNull_colid(colid, dbSchema);
|
512
|
+
}
|
513
|
+
function isNotNull_colid(colid, dbSchema) {
|
514
|
+
const columnName = colid.getText();
|
515
|
+
const column = findColumn(columnName, dbSchema);
|
516
|
+
return !column.is_nullable;
|
517
|
+
}
|
518
|
+
function isNotNull(field, where_clause) {
|
519
|
+
const a_expr = where_clause.a_expr();
|
520
|
+
if (a_expr) {
|
521
|
+
return isNotNull_a_expr(field, a_expr);
|
522
|
+
}
|
523
|
+
return false;
|
524
|
+
}
|
525
|
+
function isNotNull_a_expr(field, a_expr) {
|
526
|
+
const a_expr_qual = a_expr.a_expr_qual();
|
527
|
+
if (a_expr_qual) {
|
528
|
+
return isNotNull_a_expr_qual(a_expr_qual, field);
|
529
|
+
}
|
530
|
+
return false;
|
531
|
+
}
|
532
|
+
function isNotNull_a_expr_qual(a_expr_qual, field) {
|
533
|
+
const a_expr_lessless = a_expr_qual.a_expr_lessless();
|
534
|
+
if (a_expr_lessless) {
|
535
|
+
return isNotNull_a_expr_lessless(a_expr_lessless, field);
|
536
|
+
}
|
537
|
+
return false;
|
538
|
+
}
|
539
|
+
function isNotNull_a_expr_lessless(a_expr_lessless, field) {
|
540
|
+
const a_expr_or = a_expr_lessless.a_expr_or_list()[0];
|
541
|
+
if (a_expr_or) {
|
542
|
+
return isNotNull_a_expr_or(a_expr_or, field);
|
543
|
+
}
|
544
|
+
return false;
|
545
|
+
}
|
546
|
+
//a_expr_or: "valueisnotnulland(id>0orvalueisnotnull)"
|
547
|
+
//a_expr_or: "valueisnotnullor(id>0orvalueisnotnull)"
|
548
|
+
function isNotNull_a_expr_or(a_expr_or, field) {
|
549
|
+
const a_expr_and = a_expr_or.a_expr_and_list();
|
550
|
+
if (a_expr_and) {
|
551
|
+
//1. valueisnotnull
|
552
|
+
//2. (id>0orvalueisnotnull)
|
553
|
+
const result = a_expr_and.every(a_expr_and => isNotNull_a_expr_and(a_expr_and, field));
|
554
|
+
return result;
|
555
|
+
}
|
556
|
+
return false;
|
557
|
+
}
|
558
|
+
function isNotNull_a_expr_and(a_expr_and, field) {
|
559
|
+
const a_expr_between_list = a_expr_and.a_expr_between_list();
|
560
|
+
if (a_expr_between_list) {
|
561
|
+
return a_expr_between_list.some(a_expr_between => isNotNull_a_expr_between(a_expr_between, field));
|
562
|
+
}
|
563
|
+
return false;
|
564
|
+
}
|
565
|
+
function isNotNull_a_expr_between(a_expr_between, field) {
|
566
|
+
const a_expr_in = a_expr_between.a_expr_in_list()[0];
|
567
|
+
if (a_expr_in) {
|
568
|
+
return isNotNull_a_expr_in(a_expr_in, field);
|
569
|
+
}
|
570
|
+
return false;
|
571
|
+
}
|
572
|
+
function isNotNull_a_expr_in(a_expr_in, field) {
|
573
|
+
const a_expr_unary_not = a_expr_in.a_expr_unary_not();
|
574
|
+
if (a_expr_unary_not) {
|
575
|
+
return isNotNull_a_expr_unary_not(a_expr_unary_not, field);
|
576
|
+
}
|
577
|
+
return false;
|
578
|
+
}
|
579
|
+
function isNotNull_a_expr_unary_not(a_expr_unary_not, field) {
|
580
|
+
const a_expr_isnull = a_expr_unary_not.a_expr_isnull();
|
581
|
+
if (a_expr_isnull) {
|
582
|
+
return isNotNull_a_expr_isnull(a_expr_isnull, field);
|
583
|
+
}
|
584
|
+
return false;
|
585
|
+
}
|
586
|
+
function isNotNull_a_expr_isnull(a_expr_isnull, field) {
|
587
|
+
const a_expr_is_not = a_expr_isnull.a_expr_is_not();
|
588
|
+
if (a_expr_is_not) {
|
589
|
+
return isNotNull_a_expr_is_not(a_expr_is_not, field);
|
590
|
+
}
|
591
|
+
return false;
|
592
|
+
}
|
593
|
+
function isNotNull_a_expr_is_not(a_expr_is_not, field) {
|
594
|
+
const a_expr_compare = a_expr_is_not.a_expr_compare();
|
595
|
+
if (a_expr_compare) {
|
596
|
+
if (a_expr_is_not.IS() !== null && a_expr_is_not.NOT() !== null && a_expr_is_not.NULL_P() !== null) {
|
597
|
+
const isField = isNotNull_a_expr_compare(a_expr_compare, field);
|
598
|
+
return isField;
|
599
|
+
}
|
600
|
+
//invalid split
|
601
|
+
// const fieldName = splitName(a_expr_compare.getText());
|
602
|
+
return isNotNull_a_expr_compare(a_expr_compare, field);
|
603
|
+
}
|
604
|
+
return false;
|
605
|
+
}
|
606
|
+
function isNotNull_a_expr_compare(a_expr_compare, field) {
|
607
|
+
const a_expr_like_list = a_expr_compare.a_expr_like_list();
|
608
|
+
if (a_expr_like_list) {
|
609
|
+
//a = b, b = a, id > 10, id = $1
|
610
|
+
return a_expr_like_list.some(a_expr_like => isNotNull_a_expr_like(a_expr_like, field));
|
611
|
+
}
|
612
|
+
return false;
|
613
|
+
}
|
614
|
+
function isNotNull_a_expr_like(a_expr_like, field) {
|
615
|
+
const a_expr_qual_op_list = a_expr_like.a_expr_qual_op_list();
|
616
|
+
if (a_expr_qual_op_list) {
|
617
|
+
return a_expr_qual_op_list.every(a_expr_qual_op => isNotNull_a_expr_qual_op(a_expr_qual_op, field));
|
618
|
+
}
|
619
|
+
return false;
|
620
|
+
}
|
621
|
+
function isNotNull_a_expr_qual_op(a_expr_qual_op, field) {
|
622
|
+
const a_expr_unary_qualop_list = a_expr_qual_op.a_expr_unary_qualop_list();
|
623
|
+
if (a_expr_unary_qualop_list) {
|
624
|
+
return a_expr_unary_qualop_list.every(a_expr_unary_qualop => isNotNul_a_expr_unary_qualop(a_expr_unary_qualop, field));
|
625
|
+
}
|
626
|
+
return false;
|
627
|
+
}
|
628
|
+
function isNotNul_a_expr_unary_qualop(a_expr_unary_qualop, field) {
|
629
|
+
const a_expr_add = a_expr_unary_qualop.a_expr_add();
|
630
|
+
if (a_expr_add) {
|
631
|
+
return isNotNull_a_expr_add(a_expr_add, field);
|
632
|
+
}
|
633
|
+
return false;
|
634
|
+
}
|
635
|
+
function isNotNull_a_expr_add(a_expr_add, field) {
|
636
|
+
const a_expr_mul_list = a_expr_add.a_expr_mul_list();
|
637
|
+
if (a_expr_mul_list) {
|
638
|
+
return a_expr_mul_list.every(a_expr_mul => isNotNull_a_expr_mul(a_expr_mul, field));
|
639
|
+
}
|
640
|
+
return false;
|
641
|
+
}
|
642
|
+
function isNotNull_a_expr_mul(a_expr_mul, field) {
|
643
|
+
const a_expr_caret_list = a_expr_mul.a_expr_caret_list();
|
644
|
+
if (a_expr_caret_list) {
|
645
|
+
return a_expr_caret_list.every(a_expr_caret => isNotNull_a_expr_caret(a_expr_caret, field));
|
646
|
+
}
|
647
|
+
return false;
|
648
|
+
}
|
649
|
+
function isNotNull_a_expr_caret(a_expr_caret, field) {
|
650
|
+
const a_expr_unary_sign_list = a_expr_caret.a_expr_unary_sign_list();
|
651
|
+
if (a_expr_unary_sign_list) {
|
652
|
+
return a_expr_unary_sign_list.every(a_expr_unary_sign => isNotNull_a_expr_unary_sign(a_expr_unary_sign, field));
|
653
|
+
}
|
654
|
+
return false;
|
655
|
+
}
|
656
|
+
function isNotNull_a_expr_unary_sign(a_expr_unary_sign, field) {
|
657
|
+
const a_expr_at_time_zone = a_expr_unary_sign.a_expr_at_time_zone();
|
658
|
+
if (a_expr_at_time_zone) {
|
659
|
+
return isNotNull_a_expr_at_time_zone(a_expr_at_time_zone, field);
|
660
|
+
}
|
661
|
+
return false;
|
662
|
+
}
|
663
|
+
function isNotNull_a_expr_at_time_zone(a_expr_at_time_zone, field) {
|
664
|
+
const a_expr_collate = a_expr_at_time_zone.a_expr_collate();
|
665
|
+
if (a_expr_collate) {
|
666
|
+
return isNotNull_a_expr_collate(a_expr_collate, field);
|
667
|
+
}
|
668
|
+
return false;
|
669
|
+
}
|
670
|
+
function isNotNull_a_expr_collate(a_expr_collate, field) {
|
671
|
+
const a_expr_typecast = a_expr_collate.a_expr_typecast();
|
672
|
+
if (a_expr_typecast) {
|
673
|
+
return isNotNull_a_expr_typecast(a_expr_typecast, field);
|
674
|
+
}
|
675
|
+
return false;
|
676
|
+
}
|
677
|
+
function isNotNull_a_expr_typecast(a_expr_typecast, field) {
|
678
|
+
const c_expr = a_expr_typecast.c_expr();
|
679
|
+
if (c_expr) {
|
680
|
+
return isNotNull_c_expr(c_expr, field);
|
681
|
+
}
|
682
|
+
return false;
|
683
|
+
}
|
684
|
+
function isNotNull_c_expr(c_expr, field) {
|
685
|
+
if (c_expr instanceof PostgreSQLParser_1.C_expr_exprContext) {
|
686
|
+
const columnref = c_expr.columnref();
|
687
|
+
if (columnref) {
|
688
|
+
const fieldName = (0, select_columns_1.splitName)(columnref.getText());
|
689
|
+
return (fieldName.name === field.column_name && (fieldName.prefix === '' || field.table_name === fieldName.prefix));
|
690
|
+
}
|
691
|
+
const aexprconst = c_expr.aexprconst();
|
692
|
+
if (aexprconst) {
|
693
|
+
return false;
|
694
|
+
}
|
695
|
+
const a_expr = c_expr.a_expr();
|
696
|
+
if (a_expr) {
|
697
|
+
return isNotNull_a_expr(field, a_expr);
|
698
|
+
}
|
699
|
+
}
|
700
|
+
return false;
|
701
|
+
}
|
702
|
+
//# sourceMappingURL=traverse.js.map
|