diff --git a/src/test/java/net/snowflake/client/jdbc/PreparedStatement1IT.java b/src/test/java/net/snowflake/client/jdbc/PreparedStatement1IT.java index 56bef419f..09452649a 100644 --- a/src/test/java/net/snowflake/client/jdbc/PreparedStatement1IT.java +++ b/src/test/java/net/snowflake/client/jdbc/PreparedStatement1IT.java @@ -25,6 +25,7 @@ import java.sql.Types; import java.util.Map; import java.util.Properties; +import java.util.UUID; import net.snowflake.client.ConditionalIgnoreRule; import net.snowflake.client.RunningOnGithubAction; import net.snowflake.client.category.TestCategoryStatement; @@ -790,4 +791,74 @@ public void manualTestForPreparedStatementLogging() throws SQLException { } } } + + /** + * This test shows how to use batch requests with variant columns. Syntax + * insert into ... Select column1, ... from values (?,...) is crucial there. + */ + @Test + public void shouldUseVariantBindParametersSNOW1531307() throws SQLException { + try (Connection con = getConnection(); + Statement stmt = con.createStatement()) { + String tableName = "SNOW1531307"; + createTableForVariantBindParametersSNOW1531307(stmt, tableName); + executePreparedStatementWithBatchesSNOW1531307(con, tableName, 20); + } + } + + /** + * This test shows how to use batch requests with variant columns. Syntax + * insert into ... Select column1, ... from values (?,...) is crucial there. + * CLIENT_STAGE_ARRAY_BINDING_THRESHOLD parameter is used on session to set the minimal number of + * bind parameters to create stage file with provided parameters - it may be set only by + * administrator. + */ + @Test + @ConditionalIgnoreRule.ConditionalIgnore(condition = RunningOnGithubAction.class) + public void shouldUseVariantBindParametersWithStageSNOW1531307() throws SQLException { + try (Connection con = getConnection(); + Statement stmt = con.createStatement()) { + String tableName = "SNOW1531307"; + createTableForVariantBindParametersSNOW1531307(stmt, tableName); + + try { + stmt.execute("ALTER SESSION SET CLIENT_STAGE_ARRAY_BINDING_THRESHOLD = 10"); + executePreparedStatementWithBatchesSNOW1531307(con, tableName, 20); + } finally { + // we are planning to reuse connection so let's cleanup + stmt.execute("ALTER SESSION UNSET CLIENT_STAGE_ARRAY_BINDING_THRESHOLD"); + } + } + } + + private static void createTableForVariantBindParametersSNOW1531307( + Statement stmt, String tableName) throws SQLException { + stmt.execute( + "CREATE OR REPLACE TABLE " + + tableName + + "(id text, array variant, json1 variant, json2 variant, str variant, num variant)"); + } + + private static void executePreparedStatementWithBatchesSNOW1531307( + Connection con, String tableName, int numberOfBatches) throws SQLException { + try (PreparedStatement ps = + con.prepareStatement( + "insert into " + + tableName + + "(id, array, json1, json2, str, num) " + + "Select column1, parse_json(column2), parse_json(column3), parse_json(column4), to_variant(column5), to_variant(column6) " + + "from values(?, ?, ?, ?, ?, ?)")) { + for (int i = 0; i < numberOfBatches; i++) { + int parameterIndex = 1; + ps.setString(parameterIndex++, UUID.randomUUID().toString()); + ps.setObject(parameterIndex++, "[1,2]"); + ps.setObject(parameterIndex++, null); + ps.setObject(parameterIndex++, "{\"a\": 5}"); + ps.setObject(parameterIndex++, "bla"); + ps.setObject(parameterIndex++, 5); + ps.addBatch(); + } + assertEquals(numberOfBatches, ps.executeBatch().length); + } + } }