From 5fdd67ea3decf2095e376873d6e84840f3a4db31 Mon Sep 17 00:00:00 2001 From: "R. C. Howell" Date: Tue, 28 May 2024 09:19:29 -0700 Subject: [PATCH] Uses INT and BIGINT as default 32-bit and 64-bit integer names --- .../org/partiql/scribe/ScribeCompiler.kt | 24 ++++++++++++++++++- .../kotlin/org/partiql/scribe/sql/SqlCalls.kt | 14 ++++++----- src/test/resources/inputs/operators/cast.sql | 10 ++++++-- .../outputs/partiql/basics/simple.sql | 16 ++++++++----- .../outputs/partiql/operators/cast.sql | 10 ++++++-- .../outputs/redshift/operators/cast.sql | 10 ++++++-- .../outputs/spark/operators/cast.sql | 14 +++++++---- .../outputs/trino/operators/cast.sql | 12 +++++++--- 8 files changed, 84 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/org/partiql/scribe/ScribeCompiler.kt b/src/main/kotlin/org/partiql/scribe/ScribeCompiler.kt index 2516e31..eb66d72 100644 --- a/src/main/kotlin/org/partiql/scribe/ScribeCompiler.kt +++ b/src/main/kotlin/org/partiql/scribe/ScribeCompiler.kt @@ -1,6 +1,9 @@ package org.partiql.scribe +import org.partiql.ast.AstNode import org.partiql.ast.Statement +import org.partiql.ast.Type +import org.partiql.ast.util.AstRewriter import org.partiql.errors.Problem import org.partiql.errors.ProblemCallback import org.partiql.errors.ProblemSeverity @@ -40,7 +43,16 @@ public class ScribeCompiler internal constructor( session: PartiQLPlanner.Session, ): Scribe.Result { try { - val ast = parse(statement) + var ast = parse(statement) + + // TODO: REMOVE ME + // PartiQL came from Ion SQL which uses the INT name for the unbounded integer. + // In SQL, the INT name must have some finite precision and most systems use a 32-bit integer. + // Scribe is built to interface with other systems, so we must change all occurrences of the INT + // type name with INT4. In short, all systems do INT = INT4 but PartiQL has INT4 != INT. + // >>>> ISSUE — https://github.com/partiql/partiql-lang-kotlin/issues/1471 + ast = replaceIntWithInt4(ast) + val plan = plan(ast, session) return scribe.compile(plan, target) } catch (e: ScribeException) { @@ -78,4 +90,14 @@ public class ScribeCompiler internal constructor( @JvmStatic public fun builder(): ScribeCompilerBuilder = ScribeCompilerBuilder() } + + /** + * Rewrite all occurrences of INT with INT4. + */ + private fun replaceIntWithInt4(ast: Statement): Statement { + val rewriter = object : AstRewriter() { + override fun visitTypeInt(node: Type.Int, ctx: Unit): AstNode = Type.Int4() + } + return rewriter.visitStatement(ast, Unit) as Statement + } } diff --git a/src/main/kotlin/org/partiql/scribe/sql/SqlCalls.kt b/src/main/kotlin/org/partiql/scribe/sql/SqlCalls.kt index 485461f..abf8c7a 100644 --- a/src/main/kotlin/org/partiql/scribe/sql/SqlCalls.kt +++ b/src/main/kotlin/org/partiql/scribe/sql/SqlCalls.kt @@ -16,6 +16,7 @@ import org.partiql.ast.exprUnary import org.partiql.ast.identifierSymbol import org.partiql.ast.typeAny import org.partiql.ast.typeBag +import org.partiql.ast.typeBigint import org.partiql.ast.typeBlob import org.partiql.ast.typeBool import org.partiql.ast.typeChar @@ -33,6 +34,7 @@ import org.partiql.ast.typeList import org.partiql.ast.typeMissing import org.partiql.ast.typeNullType import org.partiql.ast.typeSexp +import org.partiql.ast.typeSmallint import org.partiql.ast.typeString import org.partiql.ast.typeStruct import org.partiql.ast.typeSymbol @@ -287,9 +289,9 @@ public abstract class SqlCalls { PartiQLValueType.ANY -> typeAny() PartiQLValueType.BOOL -> typeBool() PartiQLValueType.INT8 -> typeInt() - PartiQLValueType.INT16 -> typeInt2() - PartiQLValueType.INT32 -> typeInt4() - PartiQLValueType.INT64 -> typeInt8() + PartiQLValueType.INT16 -> typeSmallint() + PartiQLValueType.INT32 -> typeInt() + PartiQLValueType.INT64 -> typeBigint() PartiQLValueType.INT -> typeInt() PartiQLValueType.DECIMAL_ARBITRARY -> typeDecimal(null, null) PartiQLValueType.DECIMAL -> typeDecimal(null, null) @@ -327,9 +329,9 @@ public abstract class SqlCalls { PartiQLValueType.ANY -> typeAny() PartiQLValueType.BOOL -> typeBool() PartiQLValueType.INT8 -> error("unsupported") - PartiQLValueType.INT16 -> typeInt2() - PartiQLValueType.INT32 -> typeInt4() - PartiQLValueType.INT64 -> typeInt8() + PartiQLValueType.INT16 -> typeSmallint() + PartiQLValueType.INT32 -> typeInt() + PartiQLValueType.INT64 -> typeBigint() PartiQLValueType.INT -> typeInt() PartiQLValueType.DECIMAL_ARBITRARY -> typeDecimal(null, null) PartiQLValueType.DECIMAL -> typeDecimal(typeArg0?.toInt(), typeArg1?.toInt()) diff --git a/src/test/resources/inputs/operators/cast.sql b/src/test/resources/inputs/operators/cast.sql index 397b1ff..bf4d57e 100644 --- a/src/test/resources/inputs/operators/cast.sql +++ b/src/test/resources/inputs/operators/cast.sql @@ -1,5 +1,11 @@ --#[cast-00] -CAST('1' AS INT4); +CAST('1' AS INT); --#[cast-01] -SELECT CAST('foo' AS STRING) AS s FROM T; +CAST('1' AS INT4); + +--#[cast-02] +CAST('1' AS INT8); + +--#[cast-03] +CAST('1' AS BIGINT); diff --git a/src/test/resources/outputs/partiql/basics/simple.sql b/src/test/resources/outputs/partiql/basics/simple.sql index eba2bf6..cb722fa 100644 --- a/src/test/resources/outputs/partiql/basics/simple.sql +++ b/src/test/resources/outputs/partiql/basics/simple.sql @@ -77,22 +77,26 @@ NOT ("default"."T1" IS NULL); NOT ("default"."T1" IS MISSING); --#[expr-14] -"default"."T1" IS INT2; +"default"."T1" IS SMALLINT; --#[expr-15] -NOT ("default"."T1" IS INT2); +NOT ("default"."T1" IS SMALLINT); --#[expr-16] -"default"."T1" IS INT4; +-- TODO USE INT as the default INT4 name. +"default"."T1" IS INT; --#[expr-17] -NOT ("default"."T1" IS INT4); +-- TODO USE INT as the default INT4 name. +NOT ("default"."T1" IS INT); --#[expr-18] -"default"."T1" IS INT8; +-- TODO USE BIGINT as the default BIGINT/INT8 name. +"default"."T1" IS BIGINT; --#[expr-19] -NOT ("default"."T1" IS INT8); +-- TODO USE BIGINT as the default BIGINT/INT8 name. +NOT ("default"."T1" IS BIGINT); --#[expr-20] "default"."T1" IS INT; diff --git a/src/test/resources/outputs/partiql/operators/cast.sql b/src/test/resources/outputs/partiql/operators/cast.sql index 9c8ef60..2a9a04a 100644 --- a/src/test/resources/outputs/partiql/operators/cast.sql +++ b/src/test/resources/outputs/partiql/operators/cast.sql @@ -1,5 +1,11 @@ --#[cast-00] -CAST('1' AS INT4); +CAST('1' AS INT); --#[cast-01] -SELECT CAST('foo' AS STRING) AS "s" FROM "default"."T" AS "T"; +CAST('1' AS INT); + +--#[cast-02] +CAST('1' AS BIGINT); + +--#[cast-03] +CAST('1' AS BIGINT); diff --git a/src/test/resources/outputs/redshift/operators/cast.sql b/src/test/resources/outputs/redshift/operators/cast.sql index c091d11..2a9a04a 100644 --- a/src/test/resources/outputs/redshift/operators/cast.sql +++ b/src/test/resources/outputs/redshift/operators/cast.sql @@ -1,5 +1,11 @@ --#[cast-00] -CAST('1' AS INT4); +CAST('1' AS INT); --#[cast-01] -SELECT CAST('foo' AS VARCHAR) AS "s" FROM "default"."T" AS "T"; +CAST('1' AS INT); + +--#[cast-02] +CAST('1' AS BIGINT); + +--#[cast-03] +CAST('1' AS BIGINT); diff --git a/src/test/resources/outputs/spark/operators/cast.sql b/src/test/resources/outputs/spark/operators/cast.sql index c61b3e9..7829e7b 100644 --- a/src/test/resources/outputs/spark/operators/cast.sql +++ b/src/test/resources/outputs/spark/operators/cast.sql @@ -1,5 +1,11 @@ -----#[cast-00] ---CAST('1' AS INT4); +-- #[cast-00] +-- SELECT CAST('1' AS INT); ---#[cast-01] -SELECT CAST('foo' AS STRING) AS `s` FROM `default`.`T` AS `T`; +-- #[cast-01] +-- SELECT CAST('1' AS INT); + +-- #[cast-02] +-- SELECT CAST('1' AS BIGINT); + +-- #[cast-03] +-- SELECT CAST('1' AS BIGINT); diff --git a/src/test/resources/outputs/trino/operators/cast.sql b/src/test/resources/outputs/trino/operators/cast.sql index 078fd3f..2a9a04a 100644 --- a/src/test/resources/outputs/trino/operators/cast.sql +++ b/src/test/resources/outputs/trino/operators/cast.sql @@ -1,5 +1,11 @@ -----#[cast-00] ---CAST('1' AS INT4); +--#[cast-00] +CAST('1' AS INT); --#[cast-01] -SELECT CAST('foo' AS VARCHAR) AS "s" FROM "default"."T" AS "T"; +CAST('1' AS INT); + +--#[cast-02] +CAST('1' AS BIGINT); + +--#[cast-03] +CAST('1' AS BIGINT);