From bb1be258dbc1f4f4a9c0a0f3f885527edd8381eb Mon Sep 17 00:00:00 2001 From: Andreas Reichel Date: Tue, 4 Jun 2024 09:22:27 +0700 Subject: [PATCH] feat: support Insert, Update, Delete and Merge statements Signed-off-by: Andreas Reichel --- README.md | 15 ++- .../transpiler/JSQLExpressionTranspiler.java | 2 - .../transpiler/JSQLSelectTranspiler.java | 1 - .../starlake/transpiler/JSQLTranspiler.java | 92 ++++++++---------- .../DatabricksExpressionTranspiler.java | 19 +++- .../RedshiftExpressionTranspiler.java | 2 - .../SnowflakeExpressionTranspiler.java | 1 - .../snowflake/SnowflakeSelectTranspiler.java | 2 - src/site/sphinx/_static/JSQLTranspiler.ods | Bin 104909 -> 104906 bytes src/site/sphinx/index.rst | 17 +++- src/site/sphinx/usage.rst | 14 ++- .../java/ai/starlake/transpiler/CLITest.java | 34 ------- .../ai/starlake/transpiler/DebugTest.java | 18 ---- .../ai/starlake/transpiler/DuckDBFreeze.java | 66 ------------- .../RedshiftExpressionTranspilerTest.java | 2 - .../transpiler/JSQLTranspilerTest_MainIn.sql | 83 ---------------- .../transpiler/JSQLTranspilerTest_MainOut.sql | 83 ---------------- 17 files changed, 95 insertions(+), 356 deletions(-) delete mode 100644 src/test/java/ai/starlake/transpiler/CLITest.java delete mode 100644 src/test/java/ai/starlake/transpiler/DuckDBFreeze.java delete mode 100644 src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainIn.sql delete mode 100644 src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainOut.sql diff --git a/README.md b/README.md index 3efe567..7da8f49 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,11 @@ A pure Java stand-alone SQL Transpiler for translating various large RDBMS SQL Dialects into a few smaller RDBMS Dialects for Unit Testing. Based on JSQLParser. -Focus is on Queries (only) and work is on progress based on the [Feature Matrix](src/main/resources/doc/JSQLTranspiler.ods). +Supports `SELECT` queries as well as `INSERT`, `UPDATE`, `DELETE` and `MERGE` statements. + +Internal Functions will be rewritten based on the actual meaning and purpose of the function (since DuckDB `Any()` function does not necessarily behave like the RDBMS specific `Any()`). Respecting different function arguments count, order and type. + +Rewrite of Window- and Aggregate-Functions. ## Dialects @@ -57,6 +61,15 @@ String result = JSQLTranspiler.transpile(providedSQL, Dialect.AMAZON_REDSHIFT); assertEquals(expectedSQL, result); ``` +### Web API +```shell +curl -X 'POST' \ + 'https://secure-api.starlake.ai/api/v1/transpiler/transpile?dialect=SNOWFLAKE' \ + -H 'accept: text/plain' \ + -H 'Content-Type: text/plain' \ + -d 'SELECT Nvl(null, 1) a' +``` + ### Java Command Line Interface ```text usage: java -jar JSQLTranspilerCLI.jar [-d | --any | --bigquery | diff --git a/src/main/java/ai/starlake/transpiler/JSQLExpressionTranspiler.java b/src/main/java/ai/starlake/transpiler/JSQLExpressionTranspiler.java index e682566..eed90ad 100644 --- a/src/main/java/ai/starlake/transpiler/JSQLExpressionTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/JSQLExpressionTranspiler.java @@ -56,9 +56,7 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectItem; -import net.sf.jsqlparser.statement.select.SelectVisitor; import net.sf.jsqlparser.util.deparser.ExpressionDeParser; -import net.sf.jsqlparser.util.deparser.OrderByDeParser; import net.sf.jsqlparser.util.deparser.SelectDeParser; import java.text.SimpleDateFormat; diff --git a/src/main/java/ai/starlake/transpiler/JSQLSelectTranspiler.java b/src/main/java/ai/starlake/transpiler/JSQLSelectTranspiler.java index ef4a3b4..aab1177 100644 --- a/src/main/java/ai/starlake/transpiler/JSQLSelectTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/JSQLSelectTranspiler.java @@ -1,6 +1,5 @@ package ai.starlake.transpiler; -import net.sf.jsqlparser.expression.ExpressionVisitor; import net.sf.jsqlparser.parser.SimpleNode; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.select.FromItem; diff --git a/src/main/java/ai/starlake/transpiler/JSQLTranspiler.java b/src/main/java/ai/starlake/transpiler/JSQLTranspiler.java index b5640d6..459b68e 100644 --- a/src/main/java/ai/starlake/transpiler/JSQLTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/JSQLTranspiler.java @@ -16,13 +16,9 @@ */ package ai.starlake.transpiler; -import ai.starlake.transpiler.bigquery.BigQuerySelectTranspiler; import ai.starlake.transpiler.bigquery.BigQueryTranspiler; -import ai.starlake.transpiler.databricks.DatabricksSelectTranspiler; import ai.starlake.transpiler.databricks.DatabricksTranspiler; -import ai.starlake.transpiler.redshift.RedshiftSelectTranspiler; import ai.starlake.transpiler.redshift.RedshiftTranspiler; -import ai.starlake.transpiler.snowflake.SnowflakeSelectTranspiler; import ai.starlake.transpiler.snowflake.SnowflakeTranspiler; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParser; @@ -57,7 +53,7 @@ import java.util.logging.Logger; /** - * The type JSQLtranspiler. + * The type JSQLTranspiler. */ public class JSQLTranspiler extends StatementDeParser { public static final Logger LOGGER = Logger.getLogger(JSQLTranspiler.class.getName()); @@ -115,24 +111,17 @@ public JSQLTranspiler() throws InvocationTargetException, NoSuchMethodException, public static String transpileQuery(String qryStr, Dialect dialect, ExecutorService executorService, Consumer consumer) throws JSQLParserException { Statement st = CCJSqlParserUtil.parse(qryStr, executorService, consumer); - if (st instanceof Select) { - Select select = (Select) st; - - switch (dialect) { - case GOOGLE_BIG_QUERY: - return transpileGoogleBigQuery(select); - case DATABRICKS: - return transpileDatabricksQuery(select); - case SNOWFLAKE: - return transpileSnowflakeQuery(select); - case AMAZON_REDSHIFT: - return transpileAmazonRedshiftQuery(select); - default: - return transpile(select); - } - } else { - throw new RuntimeException("The " + st.getClass().getName() - + " is not supported yet. Only `PlainSelect` is supported right now."); + switch (dialect) { + case GOOGLE_BIG_QUERY: + return transpileBigQuery(st); + case DATABRICKS: + return transpileDatabricks(st); + case SNOWFLAKE: + return transpileSnowflake(st); + case AMAZON_REDSHIFT: + return transpileAmazonRedshift(st); + default: + return transpile(st); } } @@ -143,7 +132,7 @@ public static String transpileQuery(String qryStr, Dialect dialect, * @param dialect the dialect of the query string * @return the transformed query string * @throws JSQLParserException a parser exception when the statement can't be parsed - * @throws InterruptedException a time out exception, when the statement can't be parsed within 6 + * @throws InterruptedException a time-out exception, when the statement can't be parsed within 6 * seconds (hanging parser) */ public static String transpileQuery(String qryStr, Dialect dialect) @@ -170,6 +159,7 @@ public static String transpileQuery(String qryStr, Dialect dialect) * @param consumer the parser configuration to use for the parsing * @throws JSQLParserException a parser exception when the statement can't be parsed */ + @SuppressWarnings({"PMD.CyclomaticComplexity"}) public static void transpile(String sqlStr, File outputFile, ExecutorService executorService, Consumer consumer) throws JSQLParserException { try { @@ -178,14 +168,8 @@ public static void transpile(String sqlStr, File outputFile, ExecutorService exe // @todo: we may need to split this manually to salvage any not parseable statements Statements statements = CCJSqlParserUtil.parseStatements(sqlStr, executorService, consumer); for (Statement st : statements) { - if (st instanceof Select) { - Select select = (Select) st; - select.accept(transpiler); - - transpiler.getBuffer().append("\n;\n\n"); - } else { - LOGGER.log(Level.SEVERE, st.getClass().getSimpleName() + " is not supported yet:\n" + st); - } + st.accept(transpiler); + transpiler.getBuffer().append("\n;\n\n"); } String transpiledSqlStr = transpiler.getBuffer().toString(); @@ -223,7 +207,7 @@ public static void transpile(String sqlStr, File outputFile, ExecutorService exe * @param sqlStr the original query string * @param outputFile the output file, writing to STDOUT when not defined * @throws JSQLParserException a parser exception when the statement can't be parsed - * @throws InterruptedException a time out exception, when the statement can't be parsed within 6 + * @throws InterruptedException a time-out exception, when the statement can't be parsed within 6 * seconds (hanging parser) */ public static boolean transpile(String sqlStr, File outputFile) @@ -315,7 +299,7 @@ public static Collection getMacros() executorService.shutdown(); boolean wasTerminated = executorService.awaitTermination(TIMEOUT, TimeUnit.SECONDS); - LOGGER.log(Level.FINE, "Exceutor Service terminated: " + wasTerminated); + LOGGER.log(Level.FINE, "Executor Service terminated: " + wasTerminated); return macroStrList; } @@ -357,15 +341,15 @@ public static void createMacros(Connection conn) } /** - * Transpile string. + * Rewrite a given SQL Statement into a text representation. * - * @param select the select + * @param statement the statement * @return the string */ - public static String transpile(Select select) { + public static String transpile(Statement statement) { try { JSQLTranspiler transpiler = new JSQLTranspiler(); - select.accept(transpiler); + statement.accept(transpiler); return transpiler.getBuffer().toString(); } catch (InvocationTargetException | NoSuchMethodException | InstantiationException @@ -376,15 +360,15 @@ public static String transpile(Select select) { } /** - * Transpile google big query string. + * Rewrite a given BigQuery SQL Statement into a text representation. * - * @param select the select + * @param statement the statement * @return the string */ - public static String transpileGoogleBigQuery(Select select) { + public static String transpileBigQuery(Statement statement) { try { BigQueryTranspiler transpiler = new BigQueryTranspiler(); - select.accept(transpiler); + statement.accept(transpiler); return transpiler.getBuffer().toString(); } catch (InvocationTargetException | NoSuchMethodException | InstantiationException @@ -395,15 +379,15 @@ public static String transpileGoogleBigQuery(Select select) { } /** - * Transpile databricks query string. + * Rewrite a given DataBricks SQL Statement into a text representation. * - * @param select the select + * @param statement the statement * @return the string */ - public static String transpileDatabricksQuery(Select select) { + public static String transpileDatabricks(Statement statement) { try { DatabricksTranspiler transpiler = new DatabricksTranspiler(); - select.accept(transpiler); + statement.accept(transpiler); return transpiler.getBuffer().toString(); } catch (InvocationTargetException | NoSuchMethodException | InstantiationException @@ -414,15 +398,15 @@ public static String transpileDatabricksQuery(Select select) { } /** - * Transpile snowflake query string. + * Rewrite a given Snowflake SQL Statement into a text representation. * - * @param select the select + * @param statement the statement * @return the string */ - public static String transpileSnowflakeQuery(Select select) { + public static String transpileSnowflake(Statement statement) { try { SnowflakeTranspiler transpiler = new SnowflakeTranspiler(); - select.accept(transpiler); + statement.accept(transpiler); return transpiler.getBuffer().toString(); } catch (InvocationTargetException | NoSuchMethodException | InstantiationException @@ -433,15 +417,15 @@ public static String transpileSnowflakeQuery(Select select) { } /** - * Transpile amazon redshift query string. + * Rewrite a given Redshift SQL Statement into a text representation. * - * @param select the select + * @param statement the statement * @return the string */ - public static String transpileAmazonRedshiftQuery(Select select) { + public static String transpileAmazonRedshift(Statement statement) { try { RedshiftTranspiler transpiler = new RedshiftTranspiler(); - select.accept(transpiler); + statement.accept(transpiler); return transpiler.getBuffer().toString(); } catch (InvocationTargetException | NoSuchMethodException | InstantiationException diff --git a/src/main/java/ai/starlake/transpiler/databricks/DatabricksExpressionTranspiler.java b/src/main/java/ai/starlake/transpiler/databricks/DatabricksExpressionTranspiler.java index 8ebc996..d14ad56 100644 --- a/src/main/java/ai/starlake/transpiler/databricks/DatabricksExpressionTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/databricks/DatabricksExpressionTranspiler.java @@ -16,7 +16,6 @@ */ package ai.starlake.transpiler.databricks; -import ai.starlake.transpiler.JSQLSelectTranspiler; import ai.starlake.transpiler.JSQLTranspiler; import ai.starlake.transpiler.redshift.RedshiftExpressionTranspiler; import net.sf.jsqlparser.expression.AnalyticExpression; @@ -29,6 +28,7 @@ import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.LambdaExpression; import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.NotExpression; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.TimeKeyExpression; import net.sf.jsqlparser.expression.TimezoneExpression; @@ -71,7 +71,7 @@ enum TranspiledFunction { , TRY_AVG, TRY_SUM, PERCENT_RANK - , ARRAY_APPEND, ARRAY_COMPACT + , ARRAY_APPEND, ARRAY_COMPACT, ARRAY_EXCEPT ; // @FORMATTER:ON @@ -542,6 +542,21 @@ public void visit(Function function) { new LambdaExpression("x", new IsNullExpression("x", true))); } break; + case ARRAY_EXCEPT: + if (paramCount == 2) { + // LIST_DISTINCT(LIST_FILTER([1,2,2,3],X->NOT + // ARRAY_CONTAINS(LIST_INTERSECT([1,2,2,3],[1,1,3,5]),X))) + + NotExpression notExpression = new NotExpression(new Function("Array_Contains", + new Function("List_Intersect", parameters.get(0), parameters.get(1)), + new Column("x"))); + + function.setName("List_Distinct"); + function.setParameters(new Function("List_Filter", parameters.get(0), + new LambdaExpression("x", notExpression))); + } + break; + } } if (rewrittenExpression == null) { diff --git a/src/main/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspiler.java b/src/main/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspiler.java index 9c2a00f..56a921b 100644 --- a/src/main/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspiler.java @@ -17,8 +17,6 @@ package ai.starlake.transpiler.redshift; import ai.starlake.transpiler.JSQLExpressionTranspiler; -import ai.starlake.transpiler.JSQLSelectTranspiler; -import ai.starlake.transpiler.JSQLTranspiler; import net.sf.jsqlparser.expression.AnalyticExpression; import net.sf.jsqlparser.expression.ArrayConstructor; import net.sf.jsqlparser.expression.ArrayExpression; diff --git a/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeExpressionTranspiler.java b/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeExpressionTranspiler.java index b5ce2a9..182999c 100644 --- a/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeExpressionTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeExpressionTranspiler.java @@ -16,7 +16,6 @@ */ package ai.starlake.transpiler.snowflake; -import ai.starlake.transpiler.JSQLSelectTranspiler; import ai.starlake.transpiler.JSQLTranspiler; import ai.starlake.transpiler.redshift.RedshiftExpressionTranspiler; import net.sf.jsqlparser.expression.AnalyticExpression; diff --git a/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeSelectTranspiler.java b/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeSelectTranspiler.java index 293d695..d73a512 100644 --- a/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeSelectTranspiler.java +++ b/src/main/java/ai/starlake/transpiler/snowflake/SnowflakeSelectTranspiler.java @@ -16,9 +16,7 @@ */ package ai.starlake.transpiler.snowflake; -import ai.starlake.transpiler.JSQLExpressionTranspiler; import ai.starlake.transpiler.JSQLSelectTranspiler; -import ai.starlake.transpiler.JSQLTranspiler; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.ArrayConstructor; import net.sf.jsqlparser.expression.Expression; diff --git a/src/site/sphinx/_static/JSQLTranspiler.ods b/src/site/sphinx/_static/JSQLTranspiler.ods index 87eabe1d8e06ef7640c26690668df437d2b217df..cd51d201f7753fd97b6f3f86634ff6064c32a4df 100644 GIT binary patch delta 39245 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 | --duckdb] [-i ] [-o ] [-h] + +.. tab:: Web API Call + + .. code:: shell + + curl -X 'POST' \ + 'https://secure-api.starlake.ai/api/v1/transpiler/transpile?dialect=SNOWFLAKE' \ + -H 'accept: text/plain' \ + -H 'Content-Type: text/plain' \ + -d 'SELECT Nvl(null, 1) a' + + .. tab:: Java Library Call .. code:: java diff --git a/src/test/java/ai/starlake/transpiler/CLITest.java b/src/test/java/ai/starlake/transpiler/CLITest.java deleted file mode 100644 index dc23d3f..0000000 --- a/src/test/java/ai/starlake/transpiler/CLITest.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Starlake.AI JSQLTranspiler is a SQL to DuckDB Transpiler. - * Copyright (C) 2024 Andreas Reichel on behalf of Starlake.AI - * - * Licensed 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 ai.starlake.transpiler; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import java.io.File; - -public class CLITest extends JSQLTranspilerTest { - public final static String TEST_FOLDER_STR = "build/resources/test/ai/starlake/transpiler"; - - @ParameterizedTest(name = "{index} {0} {1}: {2}") - @MethodSource("getSqlTestMap") - @Disabled - protected void transpile(File f, int idx, SQLTest t) throws Exception { - - } -} diff --git a/src/test/java/ai/starlake/transpiler/DebugTest.java b/src/test/java/ai/starlake/transpiler/DebugTest.java index 4d0addf..896a37c 100644 --- a/src/test/java/ai/starlake/transpiler/DebugTest.java +++ b/src/test/java/ai/starlake/transpiler/DebugTest.java @@ -16,12 +16,6 @@ */ package ai.starlake.transpiler; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.statement.Statement; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -52,16 +46,4 @@ static Stream getSqlTestMap() { protected void transpile(File f, int idx, SQLTest t) throws Exception { super.transpile(f, idx, t); } - - - @Disabled - @Test - void testParse() throws JSQLParserException { - String sqlStr = "SELECT *\n" - + " FROM (VALUES ('a b'), ('cde'), ('f|g'), ('')) AS t1, LATERAL STRTOK_SPLIT_TO_TABLE(t1.column1, ' ')\n" - + " ORDER BY SEQ, INDEX, value;"; - Statement st = CCJSqlParserUtil.parse(sqlStr); - - Assertions.assertNotNull(st); - } } diff --git a/src/test/java/ai/starlake/transpiler/DuckDBFreeze.java b/src/test/java/ai/starlake/transpiler/DuckDBFreeze.java deleted file mode 100644 index abb548a..0000000 --- a/src/test/java/ai/starlake/transpiler/DuckDBFreeze.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Starlake.AI JSQLTranspiler is a SQL to DuckDB Transpiler. - * Copyright (C) 2024 Andreas Reichel on behalf of Starlake.AI - * - * Licensed 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 ai.starlake.transpiler; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Properties; - -public class DuckDBFreeze { - - @Test - @Disabled - void testFreeze() throws SQLException { - String sqlString = "SELECT PRINTF('%010.2f', 125.8) AS chars;"; - - Properties info = new Properties(); - - // crashes - // info.put("old_implicit_casting", true); - - // works - // info.put("old_implicit_casting", "true"); - - try (Connection connDuck = DriverManager.getConnection("jdbc:duckdb:", info); - Statement st = connDuck.createStatement(); - ResultSet rs = st.executeQuery(sqlString);) { - Assertions.assertTrue(rs.next()); - - Assertions.assertEquals("21", rs.getString(1)); - } - } - - @Test - void testUpcast() { - // SELECT 345349 * POWER((1+Cast(7 AS FLOAT)/100/12),120) qty2010; - - Object c = 1 + (float) 0.07 / 12; - - System.out.println(c.getClass()); - - - System.out.println(345349 * Math.pow(1 + (float) 0.07 / 12, 120)); - - } -} diff --git a/src/test/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspilerTest.java b/src/test/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspilerTest.java index ce5a8ff..b094cac 100644 --- a/src/test/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspilerTest.java +++ b/src/test/java/ai/starlake/transpiler/redshift/RedshiftExpressionTranspilerTest.java @@ -19,8 +19,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - class RedshiftExpressionTranspilerTest { @Test diff --git a/src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainIn.sql b/src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainIn.sql deleted file mode 100644 index 04830ac..0000000 --- a/src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainIn.sql +++ /dev/null @@ -1,83 +0,0 @@ -SELECT Nvl( NULL, 1 ) a -; - -SELECT TOP 10 - qtysold - , sellerid -FROM sales -ORDER BY qtysold DESC - , sellerid -; - -SELECT TOP 10 - qtysold - , sellerid -FROM ( SELECT TOP 4 - qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid ) a -ORDER BY qtysold DESC - , sellerid -; - -INSERT INTO tmp -SELECT TOP 10 - qtysold - , sellerid -FROM ( SELECT TOP 4 - qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid ) a -ORDER BY qtysold DESC - , sellerid -; - -DELETE FROM tmp -WHERE ( qtysold, sellerid ) IN ( SELECT TOP 10 - qtysold - , sellerid - FROM ( SELECT TOP 4 - qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid ) a - ORDER BY qtysold DESC - , sellerid ) -; - -UPDATE tmp -SET qtysold = 0 -WHERE ( qtysold, sellerid ) IN ( SELECT TOP 10 - qtysold - , sellerid - FROM ( SELECT TOP 4 - qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid ) a - ORDER BY qtysold DESC - , sellerid ) -; - -MERGE INTO tmp - USING ( SELECT TOP 10 - qtysold - , sellerid - FROM ( SELECT TOP 4 - qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid ) a - ORDER BY qtysold DESC - , sellerid ) s - ON ( tmp.sellerid = s.sellerid ) -WHEN MATCHED THEN - UPDATE SET qtysold = 0 -; \ No newline at end of file diff --git a/src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainOut.sql b/src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainOut.sql deleted file mode 100644 index 247c3dd..0000000 --- a/src/test/resources/ai/starlake/transpiler/JSQLTranspilerTest_MainOut.sql +++ /dev/null @@ -1,83 +0,0 @@ -SELECT Coalesce( NULL, 1 ) a -; - -SELECT qtysold - , sellerid -FROM sales -ORDER BY qtysold DESC - , sellerid -LIMIT 10 -; - -SELECT qtysold - , sellerid -FROM ( SELECT qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid - LIMIT 4 ) a -ORDER BY qtysold DESC - , sellerid -LIMIT 10 -; - -INSERT INTO tmp -SELECT qtysold - , sellerid -FROM ( SELECT qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid - LIMIT 4 ) a -ORDER BY qtysold DESC - , sellerid -LIMIT 10 -; - -DELETE FROM tmp -WHERE ( qtysold, sellerid ) IN ( SELECT qtysold - , sellerid - FROM ( SELECT qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid - LIMIT 4 ) a - ORDER BY qtysold DESC - , sellerid - LIMIT 10 ) -; - -UPDATE tmp -SET qtysold = 0 -WHERE ( qtysold, sellerid ) IN ( SELECT qtysold - , sellerid - FROM ( SELECT qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid - LIMIT 4 ) a - ORDER BY qtysold DESC - , sellerid - LIMIT 10 ) -; - -MERGE INTO tmp - USING ( SELECT qtysold - , sellerid - FROM ( SELECT qtysold - , sellerid - FROM sales - ORDER BY qtysold DESC - , sellerid - LIMIT 4 ) a - ORDER BY qtysold DESC - , sellerid - LIMIT 10 ) s - ON ( tmp.sellerid = s.sellerid ) -WHEN MATCHED THEN - UPDATE SET qtysold = 0 -; \ No newline at end of file