From 31012a04e52a01356a4236a79b8da4dcd04d8df5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 14 Nov 2025 01:05:34 +0000 Subject: [PATCH] Fix function identify problem in converting to sql dialect (#4793) (cherry picked from commit 3a91e5c31f879c843415a7301bda871f0a3a20aa) Signed-off-by: github-actions[bot] --- .../function/PPLBuiltinOperators.java | 8 +-- .../expression/function/PPLFuncImpTable.java | 4 +- .../function/UserDefinedFunctionBuilder.java | 7 +++ ...axFunction.java => ScalarMaxFunction.java} | 4 +- ...inFunction.java => ScalarMinFunction.java} | 4 +- .../sql/calcite/remote/CalciteExplainIT.java | 12 ++-- .../calcite/explain_eval_max.json | 6 -- .../calcite/explain_eval_max.yaml | 8 +++ .../calcite/explain_eval_min.json | 6 -- .../calcite/explain_eval_min.yaml | 8 +++ .../calcite_no_pushdown/explain_eval_max.json | 6 -- .../calcite_no_pushdown/explain_eval_max.yaml | 9 +++ .../calcite_no_pushdown/explain_eval_min.json | 6 -- .../calcite_no_pushdown/explain_eval_min.yaml | 9 +++ .../calcite/CalcitePPLAggregationTest.java | 16 +++--- .../calcite/CalcitePPLArrayFunctionTest.java | 8 +-- .../sql/ppl/calcite/CalcitePPLBasicTest.java | 10 ++-- .../sql/ppl/calcite/CalcitePPLBinTest.java | 14 ++--- .../sql/ppl/calcite/CalcitePPLChartTest.java | 10 ++-- .../ppl/calcite/CalcitePPLCountEvalTest.java | 2 +- .../CalcitePPLDateTimeFunctionTest.java | 2 +- .../sql/ppl/calcite/CalcitePPLEvalTest.java | 42 +++++++------- .../sql/ppl/calcite/CalcitePPLGrokTest.java | 4 +- .../calcite/CalcitePPLMathFunctionTest.java | 2 +- .../calcite/CalcitePPLMultisearchTest.java | 4 +- .../sql/ppl/calcite/CalcitePPLParseTest.java | 4 +- .../ppl/calcite/CalcitePPLPatternsTest.java | 36 ++++++------ .../sql/ppl/calcite/CalcitePPLRexTest.java | 44 +++++++-------- .../sql/ppl/calcite/CalcitePPLSearchTest.java | 4 +- .../sql/ppl/calcite/CalcitePPLSpathTest.java | 4 +- .../calcite/CalcitePPLStringFunctionTest.java | 14 ++--- .../ppl/calcite/CalcitePPLTimechartTest.java | 56 +++++++++---------- 32 files changed, 196 insertions(+), 177 deletions(-) rename core/src/main/java/org/opensearch/sql/expression/function/udf/math/{MaxFunction.java => ScalarMaxFunction.java} (95%) rename core/src/main/java/org/opensearch/sql/expression/function/udf/math/{MinFunction.java => ScalarMinFunction.java} (95%) delete mode 100644 integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.json create mode 100644 integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.yaml delete mode 100644 integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.json create mode 100644 integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.yaml delete mode 100644 integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.json create mode 100644 integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.yaml delete mode 100644 integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.json create mode 100644 integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.yaml diff --git a/core/src/main/java/org/opensearch/sql/expression/function/PPLBuiltinOperators.java b/core/src/main/java/org/opensearch/sql/expression/function/PPLBuiltinOperators.java index 9581cd0017d..ef5b727294c 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/PPLBuiltinOperators.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/PPLBuiltinOperators.java @@ -98,10 +98,10 @@ import org.opensearch.sql.expression.function.udf.math.ConvFunction; import org.opensearch.sql.expression.function.udf.math.DivideFunction; import org.opensearch.sql.expression.function.udf.math.EulerFunction; -import org.opensearch.sql.expression.function.udf.math.MaxFunction; -import org.opensearch.sql.expression.function.udf.math.MinFunction; import org.opensearch.sql.expression.function.udf.math.ModFunction; import org.opensearch.sql.expression.function.udf.math.NumberToStringFunction; +import org.opensearch.sql.expression.function.udf.math.ScalarMaxFunction; +import org.opensearch.sql.expression.function.udf.math.ScalarMinFunction; /** Defines functions and operators that are implemented only by PPL */ public class PPLBuiltinOperators extends ReflectiveSqlOperatorTable { @@ -131,8 +131,8 @@ public class PPLBuiltinOperators extends ReflectiveSqlOperatorTable { public static final SqlOperator DIVIDE = new DivideFunction().toUDF("DIVIDE"); public static final SqlOperator SHA2 = CryptographicFunction.sha2().toUDF("SHA2"); public static final SqlOperator CIDRMATCH = new CidrMatchFunction().toUDF("CIDRMATCH"); - public static final SqlOperator MAX = new MaxFunction().toUDF("MAX"); - public static final SqlOperator MIN = new MinFunction().toUDF("MIN"); + public static final SqlOperator SCALAR_MAX = new ScalarMaxFunction().toUDF("SCALAR_MAX"); + public static final SqlOperator SCALAR_MIN = new ScalarMinFunction().toUDF("SCALAR_MIN"); public static final SqlOperator COSH = adaptMathFunctionToUDF( diff --git a/core/src/main/java/org/opensearch/sql/expression/function/PPLFuncImpTable.java b/core/src/main/java/org/opensearch/sql/expression/function/PPLFuncImpTable.java index 8e0dd17fb4d..9cf010d259c 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/PPLFuncImpTable.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/PPLFuncImpTable.java @@ -856,8 +856,8 @@ void populate() { registerOperator(INTERNAL_TRANSLATE3, SqlLibraryOperators.TRANSLATE3); // Register eval functions for PPL max() and min() calls - registerOperator(MAX, PPLBuiltinOperators.MAX); - registerOperator(MIN, PPLBuiltinOperators.MIN); + registerOperator(MAX, PPLBuiltinOperators.SCALAR_MAX); + registerOperator(MIN, PPLBuiltinOperators.SCALAR_MIN); // Register PPL UDF operator registerOperator(COSH, PPLBuiltinOperators.COSH); diff --git a/core/src/main/java/org/opensearch/sql/expression/function/UserDefinedFunctionBuilder.java b/core/src/main/java/org/opensearch/sql/expression/function/UserDefinedFunctionBuilder.java index 30dd644fc76..f52c6b69f0e 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/UserDefinedFunctionBuilder.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/UserDefinedFunctionBuilder.java @@ -59,6 +59,13 @@ default SqlUserDefinedFunction toUDF(String functionName, boolean isDeterministi public boolean isDeterministic() { return isDeterministic; } + + @Override + public SqlIdentifier getSqlIdentifier() { + // to avoid convert to sql dialog as identifier, use keyword instead + // check the code SqlUtil.unparseFunctionSyntax() + return null; + } }; } } diff --git a/core/src/main/java/org/opensearch/sql/expression/function/udf/math/MaxFunction.java b/core/src/main/java/org/opensearch/sql/expression/function/udf/math/ScalarMaxFunction.java similarity index 95% rename from core/src/main/java/org/opensearch/sql/expression/function/udf/math/MaxFunction.java rename to core/src/main/java/org/opensearch/sql/expression/function/udf/math/ScalarMaxFunction.java index 70e17cd13b4..9b4b0b48c73 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/udf/math/MaxFunction.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/udf/math/ScalarMaxFunction.java @@ -24,9 +24,9 @@ * MAX(value1, value2, ...) returns the maximum value from the arguments. For mixed types, strings * have higher precedence than numbers. */ -public class MaxFunction extends ImplementorUDF { +public class ScalarMaxFunction extends ImplementorUDF { - public MaxFunction() { + public ScalarMaxFunction() { super(new MaxImplementor(), NullPolicy.ALL); } diff --git a/core/src/main/java/org/opensearch/sql/expression/function/udf/math/MinFunction.java b/core/src/main/java/org/opensearch/sql/expression/function/udf/math/ScalarMinFunction.java similarity index 95% rename from core/src/main/java/org/opensearch/sql/expression/function/udf/math/MinFunction.java rename to core/src/main/java/org/opensearch/sql/expression/function/udf/math/ScalarMinFunction.java index 2bb00ce05e6..441257a422e 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/udf/math/MinFunction.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/udf/math/ScalarMinFunction.java @@ -24,9 +24,9 @@ * MIN(value1, value2, ...) returns the minimum value from the arguments. For mixed types, numbers * have higher precedence than strings. */ -public class MinFunction extends ImplementorUDF { +public class ScalarMinFunction extends ImplementorUDF { - public MinFunction() { + public ScalarMinFunction() { super(new MinImplementor(), NullPolicy.ALL); } diff --git a/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java b/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java index 6942808fc7c..f8c8d32ea38 100644 --- a/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java @@ -1300,19 +1300,19 @@ public void testExplainSortOnMeasureMultiBucketsNotMultiTermsNotPushDown() throw @Test public void testExplainEvalMax() throws IOException { - String expected = loadExpectedPlan("explain_eval_max.json"); - assertJsonEqualsIgnoreId( + String expected = loadExpectedPlan("explain_eval_max.yaml"); + assertYamlEqualsIgnoreId( expected, - explainQueryToString( + explainQueryYaml( "source=opensearch-sql_test_index_account | eval new = max(1, 2, 3, age, 'banana')")); } @Test public void testExplainEvalMin() throws IOException { - String expected = loadExpectedPlan("explain_eval_min.json"); - assertJsonEqualsIgnoreId( + String expected = loadExpectedPlan("explain_eval_min.yaml"); + assertYamlEqualsIgnoreId( expected, - explainQueryToString( + explainQueryYaml( "source=opensearch-sql_test_index_account | eval new = min(1, 2, 3, age, 'banana')")); } diff --git a/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.json b/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.json deleted file mode 100644 index 6140bebcc40..00000000000 --- a/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "calcite": { - "logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[MAX(1, 2, 3, $8, 'banana':VARCHAR)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n", - "physical": "EnumerableCalc(expr#0..10=[{inputs}], expr#11=[1], expr#12=[2], expr#13=[3], expr#14=['banana':VARCHAR], expr#15=[MAX($t11, $t12, $t13, $t8, $t14)], proj#0..10=[{exprs}], $f11=[$t15])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":10000,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"account_number\",\"firstname\",\"address\",\"balance\",\"gender\",\"city\",\"employer\",\"state\",\"age\",\"email\",\"lastname\"],\"excludes\":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])\n" - } -} \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.yaml b/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.yaml new file mode 100644 index 00000000000..bd517738a0b --- /dev/null +++ b/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_max.yaml @@ -0,0 +1,8 @@ +calcite: + logical: | + LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT]) + LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[SCALAR_MAX(1, 2, 3, $8, 'banana':VARCHAR)]) + CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]]) + physical: | + EnumerableCalc(expr#0..10=[{inputs}], expr#11=[1], expr#12=[2], expr#13=[3], expr#14=['banana':VARCHAR], expr#15=[SCALAR_MAX($t11, $t12, $t13, $t8, $t14)], proj#0..10=[{exprs}], $f11=[$t15]) + CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","_source":{"includes":["account_number","firstname","address","balance","gender","city","employer","state","age","email","lastname"],"excludes":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)]) \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.json b/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.json deleted file mode 100644 index b5e85f0eb58..00000000000 --- a/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "calcite": { - "logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[MIN(1, 2, 3, $8, 'banana':VARCHAR)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n", - "physical": "EnumerableCalc(expr#0..10=[{inputs}], expr#11=[1], expr#12=[2], expr#13=[3], expr#14=['banana':VARCHAR], expr#15=[MIN($t11, $t12, $t13, $t8, $t14)], proj#0..10=[{exprs}], $f11=[$t15])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":10000,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"account_number\",\"firstname\",\"address\",\"balance\",\"gender\",\"city\",\"employer\",\"state\",\"age\",\"email\",\"lastname\"],\"excludes\":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])\n" - } -} \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.yaml b/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.yaml new file mode 100644 index 00000000000..71e2911eb09 --- /dev/null +++ b/integ-test/src/test/resources/expectedOutput/calcite/explain_eval_min.yaml @@ -0,0 +1,8 @@ +calcite: + logical: | + LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT]) + LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[SCALAR_MIN(1, 2, 3, $8, 'banana':VARCHAR)]) + CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]]) + physical: | + EnumerableCalc(expr#0..10=[{inputs}], expr#11=[1], expr#12=[2], expr#13=[3], expr#14=['banana':VARCHAR], expr#15=[SCALAR_MIN($t11, $t12, $t13, $t8, $t14)], proj#0..10=[{exprs}], $f11=[$t15]) + CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","_source":{"includes":["account_number","firstname","address","balance","gender","city","employer","state","age","email","lastname"],"excludes":[]}}, requestedTotalSize=10000, pageSize=null, startFrom=0)]) \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.json b/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.json deleted file mode 100644 index 5c366156f17..00000000000 --- a/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "calcite": { - "logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[MAX(1, 2, 3, $8, 'banana':VARCHAR)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n", - "physical": "EnumerableLimit(fetch=[10000])\n EnumerableCalc(expr#0..16=[{inputs}], expr#17=[1], expr#18=[2], expr#19=[3], expr#20=['banana':VARCHAR], expr#21=[MAX($t17, $t18, $t19, $t8, $t20)], proj#0..10=[{exprs}], new=[$t21])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n" - } -} \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.yaml b/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.yaml new file mode 100644 index 00000000000..cae22c2a7f4 --- /dev/null +++ b/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_max.yaml @@ -0,0 +1,9 @@ +calcite: + logical: | + LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT]) + LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[SCALAR_MAX(1, 2, 3, $8, 'banana':VARCHAR)]) + CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]]) + physical: | + EnumerableLimit(fetch=[10000]) + EnumerableCalc(expr#0..16=[{inputs}], expr#17=[1], expr#18=[2], expr#19=[3], expr#20=['banana':VARCHAR], expr#21=[SCALAR_MAX($t17, $t18, $t19, $t8, $t20)], proj#0..10=[{exprs}], new=[$t21]) + CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]]) \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.json b/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.json deleted file mode 100644 index 5d6872ca060..00000000000 --- a/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "calcite": { - "logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[MIN(1, 2, 3, $8, 'banana':VARCHAR)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n", - "physical": "EnumerableLimit(fetch=[10000])\n EnumerableCalc(expr#0..16=[{inputs}], expr#17=[1], expr#18=[2], expr#19=[3], expr#20=['banana':VARCHAR], expr#21=[MIN($t17, $t18, $t19, $t8, $t20)], proj#0..10=[{exprs}], new=[$t21])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n" - } -} \ No newline at end of file diff --git a/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.yaml b/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.yaml new file mode 100644 index 00000000000..e7c0af846f0 --- /dev/null +++ b/integ-test/src/test/resources/expectedOutput/calcite_no_pushdown/explain_eval_min.yaml @@ -0,0 +1,9 @@ +calcite: + logical: | + LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT]) + LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], new=[SCALAR_MIN(1, 2, 3, $8, 'banana':VARCHAR)]) + CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]]) + physical: | + EnumerableLimit(fetch=[10000]) + EnumerableCalc(expr#0..16=[{inputs}], expr#17=[1], expr#18=[2], expr#19=[3], expr#20=['banana':VARCHAR], expr#21=[SCALAR_MIN($t17, $t18, $t19, $t8, $t20)], proj#0..10=[{exprs}], new=[$t21]) + CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]]) \ No newline at end of file diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLAggregationTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLAggregationTest.java index 1446c7b0470..81597c65bbe 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLAggregationTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLAggregationTest.java @@ -447,9 +447,9 @@ public void testAvgBySpanAndFields() { String expectedSparkSql = "" - + "SELECT AVG(`SAL`) `avg(SAL)`, `SPAN`(`EMPNO`, 500, NULL) `empno_span`, `DEPTNO`\n" + + "SELECT AVG(`SAL`) `avg(SAL)`, SPAN(`EMPNO`, 500, NULL) `empno_span`, `DEPTNO`\n" + "FROM `scott`.`EMP`\n" - + "GROUP BY `DEPTNO`, `SPAN`(`EMPNO`, 500, NULL)\n" + + "GROUP BY `DEPTNO`, SPAN(`EMPNO`, 500, NULL)\n" + "ORDER BY `DEPTNO`, 2"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -470,10 +470,10 @@ public void testAvgByTimeSpanAndFields() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT AVG(`SAL`) `avg(SAL)`, `SPAN`(`HIREDATE`, 1, 'y') `hiredate_span`, `DEPTNO`\n" + "SELECT AVG(`SAL`) `avg(SAL)`, SPAN(`HIREDATE`, 1, 'y') `hiredate_span`, `DEPTNO`\n" + "FROM `scott`.`EMP`\n" + "WHERE `HIREDATE` IS NOT NULL\n" - + "GROUP BY `DEPTNO`, `SPAN`(`HIREDATE`, 1, 'y')\n" + + "GROUP BY `DEPTNO`, SPAN(`HIREDATE`, 1, 'y')\n" + "ORDER BY `DEPTNO`, 2"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -596,9 +596,9 @@ public void testStddevSampByFieldWithAlias() { String expectedSparkSql = "" - + "SELECT STDDEV_SAMP(`SAL`) `samp`, `SPAN`(`EMPNO`, 100, NULL) `empno_span`\n" + + "SELECT STDDEV_SAMP(`SAL`) `samp`, SPAN(`EMPNO`, 100, NULL) `empno_span`\n" + "FROM `scott`.`EMP`\n" - + "GROUP BY `SPAN`(`EMPNO`, 100, NULL)"; + + "GROUP BY SPAN(`EMPNO`, 100, NULL)"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -982,10 +982,10 @@ public void testSortAggregationMetrics2() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT AVG(`SAL`) `avg`, `SPAN`(`HIREDATE`, 1, 'y') `hiredate_span`\n" + "SELECT AVG(`SAL`) `avg`, SPAN(`HIREDATE`, 1, 'y') `hiredate_span`\n" + "FROM `scott`.`EMP`\n" + "WHERE `HIREDATE` IS NOT NULL\n" - + "GROUP BY `SPAN`(`HIREDATE`, 1, 'y')\n" + + "GROUP BY SPAN(`HIREDATE`, 1, 'y')\n" + "ORDER BY 1"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLArrayFunctionTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLArrayFunctionTest.java index cd98e18e4be..e825a067f50 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLArrayFunctionTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLArrayFunctionTest.java @@ -33,7 +33,7 @@ public void testMvjoinWithStringArray() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT ARRAY_JOIN(`array`('a', 'b', 'c'), ',') `joined`\n" + "SELECT ARRAY_JOIN(ARRAY('a', 'b', 'c'), ',') `joined`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -59,7 +59,7 @@ public void testMvjoinWithDifferentDelimiter() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT ARRAY_JOIN(`array`('apple', 'banana', 'cherry'), ' | ') `joined`\n" + "SELECT ARRAY_JOIN(ARRAY('apple', 'banana', 'cherry'), ' | ') `joined`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -82,7 +82,7 @@ public void testMvjoinWithEmptyArray() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT ARRAY_JOIN(`array`(), ',') `joined`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; + "SELECT ARRAY_JOIN(ARRAY(), ',') `joined`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -101,7 +101,7 @@ public void testMvjoinWithFieldReference() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT ARRAY_JOIN(`array`(`ENAME`, `JOB`), '-') `joined`\n" + "SELECT ARRAY_JOIN(ARRAY(`ENAME`, `JOB`), '-') `joined`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBasicTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBasicTest.java index 26783296f1c..784fedc2ede 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBasicTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBasicTest.java @@ -493,11 +493,11 @@ public void testDecimalLiteral() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `DIVIDE`(22, 7.0) `r1`, `DIVIDE`(22, 7.0E0) `r2`, `DIVIDE`(22.0, 7) `r3`," - + " `DIVIDE`(2.20E1, 7) `r4`, 0.1 * 0.2 `r5`, 1E-1 * 2E-1 `r6`, 0.1 + 0.2 `r7`, 1E-1 +" - + " 2E-1 `r8`, 0.06 - 0.01 `r9`, 6E-2 - 1E-2 `r10`, `DIVIDE`(0.1, 0.3) * 0.3 `r11`," - + " `DIVIDE`(1E-1, 3E-1) * 3E-1 `r12`, POWER(POWER(2.0, 5E-1), 2) `r13`," - + " POWER(POWER(2.0E0, 5E-1), 2) `r14`, `DIVIDE`(7.0, 0) `r15`, `DIVIDE`(7, 0.0)" + "SELECT DIVIDE(22, 7.0) `r1`, DIVIDE(22, 7.0E0) `r2`, DIVIDE(22.0, 7) `r3`," + + " DIVIDE(2.20E1, 7) `r4`, 0.1 * 0.2 `r5`, 1E-1 * 2E-1 `r6`, 0.1 + 0.2 `r7`, 1E-1 +" + + " 2E-1 `r8`, 0.06 - 0.01 `r9`, 6E-2 - 1E-2 `r10`, DIVIDE(0.1, 0.3) * 0.3 `r11`," + + " DIVIDE(1E-1, 3E-1) * 3E-1 `r12`, POWER(POWER(2.0, 5E-1), 2) `r13`," + + " POWER(POWER(2.0E0, 5E-1), 2) `r14`, DIVIDE(7.0, 0) `r15`, DIVIDE(7, 0.0)" + " `r16`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBinTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBinTest.java index 0d933fe1649..27d689cc5d6 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBinTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLBinTest.java @@ -31,7 +31,7 @@ public void testBinWithSpan() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`, `SPAN_BUCKET`(`SAL`," + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`, SPAN_BUCKET(`SAL`," + " 1000) `SAL`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -52,7 +52,7 @@ public void testBinWithBins() { + " LogicalTableScan(table=[[scott, EMP]])\n"); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`, `WIDTH_BUCKET`(`SAL`," + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`, WIDTH_BUCKET(`SAL`," + " 10, (MAX(`SAL`) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) -" + " (MIN(`SAL`) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING))," + " MAX(`SAL`) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING))" @@ -78,7 +78,7 @@ public void testBinWithMinspan() { String expectedSparkSql = "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`," - + " `MINSPAN_BUCKET`(`SAL`, 1.000E2, (MAX(`SAL`) OVER (RANGE BETWEEN UNBOUNDED" + + " MINSPAN_BUCKET(`SAL`, 1.000E2, (MAX(`SAL`) OVER (RANGE BETWEEN UNBOUNDED" + " PRECEDING AND UNBOUNDED FOLLOWING)) - (MIN(`SAL`) OVER (RANGE BETWEEN UNBOUNDED" + " PRECEDING AND UNBOUNDED FOLLOWING)), MAX(`SAL`) OVER (RANGE BETWEEN UNBOUNDED" + " PRECEDING AND UNBOUNDED FOLLOWING)) `SAL`\n" @@ -101,7 +101,7 @@ public void testBinWithStartEnd() { + " LogicalTableScan(table=[[scott, EMP]])\n"); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`, `RANGE_BUCKET`(`SAL`," + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `COMM`, `DEPTNO`, RANGE_BUCKET(`SAL`," + " MIN(`SAL`) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)," + " MAX(`SAL`) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 1000," + " 5000) `SAL`\n" @@ -124,7 +124,7 @@ public void testBinWithTimestampFieldUsingBins() { + " LogicalTableScan(table=[[scott, products_temporal]])\n"); String expectedSparkSql = - "SELECT `ID`, `SUPPLIER`, `SYS_END`, `WIDTH_BUCKET`(`SYS_START`, 10, (MAX(`SYS_START`) OVER" + "SELECT `ID`, `SUPPLIER`, `SYS_END`, WIDTH_BUCKET(`SYS_START`, 10, (MAX(`SYS_START`) OVER" + " (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) - (MIN(`SYS_START`)" + " OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)), MAX(`SYS_START`)" + " OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) `SYS_START`\n" @@ -148,7 +148,7 @@ public void testBinWithTimeSpan() { verifyPPLToSparkSQL( root, "SELECT `ID`, `SUPPLIER`, `SYS_END`," - + " `FROM_UNIXTIME`(FLOOR(`DIVIDE`(`DIVIDE`(`UNIX_TIMESTAMP`(`SYS_START`), 3600), 1)) *" + + " FROM_UNIXTIME(FLOOR(DIVIDE(DIVIDE(UNIX_TIMESTAMP(`SYS_START`), 3600), 1)) *" + " 3600) `SYS_START`\n" + "FROM `scott`.`products_temporal`"); } @@ -170,7 +170,7 @@ public void testBinWithAligntime() { verifyPPLToSparkSQL( root, "SELECT `ID`, `SUPPLIER`, `SYS_END`," - + " `FROM_UNIXTIME`(FLOOR(`DIVIDE`(`DIVIDE`(`UNIX_TIMESTAMP`(`SYS_START`), 3600), 1)) *" + + " FROM_UNIXTIME(FLOOR(DIVIDE(DIVIDE(UNIX_TIMESTAMP(`SYS_START`), 3600), 1)) *" + " 3600) `SYS_START`\n" + "FROM `scott`.`products_temporal`"); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLChartTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLChartTest.java index bddcde11e18..107fe7b9cb1 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLChartTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLChartTest.java @@ -192,10 +192,10 @@ public void testChartWithSpan() { RelNode root = getRelNode(ppl); String expectedSparkSql = - "SELECT `SPAN`(`age`, 10, NULL) `age`, MAX(`balance`) `max(balance)`\n" + "SELECT SPAN(`age`, 10, NULL) `age`, MAX(`balance`) `max(balance)`\n" + "FROM `scott`.`bank`\n" + "WHERE `age` IS NOT NULL AND `balance` IS NOT NULL\n" - + "GROUP BY `SPAN`(`age`, 10, NULL)\n" + + "GROUP BY SPAN(`age`, 10, NULL)\n" + "ORDER BY 1 NULLS LAST"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -209,17 +209,17 @@ public void testChartWithTimeSpan() { "SELECT `t2`.`timestamp`, CASE WHEN `t2`.`category` IS NULL THEN 'NULL' WHEN" + " `t9`.`_row_number_chart_` <= 10 THEN `t2`.`category` ELSE 'OTHER' END `category`," + " MAX(`t2`.`max(value)`) `max(value)`\n" - + "FROM (SELECT `SPAN`(`timestamp`, 1, 'w') `timestamp`, `category`, MAX(`value`)" + + "FROM (SELECT SPAN(`timestamp`, 1, 'w') `timestamp`, `category`, MAX(`value`)" + " `max(value)`\n" + "FROM `scott`.`time_data`\n" + "WHERE `timestamp` IS NOT NULL AND `value` IS NOT NULL\n" - + "GROUP BY `category`, `SPAN`(`timestamp`, 1, 'w')) `t2`\n" + + "GROUP BY `category`, SPAN(`timestamp`, 1, 'w')) `t2`\n" + "LEFT JOIN (SELECT `category`, SUM(`max(value)`) `__grand_total__`, ROW_NUMBER() OVER" + " (ORDER BY SUM(`max(value)`) DESC) `_row_number_chart_`\n" + "FROM (SELECT `category`, MAX(`value`) `max(value)`\n" + "FROM `scott`.`time_data`\n" + "WHERE `timestamp` IS NOT NULL AND `value` IS NOT NULL\n" - + "GROUP BY `category`, `SPAN`(`timestamp`, 1, 'w')) `t6`\n" + + "GROUP BY `category`, SPAN(`timestamp`, 1, 'w')) `t6`\n" + "WHERE `category` IS NOT NULL\n" + "GROUP BY `category`) `t9` ON `t2`.`category` = `t9`.`category`\n" + "GROUP BY `t2`.`timestamp`, CASE WHEN `t2`.`category` IS NULL THEN 'NULL' WHEN" diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLCountEvalTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLCountEvalTest.java index 91d9a8de09d..833f54e5619 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLCountEvalTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLCountEvalTest.java @@ -65,7 +65,7 @@ public void testCountEvalArithmeticExpression() { + " LogicalTableScan(table=[[scott, EMP]])\n") .expectResult("high_ratio=0\n") .expectSparkSQL( - "SELECT COUNT(CASE WHEN `DIVIDE`(`SAL`, `COMM`) > 10 THEN 1 ELSE NULL END)" + "SELECT COUNT(CASE WHEN DIVIDE(`SAL`, `COMM`) > 10 THEN 1 ELSE NULL END)" + " `high_ratio`\n" + "FROM `scott`.`EMP`"); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLDateTimeFunctionTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLDateTimeFunctionTest.java index ec107dcd948..a7f2cdb9893 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLDateTimeFunctionTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLDateTimeFunctionTest.java @@ -23,7 +23,7 @@ public void testDateAndCurrentTimestamp() { "LogicalProject(added=[DATE(NOW())])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); - String expectedSparkSql = "SELECT `DATE`(`NOW`()) `added`\nFROM `scott`.`EMP`"; + String expectedSparkSql = "SELECT DATE(NOW()) `added`\nFROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLEvalTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLEvalTest.java index ea0194d68cf..70b53d3c6fc 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLEvalTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLEvalTest.java @@ -135,7 +135,7 @@ public void testEvalAvg() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `DIVIDE`(10 + (20 + 30), 3.0E0) `average`\n" + "FROM `scott`.`EMP`"; + "SELECT `EMPNO`, DIVIDE(10 + (20 + 30), 3.0E0) `average`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -149,7 +149,7 @@ public void testEvalAvgWithFields() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `DIVIDE`(`SAL` + `COMM`, 2.0E0) `avgSal`\n" + "FROM `scott`.`EMP`"; + "SELECT `EMPNO`, DIVIDE(`SAL` + `COMM`, 2.0E0) `avgSal`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -523,13 +523,13 @@ public void testEvalMaxOnNumbers() { RelNode root = getRelNode(ppl); String expectedLogical = "LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5]," - + " COMM=[$6], DEPTNO=[$7], a=[MAX(5, 30, $7)])\n" + + " COMM=[$6], DEPTNO=[$7], a=[SCALAR_MAX(5, 30, $7)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, MAX(5, 30," - + " `DEPTNO`) `a`\n" + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, SCALAR_MAX(5," + + " 30, `DEPTNO`) `a`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -540,13 +540,13 @@ public void testEvalMaxOnStrings() { RelNode root = getRelNode(ppl); String expectedLogical = "LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5]," - + " COMM=[$6], DEPTNO=[$7], a=[MAX('banana':VARCHAR, 'Door':VARCHAR, $1)])\n" + + " COMM=[$6], DEPTNO=[$7], a=[SCALAR_MAX('banana':VARCHAR, 'Door':VARCHAR, $1)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, MAX('banana'," - + " 'Door', `ENAME`) `a`\n" + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`," + + " SCALAR_MAX('banana', 'Door', `ENAME`) `a`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -557,13 +557,14 @@ public void testEvalMaxOnNumericAndString() { RelNode root = getRelNode(ppl); String expectedLogical = "LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5]," - + " COMM=[$6], DEPTNO=[$7], a=[MAX(5, 30, $7, 'banana':VARCHAR, 'Door':VARCHAR, $1)])\n" + + " COMM=[$6], DEPTNO=[$7], a=[SCALAR_MAX(5, 30, $7, 'banana':VARCHAR, 'Door':VARCHAR," + + " $1)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, MAX(5, 30," - + " `DEPTNO`, 'banana', 'Door', `ENAME`) `a`\n" + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, SCALAR_MAX(5," + + " 30, `DEPTNO`, 'banana', 'Door', `ENAME`) `a`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -574,13 +575,13 @@ public void testEvalMinOnNumbers() { RelNode root = getRelNode(ppl); String expectedLogical = "LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5]," - + " COMM=[$6], DEPTNO=[$7], a=[MIN(5, 30, $7)])\n" + + " COMM=[$6], DEPTNO=[$7], a=[SCALAR_MIN(5, 30, $7)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, MIN(5, 30," - + " `DEPTNO`) `a`\n" + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, SCALAR_MIN(5," + + " 30, `DEPTNO`) `a`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -591,13 +592,13 @@ public void testEvalMinOnStrings() { RelNode root = getRelNode(ppl); String expectedLogical = "LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5]," - + " COMM=[$6], DEPTNO=[$7], a=[MIN('banana':VARCHAR, 'Door':VARCHAR, $1)])\n" + + " COMM=[$6], DEPTNO=[$7], a=[SCALAR_MIN('banana':VARCHAR, 'Door':VARCHAR, $1)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, MIN('banana'," - + " 'Door', `ENAME`) `a`\n" + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`," + + " SCALAR_MIN('banana', 'Door', `ENAME`) `a`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -608,13 +609,14 @@ public void testEvalMinOnNumericAndString() { RelNode root = getRelNode(ppl); String expectedLogical = "LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5]," - + " COMM=[$6], DEPTNO=[$7], a=[MIN(5, 30, $7, 'banana':VARCHAR, 'Door':VARCHAR, $1)])\n" + + " COMM=[$6], DEPTNO=[$7], a=[SCALAR_MIN(5, 30, $7, 'banana':VARCHAR, 'Door':VARCHAR," + + " $1)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, MIN(5, 30," - + " `DEPTNO`, 'banana', 'Door', `ENAME`) `a`\n" + "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`, SCALAR_MIN(5," + + " 30, `DEPTNO`, 'banana', 'Door', `ENAME`) `a`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLGrokTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLGrokTest.java index 376a47d0c9a..b31ca6008ad 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLGrokTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLGrokTest.java @@ -25,7 +25,7 @@ public void testGrok() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `GROK`(`ENAME`, '.+@%{HOSTNAME:host}', 'grok')['host'] `host`\n" + "SELECT `ENAME`, GROK(`ENAME`, '.+@%{HOSTNAME:host}', 'grok')['host'] `host`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -41,7 +41,7 @@ public void testGrokOverriding() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `GROK`(`ENAME`, '%{NUMBER} %{GREEDYDATA:ENAME}', 'grok')['ENAME'] `ENAME`\n" + "SELECT GROK(`ENAME`, '%{NUMBER} %{GREEDYDATA:ENAME}', 'grok')['ENAME'] `ENAME`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMathFunctionTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMathFunctionTest.java index fff01427201..58e29c49a28 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMathFunctionTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMathFunctionTest.java @@ -145,7 +145,7 @@ public void testEuler() { String expectedLogical = "LogicalProject(EULER=[E()])\n LogicalTableScan(table=[[scott, EMP]])\n"; verifyLogical(root, expectedLogical); - String expectedSparkSql = "SELECT `E`() `EULER`\nFROM `scott`.`EMP`"; + String expectedSparkSql = "SELECT E() `EULER`\nFROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMultisearchTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMultisearchTest.java index 8746fe846e5..7185c85aa1d 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMultisearchTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLMultisearchTest.java @@ -301,11 +301,11 @@ public void testMultisearchWithTimestampFiltering() { + "FROM (SELECT `timestamp`, `value`, `category`, `@timestamp`\n" + "FROM (SELECT *\n" + "FROM `scott`.`TIME_DATA1`\n" - + "WHERE `@timestamp` > `TIMESTAMP`('2025-07-31 23:00:00')\n" + + "WHERE `@timestamp` > TIMESTAMP('2025-07-31 23:00:00')\n" + "UNION ALL\n" + "SELECT *\n" + "FROM `scott`.`TIME_DATA2`\n" - + "WHERE `@timestamp` > `TIMESTAMP`('2025-07-31 23:00:00'))\n" + + "WHERE `@timestamp` > TIMESTAMP('2025-07-31 23:00:00'))\n" + "ORDER BY `@timestamp` DESC NULLS FIRST) `t2`\n" + "ORDER BY `@timestamp` DESC"; verifyPPLToSparkSQL(root, expectedSparkSql); diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLParseTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLParseTest.java index 6b613f346bb..ad95cd21b34 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLParseTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLParseTest.java @@ -27,7 +27,7 @@ public void testParse() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `JOB`, `PARSE`(`DATE_FORMAT`(`HIREDATE`, '%Y-%m-%d')," + "SELECT `JOB`, PARSE(DATE_FORMAT(`HIREDATE`, '%Y-%m-%d')," + " '(?\\d{4})-\\d{2}-\\d{2}', 'regex')['year'] `year`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -46,7 +46,7 @@ public void testParseOverriding() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `JOB`, `PARSE`(`DATE_FORMAT`(`HIREDATE`, '%Y-%m-%d')," + "SELECT `JOB`, PARSE(DATE_FORMAT(`HIREDATE`, '%Y-%m-%d')," + " '(?\\d{4})-\\d{2}-\\d{2}', 'regex')['MGR'] `MGR`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLPatternsTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLPatternsTest.java index f1dfd930a82..3d3bb5b6a1b 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLPatternsTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLPatternsTest.java @@ -64,9 +64,9 @@ public void testPatternsLabelMode_ShowNumberedToken_ForSimplePatternMethod() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN" + "SELECT `ENAME`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN" + " '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `ENAME`)['pattern'] AS" - + " STRING) `patterns_field`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR" + + " STRING) `patterns_field`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR" + " `ENAME` = '' THEN '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END," + " `ENAME`)['tokens'] AS MAP< VARCHAR, VARCHAR ARRAY >) `tokens`\n" + "FROM `scott`.`EMP`"; @@ -91,9 +91,9 @@ public void testPatternsLabelModeWithCustomPattern_ShowNumberedToken_ForSimplePa verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN" + "SELECT `ENAME`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN" + " '' ELSE REGEXP_REPLACE(`ENAME`, '[A-H]', '<*>') END, `ENAME`)['pattern'] AS STRING)" - + " `patterns_field`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` =" + + " `patterns_field`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` =" + " '' THEN '' ELSE REGEXP_REPLACE(`ENAME`, '[A-H]', '<*>') END, `ENAME`)['tokens'] AS" + " MAP< VARCHAR, VARCHAR ARRAY >) `tokens`\n" + "FROM `scott`.`EMP`"; @@ -138,9 +138,9 @@ public void testPatternsLabelModeWithPartitionBy_ShowNumberedToken_SimplePattern verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `DEPTNO`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME`" + "SELECT `ENAME`, `DEPTNO`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME`" + " = '' THEN '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END," - + " `ENAME`)['pattern'] AS STRING) `patterns_field`, TRY_CAST(`PATTERN_PARSER`(CASE" + + " `ENAME`)['pattern'] AS STRING) `patterns_field`, TRY_CAST(PATTERN_PARSER(CASE" + " WHEN `ENAME` IS NULL OR `ENAME` = '' THEN '' ELSE REGEXP_REPLACE(`ENAME`," + " '[a-zA-Z0-9]+', '<*>') END, `ENAME`)['tokens'] AS MAP< VARCHAR, VARCHAR ARRAY >)" + " `tokens`\n" @@ -160,7 +160,7 @@ public void testPatternsLabelMode_NotShowNumberedToken_ForBrainMethod() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, TRY_CAST(`PATTERN_PARSER`(`ENAME`, `pattern`(`ENAME`, 10, 100000, FALSE)" + "SELECT `ENAME`, TRY_CAST(PATTERN_PARSER(`ENAME`, `pattern`(`ENAME`, 10, 100000, FALSE)" + " OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), FALSE)['pattern']" + " AS STRING) `patterns_field`\n" + "FROM `scott`.`EMP`"; @@ -183,9 +183,9 @@ public void testPatternsLabelMode_ShowNumberedToken_ForBrainMethod() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, TRY_CAST(`PATTERN_PARSER`(`ENAME`, `pattern`(`ENAME`, 10, 100000, TRUE)" + "SELECT `ENAME`, TRY_CAST(PATTERN_PARSER(`ENAME`, `pattern`(`ENAME`, 10, 100000, TRUE)" + " OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), TRUE)['pattern']" - + " AS STRING) `patterns_field`, TRY_CAST(`PATTERN_PARSER`(`ENAME`, `pattern`(`ENAME`," + + " AS STRING) `patterns_field`, TRY_CAST(PATTERN_PARSER(`ENAME`, `pattern`(`ENAME`," + " 10, 100000, TRUE) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)," + " TRUE)['tokens'] AS MAP< VARCHAR, VARCHAR ARRAY >) `tokens`\n" + "FROM `scott`.`EMP`"; @@ -206,7 +206,7 @@ public void testPatternsLabelModeWithPartitionBy_NotShowNumberedToken_ForBrainMe verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `DEPTNO`, TRY_CAST(`PATTERN_PARSER`(`ENAME`, `pattern`(`ENAME`, 10," + "SELECT `ENAME`, `DEPTNO`, TRY_CAST(PATTERN_PARSER(`ENAME`, `pattern`(`ENAME`, 10," + " 100000, FALSE) OVER (PARTITION BY `DEPTNO` RANGE BETWEEN UNBOUNDED PRECEDING AND" + " UNBOUNDED FOLLOWING), FALSE)['pattern'] AS STRING) `patterns_field`\n" + "FROM `scott`.`EMP`"; @@ -229,10 +229,10 @@ public void testPatternsLabelModeWithPartitionBy_ShowNumberedToken_ForBrainMetho verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `DEPTNO`, TRY_CAST(`PATTERN_PARSER`(`ENAME`, `pattern`(`ENAME`, 10," + "SELECT `ENAME`, `DEPTNO`, TRY_CAST(PATTERN_PARSER(`ENAME`, `pattern`(`ENAME`, 10," + " 100000, TRUE) OVER (PARTITION BY `DEPTNO` RANGE BETWEEN UNBOUNDED PRECEDING AND" + " UNBOUNDED FOLLOWING), TRUE)['pattern'] AS STRING) `patterns_field`," - + " TRY_CAST(`PATTERN_PARSER`(`ENAME`, `pattern`(`ENAME`, 10, 100000, TRUE) OVER" + + " TRY_CAST(PATTERN_PARSER(`ENAME`, `pattern`(`ENAME`, 10, 100000, TRUE) OVER" + " (PARTITION BY `DEPTNO` RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)," + " TRUE)['tokens'] AS MAP< VARCHAR, VARCHAR ARRAY >) `tokens`\n" + "FROM `scott`.`EMP`"; @@ -281,11 +281,11 @@ public void testPatternsAggregationMode_ShowNumberedToken_ForSimplePatternMethod verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN '' ELSE" + "SELECT TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN '' ELSE" + " REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `TAKE`(`ENAME`, 10))['pattern']" + " AS STRING) `patterns_field`, COUNT(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN" + " '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END) `pattern_count`," - + " TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN '' ELSE" + + " TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN '' ELSE" + " REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `TAKE`(`ENAME`, 10))['tokens']" + " AS MAP< VARCHAR, VARCHAR ARRAY >) `tokens`, `TAKE`(`ENAME`, 10) `sample_logs`\n" + "FROM `scott`.`EMP`\n" @@ -312,12 +312,12 @@ public void testPatternsAggregationModeWithGroupBy_ShowNumberedToken_ForSimplePa verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `DEPTNO`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN" - + " '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `TAKE`(`ENAME`," + "SELECT `DEPTNO`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` = '' THEN ''" + + " ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `TAKE`(`ENAME`," + " 10))['pattern'] AS STRING) `patterns_field`, COUNT(CASE WHEN `ENAME` IS NULL OR" + " `ENAME` = '' THEN '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END)" - + " `pattern_count`, TRY_CAST(`PATTERN_PARSER`(CASE WHEN `ENAME` IS NULL OR `ENAME` =" - + " '' THEN '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `TAKE`(`ENAME`," + + " `pattern_count`, TRY_CAST(PATTERN_PARSER(CASE WHEN `ENAME` IS NULL OR `ENAME` = ''" + + " THEN '' ELSE REGEXP_REPLACE(`ENAME`, '[a-zA-Z0-9]+', '<*>') END, `TAKE`(`ENAME`," + " 10))['tokens'] AS MAP< VARCHAR, VARCHAR ARRAY >) `tokens`, `TAKE`(`ENAME`, 10)" + " `sample_logs`\n" + "FROM `scott`.`EMP`\n" diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLRexTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLRexTest.java index 4ec76823bfe..619cb26b64a 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLRexTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLRexTest.java @@ -33,7 +33,7 @@ public void testRexBasicFieldExtraction() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?[A-Z]).*', 'first') `first`\n" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?[A-Z]).*', 'first') `first`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -50,8 +50,8 @@ public void testRexMultipleNamedGroups() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?[A-Z])(?.*)', 'first') `first`," - + " `REX_EXTRACT`(`ENAME`, '(?[A-Z])(?.*)', 'rest') `rest`\n" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?[A-Z])(?.*)', 'first') `first`," + + " REX_EXTRACT(`ENAME`, '(?[A-Z])(?.*)', 'rest') `rest`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -68,7 +68,7 @@ public void testRexWithMaxMatch() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT_MULTI`(`ENAME`, '(?[A-Z])', 'letter', 3) `letter`\n" + "SELECT `ENAME`, REX_EXTRACT_MULTI(`ENAME`, '(?[A-Z])', 'letter', 3) `letter`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -86,8 +86,8 @@ public void testRexChainedCommands() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `JOB`, `REX_EXTRACT`(`ENAME`, '(?^.)', 'firstinitial')" - + " `firstinitial`, `REX_EXTRACT`(`JOB`, '(?\\w+)', 'jobtype') `jobtype`\n" + "SELECT `ENAME`, `JOB`, REX_EXTRACT(`ENAME`, '(?^.)', 'firstinitial')" + + " `firstinitial`, REX_EXTRACT(`JOB`, '(?\\w+)', 'jobtype') `jobtype`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -106,7 +106,7 @@ public void testRexWithWhereClause() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?[A-Z]).*', 'first') `first`, `SAL`\n" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?[A-Z]).*', 'first') `first`, `SAL`\n" + "FROM `scott`.`EMP`\n" + "WHERE `SAL` > 1000"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -124,9 +124,9 @@ public void testRexWithAggregation() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT COUNT(*) `count()`, `REX_EXTRACT`(`JOB`, '(?\\w+)', 'jobtype') `jobtype`\n" + "SELECT COUNT(*) `count()`, REX_EXTRACT(`JOB`, '(?\\w+)', 'jobtype') `jobtype`\n" + "FROM `scott`.`EMP`\n" - + "GROUP BY `REX_EXTRACT`(`JOB`, '(?\\w+)', 'jobtype')"; + + "GROUP BY REX_EXTRACT(`JOB`, '(?\\w+)', 'jobtype')"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -144,8 +144,8 @@ public void testRexComplexPattern() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?[A-Z]{2})(?[A-Z]+)', 'prefix')" - + " `prefix`, `REX_EXTRACT`(`ENAME`, '(?[A-Z]{2})(?[A-Z]+)', 'suffix')" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?[A-Z]{2})(?[A-Z]+)', 'prefix')" + + " `prefix`, REX_EXTRACT(`ENAME`, '(?[A-Z]{2})(?[A-Z]+)', 'suffix')" + " `suffix`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -165,7 +165,7 @@ public void testRexWithSort() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?^.)', 'firstletter')" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?^.)', 'firstletter')" + " `firstletter`\n" + "FROM `scott`.`EMP`\n" + "ORDER BY 2\n" @@ -186,7 +186,7 @@ public void testRexWithMaxMatchZero() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT_MULTI`(`ENAME`, '(?[A-Z])', 'letter', 10) `letter`\n" + "SELECT `ENAME`, REX_EXTRACT_MULTI(`ENAME`, '(?[A-Z])', 'letter', 10) `letter`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -211,7 +211,7 @@ public void testRexWithMaxMatchWithinLimit() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT_MULTI`(`ENAME`, '(?[A-Z])', 'letter', 5) `letter`\n" + "SELECT `ENAME`, REX_EXTRACT_MULTI(`ENAME`, '(?[A-Z])', 'letter', 5) `letter`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -229,7 +229,7 @@ public void testRexWithMaxMatchAtLimit() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT_MULTI`(`ENAME`, '(?[A-Z])', 'letter', 10) `letter`\n" + "SELECT `ENAME`, REX_EXTRACT_MULTI(`ENAME`, '(?[A-Z])', 'letter', 10) `letter`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -261,8 +261,8 @@ public void testRexWithOffsetField() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?[A-Z]).*', 'first') `first`," - + " `REX_OFFSET`(`ENAME`, '(?[A-Z]).*') `offsets`\n" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?[A-Z]).*', 'first') `first`," + + " REX_OFFSET(`ENAME`, '(?[A-Z]).*') `offsets`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -281,9 +281,9 @@ public void testRexWithMultipleNamedGroupsAndOffsetField() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT`(`ENAME`, '(?[A-Z])(?.*)', 'first') `first`," - + " `REX_EXTRACT`(`ENAME`, '(?[A-Z])(?.*)', 'rest') `rest`," - + " `REX_OFFSET`(`ENAME`, '(?[A-Z])(?.*)') `positions`\n" + "SELECT `ENAME`, REX_EXTRACT(`ENAME`, '(?[A-Z])(?.*)', 'first') `first`," + + " REX_EXTRACT(`ENAME`, '(?[A-Z])(?.*)', 'rest') `rest`," + + " REX_OFFSET(`ENAME`, '(?[A-Z])(?.*)') `positions`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -301,8 +301,8 @@ public void testRexWithMaxMatchAndOffsetField() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `ENAME`, `REX_EXTRACT_MULTI`(`ENAME`, '(?[A-Z])', 'letter', 3) `letter`," - + " `REX_OFFSET`(`ENAME`, '(?[A-Z])') `positions`\n" + "SELECT `ENAME`, REX_EXTRACT_MULTI(`ENAME`, '(?[A-Z])', 'letter', 3) `letter`," + + " REX_OFFSET(`ENAME`, '(?[A-Z])') `positions`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSearchTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSearchTest.java index ddb1df95edd..ce5bed94415 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSearchTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSearchTest.java @@ -50,7 +50,7 @@ public void testSearchWithFilter() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT *\nFROM `scott`.`EMP`\nWHERE `query_string`(MAP ('query', 'DEPTNO:20'))"; + "SELECT *\nFROM `scott`.`EMP`\nWHERE QUERY_STRING(MAP ('query', 'DEPTNO:20'))"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -78,7 +78,7 @@ public void testSearchWithAbsoluteTimeRange() { String expectedSparkSql = "SELECT *\n" + "FROM `scott`.`LOGS`\n" - + "WHERE `query_string`(MAP ('query', '(@timestamp:>=2020\\-10\\-11T00\\:00\\:00Z) AND" + + "WHERE QUERY_STRING(MAP ('query', '(@timestamp:>=2020\\-10\\-11T00\\:00\\:00Z) AND" + " (@timestamp:<=2025\\-01\\-01T00\\:00\\:00Z)'))"; verifyPPLToSparkSQL(root, expectedSparkSql); } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSpathTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSpathTest.java index a6de6e28036..57b11d83150 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSpathTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLSpathTest.java @@ -27,7 +27,7 @@ public void testSimpleEval() { String expectedSparkSql = "SELECT `EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`," - + " `JSON_EXTRACT`(`ENAME`, 'src.path') `src.path`\n" + + " JSON_EXTRACT(`ENAME`, 'src.path') `src.path`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -42,7 +42,7 @@ public void testEvalWithOutput() { verifyLogical(root, expectedLogical); String expectedSparkSql = - "SELECT `JSON_EXTRACT`(`ENAME`, 'src.path') `custom`\n" + "FROM `scott`.`EMP`"; + "SELECT JSON_EXTRACT(`ENAME`, 'src.path') `custom`\n" + "FROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } } diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLStringFunctionTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLStringFunctionTest.java index ba2169bab6d..42edc924294 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLStringFunctionTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLStringFunctionTest.java @@ -125,7 +125,7 @@ public void testToStringBin() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`(`SAL`, 'binary') `salary_binary`, `SAL`\nFROM `scott`.`EMP`"; + "SELECT `ENAME`, TOSTRING(`SAL`, 'binary') `salary_binary`, `SAL`\nFROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -156,7 +156,7 @@ public void testToStringHex() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`(`SAL`, 'hex') `salary_hex`, `SAL`\nFROM `scott`.`EMP`"; + "SELECT `ENAME`, TOSTRING(`SAL`, 'hex') `salary_hex`, `SAL`\nFROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -175,7 +175,7 @@ public void testToStringHexFromNumberAsString() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`('1600', 'hex') `salary_hex`\nFROM `scott`.`EMP`\nLIMIT 1"; + "SELECT `ENAME`, TOSTRING('1600', 'hex') `salary_hex`\nFROM `scott`.`EMP`\nLIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -195,7 +195,7 @@ public void testToStringCommaFromNumberAsString() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`('160040222', 'commas') `salary_comma`\n" + "SELECT `ENAME`, TOSTRING('160040222', 'commas') `salary_comma`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -217,7 +217,7 @@ public void testToStringBinaryFromNumberAsString() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`('160040222', 'binary') `salary_binary`\n" + "SELECT `ENAME`, TOSTRING('160040222', 'binary') `salary_binary`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); @@ -252,7 +252,7 @@ public void testToStringCommas() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`(`SAL`, 'commas') `salary_commas`, `SAL`\nFROM `scott`.`EMP`"; + "SELECT `ENAME`, TOSTRING(`SAL`, 'commas') `salary_commas`, `SAL`\nFROM `scott`.`EMP`"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -273,7 +273,7 @@ public void testToStringDuration() { verifyResult(root, expectedResult); String expectedSparkSql = - "SELECT `ENAME`, `TOSTRING`(6500, 'duration') `duration_commas`\n" + "SELECT `ENAME`, TOSTRING(6500, 'duration') `duration_commas`\n" + "FROM `scott`.`EMP`\n" + "LIMIT 1"; verifyPPLToSparkSQL(root, expectedSparkSql); diff --git a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLTimechartTest.java b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLTimechartTest.java index 33a9b84d23b..ca0ff70f0b7 100644 --- a/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLTimechartTest.java +++ b/ppl/src/test/java/org/opensearch/sql/ppl/calcite/CalcitePPLTimechartTest.java @@ -75,10 +75,10 @@ public void testTimechartBasic() { RelNode root = getRelNode(ppl); String expectedSparkSql = - "SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, COUNT(*) `count()`\n" + "SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, COUNT(*) `count()`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL\n" - + "GROUP BY `SPAN`(`@timestamp`, 1, 'm')\n" + + "GROUP BY SPAN(`@timestamp`, 1, 'm')\n" + "ORDER BY 1 NULLS LAST"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -87,14 +87,14 @@ public void testTimechartBasic() { public void testTimechartPerSecond() { withPPLQuery("source=events | timechart per_second(cpu_usage)") .expectSparkSQL( - "SELECT `@timestamp`, `DIVIDE`(`per_second(cpu_usage)` * 1.0000E3," + "SELECT `@timestamp`, DIVIDE(`per_second(cpu_usage)` * 1.0000E3," + " TIMESTAMPDIFF('MILLISECOND', `@timestamp`, TIMESTAMPADD('MINUTE', 1," + " `@timestamp`))) `per_second(cpu_usage)`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + " `per_second(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `SPAN`(`@timestamp`, 1, 'm')\n" + + "GROUP BY SPAN(`@timestamp`, 1, 'm')\n" + "ORDER BY 1 NULLS LAST) `t3`"); } @@ -102,14 +102,14 @@ public void testTimechartPerSecond() { public void testTimechartPerMinute() { withPPLQuery("source=events | timechart per_minute(cpu_usage)") .expectSparkSQL( - "SELECT `@timestamp`, `DIVIDE`(`per_minute(cpu_usage)` * 6.00000E4," + "SELECT `@timestamp`, DIVIDE(`per_minute(cpu_usage)` * 6.00000E4," + " TIMESTAMPDIFF('MILLISECOND', `@timestamp`, TIMESTAMPADD('MINUTE', 1," + " `@timestamp`))) `per_minute(cpu_usage)`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + " `per_minute(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `SPAN`(`@timestamp`, 1, 'm')\n" + + "GROUP BY SPAN(`@timestamp`, 1, 'm')\n" + "ORDER BY 1 NULLS LAST) `t3`"); } @@ -117,14 +117,14 @@ public void testTimechartPerMinute() { public void testTimechartPerHour() { withPPLQuery("source=events | timechart per_hour(cpu_usage)") .expectSparkSQL( - "SELECT `@timestamp`, `DIVIDE`(`per_hour(cpu_usage)` * 3.6000000E6," + "SELECT `@timestamp`, DIVIDE(`per_hour(cpu_usage)` * 3.6000000E6," + " TIMESTAMPDIFF('MILLISECOND', `@timestamp`, TIMESTAMPADD('MINUTE', 1," + " `@timestamp`))) `per_hour(cpu_usage)`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + " `per_hour(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `SPAN`(`@timestamp`, 1, 'm')\n" + + "GROUP BY SPAN(`@timestamp`, 1, 'm')\n" + "ORDER BY 1 NULLS LAST) `t3`"); } @@ -132,14 +132,14 @@ public void testTimechartPerHour() { public void testTimechartPerDay() { withPPLQuery("source=events | timechart per_day(cpu_usage)") .expectSparkSQL( - "SELECT `@timestamp`, `DIVIDE`(`per_day(cpu_usage)` * 8.64E7," + "SELECT `@timestamp`, DIVIDE(`per_day(cpu_usage)` * 8.64E7," + " TIMESTAMPDIFF('MILLISECOND', `@timestamp`, TIMESTAMPADD('MINUTE', 1," + " `@timestamp`))) `per_day(cpu_usage)`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, SUM(`cpu_usage`)" + " `per_day(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `SPAN`(`@timestamp`, 1, 'm')\n" + + "GROUP BY SPAN(`@timestamp`, 1, 'm')\n" + "ORDER BY 1 NULLS LAST) `t3`"); } @@ -149,10 +149,10 @@ public void testTimechartWithSpan() { RelNode root = getRelNode(ppl); String expectedSparkSql = - "SELECT `SPAN`(`@timestamp`, 1, 'h') `@timestamp`, COUNT(*) `count()`\n" + "SELECT SPAN(`@timestamp`, 1, 'h') `@timestamp`, COUNT(*) `count()`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL\n" - + "GROUP BY `SPAN`(`@timestamp`, 1, 'h')\n" + + "GROUP BY SPAN(`@timestamp`, 1, 'h')\n" + "ORDER BY 1 NULLS LAST"; verifyPPLToSparkSQL(root, expectedSparkSql); } @@ -166,16 +166,16 @@ public void testTimechartWithLimit() { "SELECT `t2`.`@timestamp`, CASE WHEN `t2`.`host` IS NULL THEN 'NULL' WHEN" + " `t9`.`_row_number_chart_` <= 3 THEN `t2`.`host` ELSE 'OTHER' END `host`," + " SUM(`t2`.`count()`) `count()`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, `host`, COUNT(*) `count()`\n" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, `host`, COUNT(*) `count()`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL\n" - + "GROUP BY `host`, `SPAN`(`@timestamp`, 1, 'm')) `t2`\n" + + "GROUP BY `host`, SPAN(`@timestamp`, 1, 'm')) `t2`\n" + "LEFT JOIN (SELECT `host`, SUM(`count()`) `__grand_total__`, ROW_NUMBER() OVER (ORDER" + " BY SUM(`count()`) DESC) `_row_number_chart_`\n" + "FROM (SELECT `host`, COUNT(*) `count()`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL\n" - + "GROUP BY `host`, `SPAN`(`@timestamp`, 1, 'm')) `t6`\n" + + "GROUP BY `host`, SPAN(`@timestamp`, 1, 'm')) `t6`\n" + "WHERE `host` IS NOT NULL\n" + "GROUP BY `host`) `t9` ON `t2`.`host` = `t9`.`host`\n" + "GROUP BY `t2`.`@timestamp`, CASE WHEN `t2`.`host` IS NULL THEN 'NULL' WHEN" @@ -192,16 +192,16 @@ public void testTimechartWithSpan1h() { "SELECT `t2`.`@timestamp`, CASE WHEN `t2`.`host` IS NULL THEN 'NULL' WHEN" + " `t9`.`_row_number_chart_` <= 10 THEN `t2`.`host` ELSE 'OTHER' END `host`," + " SUM(`t2`.`count()`) `count()`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'h') `@timestamp`, `host`, COUNT(*) `count()`\n" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'h') `@timestamp`, `host`, COUNT(*) `count()`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL\n" - + "GROUP BY `host`, `SPAN`(`@timestamp`, 1, 'h')) `t2`\n" + + "GROUP BY `host`, SPAN(`@timestamp`, 1, 'h')) `t2`\n" + "LEFT JOIN (SELECT `host`, SUM(`count()`) `__grand_total__`, ROW_NUMBER() OVER (ORDER" + " BY SUM(`count()`) DESC) `_row_number_chart_`\n" + "FROM (SELECT `host`, COUNT(*) `count()`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL\n" - + "GROUP BY `host`, `SPAN`(`@timestamp`, 1, 'h')) `t6`\n" + + "GROUP BY `host`, SPAN(`@timestamp`, 1, 'h')) `t6`\n" + "WHERE `host` IS NOT NULL\n" + "GROUP BY `host`) `t9` ON `t2`.`host` = `t9`.`host`\n" + "GROUP BY `t2`.`@timestamp`, CASE WHEN `t2`.`host` IS NULL THEN 'NULL' WHEN" @@ -218,17 +218,17 @@ public void testTimechartWithSpan1m() { "SELECT `t2`.`@timestamp`, CASE WHEN `t2`.`region` IS NULL THEN 'NULL' WHEN" + " `t9`.`_row_number_chart_` <= 10 THEN `t2`.`region` ELSE 'OTHER' END `region`," + " AVG(`t2`.`avg(cpu_usage)`) `avg(cpu_usage)`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'm') `@timestamp`, `region`, AVG(`cpu_usage`)" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'm') `@timestamp`, `region`, AVG(`cpu_usage`)" + " `avg(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `region`, `SPAN`(`@timestamp`, 1, 'm')) `t2`\n" + + "GROUP BY `region`, SPAN(`@timestamp`, 1, 'm')) `t2`\n" + "LEFT JOIN (SELECT `region`, SUM(`avg(cpu_usage)`) `__grand_total__`, ROW_NUMBER()" + " OVER (ORDER BY SUM(`avg(cpu_usage)`) DESC) `_row_number_chart_`\n" + "FROM (SELECT `region`, AVG(`cpu_usage`) `avg(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `region`, `SPAN`(`@timestamp`, 1, 'm')) `t6`\n" + + "GROUP BY `region`, SPAN(`@timestamp`, 1, 'm')) `t6`\n" + "WHERE `region` IS NOT NULL\n" + "GROUP BY `region`) `t9` ON `t2`.`region` = `t9`.`region`\n" + "GROUP BY `t2`.`@timestamp`, CASE WHEN `t2`.`region` IS NULL THEN 'NULL' WHEN" @@ -255,17 +255,17 @@ public void testTimechartWithLimitAndUseOtherFalse() { "SELECT `t2`.`@timestamp`, CASE WHEN `t2`.`host` IS NULL THEN 'NULL' WHEN" + " `t9`.`_row_number_chart_` <= 3 THEN `t2`.`host` ELSE 'OTHER' END `host`," + " AVG(`t2`.`avg(cpu_usage)`) `avg(cpu_usage)`\n" - + "FROM (SELECT `SPAN`(`@timestamp`, 1, 'h') `@timestamp`, `host`, AVG(`cpu_usage`)" + + "FROM (SELECT SPAN(`@timestamp`, 1, 'h') `@timestamp`, `host`, AVG(`cpu_usage`)" + " `avg(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `host`, `SPAN`(`@timestamp`, 1, 'h')) `t2`\n" + + "GROUP BY `host`, SPAN(`@timestamp`, 1, 'h')) `t2`\n" + "LEFT JOIN (SELECT `host`, SUM(`avg(cpu_usage)`) `__grand_total__`, ROW_NUMBER() OVER" + " (ORDER BY SUM(`avg(cpu_usage)`) DESC) `_row_number_chart_`\n" + "FROM (SELECT `host`, AVG(`cpu_usage`) `avg(cpu_usage)`\n" + "FROM `scott`.`events`\n" + "WHERE `@timestamp` IS NOT NULL AND `cpu_usage` IS NOT NULL\n" - + "GROUP BY `host`, `SPAN`(`@timestamp`, 1, 'h')) `t6`\n" + + "GROUP BY `host`, SPAN(`@timestamp`, 1, 'h')) `t6`\n" + "WHERE `host` IS NOT NULL\n" + "GROUP BY `host`) `t9` ON `t2`.`host` = `t9`.`host`\n" + "WHERE `t9`.`_row_number_chart_` <= 3\n"