@@ -153,11 +153,55 @@ void testExecuteScriptWithParameters() throws SQLException {
153153 script.execute(param1, param2);
154154 final Statement statement = this.adminConnection.createStatement();
155155 final ResultSet result = statement.executeQuery("SELECT * FROM " + table.getFullyQualifiedName());
156- assertAll(() -> assertThat("Result has entry", result.next(), equalTo(true)),
156+ assertThat("Result has entry", result.next(), equalTo(true));
157+ assertAll(//
157158 () -> assertThat(result.getString(1), equalTo(param1)),
158159 () -> assertThat(result.getDouble(2), equalTo(param2)));
159160 }
160161
162+ // [itest->dsn~running-scripts-that-have-no-return~1]
163+ @ParameterizedTest
164+ @ValueSource(strings = { "test", "test \"quoted\"", "test 'quoted'", "lots'''of'single''quotes", "test \\\"",
165+ "test \\" })
166+ void testExecuteScriptWithStringParameters(final String parameterValue) throws SQLException {
167+ final ExasolSchema exasolSchema = (ExasolSchema) this.factory
168+ .createSchema("PARENT_SCHEMA_FOR_SCRIPT_WITH_PARAMETERS_2");
169+ final Table table = exasolSchema.createTable("LUA_RESULT_OF_QUOTING_TESTS", "A", "VARCHAR(40)");
170+ final String content = "query([[INSERT INTO " + table.getFullyQualifiedName() + " VALUES (:p1)]], {p1=param1})";
171+ final Script script = exasolSchema.createScript("LUA_SCRIPT_FOR_QUOTING_TEST", content, "param1");
172+ try {
173+ script.execute(parameterValue);
174+ final Statement statement = this.adminConnection.createStatement();
175+ final ResultSet result = statement.executeQuery("SELECT * FROM " + table.getFullyQualifiedName());
176+ assertThat("Result has entry", result.next(), equalTo(true));
177+ assertThat(result.getString(1), equalTo(parameterValue));
178+ } finally {
179+ script.drop();
180+ table.drop();
181+ exasolSchema.drop();
182+ }
183+ }
184+
185+ @Test
186+ void testExecuteScriptWithNullParameter() throws SQLException {
187+ final ExasolSchema exasolSchema = (ExasolSchema) this.factory
188+ .createSchema("PARENT_SCHEMA_FOR_SCRIPT_WITH_NULL_PARAMETER");
189+ final Table table = exasolSchema.createTable("LUA_RESULT_OF_NULL_SCRIPT_EXEC_TEST", "A", "VARCHAR(40)");
190+ final String content = "query([[INSERT INTO " + table.getFullyQualifiedName() + " VALUES (:p1)]], {p1=param1})";
191+ final Script script = exasolSchema.createScript("LUA_SCRIPT_FOR_NULL_SCRIPT_EXEC_TEST", content, "param1");
192+ try {
193+ script.execute((Object) null);
194+ final Statement statement = this.adminConnection.createStatement();
195+ final ResultSet result = statement.executeQuery("SELECT * FROM " + table.getFullyQualifiedName());
196+ assertThat("Result has entry", result.next(), equalTo(true));
197+ assertThat(result.getString(1), equalTo(null));
198+ } finally {
199+ script.drop();
200+ table.drop();
201+ exasolSchema.drop();
202+ }
203+ }
204+
161205 @Test
162206 void testExecuteScriptReturningRowCount() {
163207 final ExasolSchema exasolSchema = (ExasolSchema) this.factory
@@ -180,6 +224,35 @@ void testExecuteScriptReturningTable() {
180224 assertThat(result, contains(contains("foo", true), contains("bar", false)));
181225 }
182226
227+ @Test
228+ void testExecuteScriptWithArrayParameter() {
229+ final ExasolSchema exasolSchema = (ExasolSchema) this.factory
230+ .createSchema("PARENT_SCHEMA_FOR_SCRIPT_WITH_ARRAY_PARAMETER");
231+ final Script script = exasolSchema.createScriptBuilder("SUM_UP") //
232+ .arrayParameter("operands") //
233+ .content("s = 0\n" //
234+ + "for _, operand in ipairs(operands) do\n" //
235+ + " s = s + operand\n" //
236+ + "end\n" //
237+ + "exit({rows_affected = s})") //
238+ .build();
239+ final int sum = script.execute(List.of(1, 2, 3, 4, 5));
240+ assertThat(sum, equalTo(15));
241+ }
242+
243+ @ValueSource(booleans = { true, false })
244+ @ParameterizedTest
245+ void testExecuteScriptThrowsExceptionOnLuaError(final boolean returnsTable) {
246+ final ExasolSchema exasolSchema = (ExasolSchema) this.factory.createSchema(
247+ "PARENT_SCHEMA_FOR_SCRIPT" + (returnsTable ? "_RETURING_TABLE" : "") + "_THROWING_EXCEPTION");
248+ final Script.Builder builder = exasolSchema.createScriptBuilder("LUA_SCRIPT").content("error()");
249+ if (returnsTable) {
250+ builder.returnsTable();
251+ }
252+ final Script build = builder.build();
253+ assertThrows(DatabaseObjectException.class, build::executeQuery);
254+ }
255+
183256 @Test
184257 // [itest->dsn~creating-udfs~1]
185258 void testCreateUdf() throws SQLException {
@@ -252,35 +325,6 @@ private ResultSet getScriptDescription(final ExasolSchema exasolSchema) throws S
252325 return result;
253326 }
254327
255- @ValueSource(booleans = { true, false })
256- @ParameterizedTest
257- void testExecuteScriptThrowsException(final boolean returnsTable) {
258- final ExasolSchema exasolSchema = (ExasolSchema) this.factory.createSchema(
259- "PARENT_SCHEMA_FOR_SCRIPT" + (returnsTable ? "_RETURING_TABLE" : "") + "_THROWING_EXCEPTION");
260- final Script.Builder builder = exasolSchema.createScriptBuilder("LUA_SCRIPT").content("error()");
261- if (returnsTable) {
262- builder.returnsTable();
263- }
264- final Script build = builder.build();
265- assertThrows(DatabaseObjectException.class, build::executeQuery);
266- }
267-
268- @Test
269- void testExecuteScriptWithArrayParameter() {
270- final ExasolSchema exasolSchema = (ExasolSchema) this.factory
271- .createSchema("PARENT_SCHEMA_FOR_SCRIPT_WITH_ARRAY_PARAMETER");
272- final Script script = exasolSchema.createScriptBuilder("SUM_UP") //
273- .arrayParameter("operands") //
274- .content("s = 0\n" //
275- + "for i=1, #operands do\n" //
276- + " s = s + operands[i]\n" //
277- + "end\n" //
278- + "exit({rows_affected=s})") //
279- .build();
280- final int sum = script.execute(List.of(1, 2, 3, 4, 5));
281- assertThat(sum, equalTo(15));
282- }
283-
284328 @Test
285329 // [itest->dsn~creating-database-users~1]
286330 void testCreateLoginUser() throws SQLException {
@@ -427,4 +471,4 @@ private static String getTableSysName(final DatabaseObject object) {
427471 }
428472 }
429473 }
430- }
474+ }
0 commit comments