From 4d7774f5d20ec07f04961e442cc6b1f66424310d Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Mon, 25 May 2026 21:56:41 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/calcite/pom.xml | 4 + .../src/main/codegen/includes/parserImpls.ftl | 14 + .../patches/select-fetch-expression.patch | 10 + .../calcite/prepare/IgniteSqlValidator.java | 87 +- .../sql/generated/IgniteSqlParserImpl.java | 2333 +++++++++-------- .../LimitOffsetIntegrationTest.java | 140 +- 6 files changed, 1402 insertions(+), 1186 deletions(-) create mode 100644 modules/calcite/src/main/codegen/patches/select-fetch-expression.patch diff --git a/modules/calcite/pom.xml b/modules/calcite/pom.xml index fb42c00c24094..a2d331c801367 100644 --- a/modules/calcite/pom.xml +++ b/modules/calcite/pom.xml @@ -341,6 +341,10 @@ outputRoot="${project.build.directory}/generated-sources/fmpp" data="tdd(${project.build.directory}/codegen/config.fmpp), default: tdd(${project.build.directory}/codegen/default_config.fmpp)" /> + diff --git a/modules/calcite/src/main/codegen/includes/parserImpls.ftl b/modules/calcite/src/main/codegen/includes/parserImpls.ftl index 8c5c964b609dd..855527f8fd499 100644 --- a/modules/calcite/src/main/codegen/includes/parserImpls.ftl +++ b/modules/calcite/src/main/codegen/includes/parserImpls.ftl @@ -816,3 +816,17 @@ SqlDrop SqlDropView(Span s, boolean replace) : return SqlDdlNodes.dropView(s.end(this), ifExists, id); } } + +JAVACODE +SqlNode FetchCount() { + SqlNode e; + if (getToken(1).kind == LPAREN) { + jj_consume_token(LPAREN); + e = Expression(ExprContext.ACCEPT_NON_QUERY); + jj_consume_token(RPAREN); + } + else + e = UnsignedNumericLiteralOrParam(); + + return e; +} diff --git a/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch b/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch new file mode 100644 index 0000000000000..1dbcd0befdded --- /dev/null +++ b/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch @@ -0,0 +1,10 @@ +--- javacc/Parser.jj ++++ javacc/Parser.jj +@@ -754,7 +754,7 @@ + { + // SQL:2008-style syntax. "OFFSET ... FETCH ...". + // If you specify both LIMIT and FETCH, FETCH wins. +- ( | ) offsetFetch[1] = UnsignedNumericLiteralOrParam() ++ ( | ) offsetFetch[1] = FetchCount() + ( | ) + } \ No newline at end of file diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index 8d25cf1c249a0..e1a2e4c8b25aa 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -240,8 +240,8 @@ private void validateTableModify(SqlNode table) { /** {@inheritDoc} */ @Override protected void validateSelect(SqlSelect select, RelDataType targetRowType) { - checkIntegerLimit(select.getFetch(), "fetch / limit"); - checkIntegerLimit(select.getOffset(), "offset"); + select.setFetch(checkIntegerLimit(select.getFetch(), "fetch / limit")); + select.setOffset(checkIntegerLimit(select.getOffset(), "offset")); super.validateSelect(select, targetRowType); } @@ -263,29 +263,84 @@ private void validateTableModify(SqlNode table) { /** * @param n Node to check limit. * @param nodeName Node name. + * @return Original node or evaluated literal for expressions. */ - private void checkIntegerLimit(SqlNode n, String nodeName) { - if (n instanceof SqlLiteral) { - BigDecimal offFetchLimit = ((SqlLiteral)n).bigDecimalValue(); + private SqlNode checkIntegerLimit(SqlNode n, String nodeName) { + if (n == null) + return null; + + BigDecimal offFetchLimit = limitValue(n); - if (offFetchLimit.compareTo(DEC_INT_MAX) > 0 || offFetchLimit.compareTo(BigDecimal.ZERO) < 0) - throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); + if (offFetchLimit != null && (offFetchLimit.compareTo(DEC_INT_MAX) > 0 + || offFetchLimit.compareTo(BigDecimal.ZERO) < 0)) { + throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); } - else if (n instanceof SqlDynamicParam) { - // will fail in params check. + + if (offFetchLimit != null && n instanceof SqlCall) + return SqlLiteral.createExactNumeric(offFetchLimit.toPlainString(), n.getParserPosition()); + + return n; + } + + /** + * @param n Limit node. + * @return Limit value, or {@code null} if the expression cannot be evaluated during validation. + */ + @Nullable private BigDecimal limitValue(SqlNode n) { + if (n instanceof SqlLiteral) + return ((SqlLiteral)n).bigDecimalValue(); + + if (n instanceof SqlDynamicParam) { + // Will fail in params check. if (F.isEmpty(parameters)) - return; + return null; int idx = ((SqlDynamicParam)n).getIndex(); - if (idx < parameters.length) { - Object param = parameters[idx]; - if (parameters[idx] instanceof Integer) { - if ((Integer)param < 0) - throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); - } + if (idx >= parameters.length) + return null; + + Object param = parameters[idx]; + + return param instanceof Number ? new BigDecimal(param.toString()) : null; + } + + if (n instanceof SqlCall) { + SqlCall call = (SqlCall)n; + List operands = call.getOperandList(); + + switch (call.getKind()) { + case PLUS: + if (operands.size() == 2) { + BigDecimal left = limitValue(operands.get(0)); + BigDecimal right = limitValue(operands.get(1)); + + return left != null && right != null ? left.add(right) : null; + } + + break; + + case MINUS: + if (operands.size() == 1) { + BigDecimal operand = limitValue(operands.get(0)); + + return operand != null ? operand.negate() : null; + } + else if (operands.size() == 2) { + BigDecimal left = limitValue(operands.get(0)); + BigDecimal right = limitValue(operands.get(1)); + + return left != null && right != null ? left.subtract(right) : null; + } + + break; + + default: + return null; } } + + return null; } /** {@inheritDoc} */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java index 05d733e02329c..f7e2f6a90932c 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/sql/generated/IgniteSqlParserImpl.java @@ -675,7 +675,7 @@ final public void FetchClause(SqlNode[] offsetFetch) throws ParseException { jj_consume_token(-1); throw new ParseException(); } - offsetFetch[1] = UnsignedNumericLiteralOrParam(); + offsetFetch[1] = FetchCount(); if (jj_2_19(2)) { jj_consume_token(ROW); } else if (jj_2_20(2)) { @@ -2023,6 +2023,19 @@ final public SqlDrop SqlDropView(Span s, boolean replace) throws ParseException throw new Error("Missing return statement in function"); } + SqlNode FetchCount() throws ParseException { + SqlNode e; + if (getToken(1).kind == LPAREN) { + jj_consume_token(LPAREN); + e = Expression(ExprContext.ACCEPT_NON_QUERY); + jj_consume_token(RPAREN); + } + else + e = UnsignedNumericLiteralOrParam(); + + return e; + } + final public SqlNodeList ParenthesizedKeyValueOptionCommaList() throws ParseException { final Span s; final List list = new ArrayList(); @@ -24191,128 +24204,6 @@ final private boolean jj_2_1805(int xla) { finally { jj_save(1804, xla); } } - final private boolean jj_3_642() { - if (jj_scan_token(HOUR)) return true; - return false; - } - - final private boolean jj_3_641() { - if (jj_scan_token(MINUTE)) return true; - return false; - } - - final private boolean jj_3_264() { - if (jj_scan_token(WITH)) return true; - if (jj_scan_token(ORDINALITY)) return true; - return false; - } - - final private boolean jj_3_640() { - if (jj_scan_token(SECOND)) return true; - return false; - } - - final private boolean jj_3_639() { - if (jj_scan_token(MILLISECOND)) return true; - return false; - } - - final private boolean jj_3_638() { - if (jj_scan_token(MICROSECOND)) return true; - return false; - } - - final private boolean jj_3R_270() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_637()) { - jj_scanpos = xsp; - if (jj_3_638()) { - jj_scanpos = xsp; - if (jj_3_639()) { - jj_scanpos = xsp; - if (jj_3_640()) { - jj_scanpos = xsp; - if (jj_3_641()) { - jj_scanpos = xsp; - if (jj_3_642()) { - jj_scanpos = xsp; - if (jj_3_643()) { - jj_scanpos = xsp; - if (jj_3_644()) { - jj_scanpos = xsp; - if (jj_3_645()) { - jj_scanpos = xsp; - if (jj_3_646()) { - jj_scanpos = xsp; - if (jj_3_647()) { - jj_scanpos = xsp; - if (jj_3_648()) { - jj_scanpos = xsp; - if (jj_3_649()) { - jj_scanpos = xsp; - if (jj_3_650()) { - jj_scanpos = xsp; - if (jj_3_651()) { - jj_scanpos = xsp; - if (jj_3_652()) { - jj_scanpos = xsp; - if (jj_3_653()) { - jj_scanpos = xsp; - if (jj_3_654()) { - jj_scanpos = xsp; - if (jj_3_655()) { - jj_scanpos = xsp; - if (jj_3_656()) { - jj_scanpos = xsp; - if (jj_3_657()) return true; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - return false; - } - - final private boolean jj_3_637() { - if (jj_scan_token(NANOSECOND)) return true; - return false; - } - - final private boolean jj_3_263() { - if (jj_scan_token(LATERAL)) return true; - return false; - } - - final private boolean jj_3_262() { - if (jj_3R_168()) return true; - return false; - } - - final private boolean jj_3_268() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_263()) jj_scanpos = xsp; - if (jj_scan_token(UNNEST)) return true; - if (jj_3R_173()) return true; - return false; - } - final private boolean jj_3_259() { if (jj_3R_168()) return true; return false; @@ -28570,13 +28461,6 @@ final private boolean jj_3_485() { return false; } - final private boolean jj_3R_242() { - if (jj_scan_token(VIEW)) return true; - if (jj_3R_133()) return true; - if (jj_3R_152()) return true; - return false; - } - final private boolean jj_3_484() { if (jj_3R_152()) return true; return false; @@ -28603,8 +28487,9 @@ final private boolean jj_3_481() { return false; } - final private boolean jj_3R_238() { + final private boolean jj_3R_242() { if (jj_scan_token(VIEW)) return true; + if (jj_3R_133()) return true; if (jj_3R_152()) return true; return false; } @@ -28645,9 +28530,9 @@ final private boolean jj_3_475() { return false; } - final private boolean jj_3R_104() { - if (jj_scan_token(ANALYZE)) return true; - if (jj_3R_354()) return true; + final private boolean jj_3R_238() { + if (jj_scan_token(VIEW)) return true; + if (jj_3R_152()) return true; return false; } @@ -28718,9 +28603,9 @@ final private boolean jj_3_941() { return false; } - final private boolean jj_3R_105() { - if (jj_scan_token(REFRESH)) return true; - if (jj_scan_token(STATISTICS)) return true; + final private boolean jj_3R_104() { + if (jj_scan_token(ANALYZE)) return true; + if (jj_3R_354()) return true; return false; } @@ -28735,8 +28620,8 @@ final private boolean jj_3R_325() { return false; } - final private boolean jj_3R_106() { - if (jj_scan_token(DROP)) return true; + final private boolean jj_3R_105() { + if (jj_scan_token(REFRESH)) return true; if (jj_scan_token(STATISTICS)) return true; return false; } @@ -28746,11 +28631,6 @@ final private boolean jj_3_471() { return false; } - final private boolean jj_3_147() { - if (jj_3R_84()) return true; - return false; - } - final private boolean jj_3_473() { if (jj_scan_token(COMMA)) return true; if (jj_3R_139()) return true; @@ -28763,24 +28643,19 @@ final private boolean jj_3_940() { return false; } - final private boolean jj_3_146() { - if (jj_3R_119()) return true; - return false; - } - final private boolean jj_3_472() { if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_939() { - if (jj_scan_token(LAST)) return true; + final private boolean jj_3R_106() { + if (jj_scan_token(DROP)) return true; + if (jj_scan_token(STATISTICS)) return true; return false; } - final private boolean jj_3R_136() { - if (jj_3R_364()) return true; - if (jj_scan_token(EQ)) return true; + final private boolean jj_3_939() { + if (jj_scan_token(LAST)) return true; return false; } @@ -28808,6 +28683,11 @@ final private boolean jj_3_937() { return false; } + final private boolean jj_3_147() { + if (jj_3R_84()) return true; + return false; + } + final private boolean jj_3_936() { if (jj_scan_token(RUNNING)) return true; return false; @@ -28824,8 +28704,8 @@ final private boolean jj_3R_416() { return false; } - final private boolean jj_3_145() { - if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true; + final private boolean jj_3_146() { + if (jj_3R_119()) return true; return false; } @@ -28848,11 +28728,32 @@ final private boolean jj_3R_324() { return false; } + final private boolean jj_3R_136() { + if (jj_3R_364()) return true; + if (jj_scan_token(EQ)) return true; + return false; + } + + final private boolean jj_3_145() { + if (jj_scan_token(MAX_CHANGED_PARTITION_ROWS_PERCENT)) return true; + return false; + } + + final private boolean jj_3_935() { + if (jj_scan_token(FINAL)) return true; + return false; + } + final private boolean jj_3_144() { if (jj_scan_token(NULLS)) return true; return false; } + final private boolean jj_3_934() { + if (jj_scan_token(RUNNING)) return true; + return false; + } + final private boolean jj_3_143() { if (jj_scan_token(SIZE)) return true; return false; @@ -28882,32 +28783,6 @@ final private boolean jj_3R_364() { return false; } - final private boolean jj_3_141() { - if (jj_scan_token(DISTINCT)) return true; - return false; - } - - final private boolean jj_3_935() { - if (jj_scan_token(FINAL)) return true; - return false; - } - - final private boolean jj_3_139() { - if (jj_scan_token(QUOTED_IDENTIFIER)) return true; - return false; - } - - final private boolean jj_3_934() { - if (jj_scan_token(RUNNING)) return true; - return false; - } - - final private boolean jj_3_137() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_136()) return true; - return false; - } - final private boolean jj_3R_326() { Token xsp; xsp = jj_scanpos; @@ -28919,8 +28794,8 @@ final private boolean jj_3R_326() { return false; } - final private boolean jj_3_138() { - if (jj_3R_136()) return true; + final private boolean jj_3_141() { + if (jj_scan_token(DISTINCT)) return true; return false; } @@ -28930,14 +28805,8 @@ final private boolean jj_3_468() { return false; } - final private boolean jj_3_140() { - if (jj_scan_token(WITH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_138()) { - jj_scanpos = xsp; - if (jj_3_139()) return true; - } + final private boolean jj_3_139() { + if (jj_scan_token(QUOTED_IDENTIFIER)) return true; return false; } @@ -28951,6 +28820,12 @@ final private boolean jj_3_933() { return false; } + final private boolean jj_3_137() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_136()) return true; + return false; + } + final private boolean jj_3_932() { if (jj_3R_325()) return true; return false; @@ -28966,6 +28841,11 @@ final private boolean jj_3_931() { return false; } + final private boolean jj_3_138() { + if (jj_3R_136()) return true; + return false; + } + final private boolean jj_3_930() { if (jj_scan_token(MATCH_NUMBER)) return true; if (jj_scan_token(LPAREN)) return true; @@ -28978,9 +28858,14 @@ final private boolean jj_3_465() { return false; } - final private boolean jj_3_136() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_135()) return true; + final private boolean jj_3_140() { + if (jj_scan_token(WITH)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_138()) { + jj_scanpos = xsp; + if (jj_3_139()) return true; + } return false; } @@ -29014,11 +28899,6 @@ final private boolean jj_3R_304() { return false; } - final private boolean jj_3R_354() { - if (jj_3R_135()) return true; - return false; - } - final private boolean jj_3_463() { if (jj_scan_token(STRING_AGG)) return true; return false; @@ -29039,6 +28919,12 @@ final private boolean jj_3_460() { return false; } + final private boolean jj_3_136() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_135()) return true; + return false; + } + final private boolean jj_3R_327() { Token xsp; xsp = jj_scanpos; @@ -29066,13 +28952,13 @@ final private boolean jj_3_927() { return false; } - final private boolean jj_3_135() { - if (jj_3R_124()) return true; + final private boolean jj_3_926() { + if (jj_scan_token(TUMBLE)) return true; return false; } - final private boolean jj_3_926() { - if (jj_scan_token(TUMBLE)) return true; + final private boolean jj_3R_354() { + if (jj_3R_135()) return true; return false; } @@ -29090,13 +28976,8 @@ final private boolean jj_3R_312() { return false; } - final private boolean jj_3R_135() { - if (jj_3R_152()) return true; - return false; - } - - final private boolean jj_3_134() { - if (jj_scan_token(TRANSACTION)) return true; + final private boolean jj_3_135() { + if (jj_3R_124()) return true; return false; } @@ -29105,9 +28986,8 @@ final private boolean jj_3_458() { return false; } - final private boolean jj_3R_101() { - if (jj_scan_token(ROLLBACK)) return true; - if (jj_scan_token(TO)) return true; + final private boolean jj_3R_135() { + if (jj_3R_152()) return true; return false; } @@ -29122,7 +29002,7 @@ final private boolean jj_3_459() { return false; } - final private boolean jj_3_133() { + final private boolean jj_3_134() { if (jj_scan_token(TRANSACTION)) return true; return false; } @@ -29139,9 +29019,9 @@ final private boolean jj_3R_303() { return false; } - final private boolean jj_3R_100() { - if (jj_scan_token(SAVEPOINT)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3R_101() { + if (jj_scan_token(ROLLBACK)) return true; + if (jj_scan_token(TO)) return true; return false; } @@ -29150,11 +29030,14 @@ final private boolean jj_3R_207() { return false; } - final private boolean jj_3R_103() { - if (jj_scan_token(ROLLBACK)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_134()) jj_scanpos = xsp; + final private boolean jj_3_133() { + if (jj_scan_token(TRANSACTION)) return true; + return false; + } + + final private boolean jj_3R_100() { + if (jj_scan_token(SAVEPOINT)) return true; + if (jj_3R_84()) return true; return false; } @@ -29164,16 +29047,16 @@ final private boolean jj_3R_296() { return false; } - final private boolean jj_3R_102() { - if (jj_scan_token(COMMIT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_133()) jj_scanpos = xsp; + final private boolean jj_3_455() { + if (jj_3R_219()) return true; return false; } - final private boolean jj_3_455() { - if (jj_3R_219()) return true; + final private boolean jj_3R_103() { + if (jj_scan_token(ROLLBACK)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_134()) jj_scanpos = xsp; return false; } @@ -29192,9 +29075,11 @@ final private boolean jj_3R_74() { return false; } - final private boolean jj_3R_99() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(QUERY)) return true; + final private boolean jj_3R_102() { + if (jj_scan_token(COMMIT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_133()) jj_scanpos = xsp; return false; } @@ -29204,8 +29089,9 @@ final private boolean jj_3R_302() { return false; } - final private boolean jj_3_132() { - if (jj_scan_token(ASYNC)) return true; + final private boolean jj_3R_99() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(QUERY)) return true; return false; } @@ -29219,12 +29105,6 @@ final private boolean jj_3_452() { return false; } - final private boolean jj_3R_98() { - if (jj_scan_token(KILL)) return true; - if (jj_scan_token(COMPUTE)) return true; - return false; - } - final private boolean jj_3_451() { if (jj_scan_token(IMMEDIATELY)) return true; if (jj_scan_token(SUCCEEDS)) return true; @@ -29242,6 +29122,11 @@ final private boolean jj_3R_301() { return false; } + final private boolean jj_3_132() { + if (jj_scan_token(ASYNC)) return true; + return false; + } + final private boolean jj_3_449() { if (jj_scan_token(IMMEDIATELY)) return true; if (jj_scan_token(PRECEDES)) return true; @@ -29253,9 +29138,9 @@ final private boolean jj_3_448() { return false; } - final private boolean jj_3R_96() { + final private boolean jj_3R_98() { if (jj_scan_token(KILL)) return true; - if (jj_scan_token(SERVICE)) return true; + if (jj_scan_token(COMPUTE)) return true; return false; } @@ -29290,9 +29175,9 @@ final private boolean jj_3_924() { return false; } - final private boolean jj_3R_97() { + final private boolean jj_3R_96() { if (jj_scan_token(KILL)) return true; - if (jj_scan_token(TRANSACTION)) return true; + if (jj_scan_token(SERVICE)) return true; return false; } @@ -29302,15 +29187,21 @@ final private boolean jj_3R_295() { return false; } - final private boolean jj_3R_95() { + final private boolean jj_3R_408() { + if (jj_3R_415()) return true; + if (jj_scan_token(LAMBDA)) return true; + return false; + } + + final private boolean jj_3R_97() { if (jj_scan_token(KILL)) return true; - if (jj_scan_token(CONTINUOUS)) return true; + if (jj_scan_token(TRANSACTION)) return true; return false; } - final private boolean jj_3R_408() { - if (jj_3R_415()) return true; - if (jj_scan_token(LAMBDA)) return true; + final private boolean jj_3R_95() { + if (jj_scan_token(KILL)) return true; + if (jj_scan_token(CONTINUOUS)) return true; return false; } @@ -29344,32 +29235,15 @@ final private boolean jj_3R_299() { return false; } - final private boolean jj_3_131() { - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; - return false; - } - final private boolean jj_3R_218() { return false; } - final private boolean jj_3_130() { - if (jj_scan_token(MINUS)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; - return false; - } - final private boolean jj_3_440() { if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_129() { - if (jj_scan_token(PLUS)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; - return false; - } - final private boolean jj_3_445() { Token xsp; xsp = jj_scanpos; @@ -29381,15 +29255,26 @@ final private boolean jj_3_445() { return false; } + final private boolean jj_3_131() { + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + return false; + } + + final private boolean jj_3_130() { + if (jj_scan_token(MINUS)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + return false; + } + final private boolean jj_3R_297() { if (jj_scan_token(TIMESTAMPADD)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_241() { - if (jj_scan_token(USER)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_129() { + if (jj_scan_token(PLUS)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } @@ -29425,9 +29310,9 @@ final private boolean jj_3_442() { return false; } - final private boolean jj_3R_93() { - if (jj_scan_token(ALTER)) return true; + final private boolean jj_3R_241() { if (jj_scan_token(USER)) return true; + if (jj_3R_84()) return true; return false; } @@ -29437,14 +29322,9 @@ final private boolean jj_3R_294() { return false; } - final private boolean jj_3R_237() { + final private boolean jj_3R_93() { + if (jj_scan_token(ALTER)) return true; if (jj_scan_token(USER)) return true; - if (jj_3R_84()) return true; - return false; - } - - final private boolean jj_3_124() { - if (jj_scan_token(COLUMN)) return true; return false; } @@ -29464,11 +29344,6 @@ final private boolean jj_3_923() { return false; } - final private boolean jj_3_123() { - if (jj_scan_token(COLUMN)) return true; - return false; - } - final private boolean jj_3_437() { if (jj_scan_token(EQ)) return true; return false; @@ -29479,16 +29354,6 @@ final private boolean jj_3_922() { return false; } - final private boolean jj_3_128() { - if (jj_scan_token(DROP)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_124()) jj_scanpos = xsp; - if (jj_3R_133()) return true; - if (jj_3R_134()) return true; - return false; - } - final private boolean jj_3_436() { if (jj_scan_token(GE)) return true; return false; @@ -29499,18 +29364,14 @@ final private boolean jj_3_435() { return false; } - final private boolean jj_3_127() { - if (jj_scan_token(ADD)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_123()) jj_scanpos = xsp; - if (jj_3R_131()) return true; - if (jj_3R_132()) return true; + final private boolean jj_3_434() { + if (jj_scan_token(LE)) return true; return false; } - final private boolean jj_3_434() { - if (jj_scan_token(LE)) return true; + final private boolean jj_3R_237() { + if (jj_scan_token(USER)) return true; + if (jj_3R_84()) return true; return false; } @@ -29539,8 +29400,8 @@ final private boolean jj_3R_208() { return false; } - final private boolean jj_3_126() { - if (jj_scan_token(NOLOGGING)) return true; + final private boolean jj_3_124() { + if (jj_scan_token(COLUMN)) return true; return false; } @@ -29555,8 +29416,8 @@ final private boolean jj_3R_292() { return false; } - final private boolean jj_3_125() { - if (jj_scan_token(LOGGING)) return true; + final private boolean jj_3_123() { + if (jj_scan_token(COLUMN)) return true; return false; } @@ -29564,9 +29425,13 @@ final private boolean jj_3R_407() { return false; } - final private boolean jj_3R_92() { - if (jj_scan_token(ALTER)) return true; - if (jj_scan_token(TABLE)) return true; + final private boolean jj_3_128() { + if (jj_scan_token(DROP)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_124()) jj_scanpos = xsp; + if (jj_3R_133()) return true; + if (jj_3R_134()) return true; return false; } @@ -29575,29 +29440,35 @@ final private boolean jj_3_430() { return false; } - final private boolean jj_3_423() { - if (jj_scan_token(DOT)) return true; - if (jj_3R_84()) return true; + final private boolean jj_3_127() { + if (jj_scan_token(ADD)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_123()) jj_scanpos = xsp; + if (jj_3R_131()) return true; + if (jj_3R_132()) return true; return false; } - final private boolean jj_3_122() { - if (jj_3R_130()) return true; + final private boolean jj_3_126() { + if (jj_scan_token(NOLOGGING)) return true; return false; } - final private boolean jj_3R_132() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_121()) { - jj_scanpos = xsp; - if (jj_3_122()) return true; - } + final private boolean jj_3_125() { + if (jj_scan_token(LOGGING)) return true; return false; } - final private boolean jj_3_121() { - if (jj_3R_129()) return true; + final private boolean jj_3_423() { + if (jj_scan_token(DOT)) return true; + if (jj_3R_84()) return true; + return false; + } + + final private boolean jj_3R_92() { + if (jj_scan_token(ALTER)) return true; + if (jj_scan_token(TABLE)) return true; return false; } @@ -29655,9 +29526,23 @@ final private boolean jj_3_429() { return false; } - final private boolean jj_3_120() { - if (jj_scan_token(NOT)) return true; - if (jj_scan_token(NULL)) return true; + final private boolean jj_3_122() { + if (jj_3R_130()) return true; + return false; + } + + final private boolean jj_3R_132() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_121()) { + jj_scanpos = xsp; + if (jj_3_122()) return true; + } + return false; + } + + final private boolean jj_3_121() { + if (jj_3R_129()) return true; return false; } @@ -29672,12 +29557,6 @@ final private boolean jj_3_428() { return false; } - final private boolean jj_3R_129() { - if (jj_3R_84()) return true; - if (jj_3R_122()) return true; - return false; - } - final private boolean jj_3_427() { if (jj_3R_212()) return true; return false; @@ -29700,9 +29579,9 @@ final private boolean jj_3_417() { return false; } - final private boolean jj_3_119() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_129()) return true; + final private boolean jj_3_120() { + if (jj_scan_token(NOT)) return true; + if (jj_scan_token(NULL)) return true; return false; } @@ -29711,6 +29590,12 @@ final private boolean jj_3_413() { return false; } + final private boolean jj_3R_129() { + if (jj_3R_84()) return true; + if (jj_3R_122()) return true; + return false; + } + final private boolean jj_3_416() { if (jj_scan_token(TILDE)) return true; Token xsp; @@ -29736,12 +29621,6 @@ final private boolean jj_3_415() { return false; } - final private boolean jj_3R_130() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_129()) return true; - return false; - } - final private boolean jj_3_410() { if (jj_scan_token(RLIKE)) return true; return false; @@ -29773,6 +29652,12 @@ final private boolean jj_3_405() { return false; } + final private boolean jj_3_119() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_129()) return true; + return false; + } + final private boolean jj_3_404() { if (jj_scan_token(ILIKE)) return true; return false; @@ -29783,6 +29668,12 @@ final private boolean jj_3_403() { return false; } + final private boolean jj_3R_130() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_129()) return true; + return false; + } + final private boolean jj_3_407() { if (jj_scan_token(NOT)) return true; Token xsp; @@ -29811,12 +29702,6 @@ final private boolean jj_3_916() { return false; } - final private boolean jj_3R_212() { - if (jj_scan_token(INFIX_CAST)) return true; - if (jj_3R_122()) return true; - return false; - } - final private boolean jj_3_414() { Token xsp; xsp = jj_scanpos; @@ -29852,13 +29737,6 @@ final private boolean jj_3R_310() { return false; } - final private boolean jj_3R_240() { - if (jj_scan_token(INDEX)) return true; - if (jj_3R_133()) return true; - if (jj_3R_152()) return true; - return false; - } - final private boolean jj_3_426() { Token xsp; xsp = jj_scanpos; @@ -29878,6 +29756,12 @@ final private boolean jj_3_399() { return false; } + final private boolean jj_3R_212() { + if (jj_scan_token(INFIX_CAST)) return true; + if (jj_3R_122()) return true; + return false; + } + final private boolean jj_3_400() { Token xsp; xsp = jj_scanpos; @@ -29893,13 +29777,6 @@ final private boolean jj_3_398() { return false; } - final private boolean jj_3R_239() { - if (jj_scan_token(TABLE)) return true; - if (jj_3R_133()) return true; - if (jj_3R_152()) return true; - return false; - } - final private boolean jj_3_915() { if (jj_3R_321()) return true; return false; @@ -29910,6 +29787,13 @@ final private boolean jj_3_396() { return false; } + final private boolean jj_3R_240() { + if (jj_scan_token(INDEX)) return true; + if (jj_3R_133()) return true; + if (jj_3R_152()) return true; + return false; + } + final private boolean jj_3_402() { if (jj_scan_token(BETWEEN)) return true; Token xsp; @@ -29933,38 +29817,25 @@ final private boolean jj_3_395() { return false; } - final private boolean jj_3R_363() { - return false; - } - final private boolean jj_3R_309() { if (jj_scan_token(JSON_OBJECTAGG)) return true; if (jj_scan_token(LPAREN)) return true; return false; } - final private boolean jj_3R_133() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_118()) { - jj_scanpos = xsp; - if (jj_3R_363()) return true; - } - return false; - } - - final private boolean jj_3_118() { - if (jj_scan_token(IF)) return true; - if (jj_scan_token(EXISTS)) return true; - return false; - } - final private boolean jj_3_401() { if (jj_scan_token(NOT)) return true; if (jj_scan_token(BETWEEN)) return true; return false; } + final private boolean jj_3R_239() { + if (jj_scan_token(TABLE)) return true; + if (jj_3R_133()) return true; + if (jj_3R_152()) return true; + return false; + } + final private boolean jj_3_425() { Token xsp; xsp = jj_scanpos; @@ -29976,30 +29847,28 @@ final private boolean jj_3_425() { return false; } - final private boolean jj_3_117() { - if (jj_scan_token(INLINE_SIZE)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3R_363() { return false; } - final private boolean jj_3_914() { - if (jj_3R_321()) return true; + final private boolean jj_3R_133() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_118()) { + jj_scanpos = xsp; + if (jj_3R_363()) return true; + } return false; } - final private boolean jj_3_116() { - if (jj_scan_token(PARALLEL)) return true; - if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + final private boolean jj_3_118() { + if (jj_scan_token(IF)) return true; + if (jj_scan_token(EXISTS)) return true; return false; } - final private boolean jj_3_115() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_116()) { - jj_scanpos = xsp; - if (jj_3_117()) return true; - } + final private boolean jj_3_914() { + if (jj_3R_321()) return true; return false; } @@ -30019,8 +29888,9 @@ final private boolean jj_3_390() { return false; } - final private boolean jj_3_114() { - if (jj_3R_84()) return true; + final private boolean jj_3_117() { + if (jj_scan_token(INLINE_SIZE)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; return false; } @@ -30034,6 +29904,22 @@ final private boolean jj_3_913() { return false; } + final private boolean jj_3_116() { + if (jj_scan_token(PARALLEL)) return true; + if (jj_scan_token(UNSIGNED_INTEGER_LITERAL)) return true; + return false; + } + + final private boolean jj_3_115() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_116()) { + jj_scanpos = xsp; + if (jj_3_117()) return true; + } + return false; + } + final private boolean jj_3_394() { if (jj_3R_208()) return true; Token xsp; @@ -30048,16 +29934,6 @@ final private boolean jj_3_394() { return false; } - final private boolean jj_3R_236() { - if (jj_scan_token(INDEX)) return true; - if (jj_3R_131()) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_114()) jj_scanpos = xsp; - if (jj_scan_token(ON)) return true; - return false; - } - final private boolean jj_3R_308() { if (jj_scan_token(JSON_OBJECT)) return true; if (jj_scan_token(LPAREN)) return true; @@ -30075,6 +29951,11 @@ final private boolean jj_3_392() { return false; } + final private boolean jj_3_114() { + if (jj_3R_84()) return true; + return false; + } + final private boolean jj_3_424() { Token xsp; xsp = jj_scanpos; @@ -30089,9 +29970,13 @@ final private boolean jj_3_424() { return false; } - final private boolean jj_3_113() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_128()) return true; + final private boolean jj_3R_236() { + if (jj_scan_token(INDEX)) return true; + if (jj_3R_131()) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_114()) jj_scanpos = xsp; + if (jj_scan_token(ON)) return true; return false; } @@ -30152,6 +30037,12 @@ final private boolean jj_3_432() { return false; } + final private boolean jj_3_113() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_128()) return true; + return false; + } + final private boolean jj_3R_211() { if (jj_3R_210()) return true; Token xsp; @@ -30168,26 +30059,6 @@ final private boolean jj_3_909() { return false; } - final private boolean jj_3_111() { - if (jj_scan_token(DESC)) return true; - return false; - } - - final private boolean jj_3_112() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_110()) { - jj_scanpos = xsp; - if (jj_3_111()) return true; - } - return false; - } - - final private boolean jj_3_110() { - if (jj_scan_token(ASC)) return true; - return false; - } - final private boolean jj_3_906() { if (jj_scan_token(KEY)) return true; if (jj_3R_319()) return true; @@ -30199,11 +30070,6 @@ final private boolean jj_3_908() { return false; } - final private boolean jj_3R_128() { - if (jj_3R_84()) return true; - return false; - } - final private boolean jj_3_907() { if (jj_scan_token(VALUE)) return true; return false; @@ -30214,12 +30080,23 @@ final private boolean jj_3R_402() { return false; } - final private boolean jj_3R_126() { + final private boolean jj_3_111() { + if (jj_scan_token(DESC)) return true; return false; } - final private boolean jj_3_107() { - if (jj_3R_124()) return true; + final private boolean jj_3_112() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_110()) { + jj_scanpos = xsp; + if (jj_3_111()) return true; + } + return false; + } + + final private boolean jj_3_110() { + if (jj_scan_token(ASC)) return true; return false; } @@ -30243,21 +30120,12 @@ final private boolean jj_3R_320() { return false; } - final private boolean jj_3_109() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_107()) { - jj_scanpos = xsp; - if (jj_3R_126()) return true; - } - if (jj_3R_127()) return true; - if (jj_scan_token(AS)) return true; - if (jj_3R_79()) return true; + final private boolean jj_3R_128() { + if (jj_3R_84()) return true; return false; } - final private boolean jj_3_108() { - if (jj_3R_125()) return true; + final private boolean jj_3R_126() { return false; } @@ -30266,6 +30134,11 @@ final private boolean jj_3R_319() { return false; } + final private boolean jj_3_107() { + if (jj_3R_124()) return true; + return false; + } + final private boolean jj_3_388() { if (jj_scan_token(DOT)) return true; if (jj_3R_207()) return true; @@ -30283,10 +30156,21 @@ final private boolean jj_3R_375() { return false; } - final private boolean jj_3R_235() { - if (jj_scan_token(TABLE)) return true; - if (jj_3R_131()) return true; - if (jj_3R_152()) return true; + final private boolean jj_3_109() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_107()) { + jj_scanpos = xsp; + if (jj_3R_126()) return true; + } + if (jj_3R_127()) return true; + if (jj_scan_token(AS)) return true; + if (jj_3R_79()) return true; + return false; + } + + final private boolean jj_3_108() { + if (jj_3R_125()) return true; return false; } @@ -30314,9 +30198,10 @@ final private boolean jj_3_905() { return false; } - final private boolean jj_3_106() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_123()) return true; + final private boolean jj_3R_235() { + if (jj_scan_token(TABLE)) return true; + if (jj_3R_131()) return true; + if (jj_3R_152()) return true; return false; } @@ -30336,14 +30221,14 @@ final private boolean jj_3_899() { return false; } - final private boolean jj_3R_125() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_123()) return true; + final private boolean jj_3_903() { + if (jj_3R_315()) return true; return false; } - final private boolean jj_3_903() { - if (jj_3R_315()) return true; + final private boolean jj_3_106() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_123()) return true; return false; } @@ -30363,18 +30248,9 @@ final private boolean jj_3R_307() { return false; } - final private boolean jj_3_103() { - if (jj_scan_token(CONSTRAINT)) return true; - if (jj_3R_84()) return true; - return false; - } - - final private boolean jj_3_105() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_103()) jj_scanpos = xsp; - if (jj_scan_token(PRIMARY)) return true; - if (jj_scan_token(KEY)) return true; + final private boolean jj_3R_125() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_123()) return true; return false; } @@ -30398,12 +30274,6 @@ final private boolean jj_3R_250() { return false; } - final private boolean jj_3_102() { - if (jj_scan_token(PRIMARY)) return true; - if (jj_scan_token(KEY)) return true; - return false; - } - final private boolean jj_3_386() { if (jj_3R_206()) return true; return false; @@ -30414,6 +30284,12 @@ final private boolean jj_3_896() { return false; } + final private boolean jj_3_103() { + if (jj_scan_token(CONSTRAINT)) return true; + if (jj_3R_84()) return true; + return false; + } + final private boolean jj_3_902() { if (jj_scan_token(WITH)) return true; Token xsp; @@ -30424,15 +30300,18 @@ final private boolean jj_3_902() { return false; } - final private boolean jj_3_901() { - if (jj_scan_token(WITH)) return true; - if (jj_scan_token(CONDITIONAL)) return true; + final private boolean jj_3_105() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_103()) jj_scanpos = xsp; + if (jj_scan_token(PRIMARY)) return true; + if (jj_scan_token(KEY)) return true; return false; } - final private boolean jj_3_101() { - if (jj_scan_token(DEFAULT_)) return true; - if (jj_3R_119()) return true; + final private boolean jj_3_901() { + if (jj_scan_token(WITH)) return true; + if (jj_scan_token(CONDITIONAL)) return true; return false; } @@ -30454,6 +30333,12 @@ final private boolean jj_3R_317() { return false; } + final private boolean jj_3_102() { + if (jj_scan_token(PRIMARY)) return true; + if (jj_scan_token(KEY)) return true; + return false; + } + final private boolean jj_3_900() { if (jj_scan_token(WITHOUT)) return true; Token xsp; @@ -30467,22 +30352,6 @@ final private boolean jj_3R_205() { return false; } - final private boolean jj_3R_123() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_104()) { - jj_scanpos = xsp; - if (jj_3_105()) return true; - } - return false; - } - - final private boolean jj_3_104() { - if (jj_3R_84()) return true; - if (jj_3R_122()) return true; - return false; - } - final private boolean jj_3_383() { if (jj_scan_token(RECURSIVE)) return true; return false; @@ -30493,6 +30362,12 @@ final private boolean jj_3_895() { return false; } + final private boolean jj_3_101() { + if (jj_scan_token(DEFAULT_)) return true; + if (jj_3R_119()) return true; + return false; + } + final private boolean jj_3_384() { if (jj_scan_token(COMMA)) return true; if (jj_3R_205()) return true; @@ -30513,15 +30388,25 @@ final private boolean jj_3R_204() { return false; } - final private boolean jj_3_893() { - if (jj_scan_token(EMPTY)) return true; - if (jj_scan_token(OBJECT)) return true; + final private boolean jj_3R_123() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_104()) { + jj_scanpos = xsp; + if (jj_3_105()) return true; + } return false; } - final private boolean jj_3R_121() { - if (jj_scan_token(INTERVAL)) return true; - if (jj_3R_215()) return true; + final private boolean jj_3_104() { + if (jj_3R_84()) return true; + if (jj_3R_122()) return true; + return false; + } + + final private boolean jj_3_893() { + if (jj_scan_token(EMPTY)) return true; + if (jj_scan_token(OBJECT)) return true; return false; } @@ -30536,18 +30421,14 @@ final private boolean jj_3_891() { return false; } - final private boolean jj_3_100() { - if (jj_3R_121()) return true; - return false; - } - - final private boolean jj_3_99() { - if (jj_3R_120()) return true; + final private boolean jj_3_890() { + if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_890() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3R_121() { + if (jj_scan_token(INTERVAL)) return true; + if (jj_3R_215()) return true; return false; } @@ -30568,6 +30449,26 @@ final private boolean jj_3R_318() { return false; } + final private boolean jj_3R_67() { + if (jj_3R_344()) return true; + return false; + } + + final private boolean jj_3_100() { + if (jj_3R_121()) return true; + return false; + } + + final private boolean jj_3_99() { + if (jj_3R_120()) return true; + return false; + } + + final private boolean jj_3_889() { + if (jj_3R_316()) return true; + return false; + } + final private boolean jj_3R_122() { Token xsp; xsp = jj_scanpos; @@ -30578,8 +30479,8 @@ final private boolean jj_3R_122() { return false; } - final private boolean jj_3R_67() { - if (jj_3R_344()) return true; + final private boolean jj_3_888() { + if (jj_3R_315()) return true; return false; } @@ -30593,8 +30494,9 @@ final private boolean jj_3_97() { return false; } - final private boolean jj_3_889() { - if (jj_3R_316()) return true; + final private boolean jj_3R_306() { + if (jj_scan_token(JSON_VALUE)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } @@ -30604,19 +30506,18 @@ final private boolean jj_3R_118() { return false; } - final private boolean jj_3_888() { - if (jj_3R_315()) return true; + final private boolean jj_3_887() { + if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3R_306() { - if (jj_scan_token(JSON_VALUE)) return true; - if (jj_scan_token(LPAREN)) return true; + final private boolean jj_3_96() { + if (jj_scan_token(WRAP_VALUE)) return true; return false; } - final private boolean jj_3_96() { - if (jj_scan_token(WRAP_VALUE)) return true; + final private boolean jj_3_886() { + if (jj_scan_token(EMPTY)) return true; return false; } @@ -30640,13 +30541,14 @@ final private boolean jj_3_92() { return false; } - final private boolean jj_3_91() { - if (jj_scan_token(DATA_REGION)) return true; + final private boolean jj_3_885() { + if (jj_scan_token(DEFAULT_)) return true; + if (jj_3R_78()) return true; return false; } - final private boolean jj_3_887() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3_91() { + if (jj_scan_token(DATA_REGION)) return true; return false; } @@ -30655,13 +30557,23 @@ final private boolean jj_3_90() { return false; } + final private boolean jj_3_884() { + if (jj_scan_token(NULL)) return true; + return false; + } + + final private boolean jj_3_382() { + if (jj_3R_67()) return true; + return false; + } + final private boolean jj_3_89() { if (jj_scan_token(CACHE_GROUP)) return true; return false; } - final private boolean jj_3_886() { - if (jj_scan_token(EMPTY)) return true; + final private boolean jj_3_381() { + if (jj_3R_204()) return true; return false; } @@ -30670,6 +30582,19 @@ final private boolean jj_3_88() { return false; } + final private boolean jj_3_883() { + if (jj_scan_token(ERROR)) return true; + return false; + } + + final private boolean jj_3R_68() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_381()) jj_scanpos = xsp; + if (jj_3R_206()) return true; + return false; + } + final private boolean jj_3_87() { if (jj_scan_token(ATOMICITY)) return true; return false; @@ -30680,14 +30605,22 @@ final private boolean jj_3_86() { return false; } - final private boolean jj_3_85() { - if (jj_scan_token(BACKUPS)) return true; + final private boolean jj_3R_316() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_883()) { + jj_scanpos = xsp; + if (jj_3_884()) { + jj_scanpos = xsp; + if (jj_3_885()) return true; + } + } + if (jj_scan_token(ON)) return true; return false; } - final private boolean jj_3_885() { - if (jj_scan_token(DEFAULT_)) return true; - if (jj_3R_78()) return true; + final private boolean jj_3_85() { + if (jj_scan_token(BACKUPS)) return true; return false; } @@ -30745,58 +30678,6 @@ final private boolean jj_3_80() { return false; } - final private boolean jj_3_884() { - if (jj_scan_token(NULL)) return true; - return false; - } - - final private boolean jj_3_382() { - if (jj_3R_67()) return true; - return false; - } - - final private boolean jj_3_381() { - if (jj_3R_204()) return true; - return false; - } - - final private boolean jj_3_883() { - if (jj_scan_token(ERROR)) return true; - return false; - } - - final private boolean jj_3R_68() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_381()) jj_scanpos = xsp; - if (jj_3R_206()) return true; - return false; - } - - final private boolean jj_3_82() { - if (jj_3R_118()) return true; - return false; - } - - final private boolean jj_3R_316() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_883()) { - jj_scanpos = xsp; - if (jj_3_884()) { - jj_scanpos = xsp; - if (jj_3_885()) return true; - } - } - if (jj_scan_token(ON)) return true; - return false; - } - - final private boolean jj_3_81() { - if (jj_scan_token(QUOTED_IDENTIFIER)) return true; - return false; - } - final private boolean jj_3_380() { if (jj_3R_67()) return true; return false; @@ -30825,21 +30706,8 @@ final private boolean jj_3_882() { return false; } - final private boolean jj_3_83() { - if (jj_scan_token(WITH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_81()) { - jj_scanpos = xsp; - if (jj_3_82()) return true; - } - return false; - } - - final private boolean jj_3R_127() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_83()) jj_scanpos = xsp; + final private boolean jj_3_82() { + if (jj_3R_118()) return true; return false; } @@ -30849,28 +30717,31 @@ final private boolean jj_3R_305() { return false; } - final private boolean jj_3R_362() { + final private boolean jj_3_81() { + if (jj_scan_token(QUOTED_IDENTIFIER)) return true; return false; } - final private boolean jj_3R_131() { + final private boolean jj_3_83() { + if (jj_scan_token(WITH)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3_79()) { + if (jj_3_81()) { jj_scanpos = xsp; - if (jj_3R_362()) return true; + if (jj_3_82()) return true; } return false; } - final private boolean jj_3_79() { - if (jj_scan_token(IF)) return true; - if (jj_scan_token(NOT)) return true; + final private boolean jj_3_881() { + if (jj_scan_token(ERROR)) return true; return false; } - final private boolean jj_3_881() { - if (jj_scan_token(ERROR)) return true; + final private boolean jj_3R_127() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_83()) jj_scanpos = xsp; return false; } @@ -30905,12 +30776,43 @@ final private boolean jj_3_878() { return false; } + final private boolean jj_3R_362() { + return false; + } + + final private boolean jj_3R_131() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_79()) { + jj_scanpos = xsp; + if (jj_3R_362()) return true; + } + return false; + } + + final private boolean jj_3_79() { + if (jj_scan_token(IF)) return true; + if (jj_scan_token(NOT)) return true; + return false; + } + final private boolean jj_3_876() { if (jj_scan_token(COMMA)) return true; if (jj_3R_81()) return true; return false; } + final private boolean jj_3_877() { + if (jj_scan_token(PASSING)) return true; + if (jj_3R_81()) return true; + return false; + } + + final private boolean jj_3R_203() { + if (jj_3R_84()) return true; + return false; + } + final private boolean jj_3_78() { if (jj_3R_117()) return true; return false; @@ -30936,19 +30838,14 @@ final private boolean jj_3_74() { return false; } - final private boolean jj_3_877() { - if (jj_scan_token(PASSING)) return true; - if (jj_3R_81()) return true; - return false; - } - final private boolean jj_3_73() { if (jj_3R_112()) return true; return false; } - final private boolean jj_3R_203() { - if (jj_3R_84()) return true; + final private boolean jj_3_378() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_203()) return true; return false; } @@ -30982,14 +30879,14 @@ final private boolean jj_3_67() { return false; } - final private boolean jj_3_66() { - if (jj_3R_106()) return true; + final private boolean jj_3_875() { + if (jj_scan_token(FORMAT)) return true; + if (jj_3R_313()) return true; return false; } - final private boolean jj_3_378() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_203()) return true; + final private boolean jj_3_66() { + if (jj_3R_106()) return true; return false; } @@ -31018,14 +30915,19 @@ final private boolean jj_3_61() { return false; } - final private boolean jj_3_60() { - if (jj_3R_100()) return true; + final private boolean jj_3R_202() { + if (jj_3R_84()) return true; return false; } - final private boolean jj_3_875() { - if (jj_scan_token(FORMAT)) return true; - if (jj_3R_313()) return true; + final private boolean jj_3R_315() { + if (jj_scan_token(RETURNING)) return true; + if (jj_3R_120()) return true; + return false; + } + + final private boolean jj_3_60() { + if (jj_3R_100()) return true; return false; } @@ -31044,11 +30946,22 @@ final private boolean jj_3_57() { return false; } + final private boolean jj_3_377() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_202()) return true; + return false; + } + final private boolean jj_3_56() { if (jj_3R_96()) return true; return false; } + final private boolean jj_3R_194() { + if (jj_3R_202()) return true; + return false; + } + final private boolean jj_3_55() { if (jj_3R_95()) return true; return false; @@ -31059,19 +30972,18 @@ final private boolean jj_3_54() { return false; } - final private boolean jj_3R_202() { - if (jj_3R_84()) return true; + final private boolean jj_3_873() { + if (jj_scan_token(UTF32)) return true; return false; } - final private boolean jj_3R_315() { - if (jj_scan_token(RETURNING)) return true; - if (jj_3R_120()) return true; + final private boolean jj_3_53() { + if (jj_3R_93()) return true; return false; } - final private boolean jj_3_53() { - if (jj_3R_93()) return true; + final private boolean jj_3_872() { + if (jj_scan_token(UTF16)) return true; return false; } @@ -31080,6 +30992,17 @@ final private boolean jj_3_52() { return false; } + final private boolean jj_3_871() { + if (jj_scan_token(UTF8)) return true; + return false; + } + + final private boolean jj_3_372() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_201()) return true; + return false; + } + final private boolean jj_3R_91() { Token xsp; xsp = jj_scanpos; @@ -31165,51 +31088,6 @@ final private boolean jj_3R_91() { return false; } - final private boolean jj_3_377() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_202()) return true; - return false; - } - - final private boolean jj_3R_194() { - if (jj_3R_202()) return true; - return false; - } - - final private boolean jj_3_873() { - if (jj_scan_token(UTF32)) return true; - return false; - } - - final private boolean jj_3_872() { - if (jj_scan_token(UTF16)) return true; - return false; - } - - final private boolean jj_3_50() { - if (jj_3R_91()) return true; - return false; - } - - final private boolean jj_3_871() { - if (jj_scan_token(UTF8)) return true; - return false; - } - - final private boolean jj_3_372() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_201()) return true; - return false; - } - - final private boolean jj_3_49() { - if (jj_scan_token(SEMICOLON)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_50()) jj_scanpos = xsp; - return false; - } - final private boolean jj_3_874() { if (jj_scan_token(ENCODING)) return true; Token xsp; @@ -31235,13 +31113,8 @@ final private boolean jj_3R_313() { return false; } - final private boolean jj_3_51() { + final private boolean jj_3_50() { if (jj_3R_91()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_49()) { jj_scanpos = xsp; break; } - } return false; } @@ -31256,6 +31129,14 @@ final private boolean jj_3_870() { return false; } + final private boolean jj_3_49() { + if (jj_scan_token(SEMICOLON)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_50()) jj_scanpos = xsp; + return false; + } + final private boolean jj_3_374() { if (jj_scan_token(LPAREN)) return true; if (jj_3R_201()) return true; @@ -31298,14 +31179,18 @@ final private boolean jj_3_867() { return false; } - final private boolean jj_3R_90() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; + final private boolean jj_3_866() { + if (jj_3R_308()) return true; return false; } - final private boolean jj_3_866() { - if (jj_3R_308()) return true; + final private boolean jj_3_51() { + if (jj_3R_91()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_49()) { jj_scanpos = xsp; break; } + } return false; } @@ -31348,6 +31233,12 @@ final private boolean jj_3_860() { return false; } + final private boolean jj_3R_90() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; + return false; + } + final private boolean jj_3_859() { if (jj_3R_301()) return true; return false; @@ -31393,11 +31284,6 @@ final private boolean jj_3_855() { return false; } - final private boolean jj_3R_80() { - if (jj_scan_token(DEFAULT_)) return true; - return false; - } - final private boolean jj_3_362() { if (jj_3R_198()) return true; return false; @@ -31408,38 +31294,16 @@ final private boolean jj_3_854() { return false; } - final private boolean jj_3R_89() { - if (jj_3R_134()) return true; - return false; - } - final private boolean jj_3_853() { if (jj_3R_295()) return true; return false; } - final private boolean jj_3_46() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_89()) { - jj_scanpos = xsp; - if (jj_3R_90()) return true; - } - if (jj_scan_token(LAMBDA)) return true; - return false; - } - final private boolean jj_3_852() { if (jj_3R_294()) return true; return false; } - final private boolean jj_3R_86() { - if (jj_scan_token(LPAREN)) return true; - if (jj_scan_token(RPAREN)) return true; - return false; - } - final private boolean jj_3_363() { if (jj_scan_token(COMMA)) return true; Token xsp; @@ -31456,21 +31320,11 @@ final private boolean jj_3_851() { return false; } - final private boolean jj_3_48() { - if (jj_3R_87()) return true; - return false; - } - final private boolean jj_3_850() { if (jj_3R_292()) return true; return false; } - final private boolean jj_3_47() { - if (jj_3R_81()) return true; - return false; - } - final private boolean jj_3_364() { if (jj_3R_198()) return true; Token xsp; @@ -31489,13 +31343,24 @@ final private boolean jj_3_837() { return false; } - final private boolean jj_3R_350() { - if (jj_3R_408()) return true; + final private boolean jj_3R_80() { + if (jj_scan_token(DEFAULT_)) return true; return false; } - final private boolean jj_3_45() { - if (jj_3R_80()) return true; + final private boolean jj_3R_89() { + if (jj_3R_134()) return true; + return false; + } + + final private boolean jj_3_46() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_89()) { + jj_scanpos = xsp; + if (jj_3R_90()) return true; + } + if (jj_scan_token(LAMBDA)) return true; return false; } @@ -31513,13 +31378,14 @@ final private boolean jj_3_370() { return false; } - final private boolean jj_3R_349() { + final private boolean jj_3R_86() { + if (jj_scan_token(LPAREN)) return true; + if (jj_scan_token(RPAREN)) return true; return false; } - final private boolean jj_3_44() { - if (jj_3R_84()) return true; - if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; + final private boolean jj_3_48() { + if (jj_3R_87()) return true; return false; } @@ -31541,24 +31407,8 @@ final private boolean jj_3_839() { return false; } - final private boolean jj_3R_83() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_44()) { - jj_scanpos = xsp; - if (jj_3R_349()) return true; - } - xsp = jj_scanpos; - if (jj_3_45()) { - jj_scanpos = xsp; - if (jj_3R_350()) { - jj_scanpos = xsp; - if (jj_3_47()) { - jj_scanpos = xsp; - if (jj_3_48()) return true; - } - } - } + final private boolean jj_3_47() { + if (jj_3R_81()) return true; return false; } @@ -31567,18 +31417,27 @@ final private boolean jj_3_835() { return false; } + final private boolean jj_3R_350() { + if (jj_3R_408()) return true; + return false; + } + final private boolean jj_3_368() { if (jj_scan_token(PLUS)) return true; return false; } + final private boolean jj_3_45() { + if (jj_3R_80()) return true; + return false; + } + final private boolean jj_3_834() { if (jj_scan_token(TRAILING)) return true; return false; } - final private boolean jj_3R_85() { - if (jj_3R_134()) return true; + final private boolean jj_3R_349() { return false; } @@ -31587,14 +31446,9 @@ final private boolean jj_3_367() { return false; } - final private boolean jj_3_41() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_85()) { - jj_scanpos = xsp; - if (jj_3R_86()) return true; - } - if (jj_scan_token(LAMBDA)) return true; + final private boolean jj_3_44() { + if (jj_3R_84()) return true; + if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; return false; } @@ -31603,11 +31457,6 @@ final private boolean jj_3_833() { return false; } - final private boolean jj_3_43() { - if (jj_3R_88()) return true; - return false; - } - final private boolean jj_3R_381() { Token xsp; xsp = jj_scanpos; @@ -31624,13 +31473,24 @@ final private boolean jj_3R_381() { return false; } - final private boolean jj_3_42() { - if (jj_3R_87()) return true; - return false; - } - - final private boolean jj_3R_367() { - if (jj_3R_408()) return true; + final private boolean jj_3R_83() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_44()) { + jj_scanpos = xsp; + if (jj_3R_349()) return true; + } + xsp = jj_scanpos; + if (jj_3_45()) { + jj_scanpos = xsp; + if (jj_3R_350()) { + jj_scanpos = xsp; + if (jj_3_47()) { + jj_scanpos = xsp; + if (jj_3_48()) return true; + } + } + } return false; } @@ -31645,11 +31505,6 @@ final private boolean jj_3R_197() { return false; } - final private boolean jj_3_40() { - if (jj_3R_80()) return true; - return false; - } - final private boolean jj_3_838() { Token xsp; xsp = jj_scanpos; @@ -31666,13 +31521,24 @@ final private boolean jj_3_838() { return false; } - final private boolean jj_3R_366() { + final private boolean jj_3R_85() { + if (jj_3R_134()) return true; return false; } - final private boolean jj_3_39() { - if (jj_3R_84()) return true; - if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; + final private boolean jj_3_41() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_85()) { + jj_scanpos = xsp; + if (jj_3R_86()) return true; + } + if (jj_scan_token(LAMBDA)) return true; + return false; + } + + final private boolean jj_3_43() { + if (jj_3R_88()) return true; return false; } @@ -31686,29 +31552,13 @@ final private boolean jj_3_1805() { return false; } - final private boolean jj_3R_154() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_39()) { - jj_scanpos = xsp; - if (jj_3R_366()) return true; - } - xsp = jj_scanpos; - if (jj_3_40()) { - jj_scanpos = xsp; - if (jj_3R_367()) { - jj_scanpos = xsp; - if (jj_3_42()) { - jj_scanpos = xsp; - if (jj_3_43()) return true; - } - } - } + final private boolean jj_3_1804() { + if (jj_scan_token(WEDNESDAY)) return true; return false; } - final private boolean jj_3_1804() { - if (jj_scan_token(WEDNESDAY)) return true; + final private boolean jj_3_42() { + if (jj_3R_87()) return true; return false; } @@ -31722,6 +31572,11 @@ final private boolean jj_3_1802() { return false; } + final private boolean jj_3R_367() { + if (jj_3R_408()) return true; + return false; + } + final private boolean jj_3_1801() { if (jj_scan_token(VERSIONING)) return true; return false; @@ -31748,6 +31603,11 @@ final private boolean jj_3_1799() { return false; } + final private boolean jj_3_40() { + if (jj_3R_80()) return true; + return false; + } + final private boolean jj_3_361() { if (jj_3R_197()) return true; return false; @@ -31779,6 +31639,10 @@ final private boolean jj_3_832() { return false; } + final private boolean jj_3R_366() { + return false; + } + final private boolean jj_3_1796() { if (jj_scan_token(TRY_CAST)) return true; return false; @@ -31789,6 +31653,12 @@ final private boolean jj_3_1795() { return false; } + final private boolean jj_3_39() { + if (jj_3R_84()) return true; + if (jj_scan_token(NAMED_ARGUMENT_ASSIGNMENT)) return true; + return false; + } + final private boolean jj_3_1794() { if (jj_scan_token(TRANSLATION)) return true; return false; @@ -31824,6 +31694,27 @@ final private boolean jj_3_1791() { return false; } + final private boolean jj_3R_154() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_39()) { + jj_scanpos = xsp; + if (jj_3R_366()) return true; + } + xsp = jj_scanpos; + if (jj_3_40()) { + jj_scanpos = xsp; + if (jj_3R_367()) { + jj_scanpos = xsp; + if (jj_3_42()) { + jj_scanpos = xsp; + if (jj_3_43()) return true; + } + } + } + return false; + } + final private boolean jj_3_1790() { if (jj_scan_token(SUM)) return true; return false; @@ -31912,36 +31803,16 @@ final private boolean jj_3_1779() { return false; } - final private boolean jj_3_38() { - if (jj_scan_token(ALL)) return true; - return false; - } - final private boolean jj_3_1778() { if (jj_scan_token(ROLLUP)) return true; return false; } - final private boolean jj_3R_82() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_37()) { - jj_scanpos = xsp; - if (jj_3_38()) return true; - } - return false; - } - final private boolean jj_3_1777() { if (jj_scan_token(RETURNS)) return true; return false; } - final private boolean jj_3_37() { - if (jj_scan_token(DISTINCT)) return true; - return false; - } - final private boolean jj_3_846() { if (jj_scan_token(FLOOR)) return true; if (jj_3R_291()) return true; @@ -32031,9 +31902,8 @@ final private boolean jj_3_1765() { return false; } - final private boolean jj_3_36() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_83()) return true; + final private boolean jj_3_38() { + if (jj_scan_token(ALL)) return true; return false; } @@ -32052,17 +31922,28 @@ final private boolean jj_3_1764() { return false; } + final private boolean jj_3R_82() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_37()) { + jj_scanpos = xsp; + if (jj_3_38()) return true; + } + return false; + } + final private boolean jj_3_1763() { if (jj_scan_token(OVERLAPS)) return true; return false; } - final private boolean jj_3_1762() { - if (jj_scan_token(ORDINAL)) return true; + final private boolean jj_3_37() { + if (jj_scan_token(DISTINCT)) return true; return false; } - final private boolean jj_3R_385() { + final private boolean jj_3_1762() { + if (jj_scan_token(ORDINAL)) return true; return false; } @@ -32086,11 +31967,6 @@ final private boolean jj_3_1759() { return false; } - final private boolean jj_3_35() { - if (jj_3R_82()) return true; - return false; - } - final private boolean jj_3_823() { if (jj_scan_token(USING)) return true; if (jj_3R_84()) return true; @@ -32127,17 +32003,6 @@ final private boolean jj_3_1754() { return false; } - final private boolean jj_3R_220() { - if (jj_scan_token(LPAREN)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_35()) { - jj_scanpos = xsp; - if (jj_3R_385()) return true; - } - return false; - } - final private boolean jj_3_1753() { if (jj_scan_token(MIN)) return true; return false; @@ -32164,6 +32029,12 @@ final private boolean jj_3_1751() { return false; } + final private boolean jj_3_36() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_83()) return true; + return false; + } + final private boolean jj_3_844() { if (jj_scan_token(TRANSLATE)) return true; if (jj_scan_token(LPAREN)) return true; @@ -32190,6 +32061,10 @@ final private boolean jj_3_1748() { return false; } + final private boolean jj_3R_385() { + return false; + } + final private boolean jj_3_1747() { if (jj_scan_token(LARGE)) return true; return false; @@ -32216,6 +32091,11 @@ final private boolean jj_3_1745() { return false; } + final private boolean jj_3_35() { + if (jj_3R_82()) return true; + return false; + } + final private boolean jj_3_1744() { if (jj_scan_token(JSON_ARRAYAGG)) return true; return false; @@ -32252,6 +32132,17 @@ final private boolean jj_3_815() { return false; } + final private boolean jj_3R_220() { + if (jj_scan_token(LPAREN)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_35()) { + jj_scanpos = xsp; + if (jj_3R_385()) return true; + } + return false; + } + final private boolean jj_3_1739() { if (jj_scan_token(GRANT)) return true; return false; @@ -32262,11 +32153,6 @@ final private boolean jj_3_1738() { return false; } - final private boolean jj_3R_401() { - if (jj_3R_220()) return true; - return false; - } - final private boolean jj_3_1737() { if (jj_scan_token(FRAME_ROW)) return true; return false; @@ -32367,11 +32253,6 @@ final private boolean jj_3_1727() { return false; } - final private boolean jj_3_34() { - if (jj_3R_80()) return true; - return false; - } - final private boolean jj_3_1726() { if (jj_scan_token(DEC)) return true; return false; @@ -32382,11 +32263,6 @@ final private boolean jj_3_1725() { return false; } - final private boolean jj_3_33() { - if (jj_3R_81()) return true; - return false; - } - final private boolean jj_3_1724() { if (jj_scan_token(CURSOR)) return true; return false; @@ -32398,6 +32274,11 @@ final private boolean jj_3_814() { return false; } + final private boolean jj_3R_401() { + if (jj_3R_220()) return true; + return false; + } + final private boolean jj_3_1723() { if (jj_scan_token(CURRENT_ROLE)) return true; return false; @@ -32460,17 +32341,6 @@ final private boolean jj_3_1715() { return false; } - final private boolean jj_3_32() { - if (jj_scan_token(COMMA)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_33()) { - jj_scanpos = xsp; - if (jj_3_34()) return true; - } - return false; - } - final private boolean jj_3R_192() { Token xsp; xsp = jj_scanpos; @@ -32489,13 +32359,13 @@ final private boolean jj_3_1713() { return false; } - final private boolean jj_3_1712() { - if (jj_scan_token(CALL)) return true; + final private boolean jj_3_34() { + if (jj_3R_80()) return true; return false; } - final private boolean jj_3_31() { - if (jj_3R_80()) return true; + final private boolean jj_3_1712() { + if (jj_scan_token(CALL)) return true; return false; } @@ -32515,13 +32385,13 @@ final private boolean jj_3_1711() { return false; } - final private boolean jj_3_1710() { - if (jj_scan_token(BEGIN_PARTITION)) return true; + final private boolean jj_3_33() { + if (jj_3R_81()) return true; return false; } - final private boolean jj_3_30() { - if (jj_3R_79()) return true; + final private boolean jj_3_1710() { + if (jj_scan_token(BEGIN_PARTITION)) return true; return false; } @@ -32570,6 +32440,17 @@ final private boolean jj_3_1701() { return false; } + final private boolean jj_3_32() { + if (jj_scan_token(COMMA)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_33()) { + jj_scanpos = xsp; + if (jj_3_34()) return true; + } + return false; + } + final private boolean jj_3_1700() { if (jj_scan_token(PARALLEL)) return true; return false; @@ -32597,6 +32478,11 @@ final private boolean jj_3_1698() { return false; } + final private boolean jj_3_31() { + if (jj_3R_80()) return true; + return false; + } + final private boolean jj_3_1697() { if (jj_scan_token(ATOMICITY)) return true; return false; @@ -32613,6 +32499,11 @@ final private boolean jj_3_1696() { return false; } + final private boolean jj_3_30() { + if (jj_3R_79()) return true; + return false; + } + final private boolean jj_3_1695() { if (jj_scan_token(XML)) return true; return false; @@ -32639,17 +32530,6 @@ final private boolean jj_3_1692() { return false; } - final private boolean jj_3R_183() { - if (jj_scan_token(LPAREN)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_30()) { - jj_scanpos = xsp; - if (jj_3_31()) return true; - } - return false; - } - final private boolean jj_3_1691() { if (jj_scan_token(USER_DEFINED_TYPE_NAME)) return true; return false; @@ -32749,6 +32629,17 @@ final private boolean jj_3_1678() { return false; } + final private boolean jj_3R_183() { + if (jj_scan_token(LPAREN)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_30()) { + jj_scanpos = xsp; + if (jj_3_31()) return true; + } + return false; + } + final private boolean jj_3_1677() { if (jj_scan_token(SQL_TSI_SECOND)) return true; return false; @@ -32824,12 +32715,6 @@ final private boolean jj_3_1670() { return false; } - final private boolean jj_3_29() { - if (jj_scan_token(COMMA)) return true; - if (jj_3R_78()) return true; - return false; - } - final private boolean jj_3_1669() { if (jj_scan_token(SQL_INTERVAL_MINUTE_TO_SECOND)) return true; return false; @@ -32940,6 +32825,12 @@ final private boolean jj_3_1656() { return false; } + final private boolean jj_3_29() { + if (jj_scan_token(COMMA)) return true; + if (jj_3R_78()) return true; + return false; + } + final private boolean jj_3R_223() { Token xsp; xsp = jj_scanpos; @@ -33068,12 +32959,6 @@ final private boolean jj_3_1651() { return false; } - final private boolean jj_3R_173() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_79()) return true; - return false; - } - final private boolean jj_3_1650() { if (jj_scan_token(RESTART)) return true; return false; @@ -33150,6 +33035,12 @@ final private boolean jj_3_1637() { return false; } + final private boolean jj_3R_173() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_79()) return true; + return false; + } + final private boolean jj_3_1636() { if (jj_scan_token(NORMALIZED)) return true; return false; @@ -33415,12 +33306,6 @@ final private boolean jj_3_1597() { return false; } - final private boolean jj_3R_172() { - if (jj_scan_token(LPAREN)) return true; - if (jj_3R_374()) return true; - return false; - } - final private boolean jj_3_1596() { if (jj_scan_token(COLLATION_NAME)) return true; return false; @@ -33528,13 +33413,9 @@ final private boolean jj_3_800() { return false; } - final private boolean jj_3_28() { - if (jj_3R_77()) return true; - return false; - } - - final private boolean jj_3_27() { - if (jj_3R_76()) return true; + final private boolean jj_3R_172() { + if (jj_scan_token(LPAREN)) return true; + if (jj_3R_374()) return true; return false; } @@ -34209,24 +34090,6 @@ final private boolean jj_3R_379() { return false; } - final private boolean jj_3R_206() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_26()) { - jj_scanpos = xsp; - if (jj_3_27()) { - jj_scanpos = xsp; - if (jj_3_28()) return true; - } - } - return false; - } - - final private boolean jj_3_26() { - if (jj_3R_75()) return true; - return false; - } - final private boolean jj_3_1584() { if (jj_scan_token(FRIDAY)) return true; return false; @@ -34277,6 +34140,11 @@ final private boolean jj_3_1579() { return false; } + final private boolean jj_3_28() { + if (jj_3R_77()) return true; + return false; + } + final private boolean jj_3_1578() { if (jj_scan_token(VALUE_OF)) return true; return false; @@ -34287,8 +34155,8 @@ final private boolean jj_3_1577() { return false; } - final private boolean jj_3_25() { - if (jj_scan_token(ALL)) return true; + final private boolean jj_3_27() { + if (jj_3R_76()) return true; return false; } @@ -34302,11 +34170,6 @@ final private boolean jj_3_1575() { return false; } - final private boolean jj_3_24() { - if (jj_3R_74()) return true; - return false; - } - final private boolean jj_3R_189() { if (jj_3R_162()) return true; Token xsp; @@ -34340,11 +34203,29 @@ final private boolean jj_3_798() { return false; } + final private boolean jj_3R_206() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_26()) { + jj_scanpos = xsp; + if (jj_3_27()) { + jj_scanpos = xsp; + if (jj_3_28()) return true; + } + } + return false; + } + final private boolean jj_3_1571() { if (jj_scan_token(TIME)) return true; return false; } + final private boolean jj_3_26() { + if (jj_3R_75()) return true; + return false; + } + final private boolean jj_3_1570() { if (jj_scan_token(SYSTEM_TIME)) return true; return false; @@ -34355,11 +34236,6 @@ final private boolean jj_3_1569() { return false; } - final private boolean jj_3_22() { - if (jj_scan_token(ALL)) return true; - return false; - } - final private boolean jj_3_1568() { if (jj_scan_token(SUBSET)) return true; return false; @@ -34398,11 +34274,6 @@ final private boolean jj_3_1565() { return false; } - final private boolean jj_3_21() { - if (jj_3R_74()) return true; - return false; - } - final private boolean jj_3_1564() { if (jj_scan_token(SPECIFICTYPE)) return true; return false; @@ -34419,6 +34290,11 @@ final private boolean jj_3_1563() { return false; } + final private boolean jj_3_25() { + if (jj_scan_token(ALL)) return true; + return false; + } + final private boolean jj_3_337() { if (jj_scan_token(AS)) return true; return false; @@ -34434,6 +34310,11 @@ final private boolean jj_3_1561() { return false; } + final private boolean jj_3_24() { + if (jj_3R_74()) return true; + return false; + } + final private boolean jj_3_1560() { if (jj_scan_token(SCOPE)) return true; return false; @@ -34454,17 +34335,6 @@ final private boolean jj_3_1557() { return false; } - final private boolean jj_3_23() { - if (jj_3R_74()) return true; - if (jj_scan_token(COMMA)) return true; - return false; - } - - final private boolean jj_3_18() { - if (jj_scan_token(NEXT)) return true; - return false; - } - final private boolean jj_3_792() { if (jj_scan_token(CHAR)) return true; return false; @@ -34480,6 +34350,11 @@ final private boolean jj_3_1555() { return false; } + final private boolean jj_3_22() { + if (jj_scan_token(ALL)) return true; + return false; + } + final private boolean jj_3_334() { if (jj_scan_token(COMMA)) return true; if (jj_3R_188()) return true; @@ -34517,21 +34392,12 @@ final private boolean jj_3_1551() { return false; } - final private boolean jj_3R_289() { + final private boolean jj_3_21() { + if (jj_3R_74()) return true; return false; } - final private boolean jj_3R_72() { - if (jj_scan_token(LIMIT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_23()) { - jj_scanpos = xsp; - if (jj_3_24()) { - jj_scanpos = xsp; - if (jj_3_25()) return true; - } - } + final private boolean jj_3R_289() { return false; } @@ -34555,11 +34421,6 @@ final private boolean jj_3_1548() { return false; } - final private boolean jj_3_20() { - if (jj_scan_token(ROWS)) return true; - return false; - } - final private boolean jj_3_793() { if (jj_scan_token(VARYING)) return true; return false; @@ -34570,11 +34431,6 @@ final private boolean jj_3_1547() { return false; } - final private boolean jj_3_17() { - if (jj_scan_token(FIRST)) return true; - return false; - } - final private boolean jj_3_1546() { if (jj_scan_token(PORTION)) return true; return false; @@ -34595,6 +34451,17 @@ final private boolean jj_3_1543() { return false; } + final private boolean jj_3_23() { + if (jj_3R_74()) return true; + if (jj_scan_token(COMMA)) return true; + return false; + } + + final private boolean jj_3_18() { + if (jj_scan_token(NEXT)) return true; + return false; + } + final private boolean jj_3_791() { if (jj_scan_token(CHARACTER)) return true; return false; @@ -34630,11 +34497,6 @@ final private boolean jj_3_1540() { return false; } - final private boolean jj_3_19() { - if (jj_scan_token(ROW)) return true; - return false; - } - final private boolean jj_3_1539() { if (jj_scan_token(OCTET_LENGTH)) return true; return false; @@ -34658,17 +34520,6 @@ final private boolean jj_3R_284() { return false; } - final private boolean jj_3R_73() { - if (jj_scan_token(FETCH)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3_17()) { - jj_scanpos = xsp; - if (jj_3_18()) return true; - } - return false; - } - final private boolean jj_3_1537() { if (jj_scan_token(NORMALIZE)) return true; return false; @@ -34679,6 +34530,20 @@ final private boolean jj_3_336() { return false; } + final private boolean jj_3R_72() { + if (jj_scan_token(LIMIT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_23()) { + jj_scanpos = xsp; + if (jj_3_24()) { + jj_scanpos = xsp; + if (jj_3_25()) return true; + } + } + return false; + } + final private boolean jj_3_1536() { if (jj_scan_token(NEXT)) return true; return false; @@ -34689,13 +34554,13 @@ final private boolean jj_3_1535() { return false; } - final private boolean jj_3_15() { - if (jj_scan_token(ROWS)) return true; + final private boolean jj_3_1534() { + if (jj_scan_token(MONTH)) return true; return false; } - final private boolean jj_3_1534() { - if (jj_scan_token(MONTH)) return true; + final private boolean jj_3_20() { + if (jj_scan_token(ROWS)) return true; return false; } @@ -34704,6 +34569,11 @@ final private boolean jj_3_1533() { return false; } + final private boolean jj_3_17() { + if (jj_scan_token(FIRST)) return true; + return false; + } + final private boolean jj_3_1532() { if (jj_scan_token(METHOD)) return true; return false; @@ -34740,23 +34610,13 @@ final private boolean jj_3_1527() { return false; } - final private boolean jj_3_14() { - if (jj_scan_token(ROW)) return true; - return false; - } - - final private boolean jj_3_16() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_14()) { - jj_scanpos = xsp; - if (jj_3_15()) return true; - } + final private boolean jj_3_1526() { + if (jj_scan_token(LANGUAGE)) return true; return false; } - final private boolean jj_3_1526() { - if (jj_scan_token(LANGUAGE)) return true; + final private boolean jj_3_19() { + if (jj_scan_token(ROW)) return true; return false; } @@ -34770,9 +34630,14 @@ final private boolean jj_3_1524() { return false; } - final private boolean jj_3R_71() { - if (jj_scan_token(OFFSET)) return true; - if (jj_3R_74()) return true; + final private boolean jj_3R_73() { + if (jj_scan_token(FETCH)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3_17()) { + jj_scanpos = xsp; + if (jj_3_18()) return true; + } return false; } @@ -34791,6 +34656,11 @@ final private boolean jj_3_1521() { return false; } + final private boolean jj_3_15() { + if (jj_scan_token(ROWS)) return true; + return false; + } + final private boolean jj_3_1520() { if (jj_scan_token(IDENTITY)) return true; return false; @@ -34838,6 +34708,21 @@ final private boolean jj_3_1513() { return false; } + final private boolean jj_3_14() { + if (jj_scan_token(ROW)) return true; + return false; + } + + final private boolean jj_3_16() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_14()) { + jj_scanpos = xsp; + if (jj_3_15()) return true; + } + return false; + } + final private boolean jj_3_1512() { if (jj_scan_token(ESCAPE)) return true; return false; @@ -34853,6 +34738,12 @@ final private boolean jj_3_1510() { return false; } + final private boolean jj_3R_71() { + if (jj_scan_token(OFFSET)) return true; + if (jj_3R_74()) return true; + return false; + } + final private boolean jj_3_1509() { if (jj_scan_token(DYNAMIC)) return true; return false; @@ -34868,21 +34759,11 @@ final private boolean jj_3_1507() { return false; } - final private boolean jj_3_8() { - if (jj_3R_73()) return true; - return false; - } - final private boolean jj_3_1506() { if (jj_scan_token(DECLARE)) return true; return false; } - final private boolean jj_3_12() { - if (jj_3R_73()) return true; - return false; - } - final private boolean jj_3_1505() { if (jj_scan_token(DEALLOCATE)) return true; return false; @@ -34926,21 +34807,6 @@ final private boolean jj_3_1500() { return false; } - final private boolean jj_3_7() { - if (jj_3R_72()) return true; - return false; - } - - final private boolean jj_3_9() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_7()) { - jj_scanpos = xsp; - if (jj_3_8()) return true; - } - return false; - } - final private boolean jj_3_1499() { if (jj_scan_token(CORRESPONDING)) return true; return false; @@ -34971,46 +34837,28 @@ final private boolean jj_3_1494() { return false; } - final private boolean jj_3_6() { - if (jj_3R_71()) return true; - return false; - } - - final private boolean jj_3_11() { - if (jj_3R_71()) return true; - return false; - } - final private boolean jj_3_1493() { if (jj_scan_token(CEILING)) return true; return false; } - final private boolean jj_3_1492() { - if (jj_scan_token(CARDINALITY)) return true; + final private boolean jj_3_8() { + if (jj_3R_73()) return true; return false; } - final private boolean jj_3_1491() { - if (jj_scan_token(BOOLEAN)) return true; + final private boolean jj_3_1492() { + if (jj_scan_token(CARDINALITY)) return true; return false; } - final private boolean jj_3_10() { - if (jj_3R_72()) return true; + final private boolean jj_3_12() { + if (jj_3R_73()) return true; return false; } - final private boolean jj_3_13() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_10()) { - jj_scanpos = xsp; - if (jj_3_11()) { - jj_scanpos = xsp; - if (jj_3_12()) return true; - } - } + final private boolean jj_3_1491() { + if (jj_scan_token(BOOLEAN)) return true; return false; } @@ -35024,10 +34872,6 @@ final private boolean jj_3_1489() { return false; } - final private boolean jj_3R_406() { - return false; - } - final private boolean jj_3_1488() { if (jj_scan_token(AUTHORIZATION)) return true; return false; @@ -35038,13 +34882,23 @@ final private boolean jj_3_1487() { return false; } - final private boolean jj_3_5() { - if (jj_3R_70()) return true; + final private boolean jj_3_1486() { + if (jj_scan_token(ARE)) return true; return false; } - final private boolean jj_3_1486() { - if (jj_scan_token(ARE)) return true; + final private boolean jj_3_7() { + if (jj_3R_72()) return true; + return false; + } + + final private boolean jj_3_9() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_7()) { + jj_scanpos = xsp; + if (jj_3_8()) return true; + } return false; } @@ -35078,20 +34932,18 @@ final private boolean jj_3_1481() { return false; } - final private boolean jj_3R_348() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_5()) { - jj_scanpos = xsp; - if (jj_3R_406()) return true; - } - xsp = jj_scanpos; - if (jj_3_13()) jj_scanpos = xsp; + final private boolean jj_3_1480() { + if (jj_scan_token(LOGGING)) return true; return false; } - final private boolean jj_3_1480() { - if (jj_scan_token(LOGGING)) return true; + final private boolean jj_3_6() { + if (jj_3R_71()) return true; + return false; + } + + final private boolean jj_3_11() { + if (jj_3R_71()) return true; return false; } @@ -35115,6 +34967,24 @@ final private boolean jj_3_1477() { return false; } + final private boolean jj_3_10() { + if (jj_3R_72()) return true; + return false; + } + + final private boolean jj_3_13() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_10()) { + jj_scanpos = xsp; + if (jj_3_11()) { + jj_scanpos = xsp; + if (jj_3_12()) return true; + } + } + return false; + } + final private boolean jj_3_1476() { if (jj_scan_token(AFFINITY_KEY)) return true; return false; @@ -35125,6 +34995,10 @@ final private boolean jj_3_1475() { return false; } + final private boolean jj_3R_406() { + return false; + } + final private boolean jj_3_1474() { if (jj_scan_token(WRITE)) return true; return false; @@ -35141,6 +35015,11 @@ final private boolean jj_3_1473() { return false; } + final private boolean jj_3_5() { + if (jj_3R_70()) return true; + return false; + } + final private boolean jj_3_1472() { if (jj_scan_token(VERSION)) return true; return false; @@ -35176,6 +35055,18 @@ final private boolean jj_3_1467() { return false; } + final private boolean jj_3R_348() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_5()) { + jj_scanpos = xsp; + if (jj_3R_406()) return true; + } + xsp = jj_scanpos; + if (jj_3_13()) jj_scanpos = xsp; + return false; + } + final private boolean jj_3_1466() { if (jj_scan_token(TRIGGER_NAME)) return true; return false; @@ -35192,12 +35083,6 @@ final private boolean jj_3_332() { return false; } - final private boolean jj_3R_79() { - if (jj_3R_347()) return true; - if (jj_3R_348()) return true; - return false; - } - final private boolean jj_3_1464() { if (jj_scan_token(TRANSACTIONS_ACTIVE)) return true; return false; @@ -35324,6 +35209,12 @@ final private boolean jj_3_1451() { return false; } + final private boolean jj_3R_79() { + if (jj_3R_347()) return true; + if (jj_3R_348()) return true; + return false; + } + final private boolean jj_3_1450() { if (jj_scan_token(SQL_LONGVARBINARY)) return true; return false; @@ -35472,11 +35363,6 @@ final private boolean jj_3_1429() { return false; } - final private boolean jj_3_2() { - if (jj_3R_67()) return true; - return false; - } - final private boolean jj_3_1428() { if (jj_scan_token(RELATIVE)) return true; return false; @@ -35487,11 +35373,6 @@ final private boolean jj_3_1427() { return false; } - final private boolean jj_3_1() { - if (jj_3R_66()) return true; - return false; - } - final private boolean jj_3_1426() { if (jj_scan_token(PRIOR)) return true; return false; @@ -35507,20 +35388,6 @@ final private boolean jj_3_1424() { return false; } - final private boolean jj_3_4() { - if (jj_3R_69()) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_1()) { jj_scanpos = xsp; break; } - } - while (true) { - xsp = jj_scanpos; - if (jj_3_2()) { jj_scanpos = xsp; break; } - } - return false; - } - final private boolean jj_3_1423() { if (jj_scan_token(PASSTHROUGH)) return true; return false; @@ -35557,11 +35424,6 @@ final private boolean jj_3_1419() { return false; } - final private boolean jj_3_3() { - if (jj_3R_68()) return true; - return false; - } - final private boolean jj_3_1418() { if (jj_scan_token(ORDERING)) return true; return false; @@ -35587,13 +35449,8 @@ final private boolean jj_3_1415() { return false; } - final private boolean jj_3R_374() { - Token xsp; - xsp = jj_scanpos; - if (jj_3_3()) { - jj_scanpos = xsp; - if (jj_3_4()) return true; - } + final private boolean jj_3_2() { + if (jj_3R_67()) return true; return false; } @@ -35617,6 +35474,11 @@ final private boolean jj_3_1413() { return false; } + final private boolean jj_3_1() { + if (jj_3R_66()) return true; + return false; + } + final private boolean jj_3_1412() { if (jj_scan_token(MILLISECOND)) return true; return false; @@ -35632,6 +35494,20 @@ final private boolean jj_3_1410() { return false; } + final private boolean jj_3_4() { + if (jj_3R_69()) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_1()) { jj_scanpos = xsp; break; } + } + while (true) { + xsp = jj_scanpos; + if (jj_3_2()) { jj_scanpos = xsp; break; } + } + return false; + } + final private boolean jj_3_1409() { if (jj_scan_token(M)) return true; return false; @@ -35663,6 +35539,11 @@ final private boolean jj_3_1405() { return false; } + final private boolean jj_3_3() { + if (jj_3R_68()) return true; + return false; + } + final private boolean jj_3_1404() { if (jj_scan_token(ISODOW)) return true; return false; @@ -35693,6 +35574,16 @@ final private boolean jj_3_324() { return false; } + final private boolean jj_3R_374() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_3()) { + jj_scanpos = xsp; + if (jj_3_4()) return true; + } + return false; + } + final private boolean jj_3_1400() { if (jj_scan_token(ILIKE)) return true; return false; @@ -38700,11 +38591,6 @@ final private boolean jj_3_1142() { return false; } - final private boolean jj_3R_291() { - if (jj_3R_400()) return true; - return false; - } - final private boolean jj_3R_341() { Token xsp; xsp = jj_scanpos; @@ -39391,13 +39277,13 @@ final private boolean jj_3_1140() { return false; } - final private boolean jj_3R_357() { - if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} + final private boolean jj_3_1139() { + if (jj_3R_341()) return true; return false; } - final private boolean jj_3_1139() { - if (jj_3R_341()) return true; + final private boolean jj_3R_291() { + if (jj_3R_400()) return true; return false; } @@ -39434,13 +39320,13 @@ final private boolean jj_3_294() { return false; } - final private boolean jj_3R_346() { - if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} + final private boolean jj_3_291() { + if (jj_scan_token(ROW)) return true; return false; } - final private boolean jj_3_291() { - if (jj_scan_token(ROW)) return true; + final private boolean jj_3R_357() { + if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} return false; } @@ -39461,10 +39347,6 @@ final private boolean jj_3_679() { return false; } - final private boolean jj_3R_411() { - return false; - } - final private boolean jj_3_292() { if (jj_scan_token(LPAREN)) return true; if (jj_scan_token(ROW)) return true; @@ -39472,6 +39354,11 @@ final private boolean jj_3_292() { return false; } + final private boolean jj_3R_346() { + if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} + return false; + } + final private boolean jj_3R_170() { if (jj_3R_275()) return true; Token xsp; @@ -39495,8 +39382,7 @@ final private boolean jj_3R_162() { return false; } - final private boolean jj_3R_175() { - if (jj_3R_375()) return true; + final private boolean jj_3R_411() { return false; } @@ -39511,6 +39397,11 @@ final private boolean jj_3_678() { return false; } + final private boolean jj_3R_175() { + if (jj_3R_375()) return true; + return false; + } + final private boolean jj_3_677() { if (jj_scan_token(DOT)) return true; if (jj_3R_274()) return true; @@ -40051,6 +39942,128 @@ final private boolean jj_3_643() { return false; } + final private boolean jj_3_642() { + if (jj_scan_token(HOUR)) return true; + return false; + } + + final private boolean jj_3_264() { + if (jj_scan_token(WITH)) return true; + if (jj_scan_token(ORDINALITY)) return true; + return false; + } + + final private boolean jj_3_641() { + if (jj_scan_token(MINUTE)) return true; + return false; + } + + final private boolean jj_3_640() { + if (jj_scan_token(SECOND)) return true; + return false; + } + + final private boolean jj_3_639() { + if (jj_scan_token(MILLISECOND)) return true; + return false; + } + + final private boolean jj_3_638() { + if (jj_scan_token(MICROSECOND)) return true; + return false; + } + + final private boolean jj_3R_270() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_637()) { + jj_scanpos = xsp; + if (jj_3_638()) { + jj_scanpos = xsp; + if (jj_3_639()) { + jj_scanpos = xsp; + if (jj_3_640()) { + jj_scanpos = xsp; + if (jj_3_641()) { + jj_scanpos = xsp; + if (jj_3_642()) { + jj_scanpos = xsp; + if (jj_3_643()) { + jj_scanpos = xsp; + if (jj_3_644()) { + jj_scanpos = xsp; + if (jj_3_645()) { + jj_scanpos = xsp; + if (jj_3_646()) { + jj_scanpos = xsp; + if (jj_3_647()) { + jj_scanpos = xsp; + if (jj_3_648()) { + jj_scanpos = xsp; + if (jj_3_649()) { + jj_scanpos = xsp; + if (jj_3_650()) { + jj_scanpos = xsp; + if (jj_3_651()) { + jj_scanpos = xsp; + if (jj_3_652()) { + jj_scanpos = xsp; + if (jj_3_653()) { + jj_scanpos = xsp; + if (jj_3_654()) { + jj_scanpos = xsp; + if (jj_3_655()) { + jj_scanpos = xsp; + if (jj_3_656()) { + jj_scanpos = xsp; + if (jj_3_657()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + final private boolean jj_3_637() { + if (jj_scan_token(NANOSECOND)) return true; + return false; + } + + final private boolean jj_3_263() { + if (jj_scan_token(LATERAL)) return true; + return false; + } + + final private boolean jj_3_262() { + if (jj_3R_168()) return true; + return false; + } + + final private boolean jj_3_268() { + Token xsp; + xsp = jj_scanpos; + if (jj_3_263()) jj_scanpos = xsp; + if (jj_scan_token(UNNEST)) return true; + if (jj_3R_173()) return true; + return false; + } + public IgniteSqlParserImplTokenManager token_source; SimpleCharStream jj_input_stream; public Token token, jj_nt; diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index 428d4d273d9e2..475711657d802 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -104,15 +104,10 @@ public void testNestedLimitOffsetWithUnion() { /** Tests correctness of fetch / offset params. */ @Test public void testInvalidLimitOffset() { - String bigInt = BigDecimal.valueOf(10000000000L).toString(); - - assertThrows("SELECT * FROM TEST_REPL OFFSET " + bigInt + " ROWS", + assertThrows("SELECT * FROM TEST_REPL OFFSET " + bigInt() + " ROWS", SqlValidatorException.class, "Illegal value of offset"); - assertThrows("SELECT * FROM TEST_REPL FETCH FIRST " + bigInt + " ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit"); - - assertThrows("SELECT * FROM TEST_REPL LIMIT " + bigInt, + assertThrows("SELECT * FROM TEST_REPL LIMIT " + bigInt(), SqlValidatorException.class, "Illegal value of fetch / limit"); assertThrows("SELECT * FROM TEST_REPL OFFSET -1 ROWS FETCH FIRST -1 ROWS ONLY", @@ -130,9 +125,6 @@ public void testInvalidLimitOffset() { assertThrows("SELECT * FROM TEST_REPL OFFSET ? ROWS", SqlValidatorException.class, "Illegal value of offset", -1); - - assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit", -1); } /** @@ -186,6 +178,129 @@ public void testOffsetOutOfRange() throws Exception { assertQuery("SELECT (SELECT id FROM TEST_PART ORDER BY id LIMIT 1 OFFSET 10)").returns(NULL_RESULT).check(); } + /** */ + @Test + public void testInvalidFetch() { + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST " + bigInt() + " ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit"); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST -1 ROWS ONLY", + IgniteSQLException.class, null); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (-2) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit"); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (2 - 3) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit"); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + 2 - 4) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit"); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (10 - (50 - 20)) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit"); + + // Check with parameters. + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", bigInt()); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", -4); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", -5); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + ? - 4) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", 1); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (? - (50 - 20)) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", 2); + } + + /** */ + @Test + public void testFetchExpression() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1) ROWS ONLY") + .returns(0) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + 2) ROWS ONLY") + .returns(0) + .returns(1) + .returns(2) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + 5 - 2) ROWS ONLY") + .returns(0) + .returns(1) + .returns(2) + .returns(3) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2 - 1) + 1) ROWS ONLY") + .returns(0) + .returns(1) + .returns(2) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2 - 1) + 1) ROWS ONLY") + .returns(0) + .returns(1) + .returns(2) + .check(); + + // With parameters. + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (?) ROWS ONLY") + .withParams(2) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + ?) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) ROWS ONLY") + .withParams(3) + .returns(0) + .returns(1) + .returns(2) + .returns(3) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + (3 - 1)) ROWS ONLY") + .withParams(2) + .returns(0) + .returns(1) + .returns(2) + .returns(3) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (1 + (2 - ?) + 1) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .returns(2) + .check(); + + // Check another sort order. + assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1 + (2 - 1) + 1) ROWS ONLY") + .returns(4) + .returns(3) + .returns(2) + .check(); + + } + /** * @param c Cache. * @param rows Rows count. @@ -270,4 +385,9 @@ private String createSql(int lim, int off, boolean param, boolean sorted) { return sb.toString(); } + + /** */ + private static BigDecimal bigInt() { + return BigDecimal.valueOf(Integer.MAX_VALUE).add(BigDecimal.ONE); + } } From 0ebb37b3cbeeb6e9c50f25f0c0b82cbf282dd9fa Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Mon, 25 May 2026 22:57:26 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/calcite/exec/rel/LimitNode.java | 4 ++ .../prepare/IgniteSqlToRelConvertor.java | 69 +++++++++++++++++++ .../calcite/prepare/IgniteSqlValidator.java | 23 ++++--- .../query/calcite/prepare/PlannerPhase.java | 5 +- .../LimitOffsetIntegrationTest.java | 52 +++++++++++++- .../planner/LimitOffsetPlannerTest.java | 9 +++ 6 files changed, 149 insertions(+), 13 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java index 9fa9d14090cd8..9b4718078b3c1 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java @@ -19,6 +19,7 @@ import java.util.function.Supplier; import org.apache.calcite.rel.type.RelDataType; +import org.apache.ignite.internal.processors.query.IgniteSQLException; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; import org.apache.ignite.internal.util.typedef.F; import org.jetbrains.annotations.Nullable; @@ -57,6 +58,9 @@ public LimitNode( offset = offsetNode == null ? 0 : offsetNode.get(); fetch = fetchNode == null ? 0 : fetchNode.get(); this.fetchNode = fetchNode; + + if (fetch < 0) + throw new IgniteSQLException("FETCH must not be negative"); } /** {@inheritDoc} */ diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java index fa8b31d7eee69..670a3819eb1e0 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java @@ -19,22 +19,30 @@ import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Set; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.prepare.Prepare; +import org.apache.calcite.rel.RelCollation; +import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelRoot; import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.core.Sort; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rel.logical.LogicalTableModify; import org.apache.calcite.rel.logical.LogicalValues; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; +import org.apache.calcite.rex.RexDynamicParam; import org.apache.calcite.rex.RexInputRef; +import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlInsert; @@ -46,11 +54,15 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorUtil; +import org.apache.calcite.sql2rel.RelFieldTrimmer; import org.apache.calcite.sql2rel.SqlRexConvertletTable; import org.apache.calcite.sql2rel.SqlToRelConverter; import org.apache.calcite.tools.RelBuilder; +import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ControlFlowException; import org.apache.calcite.util.Pair; +import org.apache.calcite.util.mapping.Mapping; +import org.apache.calcite.util.mapping.Mappings; import org.apache.ignite.internal.processors.query.calcite.schema.IgniteTable; import org.jetbrains.annotations.Nullable; @@ -87,6 +99,11 @@ public IgniteSqlToRelConvertor( return super.convertQueryRecursive(qry, top, targetRowType); } + /** {@inheritDoc} */ + @Override protected RelFieldTrimmer newFieldTrimmer() { + return new IgniteRelFieldTrimmer(validator, relBuilder); + } + /** {@inheritDoc} */ @Override protected RelNode convertInsert(SqlInsert call) { datasetStack.push(call); @@ -199,6 +216,58 @@ private boolean hasDefaults(SqlCall call) { } } + /** Field trimmer that preserves expression-based OFFSET/FETCH nodes. */ + public static class IgniteRelFieldTrimmer extends RelFieldTrimmer { + /** */ + private IgniteRelFieldTrimmer(@Nullable SqlValidator validator, RelBuilder relBuilder) { + super(validator, relBuilder); + } + + /** {@inheritDoc} */ + @Override public TrimResult trimFields( + Sort sort, + ImmutableBitSet fieldsUsed, + Set extraFields + ) { + if (supportedByRelBuilder(sort.offset) && supportedByRelBuilder(sort.fetch)) + return super.trimFields(sort, fieldsUsed, extraFields); + + RelCollation collation = sort.getCollation(); + RelNode input = sort.getInput(); + int fieldCnt = sort.getRowType().getFieldCount(); + + ImmutableBitSet.Builder inputFieldsUsed = fieldsUsed.rebuild(); + + for (RelFieldCollation field : collation.getFieldCollations()) + inputFieldsUsed.set(field.getFieldIndex()); + + TrimResult trimRes = trimChild(sort, input, inputFieldsUsed.build(), Collections.emptySet()); + RelNode newInput = trimRes.left; + Mapping inputMapping = trimRes.right; + + if (newInput == input && inputMapping.isIdentity() && fieldsUsed.cardinality() == fieldCnt) + return result(sort, Mappings.createIdentity(fieldCnt)); + + RelNode newSort = sort.copy( + sort.getTraitSet(), + newInput, + RexUtil.apply(inputMapping, collation), + sort.offset, + sort.fetch + ); + + return result(newSort, inputMapping, sort); + } + + /** + * @param node Rex node. + * @return {@code true} if Calcite RelBuilder accepts the node for OFFSET/FETCH. + */ + private static boolean supportedByRelBuilder(@Nullable RexNode node) { + return node == null || node instanceof RexLiteral || node instanceof RexDynamicParam; + } + } + /** * This method was copy-pasted from super-method except this changes: * - For updateCall we require all columns in the project and should not skip anything. diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index e1a2e4c8b25aa..f5cc4f2b8dd02 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -240,8 +240,8 @@ private void validateTableModify(SqlNode table) { /** {@inheritDoc} */ @Override protected void validateSelect(SqlSelect select, RelDataType targetRowType) { - select.setFetch(checkIntegerLimit(select.getFetch(), "fetch / limit")); - select.setOffset(checkIntegerLimit(select.getOffset(), "offset")); + checkIntegerLimit(select.getFetch(), "fetch / limit"); + checkIntegerLimit(select.getOffset(), "offset"); super.validateSelect(select, targetRowType); } @@ -263,11 +263,10 @@ private void validateTableModify(SqlNode table) { /** * @param n Node to check limit. * @param nodeName Node name. - * @return Original node or evaluated literal for expressions. */ - private SqlNode checkIntegerLimit(SqlNode n, String nodeName) { + private void checkIntegerLimit(SqlNode n, String nodeName) { if (n == null) - return null; + return; BigDecimal offFetchLimit = limitValue(n); @@ -275,11 +274,6 @@ private SqlNode checkIntegerLimit(SqlNode n, String nodeName) { || offFetchLimit.compareTo(BigDecimal.ZERO) < 0)) { throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); } - - if (offFetchLimit != null && n instanceof SqlCall) - return SqlLiteral.createExactNumeric(offFetchLimit.toPlainString(), n.getParserPosition()); - - return n; } /** @@ -291,11 +285,18 @@ private SqlNode checkIntegerLimit(SqlNode n, String nodeName) { return ((SqlLiteral)n).bigDecimalValue(); if (n instanceof SqlDynamicParam) { + RelDataType intType = typeFactory().createTypeWithNullability( + typeFactory().createSqlType(SqlTypeName.INTEGER), true); + SqlDynamicParam paramNode = (SqlDynamicParam)n; + + if (deriveDynamicParameterType(paramNode, intType) == null) + setValidatedNodeType(paramNode, intType); + // Will fail in params check. if (F.isEmpty(parameters)) return null; - int idx = ((SqlDynamicParam)n).getIndex(); + int idx = paramNode.getIndex(); if (idx >= parameters.length) return null; diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java index b8333a541663f..d731697c41fae 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/PlannerPhase.java @@ -43,6 +43,7 @@ import org.apache.calcite.rel.rules.PruneEmptyRules; import org.apache.calcite.rel.rules.SetOpToFilterRule; import org.apache.calcite.rel.rules.SortRemoveRule; +import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.tools.Program; import org.apache.calcite.tools.RuleSet; import org.apache.calcite.tools.RuleSets; @@ -259,7 +260,9 @@ public enum PlannerPhase { ((RelRule)PruneEmptyRules.SORT_FETCH_ZERO_INSTANCE).config .withOperandSupplier(b -> - b.operand(LogicalSort.class).anyInputs()) + b.operand(LogicalSort.class) + .predicate(sort -> sort.fetch instanceof RexLiteral) + .anyInputs()) .toRule(), ExposeIndexRule.INSTANCE, diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index 475711657d802..da96840eefada 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -291,14 +291,64 @@ public void testFetchExpression() throws Exception { .returns(1) .returns(2) .check(); + } + + /** */ + @Test + public void testFetchExpressionAnotherSortOrder() throws Exception { + fillCache(cacheRepl, 5); - // Check another sort order. assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1 + (2 - 1) + 1) ROWS ONLY") .returns(4) .returns(3) .returns(2) .check(); + } + + /** */ + @Test + public void testFetchExpressionCachedQuery() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) ROWS ONLY") + .withParams(2) + .returns(0) + .returns(1) + .returns(2) + .check(); + + // Check negative param. + assertThrows("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (? + 1) ROWS ONLY", + IgniteSQLException.class, "FETCH must not be negative", -2); + } + + /** */ + @Test + public void testFetchExpressionCachedQueryAndAnotherSortOrder() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (? + 1) ROWS ONLY") + .withParams(1) + .returns(4) + .returns(3) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (? + 1) ROWS ONLY") + .withParams(2) + .returns(4) + .returns(3) + .returns(2) + .check(); + // Check negative param. + assertThrows("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (? + 1) ROWS ONLY", + IgniteSQLException.class, "FETCH must not be negative", -2); } /** diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java index cbde34372992e..dd4ad62c871bd 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java @@ -61,6 +61,15 @@ public void testLimit() throws Exception { .and(hasChildThat(isInstanceOf(IgniteSort.class))))); } + /** */ + @Test + public void testFetchExpressionPlanning() throws Exception { + IgniteSchema publicSchema = createSchemaWithTable(IgniteDistributions.broadcast()); + + physicalPlan("SELECT * FROM TEST FETCH FIRST (2 + 1) ROWS ONLY", publicSchema); + physicalPlan("SELECT * FROM TEST FETCH FIRST (? + 1) ROWS ONLY", publicSchema); + } + /** */ @Test public void testNestedLimitOffsetWithUnion() throws Exception { From 74f1beb9eb842c8a1fcaac7f7775d47494d140ee Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Tue, 26 May 2026 14:41:23 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LimitOffsetIntegrationTest.java | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index da96840eefada..8d46350890d11 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -93,12 +93,12 @@ public class LimitOffsetIntegrationTest extends AbstractBasicIntegrationTransact /** */ @Test - public void testNestedLimitOffsetWithUnion() { - sql("INSERT into TEST_REPL VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')"); + public void testNestedLimitOffsetWithUnion() throws Exception { + fillCache(cacheRepl, 4); assertQuery("(SELECT id FROM TEST_REPL WHERE id = 2) UNION ALL " + "SELECT id FROM (select id from (SELECT id FROM TEST_REPL OFFSET 2) order by id OFFSET 1)" - ).returns(2).returns(4).check(); + ).returns(2).returns(3).check(); } /** Tests correctness of fetch / offset params. */ @@ -251,6 +251,11 @@ public void testFetchExpression() throws Exception { .check(); // With parameters. + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (?) ROWS ONLY") + .withParams(1) + .returns(0) + .check(); + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (?) ROWS ONLY") .withParams(2) .returns(0) @@ -303,6 +308,36 @@ public void testFetchExpressionAnotherSortOrder() throws Exception { .returns(3) .returns(2) .check(); + + // With parameters. + assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (1 + (2 - 1) + ?) ROWS ONLY") + .withParams(2) + .returns(4) + .returns(3) + .returns(2) + .returns(1) + .check(); + } + + /** */ + @Test + public void testFetchExpressionWithoutSortOrder() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + (2 - 1) + 1) ROWS ONLY") + .returns(0) + .returns(1) + .returns(2) + .check(); + + // With parameters. + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + (2 - 1) + ?) ROWS ONLY") + .withParams(2) + .returns(0) + .returns(1) + .returns(2) + .returns(3) + .check(); } /** */ @@ -351,6 +386,55 @@ public void testFetchExpressionCachedQueryAndAnotherSortOrder() throws Exception IgniteSQLException.class, "FETCH must not be negative", -2); } + /** */ + @Test + public void testFetchExpressionCachedQueryAndWithoutSortOrder() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (? + 1) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (? + 1) ROWS ONLY") + .withParams(2) + .returns(0) + .returns(1) + .returns(2) + .check(); + + // Check negative param. + assertThrows("SELECT id FROM TEST_REPL FETCH FIRST (? + 1) ROWS ONLY", + IgniteSQLException.class, "FETCH must not be negative", -2); + } + + /** */ + @Test + public void testFetchExpressionNested() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM (SELECT id from TEST_REPL FETCH FIRST (? + 3) ROWS ONLY) " + + "FETCH NEXT (1 + ?) ROWS ONLY") + .withParams(2, 1) + .returns(0) + .returns(1) + .check(); + } + + /** */ + @Test + public void test() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (SQRT(?)) ROWS ONLY") + .withParams(4) + .returns(0) + .returns(1) + .returns(3) + .check(); + } + /** * @param c Cache. * @param rows Rows count. From 796de2e1db49a5025bfcf6c1457854dc6e7bd646 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Tue, 26 May 2026 16:07:13 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calcite/exec/LogicalRelImplementor.java | 4 +- .../query/calcite/exec/rel/LimitNode.java | 43 ++++++++++++++---- .../calcite/prepare/IgniteSqlValidator.java | 22 ++++++++- .../LimitOffsetIntegrationTest.java | 45 +++++++++++++++++-- 4 files changed, 100 insertions(+), 14 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java index 3ff4bc544504c..d7eafaa2eea6d 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java @@ -626,8 +626,8 @@ private boolean hasExchange(RelNode rel) { /** {@inheritDoc} */ @Override public Node visit(IgniteLimit rel) { - Supplier offset = (rel.offset() == null) ? null : expressionFactory.execute(rel.offset()); - Supplier fetch = (rel.fetch() == null) ? null : expressionFactory.execute(rel.fetch()); + Supplier offset = (rel.offset() == null) ? null : expressionFactory.execute(rel.offset()); + Supplier fetch = (rel.fetch() == null) ? null : expressionFactory.execute(rel.fetch()); LimitNode node = new LimitNode<>(ctx, rel.getRowType(), offset, fetch); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java index 9b4718078b3c1..247912c3404f0 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.query.calcite.exec.rel; +import java.math.BigDecimal; import java.util.function.Supplier; import org.apache.calcite.rel.type.RelDataType; import org.apache.ignite.internal.processors.query.IgniteSQLException; @@ -26,6 +27,9 @@ /** Offset, fetch|limit support node. */ public class LimitNode extends AbstractNode implements SingleNode, Downstream { + /** Decimal of Integer.MAX_VALUE for fetch/offset bounding. */ + private static final BigDecimal DEC_INT_MAX = BigDecimal.valueOf(Integer.MAX_VALUE); + /** Offset if its present, otherwise 0. */ private final int offset; @@ -36,7 +40,7 @@ public class LimitNode extends AbstractNode implements SingleNode private int rowsProcessed; /** Fetch can be unset, in this case we need all rows. */ - private @Nullable Supplier fetchNode; + private final @Nullable Supplier fetchNode; /** Waiting results counter. */ private int waiting; @@ -50,17 +54,14 @@ public class LimitNode extends AbstractNode implements SingleNode public LimitNode( ExecutionContext ctx, RelDataType rowType, - Supplier offsetNode, - Supplier fetchNode + @Nullable Supplier offsetNode, + @Nullable Supplier fetchNode ) { super(ctx, rowType); - offset = offsetNode == null ? 0 : offsetNode.get(); - fetch = fetchNode == null ? 0 : fetchNode.get(); + offset = limitValueWithCheck(offsetNode, "OFFSET"); + fetch = limitValueWithCheck(fetchNode, "FETCH"); this.fetchNode = fetchNode; - - if (fetch < 0) - throw new IgniteSQLException("FETCH must not be negative"); } /** {@inheritDoc} */ @@ -136,4 +137,30 @@ public LimitNode( private boolean fetchNone() { return (fetchNode != null && fetch == 0) || (fetch > 0 && rowsProcessed == fetch + offset); } + + /** */ + private static int limitValueWithCheck(@Nullable Supplier s, String name) { + if (s == null) + return 0; + + Number n = s.get(); + + if (n == null) + throw new IgniteSQLException(name + " must not be null"); + else if (n instanceof Double || n instanceof Float) { + double v = n.doubleValue(); + + if (!Double.isFinite(v)) + throw new IgniteSQLException(name + " must be an finite number"); + } + + BigDecimal v = new BigDecimal(n.toString()); + + if (v.compareTo(BigDecimal.ZERO) < 0) + throw new IgniteSQLException(name + " must not be negative"); + else if (v.compareTo(DEC_INT_MAX) > 0) + throw new IgniteSQLException(name + " must not be greater than " + DEC_INT_MAX); + + return v.intValue(); + } } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index f5cc4f2b8dd02..b140030e68944 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -268,6 +268,8 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { if (n == null) return; + deriveDynamicParameterTypes(n); + BigDecimal offFetchLimit = limitValue(n); if (offFetchLimit != null && (offFetchLimit.compareTo(DEC_INT_MAX) > 0 @@ -286,7 +288,7 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { if (n instanceof SqlDynamicParam) { RelDataType intType = typeFactory().createTypeWithNullability( - typeFactory().createSqlType(SqlTypeName.INTEGER), true); + typeFactory().createSqlType(SqlTypeName.DECIMAL), true); SqlDynamicParam paramNode = (SqlDynamicParam)n; if (deriveDynamicParameterType(paramNode, intType) == null) @@ -344,6 +346,24 @@ else if (operands.size() == 2) { return null; } + /** + * @param n Node to check. + */ + private void deriveDynamicParameterTypes(SqlNode n) { + if (n instanceof SqlDynamicParam) { + RelDataType intType = typeFactory().createTypeWithNullability( + typeFactory().createSqlType(SqlTypeName.DECIMAL), true); + SqlDynamicParam paramNode = (SqlDynamicParam)n; + + if (deriveDynamicParameterType(paramNode, intType) == null) + setValidatedNodeType(paramNode, intType); + } + else if (n instanceof SqlCall) { + for (SqlNode operand : ((SqlCall)n).getOperandList()) + deriveDynamicParameterTypes(operand); + } + } + /** {@inheritDoc} */ @Override public void validateCall(SqlCall call, SqlValidatorScope scope) { if (call.getKind() == SqlKind.AS) { diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index 8d46350890d11..69d2cdde3a898 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -216,6 +216,25 @@ public void testInvalidFetch() { SqlValidatorException.class, "Illegal value of fetch / limit", 2); } + /** */ + @Test + public void testInvalidFetchWithScalarFunctionExpression() { + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST SQRT(4) ROWS ONLY", + IgniteSQLException.class, null); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", + IgniteSQLException.class, null, NULL_RESULT); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", + IgniteSQLException.class, null, Double.NaN); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", + IgniteSQLException.class, null, Double.POSITIVE_INFINITY); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", + IgniteSQLException.class, null, Double.NEGATIVE_INFINITY); + } + /** */ @Test public void testFetchExpression() throws Exception { @@ -424,14 +443,34 @@ public void testFetchExpressionNested() throws Exception { /** */ @Test - public void test() throws Exception { + public void testFetchScalarFunctionExpression() throws Exception { fillCache(cacheRepl, 5); - assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (SQRT(?)) ROWS ONLY") + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + ABS(?)) ROWS ONLY") + .withParams(-2) + .returns(0) + .returns(1) + .returns(2) + .check(); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + ABS(?)) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY") .withParams(4) .returns(0) .returns(1) - .returns(3) + .returns(2) + .check(); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY") + .withParams(5) + .returns(0) + .returns(1) + .returns(2) .check(); } From e45fc065d0587ff29cae2fb80cb29dd1f4da9980 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Tue, 26 May 2026 17:04:29 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calcite/exec/LogicalRelImplementor.java | 4 +- .../query/calcite/exec/rel/LimitNode.java | 35 +----------- .../query/calcite/exec/rel/RelNodeUtils.java | 56 +++++++++++++++++++ .../query/calcite/exec/rel/SortNode.java | 10 ++-- .../calcite/prepare/IgniteSqlValidator.java | 45 +++++++++------ .../LimitOffsetIntegrationTest.java | 26 ++++++++- 6 files changed, 115 insertions(+), 61 deletions(-) create mode 100644 modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/RelNodeUtils.java diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java index d7eafaa2eea6d..cd4af5de10e1a 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/LogicalRelImplementor.java @@ -642,8 +642,8 @@ private boolean hasExchange(RelNode rel) { @Override public Node visit(IgniteSort rel) { RelCollation collation = rel.getCollation(); - Supplier offset = (rel.offset == null) ? null : expressionFactory.execute(rel.offset); - Supplier fetch = (rel.fetch == null) ? null : expressionFactory.execute(rel.fetch); + Supplier offset = (rel.offset == null) ? null : expressionFactory.execute(rel.offset); + Supplier fetch = (rel.fetch == null) ? null : expressionFactory.execute(rel.fetch); SortNode node = new SortNode<>(ctx, rel.getRowType(), expressionFactory.comparator(collation), offset, fetch); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java index 247912c3404f0..993fbc5970f4a 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/LimitNode.java @@ -17,19 +17,14 @@ package org.apache.ignite.internal.processors.query.calcite.exec.rel; -import java.math.BigDecimal; import java.util.function.Supplier; import org.apache.calcite.rel.type.RelDataType; -import org.apache.ignite.internal.processors.query.IgniteSQLException; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; import org.apache.ignite.internal.util.typedef.F; import org.jetbrains.annotations.Nullable; /** Offset, fetch|limit support node. */ public class LimitNode extends AbstractNode implements SingleNode, Downstream { - /** Decimal of Integer.MAX_VALUE for fetch/offset bounding. */ - private static final BigDecimal DEC_INT_MAX = BigDecimal.valueOf(Integer.MAX_VALUE); - /** Offset if its present, otherwise 0. */ private final int offset; @@ -59,8 +54,8 @@ public LimitNode( ) { super(ctx, rowType); - offset = limitValueWithCheck(offsetNode, "OFFSET"); - fetch = limitValueWithCheck(fetchNode, "FETCH"); + offset = RelNodeUtils.limitValueWithCheck(offsetNode, "OFFSET"); + fetch = RelNodeUtils.limitValueWithCheck(fetchNode, "FETCH"); this.fetchNode = fetchNode; } @@ -137,30 +132,4 @@ public LimitNode( private boolean fetchNone() { return (fetchNode != null && fetch == 0) || (fetch > 0 && rowsProcessed == fetch + offset); } - - /** */ - private static int limitValueWithCheck(@Nullable Supplier s, String name) { - if (s == null) - return 0; - - Number n = s.get(); - - if (n == null) - throw new IgniteSQLException(name + " must not be null"); - else if (n instanceof Double || n instanceof Float) { - double v = n.doubleValue(); - - if (!Double.isFinite(v)) - throw new IgniteSQLException(name + " must be an finite number"); - } - - BigDecimal v = new BigDecimal(n.toString()); - - if (v.compareTo(BigDecimal.ZERO) < 0) - throw new IgniteSQLException(name + " must not be negative"); - else if (v.compareTo(DEC_INT_MAX) > 0) - throw new IgniteSQLException(name + " must not be greater than " + DEC_INT_MAX); - - return v.intValue(); - } } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/RelNodeUtils.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/RelNodeUtils.java new file mode 100644 index 0000000000000..3c455cdee9190 --- /dev/null +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/RelNodeUtils.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.calcite.exec.rel; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.function.Supplier; +import org.apache.ignite.internal.processors.query.IgniteSQLException; +import org.jetbrains.annotations.Nullable; + +/** Utility class for rel nodes containing useful methods and constants. */ +class RelNodeUtils { + /** Decimal of Integer.MAX_VALUE for fetch/offset bounding. */ + private static final BigDecimal DEC_INT_MAX = BigDecimal.valueOf(Integer.MAX_VALUE); + + /** */ + static int limitValueWithCheck(@Nullable Supplier s, String name) { + if (s == null) + return 0; + + Number n = s.get(); + + if (n == null) + throw new IgniteSQLException(name + " must not be null"); + else if (n instanceof Double || n instanceof Float) { + double v = n.doubleValue(); + + if (!Double.isFinite(v)) + throw new IgniteSQLException(name + " must be an finite number"); + } + + BigDecimal v = new BigDecimal(n.toString()).setScale(0, RoundingMode.DOWN); + + if (v.compareTo(BigDecimal.ZERO) < 0) + throw new IgniteSQLException(name + " must not be negative"); + else if (v.compareTo(DEC_INT_MAX) > 0) + throw new IgniteSQLException(name + " must not be greater than " + DEC_INT_MAX); + + return v.intValue(); + } +} diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java index 09376b210f601..9706fa124de81 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/rel/SortNode.java @@ -58,15 +58,13 @@ public class SortNode extends MemoryTrackingNode implements SingleNode public SortNode( ExecutionContext ctx, RelDataType rowType, Comparator comp, - @Nullable Supplier offset, - @Nullable Supplier fetch + @Nullable Supplier offset, + @Nullable Supplier fetch ) { super(ctx, rowType); - assert fetch == null || fetch.get() >= 0; - assert offset == null || offset.get() >= 0; - - limit = fetch == null ? -1 : fetch.get() + (offset == null ? 0 : offset.get()); + limit = fetch == null ? + -1 : RelNodeUtils.limitValueWithCheck(fetch, "FETCH") + RelNodeUtils.limitValueWithCheck(offset, "OFFSET"); if (limit < 0) rows = new PriorityQueue<>(comp); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index b140030e68944..235753fca97ad 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.query.calcite.prepare; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; @@ -270,29 +271,32 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { deriveDynamicParameterTypes(n); - BigDecimal offFetchLimit = limitValue(n); + BigDecimal offFetchLimit = limitValue(n, nodeName); - if (offFetchLimit != null && (offFetchLimit.compareTo(DEC_INT_MAX) > 0 - || offFetchLimit.compareTo(BigDecimal.ZERO) < 0)) { - throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); + if (offFetchLimit != null) { + offFetchLimit = offFetchLimit.setScale(0, RoundingMode.DOWN); + + if (offFetchLimit.compareTo(DEC_INT_MAX) > 0 || offFetchLimit.compareTo(BigDecimal.ZERO) < 0) + throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); } } /** * @param n Limit node. + * @param nodeName Node name. * @return Limit value, or {@code null} if the expression cannot be evaluated during validation. */ - @Nullable private BigDecimal limitValue(SqlNode n) { + private @Nullable BigDecimal limitValue(SqlNode n, String nodeName) { if (n instanceof SqlLiteral) return ((SqlLiteral)n).bigDecimalValue(); if (n instanceof SqlDynamicParam) { - RelDataType intType = typeFactory().createTypeWithNullability( + RelDataType dataType = typeFactory().createTypeWithNullability( typeFactory().createSqlType(SqlTypeName.DECIMAL), true); SqlDynamicParam paramNode = (SqlDynamicParam)n; - if (deriveDynamicParameterType(paramNode, intType) == null) - setValidatedNodeType(paramNode, intType); + if (deriveDynamicParameterType(paramNode, dataType) == null) + setValidatedNodeType(paramNode, dataType); // Will fail in params check. if (F.isEmpty(parameters)) @@ -305,7 +309,14 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { Object param = parameters[idx]; - return param instanceof Number ? new BigDecimal(param.toString()) : null; + if (!(param instanceof Number)) + return null; + else if (param instanceof Double || param instanceof Float) { + if (!Double.isFinite(((Number) param).doubleValue())) + throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); + } + + return new BigDecimal(param.toString()); } if (n instanceof SqlCall) { @@ -315,8 +326,8 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { switch (call.getKind()) { case PLUS: if (operands.size() == 2) { - BigDecimal left = limitValue(operands.get(0)); - BigDecimal right = limitValue(operands.get(1)); + BigDecimal left = limitValue(operands.get(0), nodeName); + BigDecimal right = limitValue(operands.get(1), nodeName); return left != null && right != null ? left.add(right) : null; } @@ -325,13 +336,13 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { case MINUS: if (operands.size() == 1) { - BigDecimal operand = limitValue(operands.get(0)); + BigDecimal operand = limitValue(operands.get(0), nodeName); return operand != null ? operand.negate() : null; } else if (operands.size() == 2) { - BigDecimal left = limitValue(operands.get(0)); - BigDecimal right = limitValue(operands.get(1)); + BigDecimal left = limitValue(operands.get(0), nodeName); + BigDecimal right = limitValue(operands.get(1), nodeName); return left != null && right != null ? left.subtract(right) : null; } @@ -351,12 +362,12 @@ else if (operands.size() == 2) { */ private void deriveDynamicParameterTypes(SqlNode n) { if (n instanceof SqlDynamicParam) { - RelDataType intType = typeFactory().createTypeWithNullability( + RelDataType dataType = typeFactory().createTypeWithNullability( typeFactory().createSqlType(SqlTypeName.DECIMAL), true); SqlDynamicParam paramNode = (SqlDynamicParam)n; - if (deriveDynamicParameterType(paramNode, intType) == null) - setValidatedNodeType(paramNode, intType); + if (deriveDynamicParameterType(paramNode, dataType) == null) + setValidatedNodeType(paramNode, dataType); } else if (n instanceof SqlCall) { for (SqlNode operand : ((SqlCall)n).getOperandList()) diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index 69d2cdde3a898..0b41cfb013dbd 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -209,6 +209,15 @@ public void testInvalidFetch() { assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", SqlValidatorException.class, "Illegal value of fetch / limit", -5); + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", + IgniteSQLException.class, null, NULL_RESULT); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", Double.NaN); + + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit", Double.POSITIVE_INFINITY); + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + ? - 4) ROWS ONLY", SqlValidatorException.class, "Illegal value of fetch / limit", 1); @@ -228,9 +237,6 @@ public void testInvalidFetchWithScalarFunctionExpression() { assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", IgniteSQLException.class, null, Double.NaN); - assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", - IgniteSQLException.class, null, Double.POSITIVE_INFINITY); - assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY", IgniteSQLException.class, null, Double.NEGATIVE_INFINITY); } @@ -472,6 +478,20 @@ public void testFetchScalarFunctionExpression() throws Exception { .returns(1) .returns(2) .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY") + .withParams(5) + .returns(0) + .returns(1) + .returns(2) + .check(); + + assertQuery("SELECT id FROM TEST_REPL ORDER BY id DESC FETCH FIRST (SQRT(?) + 1 + 0) ROWS ONLY") + .withParams(5) + .returns(4) + .returns(3) + .returns(2) + .check(); } /** From 9a565e6ba389aa28b4232b7c680196c58ab12456 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Tue, 26 May 2026 17:50:31 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calcite/prepare/IgniteSqlValidator.java | 51 ++----------------- .../LimitOffsetIntegrationTest.java | 10 ++-- 2 files changed, 9 insertions(+), 52 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index 235753fca97ad..656b251dfa771 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -66,7 +66,6 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.sql.validate.SqlValidatorTable; import org.apache.calcite.sql.validate.SqlValidatorUtil; -import org.apache.calcite.util.Static; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.processors.query.calcite.schema.CacheTableDescriptor; import org.apache.ignite.internal.processors.query.calcite.schema.IgniteCacheTable; @@ -174,7 +173,7 @@ private void validateTableModify(SqlNode table) { final SqlValidatorTable targetTable = getCatalogReader().getTable(((SqlIdentifier)table).names); if (targetTable == null) - throw newValidationError(table, Static.RESOURCE.objectNotFound(table.toString())); + throw newValidationError(table, RESOURCE.objectNotFound(table.toString())); if (!targetTable.unwrap(IgniteTable.class).isModifiable()) throw newValidationError(table, IgniteResource.INSTANCE.modifyTableNotSupported(table.toString())); @@ -193,7 +192,7 @@ private void validateTableModify(SqlNode table) { final SqlValidatorTable table = getCatalogReader().getTable(targetTable.names); if (table == null) - throw newValidationError(call, Static.RESOURCE.objectNotFound(targetTable.toString())); + throw newValidationError(call, RESOURCE.objectNotFound(targetTable.toString())); SqlIdentifier alias = call.getAlias() != null ? call.getAlias() : new SqlIdentifier(deriveAlias(targetTable, 0), SqlParserPos.ZERO); @@ -284,25 +283,18 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { /** * @param n Limit node. * @param nodeName Node name. - * @return Limit value, or {@code null} if the expression cannot be evaluated during validation. + * @return Limit value, or {@code null} if the node is not an atomic value. */ private @Nullable BigDecimal limitValue(SqlNode n, String nodeName) { if (n instanceof SqlLiteral) return ((SqlLiteral)n).bigDecimalValue(); if (n instanceof SqlDynamicParam) { - RelDataType dataType = typeFactory().createTypeWithNullability( - typeFactory().createSqlType(SqlTypeName.DECIMAL), true); - SqlDynamicParam paramNode = (SqlDynamicParam)n; - - if (deriveDynamicParameterType(paramNode, dataType) == null) - setValidatedNodeType(paramNode, dataType); - // Will fail in params check. if (F.isEmpty(parameters)) return null; - int idx = paramNode.getIndex(); + int idx = ((SqlDynamicParam) n).getIndex(); if (idx >= parameters.length) return null; @@ -319,41 +311,6 @@ else if (param instanceof Double || param instanceof Float) { return new BigDecimal(param.toString()); } - if (n instanceof SqlCall) { - SqlCall call = (SqlCall)n; - List operands = call.getOperandList(); - - switch (call.getKind()) { - case PLUS: - if (operands.size() == 2) { - BigDecimal left = limitValue(operands.get(0), nodeName); - BigDecimal right = limitValue(operands.get(1), nodeName); - - return left != null && right != null ? left.add(right) : null; - } - - break; - - case MINUS: - if (operands.size() == 1) { - BigDecimal operand = limitValue(operands.get(0), nodeName); - - return operand != null ? operand.negate() : null; - } - else if (operands.size() == 2) { - BigDecimal left = limitValue(operands.get(0), nodeName); - BigDecimal right = limitValue(operands.get(1), nodeName); - - return left != null && right != null ? left.subtract(right) : null; - } - - break; - - default: - return null; - } - } - return null; } diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index 0b41cfb013dbd..54bbfa65ea3e1 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -191,13 +191,13 @@ public void testInvalidFetch() { SqlValidatorException.class, "Illegal value of fetch / limit"); assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (2 - 3) ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit"); + IgniteSQLException.class, null); assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + 2 - 4) ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit"); + IgniteSQLException.class, null); assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (10 - (50 - 20)) ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit"); + IgniteSQLException.class, null); // Check with parameters. assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY", @@ -219,10 +219,10 @@ public void testInvalidFetch() { SqlValidatorException.class, "Illegal value of fetch / limit", Double.POSITIVE_INFINITY); assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (1 + ? - 4) ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit", 1); + IgniteSQLException.class, null, 1); assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (? - (50 - 20)) ROWS ONLY", - SqlValidatorException.class, "Illegal value of fetch / limit", 2); + IgniteSQLException.class, null, 2); } /** */ From 2e11e6d9b23027be70c1c169f983abf261755c05 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Tue, 26 May 2026 20:59:17 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/calcite/planner/LimitOffsetPlannerTest.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java index dd4ad62c871bd..cbde34372992e 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/LimitOffsetPlannerTest.java @@ -61,15 +61,6 @@ public void testLimit() throws Exception { .and(hasChildThat(isInstanceOf(IgniteSort.class))))); } - /** */ - @Test - public void testFetchExpressionPlanning() throws Exception { - IgniteSchema publicSchema = createSchemaWithTable(IgniteDistributions.broadcast()); - - physicalPlan("SELECT * FROM TEST FETCH FIRST (2 + 1) ROWS ONLY", publicSchema); - physicalPlan("SELECT * FROM TEST FETCH FIRST (? + 1) ROWS ONLY", publicSchema); - } - /** */ @Test public void testNestedLimitOffsetWithUnion() throws Exception { From bdbe29676f7faaa338a64bafa579c42d7c569046 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Wed, 27 May 2026 07:29:03 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D1=82=D1=86=D0=B5=D0=BD=D0=B7?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../patches/select-fetch-expression.patch | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch b/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch index 1dbcd0befdded..70b024b00f8f3 100644 --- a/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch +++ b/modules/calcite/src/main/codegen/patches/select-fetch-expression.patch @@ -1,3 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# --- javacc/Parser.jj +++ javacc/Parser.jj @@ -754,7 +754,7 @@ @@ -7,4 +23,4 @@ - ( | ) offsetFetch[1] = UnsignedNumericLiteralOrParam() + ( | ) offsetFetch[1] = FetchCount() ( | ) - } \ No newline at end of file + } From 0602a4e45e5693e584338a7c8c559c5cf69511a4 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Wed, 27 May 2026 07:46:39 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/calcite/prepare/IgniteSqlToRelConvertor.java | 2 +- .../processors/query/calcite/prepare/IgniteSqlValidator.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java index 670a3819eb1e0..d6cb129c10b5c 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlToRelConvertor.java @@ -58,8 +58,8 @@ import org.apache.calcite.sql2rel.SqlRexConvertletTable; import org.apache.calcite.sql2rel.SqlToRelConverter; import org.apache.calcite.tools.RelBuilder; -import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ControlFlowException; +import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.Pair; import org.apache.calcite.util.mapping.Mapping; import org.apache.calcite.util.mapping.Mappings; diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index 656b251dfa771..9e9c90dca4538 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -294,7 +294,7 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { if (F.isEmpty(parameters)) return null; - int idx = ((SqlDynamicParam) n).getIndex(); + int idx = ((SqlDynamicParam)n).getIndex(); if (idx >= parameters.length) return null; @@ -304,7 +304,7 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { if (!(param instanceof Number)) return null; else if (param instanceof Double || param instanceof Float) { - if (!Double.isFinite(((Number) param).doubleValue())) + if (!Double.isFinite(((Number)param).doubleValue())) throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); } From b9d186f3a6c7967ecb90fe14b07bf04a4df49fb8 Mon Sep 17 00:00:00 2001 From: Kirill Tkalenko Date: Thu, 28 May 2026 14:27:17 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calcite/prepare/IgniteSqlValidator.java | 56 +++++++++++++++++-- .../LimitOffsetIntegrationTest.java | 25 +++++++++ 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java index 9e9c90dca4538..63d4a008404eb 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -112,6 +113,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl { /** */ private final RelDataType nullType; + /** Dynamic parameter types by parameter index. */ + private final Map dynamicParamTypeByIdx = new HashMap<>(); + /** * Creates a validator. * @@ -286,8 +290,12 @@ private void checkIntegerLimit(SqlNode n, String nodeName) { * @return Limit value, or {@code null} if the node is not an atomic value. */ private @Nullable BigDecimal limitValue(SqlNode n, String nodeName) { - if (n instanceof SqlLiteral) + if (n instanceof SqlLiteral) { + if (((SqlLiteral)n).getTypeName().getFamily() != SqlTypeFamily.NUMERIC) + throw newValidationError(n, IgniteResource.INSTANCE.correctIntegerLimit(nodeName)); + return ((SqlLiteral)n).bigDecimalValue(); + } if (n instanceof SqlDynamicParam) { // Will fail in params check. @@ -323,8 +331,10 @@ private void deriveDynamicParameterTypes(SqlNode n) { typeFactory().createSqlType(SqlTypeName.DECIMAL), true); SqlDynamicParam paramNode = (SqlDynamicParam)n; - if (deriveDynamicParameterType(paramNode, dataType) == null) + if (deriveDynamicParameterType(paramNode, dataType) == null) { setValidatedNodeType(paramNode, dataType); + dynamicParamTypeByIdx.put(paramNode.getIndex(), dataType); + } } else if (n instanceof SqlCall) { for (SqlNode operand : ((SqlCall)n).getOperandList()) @@ -613,9 +623,28 @@ private boolean isSystemFieldName(String alias) { return super.deriveType(scope, expr); } + /** {@inheritDoc} */ + @Override public @Nullable RelDataType getValidatedNodeTypeIfKnown(SqlNode node) { + RelDataType type = super.getValidatedNodeTypeIfKnown(node); + + if (type == null && node instanceof SqlDynamicParam) { + SqlDynamicParam param = (SqlDynamicParam)node; + + type = dynamicParamTypeByIdx.get(param.getIndex()); + + if (type == null) + type = dynamicParameterType(param, nullType); + } + + return type; + } + /** @return A derived type or {@code null} if unable to determine. */ @Nullable private RelDataType deriveDynamicParameterType(SqlDynamicParam node, RelDataType nullValType) { - RelDataType type = getValidatedNodeTypeIfKnown(node); + RelDataType type = super.getValidatedNodeTypeIfKnown(node); + + if (type == null) + type = dynamicParamTypeByIdx.get(node.getIndex()); // Do not clarify the widest type for any value. if (type instanceof OtherType) @@ -629,11 +658,28 @@ private boolean isSystemFieldName(String alias) { if (val == null && type != null) return type; - type = val == null + type = dynamicParameterType(node, nullValType); + + if (type == null) + return null; + + setValidatedNodeType(node, type); + + return type; + } + + /** @return Dynamic parameter type derived from parameter value, or {@code null} if unable to determine. */ + @Nullable private RelDataType dynamicParameterType(SqlDynamicParam node, RelDataType nullValType) { + if (parameters == null || node.getIndex() >= parameters.length) + return null; + + Object val = parameters[node.getIndex()]; + + RelDataType type = val == null ? typeFactory().createTypeWithNullability(nullValType, true) : typeFactory().createTypeWithNullability(typeFactory().toSql(typeFactory().createType(val.getClass())), true); - setValidatedNodeType(node, type); + dynamicParamTypeByIdx.put(node.getIndex(), type); return type; } diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java index 54bbfa65ea3e1..14a971a179471 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/LimitOffsetIntegrationTest.java @@ -199,6 +199,9 @@ public void testInvalidFetch() { assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (10 - (50 - 20)) ROWS ONLY", IgniteSQLException.class, null); + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ('abc') ROWS ONLY", + SqlValidatorException.class, "Illegal value of fetch / limit"); + // Check with parameters. assertThrows("SELECT * FROM TEST_REPL FETCH FIRST ? ROWS ONLY", SqlValidatorException.class, "Illegal value of fetch / limit", bigInt()); @@ -212,6 +215,9 @@ public void testInvalidFetch() { assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", IgniteSQLException.class, null, NULL_RESULT); + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", + IgniteSQLException.class, null, "abc"); + assertThrows("SELECT * FROM TEST_REPL FETCH FIRST (?) ROWS ONLY", SqlValidatorException.class, "Illegal value of fetch / limit", Double.NaN); @@ -494,6 +500,25 @@ public void testFetchScalarFunctionExpression() throws Exception { .check(); } + /** */ + @Test + public void testFetchExpressionWithRewrite() throws Exception { + fillCache(cacheRepl, 5); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + NVL(?, 10000)) ROWS ONLY") + .withParams(1) + .returns(0) + .returns(1) + .check(); + + assertQuery("SELECT id FROM TEST_REPL FETCH FIRST (1 + NVL(?, 10000)) ROWS ONLY") + .withParams(2) + .returns(0) + .returns(1) + .returns(2) + .check(); + } + /** * @param c Cache. * @param rows Rows count.