rawsql-ts 0.10.2-beta → 0.10.4-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -17
- package/dist/esm/index.min.js +11 -11
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/parsers/FunctionExpressionParser.js +18 -4
- package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/esm/parsers/ValueParser.js +56 -11
- package/dist/esm/parsers/ValueParser.js.map +1 -1
- package/dist/esm/transformers/CTECollector.js +6 -1
- package/dist/esm/transformers/CTECollector.js.map +1 -1
- package/dist/esm/transformers/SqlParamInjector.js +301 -17
- package/dist/esm/transformers/SqlParamInjector.js.map +1 -1
- package/dist/esm/transformers/TableSourceCollector.js +8 -1
- package/dist/esm/transformers/TableSourceCollector.js.map +1 -1
- package/dist/esm/types/parsers/FunctionExpressionParser.d.ts +6 -1
- package/dist/esm/types/parsers/ValueParser.d.ts +9 -1
- package/dist/esm/types/transformers/CTECollector.d.ts +1 -0
- package/dist/esm/types/transformers/SqlParamInjector.d.ts +11 -1
- package/dist/esm/types/transformers/TableSourceCollector.d.ts +1 -0
- package/dist/esm/types/utils/OperatorPrecedence.d.ts +29 -0
- package/dist/esm/types/utils/ParameterRemover.d.ts +225 -0
- package/dist/esm/utils/OperatorPrecedence.js +79 -0
- package/dist/esm/utils/OperatorPrecedence.js.map +1 -0
- package/dist/esm/utils/ParameterRemover.js +777 -0
- package/dist/esm/utils/ParameterRemover.js.map +1 -0
- package/dist/index.min.js +11 -11
- package/dist/index.min.js.map +4 -4
- package/dist/parsers/FunctionExpressionParser.d.ts +6 -1
- package/dist/parsers/FunctionExpressionParser.js +18 -4
- package/dist/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/parsers/ValueParser.d.ts +9 -1
- package/dist/parsers/ValueParser.js +55 -10
- package/dist/parsers/ValueParser.js.map +1 -1
- package/dist/transformers/CTECollector.d.ts +1 -0
- package/dist/transformers/CTECollector.js +5 -0
- package/dist/transformers/CTECollector.js.map +1 -1
- package/dist/transformers/SqlParamInjector.d.ts +11 -1
- package/dist/transformers/SqlParamInjector.js +301 -17
- package/dist/transformers/SqlParamInjector.js.map +1 -1
- package/dist/transformers/TableSourceCollector.d.ts +1 -0
- package/dist/transformers/TableSourceCollector.js +7 -0
- package/dist/transformers/TableSourceCollector.js.map +1 -1
- package/dist/utils/OperatorPrecedence.d.ts +29 -0
- package/dist/utils/OperatorPrecedence.js +83 -0
- package/dist/utils/OperatorPrecedence.js.map +1 -0
- package/dist/utils/ParameterRemover.d.ts +225 -0
- package/dist/utils/ParameterRemover.js +781 -0
- package/dist/utils/ParameterRemover.js.map +1 -0
- package/package.json +2 -2
@@ -0,0 +1,83 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.OperatorPrecedence = void 0;
|
4
|
+
/**
|
5
|
+
* SQL operator precedence definitions
|
6
|
+
* Higher numbers indicate higher precedence (tighter binding)
|
7
|
+
*/
|
8
|
+
class OperatorPrecedence {
|
9
|
+
/**
|
10
|
+
* Get the precedence of an operator
|
11
|
+
* @param operator The operator string
|
12
|
+
* @returns The precedence number (higher = tighter binding)
|
13
|
+
*/
|
14
|
+
static getPrecedence(operator) {
|
15
|
+
const precedence = this.precedenceMap[operator.toLowerCase()];
|
16
|
+
return precedence !== undefined ? precedence : 0;
|
17
|
+
}
|
18
|
+
/**
|
19
|
+
* Check if operator1 has higher or equal precedence than operator2
|
20
|
+
*/
|
21
|
+
static hasHigherOrEqualPrecedence(operator1, operator2) {
|
22
|
+
return this.getPrecedence(operator1) >= this.getPrecedence(operator2);
|
23
|
+
}
|
24
|
+
/**
|
25
|
+
* Check if an operator is a logical operator (AND/OR)
|
26
|
+
*/
|
27
|
+
static isLogicalOperator(operator) {
|
28
|
+
const op = operator.toLowerCase();
|
29
|
+
return op === 'and' || op === 'or';
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* Check if an operator is a BETWEEN operator
|
33
|
+
*/
|
34
|
+
static isBetweenOperator(operator) {
|
35
|
+
const op = operator.toLowerCase();
|
36
|
+
return op === 'between' || op === 'not between';
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* Check if a string is a comparison operator
|
40
|
+
*/
|
41
|
+
static isComparisonOperator(operator) {
|
42
|
+
const lowerOp = operator.toLowerCase();
|
43
|
+
return ['=', '!=', '<>', '<', '>', '<=', '>=', 'like', 'ilike', 'in', 'not in'].includes(lowerOp);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
exports.OperatorPrecedence = OperatorPrecedence;
|
47
|
+
OperatorPrecedence.precedenceMap = {
|
48
|
+
// Logical operators (lowest precedence)
|
49
|
+
'or': 1,
|
50
|
+
'and': 2,
|
51
|
+
// Comparison operators
|
52
|
+
'=': 10,
|
53
|
+
'!=': 10,
|
54
|
+
'<>': 10,
|
55
|
+
'<': 10,
|
56
|
+
'<=': 10,
|
57
|
+
'>': 10,
|
58
|
+
'>=': 10,
|
59
|
+
'like': 10,
|
60
|
+
'ilike': 10,
|
61
|
+
'not like': 10,
|
62
|
+
'not ilike': 10,
|
63
|
+
'in': 10,
|
64
|
+
'not in': 10,
|
65
|
+
'is': 10,
|
66
|
+
'is not': 10,
|
67
|
+
'between': 15, // BETWEEN has higher precedence than logical operators
|
68
|
+
'not between': 15,
|
69
|
+
// Arithmetic operators
|
70
|
+
'+': 20,
|
71
|
+
'-': 20,
|
72
|
+
'*': 30,
|
73
|
+
'/': 30,
|
74
|
+
'%': 30,
|
75
|
+
'^': 40,
|
76
|
+
// Type casting
|
77
|
+
'::': 50,
|
78
|
+
// Highest precedence operators
|
79
|
+
'unary+': 100,
|
80
|
+
'unary-': 100,
|
81
|
+
'not': 100
|
82
|
+
};
|
83
|
+
//# sourceMappingURL=OperatorPrecedence.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"OperatorPrecedence.js","sourceRoot":"","sources":["../../src/utils/OperatorPrecedence.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,kBAAkB;IA0C3B;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,QAAgB;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,0BAA0B,CAAC,SAAiB,EAAE,SAAiB;QACzE,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,iBAAiB,CAAC,QAAgB;QAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,iBAAiB,CAAC,QAAgB;QAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,aAAa,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,oBAAoB,CAAC,QAAgB;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtG,CAAC;;AAjFL,gDAkFC;AAjF2B,gCAAa,GAA2B;IAC5D,wCAAwC;IACxC,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IAER,uBAAuB;IACvB,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE,EAAG,uDAAuD;IACvE,aAAa,EAAE,EAAE;IAEjB,uBAAuB;IACvB,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IAEP,eAAe;IACf,IAAI,EAAE,EAAE;IAER,+BAA+B;IAC/B,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,GAAG;CACb,CAAC"}
|
@@ -0,0 +1,225 @@
|
|
1
|
+
import { SqlComponent, SqlComponentVisitor } from "../models/SqlComponent";
|
2
|
+
/**
|
3
|
+
* Utility class to traverse and remove ParameterExpression nodes from the SQL AST.
|
4
|
+
* This removes any binary expression containing a ParameterExpression as a whole.
|
5
|
+
* For compound logical expressions (AND/OR), only the parameterized parts are removed.
|
6
|
+
* If all conditions are removed from a logical expression, the parent node is removed as well.
|
7
|
+
*/
|
8
|
+
export declare class ParameterRemover implements SqlComponentVisitor<SqlComponent | null> {
|
9
|
+
private handlers;
|
10
|
+
private visitedNodes;
|
11
|
+
private isRootVisit;
|
12
|
+
constructor();
|
13
|
+
/**
|
14
|
+
* Reset the visited nodes tracking
|
15
|
+
*/
|
16
|
+
private reset;
|
17
|
+
/**
|
18
|
+
* Main entry point for the visitor pattern.
|
19
|
+
* @param arg The SQL component to visit
|
20
|
+
* @returns The component with parameter expressions removed, or null if the entire component should be removed
|
21
|
+
*/
|
22
|
+
visit(arg: SqlComponent): SqlComponent | null;
|
23
|
+
/**
|
24
|
+
* Internal visit method used for all nodes.
|
25
|
+
* This separates the visit flag management from the actual node visitation logic.
|
26
|
+
*/
|
27
|
+
private visitNode;
|
28
|
+
/**
|
29
|
+
* Visit SimpleSelectQuery node
|
30
|
+
*/
|
31
|
+
private visitSimpleSelectQuery;
|
32
|
+
/**
|
33
|
+
* Visit BinarySelectQuery node
|
34
|
+
*/
|
35
|
+
private visitBinarySelectQuery;
|
36
|
+
/**
|
37
|
+
* Visit ValuesQuery node
|
38
|
+
*/
|
39
|
+
private visitValuesQuery;
|
40
|
+
/**
|
41
|
+
* Visit WithClause node
|
42
|
+
*/
|
43
|
+
private visitWithClause;
|
44
|
+
/**
|
45
|
+
* Visit CommonTable node
|
46
|
+
*/
|
47
|
+
private visitCommonTable;
|
48
|
+
/**
|
49
|
+
* Visit SelectClause node
|
50
|
+
*/
|
51
|
+
private visitSelectClause;
|
52
|
+
/**
|
53
|
+
* Visit SelectItem node
|
54
|
+
*/
|
55
|
+
private visitSelectItem;
|
56
|
+
private visitIdentifierString;
|
57
|
+
private visitRawString;
|
58
|
+
private visitColumnReference;
|
59
|
+
private visitParameterExpression;
|
60
|
+
private visitLiteralValue;
|
61
|
+
private visitTableSource;
|
62
|
+
private visitForClause;
|
63
|
+
private visitDistinctComponent;
|
64
|
+
/**
|
65
|
+
* Visit SourceExpression node
|
66
|
+
*/
|
67
|
+
private visitSourceExpression;
|
68
|
+
/**
|
69
|
+
* Visit ParenSource node
|
70
|
+
*/
|
71
|
+
private visitParenSource;
|
72
|
+
/**
|
73
|
+
* Visit SourceAliasExpression node
|
74
|
+
*/
|
75
|
+
private visitSourceAliasExpression;
|
76
|
+
/**
|
77
|
+
* Visit SubQuerySource node
|
78
|
+
*/
|
79
|
+
private visitSubQuerySource;
|
80
|
+
/**
|
81
|
+
* Visit InlineQuery node
|
82
|
+
*/
|
83
|
+
private visitInlineQuery;
|
84
|
+
/**
|
85
|
+
* Visit FromClause node
|
86
|
+
*/
|
87
|
+
private visitFromClause;
|
88
|
+
/**
|
89
|
+
* Visit JoinClause node
|
90
|
+
*/
|
91
|
+
private visitJoinClause;
|
92
|
+
/**
|
93
|
+
* Visit JoinOnClause node
|
94
|
+
*/
|
95
|
+
private visitJoinOnClause;
|
96
|
+
/**
|
97
|
+
* Visit JoinUsingClause node
|
98
|
+
*/
|
99
|
+
private visitJoinUsingClause;
|
100
|
+
/**
|
101
|
+
* Visit WhereClause node - key method for parameter removal
|
102
|
+
*/
|
103
|
+
private visitWhereClause;
|
104
|
+
/**
|
105
|
+
* Visit ParenExpression node
|
106
|
+
*/
|
107
|
+
private visitParenExpression;
|
108
|
+
/**
|
109
|
+
* Visit BinaryExpression node - improved logic for right-associative parser structure
|
110
|
+
*/
|
111
|
+
private visitBinaryExpression;
|
112
|
+
/**
|
113
|
+
* Handle comparison expressions, accounting for right-associative parser structure
|
114
|
+
*/
|
115
|
+
private handleComparisonExpression;
|
116
|
+
/**
|
117
|
+
* Restructure expressions like "id = (1 AND ...)" to "(id = 1) AND ..."
|
118
|
+
*/
|
119
|
+
private restructureComparisonWithLogical;
|
120
|
+
/**
|
121
|
+
* Check if an operator is a logical operator */
|
122
|
+
/**
|
123
|
+
* Check if the resulting expression would be nonsensical
|
124
|
+
* This is a heuristic to detect cases like "name = age > 18"
|
125
|
+
*/
|
126
|
+
private wouldCreateNonsensicalExpression;
|
127
|
+
/**
|
128
|
+
* Check if a ValueComponent contains a ParameterExpression anywhere in its tree
|
129
|
+
*/
|
130
|
+
private containsParameter;
|
131
|
+
/**
|
132
|
+
* Visit UnaryExpression node
|
133
|
+
*/
|
134
|
+
private visitUnaryExpression;
|
135
|
+
/**
|
136
|
+
* Visit CaseExpression node
|
137
|
+
*/
|
138
|
+
private visitCaseExpression;
|
139
|
+
/**
|
140
|
+
* Visit CaseKeyValuePair node
|
141
|
+
*/
|
142
|
+
private visitCaseKeyValuePair;
|
143
|
+
/**
|
144
|
+
* Visit SwitchCaseArgument node
|
145
|
+
*/
|
146
|
+
private visitSwitchCaseArgument;
|
147
|
+
/**
|
148
|
+
* Visit BetweenExpression node
|
149
|
+
*/
|
150
|
+
private visitBetweenExpression;
|
151
|
+
/**
|
152
|
+
* Visit FunctionCall node
|
153
|
+
*/
|
154
|
+
private visitFunctionCall;
|
155
|
+
/**
|
156
|
+
* Visit ArrayExpression node
|
157
|
+
*/
|
158
|
+
private visitArrayExpression;
|
159
|
+
/**
|
160
|
+
* Visit TupleExpression node
|
161
|
+
*/
|
162
|
+
private visitTupleExpression;
|
163
|
+
/**
|
164
|
+
* Visit CastExpression node
|
165
|
+
*/
|
166
|
+
private visitCastExpression;
|
167
|
+
/**
|
168
|
+
* Visit WindowFrameExpression node
|
169
|
+
*/
|
170
|
+
private visitWindowFrameExpression;
|
171
|
+
/**
|
172
|
+
* Visit WindowFrameSpec node
|
173
|
+
*/
|
174
|
+
private visitWindowFrameSpec;
|
175
|
+
/**
|
176
|
+
* Visit TypeValue node
|
177
|
+
*/
|
178
|
+
private visitTypeValue;
|
179
|
+
/**
|
180
|
+
* Visit GroupByClause node
|
181
|
+
*/
|
182
|
+
private visitGroupByClause;
|
183
|
+
/**
|
184
|
+
* Visit HavingClause node
|
185
|
+
*/
|
186
|
+
private visitHavingClause;
|
187
|
+
/**
|
188
|
+
* Visit OrderByClause node
|
189
|
+
*/
|
190
|
+
private visitOrderByClause;
|
191
|
+
/**
|
192
|
+
* Visit OrderByItem node
|
193
|
+
*/
|
194
|
+
private visitOrderByItem;
|
195
|
+
/**
|
196
|
+
* Visit WindowFrameClause node
|
197
|
+
*/
|
198
|
+
private visitWindowFrameClause;
|
199
|
+
/**
|
200
|
+
* Visit WindowsClause node
|
201
|
+
*/
|
202
|
+
private visitWindowsClause;
|
203
|
+
/**
|
204
|
+
* Visit LimitClause node
|
205
|
+
*/
|
206
|
+
private visitLimitClause;
|
207
|
+
/**
|
208
|
+
* Visit OffsetClause node
|
209
|
+
*/
|
210
|
+
private visitOffsetClause;
|
211
|
+
/**
|
212
|
+
* Visit FetchClause node
|
213
|
+
*/
|
214
|
+
private visitFetchClause;
|
215
|
+
/**
|
216
|
+
* Visit FetchExpression node
|
217
|
+
*/
|
218
|
+
private visitFetchExpression;
|
219
|
+
/**
|
220
|
+
* Static method to apply parameter removal transformation on an SQL AST
|
221
|
+
* @param node The SQL AST node to transform
|
222
|
+
* @returns The transformed SQL AST with parameter expressions removed
|
223
|
+
*/
|
224
|
+
static remove(node: SqlComponent): SqlComponent | null;
|
225
|
+
}
|