diff --git a/presto-docs/src/main/sphinx/connector/singlestore.rst b/presto-docs/src/main/sphinx/connector/singlestore.rst index 3545bd3d99ee1..f55999410da90 100644 --- a/presto-docs/src/main/sphinx/connector/singlestore.rst +++ b/presto-docs/src/main/sphinx/connector/singlestore.rst @@ -75,6 +75,50 @@ For :doc:`/sql/create-table` statement, the default table type is ``columnstore` The table type can be configured by setting the ``default_table_type`` engine variable, see `Creating a Columnstore Table `_. +SingleStore to PrestoDB type mapping +------------------------------------ + +Map of SingleStore types to the relevant PrestoDB types: + +.. list-table:: SingleStore to PrestoDB type mapping + :widths: 50, 50 + :header-rows: 1 + + * - SingleStore type + - PrestoDB type + * - ``BOOLEAN`` + - ``BOOLEAN`` + * - ``INTEGER`` + - ``INTEGER`` + * - ``FLOAT`` + - ``REAL`` + * - ``DOUBLE`` + - ``DOUBLE`` + * - ``DECIMAL`` + - ``DECIMAL`` + * - ``LARGETEXT`` + - ``VARCHAR (unbounded)`` + * - ``VARCHAR(len)`` + - ``VARCHAR(len) len < 21845`` + * - ``CHAR(len)`` + - ``CHAR(len)`` + * - ``MEDIUMTEXT`` + - ``VARCHAR(len) 21845 <= len < 5592405`` + * - ``LARGETEXT`` + - ``VARCHAR(len) 5592405 <= len < 1431655765`` + * - ``MEDIUMBLOB`` + - ``VARBINARY`` + * - ``UUID`` + - ``UUID`` + * - ``DATE`` + - ``DATE`` + * - ``TIME`` + - ``TIME`` + * - ``DATETIME`` + - ``TIMESTAMP`` + +No other types are supported. + The following SQL statements are not supported: * :doc:`/sql/alter-schema` diff --git a/presto-singlestore/src/main/java/com/facebook/presto/plugin/singlestore/SingleStoreClient.java b/presto-singlestore/src/main/java/com/facebook/presto/plugin/singlestore/SingleStoreClient.java index 2e8c4d2290973..a4228026ff214 100644 --- a/presto-singlestore/src/main/java/com/facebook/presto/plugin/singlestore/SingleStoreClient.java +++ b/presto-singlestore/src/main/java/com/facebook/presto/plugin/singlestore/SingleStoreClient.java @@ -22,6 +22,8 @@ import com.facebook.presto.plugin.jdbc.JdbcConnectorId; import com.facebook.presto.plugin.jdbc.JdbcIdentity; import com.facebook.presto.plugin.jdbc.JdbcTableHandle; +import com.facebook.presto.plugin.jdbc.JdbcTypeHandle; +import com.facebook.presto.plugin.jdbc.mapping.ReadMapping; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.ConnectorTableMetadata; import com.facebook.presto.spi.PrestoException; @@ -34,6 +36,7 @@ import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.util.Collection; import java.util.Optional; import java.util.Properties; @@ -44,8 +47,11 @@ import static com.facebook.presto.common.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; import static com.facebook.presto.common.type.UuidType.UUID; import static com.facebook.presto.common.type.VarbinaryType.VARBINARY; +import static com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType; import static com.facebook.presto.common.type.Varchars.isVarcharType; import static com.facebook.presto.plugin.jdbc.JdbcErrorCode.JDBC_ERROR; +import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.varbinaryReadMapping; +import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.varcharReadMapping; import static com.facebook.presto.spi.StandardErrorCode.ALREADY_EXISTS; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; import static com.google.common.util.concurrent.MoreExecutors.directExecutor; @@ -143,21 +149,36 @@ protected String toSqlType(Type type) if (varcharType.isUnbounded()) { return "longtext"; } - if (varcharType.getLengthSafe() <= 255) { - return "tinytext"; + if (varcharType.getLengthSafe() <= 21844) { + // 21844 is the maximum length a singlestore varchar supports. + return super.toSqlType(type); } - if (varcharType.getLengthSafe() <= 65535) { - return "text"; - } - if (varcharType.getLengthSafe() <= 16777215) { + if (varcharType.getLengthSafe() <= 5592405) { // 16MB return "mediumtext"; } - return "longtext"; + if (varcharType.getLengthSafe() <= 1431655765) { // 100MB to 1GB + return "longtext"; // max = 1431655765 + } + else { + throw new PrestoException(NOT_SUPPORTED, "Unsupported column width: " + varcharType.getLengthSafe()); + } } return super.toSqlType(type); } + @Override + public Optional toPrestoType(ConnectorSession session, JdbcTypeHandle typeHandle) + { + switch (typeHandle.getJdbcType()) { + case Types.CLOB: + return Optional.of(varcharReadMapping(createUnboundedVarcharType())); + case Types.BLOB: + return Optional.of(varbinaryReadMapping()); + } + return super.toPrestoType(session, typeHandle); + } + @Override public void createTable(ConnectorSession session, ConnectorTableMetadata tableMetadata) { diff --git a/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreDistributedQueries.java b/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreDistributedQueries.java index dbe8acb45a5bb..c5baeecb4a52e 100644 --- a/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreDistributedQueries.java +++ b/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreDistributedQueries.java @@ -65,19 +65,17 @@ public final void destroy() public void testShowColumns(@Optional("PARQUET") String storageFormat) { MaterializedResult actual = computeActual("SHOW COLUMNS FROM orders"); - MaterializedResult expectedParametrizedVarchar = resultBuilder(getSession(), VARCHAR, VARCHAR, VARCHAR, VARCHAR, BIGINT, BIGINT, BIGINT) .row("orderkey", "bigint", "", "", 19L, null, null) .row("custkey", "bigint", "", "", 19L, null, null) - .row("orderstatus", "varchar(85)", "", "", null, null, 85L)//utf8 + .row("orderstatus", "varchar(1)", "", "", null, null, 1L)//utf8 .row("totalprice", "double", "", "", 53L, null, null) .row("orderdate", "date", "", "", null, null, null) - .row("orderpriority", "varchar(85)", "", "", null, null, 85L) - .row("clerk", "varchar(85)", "", "", null, null, 85L) + .row("orderpriority", "varchar(15)", "", "", null, null, 15L) + .row("clerk", "varchar(15)", "", "", null, null, 15L) .row("shippriority", "integer", "", "", 10L, null, null) - .row("comment", "varchar(85)", "", "", null, null, 85L) + .row("comment", "varchar(79)", "", "", null, null, 79L) .build(); - assertEquals(actual, expectedParametrizedVarchar); } diff --git a/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreIntegrationSmokeTest.java b/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreIntegrationSmokeTest.java index d0b2a486d5709..d2f9c8c329707 100644 --- a/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreIntegrationSmokeTest.java +++ b/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreIntegrationSmokeTest.java @@ -65,17 +65,16 @@ public void testDescribeTable() { // we need specific implementation of this tests due to specific Presto<->SingleStore varchar length mapping. MaterializedResult actualColumns = computeActual("DESC ORDERS").toTestTypes(); - MaterializedResult expectedColumns = MaterializedResult.resultBuilder(getQueryRunner().getDefaultSession(), VARCHAR, VARCHAR, VARCHAR, VARCHAR, BIGINT, BIGINT, BIGINT) .row("orderkey", "bigint", "", "", 19L, null, null) .row("custkey", "bigint", "", "", 19L, null, null) - .row("orderstatus", "varchar(85)", "", "", null, null, 85L)//utf-8 + .row("orderstatus", "varchar(1)", "", "", null, null, 1L)//utf-8 .row("totalprice", "double", "", "", 53L, null, null) .row("orderdate", "date", "", "", null, null, null) - .row("orderpriority", "varchar(85)", "", "", null, null, 85L) - .row("clerk", "varchar(85)", "", "", null, null, 85L) + .row("orderpriority", "varchar(15)", "", "", null, null, 15L) + .row("clerk", "varchar(15)", "", "", null, null, 15L) .row("shippriority", "integer", "", "", 10L, null, null) - .row("comment", "varchar(85)", "", "", null, null, 85L) + .row("comment", "varchar(79)", "", "", null, null, 79L) .build(); assertEquals(actualColumns, expectedColumns); } diff --git a/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreTypeMapping.java b/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreTypeMapping.java index 11730c87b3684..7f91aafe26f9c 100644 --- a/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreTypeMapping.java +++ b/presto-singlestore/src/test/java/com/facebook/presto/plugin/singlestore/TestSingleStoreTypeMapping.java @@ -95,12 +95,12 @@ public void testBasicTypes() public void testPrestoCreatedParameterizedVarchar() { DataTypeTest.create() - .addRoundTrip(stringDataType("varchar(10)", createVarcharType(255 / 3)), "text_a")//utf-8 - .addRoundTrip(stringDataType("varchar(255)", createVarcharType(255 / 3)), "text_b") - .addRoundTrip(stringDataType("varchar(256)", createVarcharType(65535 / 3)), "text_c") - .addRoundTrip(stringDataType("varchar(65535)", createVarcharType(65535 / 3)), "text_d") - .addRoundTrip(stringDataType("varchar(65536)", createVarcharType(16777215 / 3)), "text_e") - .addRoundTrip(stringDataType("varchar(16777215)", createVarcharType(16777215 / 3)), "text_f") + .addRoundTrip(stringDataType("varchar(10)", createVarcharType(10)), "text_a")//utf-8 + .addRoundTrip(stringDataType("varchar(255)", createVarcharType(255)), "text_b") + .addRoundTrip(stringDataType("varchar(21844)", createVarcharType(21844)), "text_c") + .addRoundTrip(stringDataType("varchar(21846)", createVarcharType(5592405)), "text_d") + .addRoundTrip(stringDataType("varchar(65536)", createVarcharType(5592405)), "text_e") + .addRoundTrip(stringDataType("varchar(16777215)", createVarcharType(1431655765)), "text_f") .execute(getQueryRunner(), prestoCreateAsSelect("presto_test_parameterized_varchar")); }