27
27
*
28
28
* @since 0.9
29
29
*/
30
- class PostgresqlSqlLexer {
30
+ class PostgresqlSqlParser {
31
31
32
32
private static final char [] SPECIAL_AND_OPERATOR_CHARS = {
33
33
'+' , '-' , '*' , '/' , '<' , '>' , '=' , '~' , '!' , '@' , '#' , '%' , '^' , '&' , '|' , '`' , '?' ,
@@ -38,15 +38,15 @@ class PostgresqlSqlLexer {
38
38
Arrays .sort (SPECIAL_AND_OPERATOR_CHARS );
39
39
}
40
40
41
- public static TokenizedSql tokenize (String sql ) {
42
- List <TokenizedSql .Token > tokens = new ArrayList <>();
43
- List <TokenizedSql .TokenizedStatement > statements = new ArrayList <>();
41
+ public static ParsedSql tokenize (String sql ) {
42
+ List <ParsedSql .Token > tokens = new ArrayList <>();
43
+ List <ParsedSql .TokenizedStatement > statements = new ArrayList <>();
44
44
45
45
int statementStartIndex = 0 ;
46
46
int i = 0 ;
47
47
while (i < sql .length ()) {
48
48
char c = sql .charAt (i );
49
- TokenizedSql .Token token = null ;
49
+ ParsedSql .Token token = null ;
50
50
51
51
if (isWhitespace (c )) {
52
52
i ++;
@@ -73,25 +73,25 @@ public static TokenizedSql tokenize(String sql) {
73
73
token = getParameterOrDollarQuoteToken (sql , i );
74
74
break ;
75
75
case ';' :
76
- token = new TokenizedSql .Token (TokenizedSql .TokenType .STATEMENT_END , ";" );
76
+ token = new ParsedSql .Token (ParsedSql .TokenType .STATEMENT_END , ";" );
77
77
break ;
78
78
default :
79
79
break ;
80
80
}
81
81
if (token == null ) {
82
82
if (isSpecialOrOperatorChar (c )) {
83
- token = new TokenizedSql .Token (TokenizedSql .TokenType .SPECIAL_OR_OPERATOR , Character .toString (c ));//getSpecialOrOperatorToken(sql, i);
83
+ token = new ParsedSql .Token (ParsedSql .TokenType .SPECIAL_OR_OPERATOR , Character .toString (c ));//getSpecialOrOperatorToken(sql, i);
84
84
} else {
85
85
token = getDefaultToken (sql , i );
86
86
}
87
87
}
88
88
89
89
i += token .getValue ().length ();
90
90
91
- if (token .getType () == TokenizedSql .TokenType .STATEMENT_END ) {
91
+ if (token .getType () == ParsedSql .TokenType .STATEMENT_END ) {
92
92
93
93
tokens .add (token );
94
- statements .add (new TokenizedSql .TokenizedStatement (sql .substring (statementStartIndex , i ), tokens ));
94
+ statements .add (new ParsedSql .TokenizedStatement (sql .substring (statementStartIndex , i ), tokens ));
95
95
96
96
tokens = new ArrayList <>();
97
97
statementStartIndex = i + 1 ;
@@ -101,27 +101,27 @@ public static TokenizedSql tokenize(String sql) {
101
101
}
102
102
// If tokens is not empty, implicit statement end
103
103
if (!tokens .isEmpty ()) {
104
- statements .add (new TokenizedSql .TokenizedStatement (sql .substring (statementStartIndex ), tokens ));
104
+ statements .add (new ParsedSql .TokenizedStatement (sql .substring (statementStartIndex ), tokens ));
105
105
}
106
106
107
- return new TokenizedSql (sql , statements );
107
+ return new ParsedSql (sql , statements );
108
108
}
109
109
110
- private static TokenizedSql .Token getDefaultToken (String sql , int beginIndex ) {
110
+ private static ParsedSql .Token getDefaultToken (String sql , int beginIndex ) {
111
111
for (int i = beginIndex + 1 ; i < sql .length (); i ++) {
112
112
char c = sql .charAt (i );
113
113
if (Character .isWhitespace (c ) || isSpecialOrOperatorChar (c )) {
114
- return new TokenizedSql .Token (TokenizedSql .TokenType .DEFAULT , sql .substring (beginIndex , i ));
114
+ return new ParsedSql .Token (ParsedSql .TokenType .DEFAULT , sql .substring (beginIndex , i ));
115
115
}
116
116
}
117
- return new TokenizedSql .Token (TokenizedSql .TokenType .DEFAULT , sql .substring (beginIndex ));
117
+ return new ParsedSql .Token (ParsedSql .TokenType .DEFAULT , sql .substring (beginIndex ));
118
118
}
119
119
120
120
private static boolean isSpecialOrOperatorChar (char c ) {
121
121
return Arrays .binarySearch (SPECIAL_AND_OPERATOR_CHARS , c ) >= 0 ;
122
122
}
123
123
124
- private static TokenizedSql .Token getBlockCommentToken (String sql , int beginIndex ) {
124
+ private static ParsedSql .Token getBlockCommentToken (String sql , int beginIndex ) {
125
125
int depth = 1 ;
126
126
for (int i = beginIndex + 2 ; i < (sql .length () - 1 ); i ++) {
127
127
char c1 = sql .charAt (i );
@@ -134,44 +134,44 @@ private static TokenizedSql.Token getBlockCommentToken(String sql, int beginInde
134
134
i ++;
135
135
}
136
136
if (depth == 0 ) {
137
- return new TokenizedSql .Token (TokenizedSql .TokenType .COMMENT , sql .substring (beginIndex , i + 1 ));
137
+ return new ParsedSql .Token (ParsedSql .TokenType .COMMENT , sql .substring (beginIndex , i + 1 ));
138
138
}
139
139
}
140
140
throw new IllegalArgumentException ("Sql cannot be parsed: unclosed block comment (comment opened at index " + beginIndex + ") in statement: " + sql );
141
141
}
142
142
143
- private static TokenizedSql .Token getCommentToLineEndToken (String sql , int beginIndex ) {
143
+ private static ParsedSql .Token getCommentToLineEndToken (String sql , int beginIndex ) {
144
144
int lineEnding = sql .indexOf ('\n' , beginIndex );
145
145
if (lineEnding == -1 ) {
146
- return new TokenizedSql .Token (TokenizedSql .TokenType .COMMENT , sql .substring (beginIndex ));
146
+ return new ParsedSql .Token (ParsedSql .TokenType .COMMENT , sql .substring (beginIndex ));
147
147
} else {
148
- return new TokenizedSql .Token (TokenizedSql .TokenType .COMMENT , sql .substring (beginIndex , lineEnding ));
148
+ return new ParsedSql .Token (ParsedSql .TokenType .COMMENT , sql .substring (beginIndex , lineEnding ));
149
149
}
150
150
}
151
151
152
- private static TokenizedSql .Token getDollarQuoteToken (String sql , String tag , int beginIndex ) {
152
+ private static ParsedSql .Token getDollarQuoteToken (String sql , String tag , int beginIndex ) {
153
153
int nextQuote = sql .indexOf (tag , beginIndex + tag .length ());
154
154
if (nextQuote == -1 ) {
155
155
throw new IllegalArgumentException ("Sql cannot be parsed: unclosed quote (quote opened at index " + beginIndex + ") in statement: " + sql );
156
156
} else {
157
- return new TokenizedSql .Token (TokenizedSql .TokenType .STRING_CONSTANT , sql .substring (beginIndex , nextQuote + tag .length ()));
157
+ return new ParsedSql .Token (ParsedSql .TokenType .STRING_CONSTANT , sql .substring (beginIndex , nextQuote + tag .length ()));
158
158
}
159
159
}
160
160
161
- private static TokenizedSql .Token getParameterToken (String sql , int beginIndex ) {
161
+ private static ParsedSql .Token getParameterToken (String sql , int beginIndex ) {
162
162
for (int i = beginIndex + 1 ; i < sql .length (); i ++) {
163
163
char c = sql .charAt (i );
164
164
if (isWhitespace (c ) || isSpecialOrOperatorChar (c )) {
165
- return new TokenizedSql .Token (TokenizedSql .TokenType .PARAMETER , sql .substring (beginIndex , i ));
165
+ return new ParsedSql .Token (ParsedSql .TokenType .PARAMETER , sql .substring (beginIndex , i ));
166
166
}
167
167
if (!isAsciiDigit (c )) {
168
168
throw new IllegalArgumentException ("Sql cannot be parsed: illegal character in parameter or dollar-quote tag: " + c );
169
169
}
170
170
}
171
- return new TokenizedSql .Token (TokenizedSql .TokenType .PARAMETER , sql .substring (beginIndex ));
171
+ return new ParsedSql .Token (ParsedSql .TokenType .PARAMETER , sql .substring (beginIndex ));
172
172
}
173
173
174
- private static TokenizedSql .Token getParameterOrDollarQuoteToken (String sql , int beginIndex ) {
174
+ private static ParsedSql .Token getParameterOrDollarQuoteToken (String sql , int beginIndex ) {
175
175
char firstChar = sql .charAt (beginIndex + 1 );
176
176
if (firstChar == '$' ) {
177
177
return getDollarQuoteToken (sql , "$$" , beginIndex );
@@ -191,21 +191,21 @@ private static TokenizedSql.Token getParameterOrDollarQuoteToken(String sql, int
191
191
}
192
192
}
193
193
194
- private static TokenizedSql .Token getStandardQuoteToken (String sql , int beginIndex ) {
194
+ private static ParsedSql .Token getStandardQuoteToken (String sql , int beginIndex ) {
195
195
int nextQuote = sql .indexOf ('\'' , beginIndex + 1 );
196
196
if (nextQuote == -1 ) {
197
197
throw new IllegalArgumentException ("Sql cannot be parsed: unclosed quote (quote opened at index " + beginIndex + ") in statement: " + sql );
198
198
} else {
199
- return new TokenizedSql .Token (TokenizedSql .TokenType .STRING_CONSTANT , sql .substring (beginIndex , nextQuote + 1 ));
199
+ return new ParsedSql .Token (ParsedSql .TokenType .STRING_CONSTANT , sql .substring (beginIndex , nextQuote + 1 ));
200
200
}
201
201
}
202
202
203
- private static TokenizedSql .Token getQuotedIdentifierToken (String sql , int beginIndex ) {
203
+ private static ParsedSql .Token getQuotedIdentifierToken (String sql , int beginIndex ) {
204
204
int nextQuote = sql .indexOf ('\"' , beginIndex + 1 );
205
205
if (nextQuote == -1 ) {
206
206
throw new IllegalArgumentException ("Sql cannot be parsed: unclosed quoted identifier (identifier opened at index " + beginIndex + ") in statement: " + sql );
207
207
} else {
208
- return new TokenizedSql .Token (TokenizedSql .TokenType .QUOTED_IDENTIFIER , sql .substring (beginIndex , nextQuote + 1 ));
208
+ return new ParsedSql .Token (ParsedSql .TokenType .QUOTED_IDENTIFIER , sql .substring (beginIndex , nextQuote + 1 ));
209
209
}
210
210
}
211
211
0 commit comments