You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
if (op == OP_SLASH || op == OP_CARET || op == K_DIV) prec = 6;
344
+
else if (op == OP_CONCAT || op == OP_PIPE
345
+
|| op == OP_LSHIFT || op == OP_RSHIFT) prec = 5;
346
+
else {
347
+
// Handle unnamed tokens by image
348
+
String img = t.image;
349
+
if ("*".equals(img) || "%".equals(img)) prec = 6;
350
+
else if ("+".equals(img) || "-".equals(img) || "&".equals(img)) prec = 5;
351
+
else break; // not an arithmetic operator
352
+
}
353
+
354
+
if (prec < minPrec) break;
355
+
356
+
// OP_PIPE: distinguish " | | " (space-sep concat) from single " | " (bitwise OR)
357
+
if (op == OP_PIPE && getToken(2).kind == OP_PIPE) {
358
+
jj_consume_token(OP_PIPE, getToken(1).image);
359
+
jj_consume_token(OP_PIPE, getToken(1).image);
360
+
Expression right = prattArithRest(PrimaryExpression(), prec + 1);
361
+
Concat r = new Concat(); r.setLeftExpression(left); r.setRightExpression(right); left = r;
362
+
continue;
363
+
}
364
+
365
+
jj_consume_token(op, getToken(1).image);
366
+
Expression right = prattArithRest(PrimaryExpression(), prec + 1);
367
+
368
+
if (op == OP_SLASH) { Division r = new Division(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
369
+
else if (op == OP_CARET) { net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor r = new net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
370
+
else if (op == K_DIV) { IntegerDivision r = new IntegerDivision(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
371
+
else if (op == OP_CONCAT) { Concat r = new Concat(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
372
+
else if (op == OP_PIPE) { BitwiseOr r = new BitwiseOr(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
373
+
else if (op == OP_LSHIFT) { BitwiseLeftShift r = new BitwiseLeftShift(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
374
+
else if (op == OP_RSHIFT) { BitwiseRightShift r = new BitwiseRightShift(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
375
+
else {
376
+
String img = t.image;
377
+
if ("*".equals(img)) { Multiplication r = new Multiplication(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
378
+
else if ("+".equals(img)) { Addition r = new Addition(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
379
+
else if ("-".equals(img)) { Subtraction r = new Subtraction(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
380
+
else if ("%".equals(img)) { Modulo r = new Modulo(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
381
+
else if ("&".equals(img)) { BitwiseAnd r = new BitwiseAnd(); r.setLeftExpression(left); r.setRightExpression(right); left = r; }
382
+
}
383
+
}
384
+
return left;
385
+
}
386
+
387
+
// True when "(" opens a parenthesised FROM item (table/function/lateral/join)
388
+
// rather than a SELECT subquery. Cheap 2-token check replaces expensive
389
+
// syntactic LOOKAHEAD(ParenthesedFromItem()).
390
+
protected boolean isParenthesedFromItemAhead() {
391
+
try {
392
+
if (getToken(1).kind != OPENING_BRACKET) return false;
393
+
int k2 = getToken(2).kind;
394
+
// Direct subquery: ( SELECT/WITH ) → ParenthesedSelect handles it
395
+
// ( VALUES ) can be ParenthesedFromItem(Values) or ParenthesedSelect;
396
+
// ParenthesedFromItem is checked first so Values-as-FROM-item works
397
+
if (k2 == K_SELECT || k2 == K_WITH) return false;
398
+
// ( ( SELECT ) UNION ( SELECT ) ) → isNestedSetOperationAhead handles it
399
+
// Other (( patterns: ( (SELECT...) JOIN ... ) or ( (table) ) → ParenthesedFromItem
400
+
if (k2 == K_LATERAL) return false; // handled by LateralSubSelect
401
+
if (k2 == CLOSING_BRACKET) return false; // empty "()" is not valid
402
+
// EXASOL: ( IMPORT ... ) is a SubImport; handled at the outer FromItem level
403
+
// by LOOKAHEAD(2, Dialect.EXASOL...) SubImport() - must NOT go into ParenthesedFromItem
404
+
if (k2 == K_IMPORT) return false;
405
+
return true;
406
+
} catch (TokenMgrError e) { return false; }
407
+
}
408
+
297
409
// True when ( (SELECT ...) UNION/INTERSECT/EXCEPT (SELECT ...) ) — a set-operation
298
410
// subquery used as IN RHS. Bracket-scans past the inner select to verify a set
299
411
// operator follows, distinguishing from comma-separated ((SELECT...), (SELECT...)).
300
412
protected boolean isNestedSetOperationAhead() {
301
413
try {
302
414
if (getToken(1).kind != OPENING_BRACKET) return false;
303
415
if (getToken(2).kind != OPENING_BRACKET) return false;
0 commit comments