Skip to content

Commit 9fff37b

Browse files
committed
Update tests for query types
1 parent 28b2a72 commit 9fff37b

File tree

4 files changed

+116
-8
lines changed

4 files changed

+116
-8
lines changed

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbPreparedStatementImplTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ public class YdbPreparedStatementImplTest {
5858
private static final String SELECT_BY_KEY_SQL = ""
5959
+ "declare $key as Optional<Int32>;\n"
6060
+ "select key, #column from #tableName where key=$key";
61+
private static final String SCAN_SELECT_BY_KEY_SQL = ""
62+
+ "declare $key as Optional<Int32>;\n"
63+
+ "scan select key, #column from #tableName where key=$key";
6164

6265
@BeforeAll
6366
public static void initTable() throws SQLException {
@@ -121,10 +124,10 @@ private PreparedStatement prepareScanSelect(String column) throws SQLException {
121124
}
122125

123126
private String scanSelectByKey(String column) throws SQLException {
124-
String sql = SELECT_BY_KEY_SQL
127+
String sql = SCAN_SELECT_BY_KEY_SQL
125128
.replaceAll("#column", column)
126129
.replaceAll("#tableName", TEST_TABLE_NAME);
127-
return "SCAN " + sql;
130+
return sql;
128131
}
129132

130133
private YdbPreparedStatement prepareSelectAll() throws SQLException {
@@ -415,15 +418,16 @@ public void executeScanQueryInTx(SqlQueries.YqlQuery mode) throws SQLException {
415418

416419
@Test
417420
public void executeScanQueryAsUpdate() throws SQLException {
418-
String sql = "SCAN " + upsertSql("c_Text", "Optional<Text>");
421+
String sql = upsertSql("c_Text", "Optional<Text>");
419422

420423
try (YdbPreparedStatement statement = jdbc.connection().unwrap(YdbConnection.class)
421424
.prepareStatement(sql, YdbPrepareMode.IN_MEMORY)
422425
.unwrap(YdbPreparedStatement.class)) {
423426
statement.setInt("key", 1);
424427
statement.setString("c_Text", "value-1");
425428

426-
ExceptionAssert.ydbConditionallyRetryable("Scan query should have a single result set", statement::execute);
429+
ExceptionAssert.ydbConditionallyRetryable("Scan query should have a single result set",
430+
statement::executeScanQuery);
427431
}
428432
}
429433

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbPreparedStatementWithDataQueryImplTest.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,19 @@ public class YdbPreparedStatementWithDataQueryImplTest {
3434
+ "declare $#column as #type;\n"
3535
+ "upsert into #tableName (key, #column) values ($key, $#column)";
3636

37+
private static final String SCAN_UPSERT_SQL = ""
38+
+ "declare $key as Optional<Int32>;\n"
39+
+ "declare $#column as #type;\n"
40+
+ "scan upsert into #tableName (key, #column) values ($key, $#column)";
41+
3742
private static final String SIMPLE_SELECT_SQL = "select key, #column from #tableName";
3843
private static final String SELECT_BY_KEY_SQL = ""
3944
+ "declare $key as Optional<Int32>;\n"
4045
+ "select key, #column from #tableName where key=$key";
4146

47+
private static final String SCAN_SELECT_BY_KEY_SQL = ""
48+
+ "declare $key as Optional<Int32>;\n"
49+
+ "scan\tselect key, #column from #tableName where key=$key";
4250
@BeforeAll
4351
public static void initTable() throws SQLException {
4452
try (Statement statement = jdbc.connection().createStatement();) {
@@ -77,6 +85,13 @@ private String upsertSql(String column, String type) {
7785
.replaceAll("#tableName", TEST_TABLE_NAME);
7886
}
7987

88+
private String scanUpsertSql(String column, String type) {
89+
return SCAN_UPSERT_SQL
90+
.replaceAll("#column", column)
91+
.replaceAll("#type", type)
92+
.replaceAll("#tableName", TEST_TABLE_NAME);
93+
}
94+
8095
private YdbPreparedStatement prepareUpsert(String column, String type) throws SQLException {
8196
return jdbc.connection().unwrap(YdbConnection.class)
8297
.prepareStatement(upsertSql(column, type));
@@ -97,10 +112,10 @@ private YdbPreparedStatement prepareSelectByKey(String column) throws SQLExcepti
97112
}
98113

99114
private YdbPreparedStatement prepareScanSelectByKey(String column) throws SQLException {
100-
String sql = SELECT_BY_KEY_SQL
115+
String sql = SCAN_SELECT_BY_KEY_SQL
101116
.replaceAll("#column", column)
102117
.replaceAll("#tableName", TEST_TABLE_NAME);
103-
return jdbc.connection().prepareStatement("scan\t" + sql)
118+
return jdbc.connection().prepareStatement(sql)
104119
.unwrap(YdbPreparedStatement.class);
105120
}
106121

@@ -217,7 +232,7 @@ public void executeScanQueryInTx() throws SQLException {
217232

218233
@Test
219234
public void executeScanQueryAsUpdate() throws SQLException {
220-
String sql = "SCAN " + upsertSql("c_Text", "Optional<Text>");
235+
String sql = scanUpsertSql("c_Text", "Optional<Text>");
221236

222237
try (YdbPreparedStatement statement = jdbc.connection().unwrap(YdbConnection.class)
223238
.prepareStatement(sql)

jdbc/src/test/java/tech/ydb/jdbc/impl/YdbStatementImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ public void executeScanQueryOnSystemTable() throws SQLException {
313313
@Test
314314
public void executeScanQueryMultiResult() {
315315
ExceptionAssert.ydbConditionallyRetryable("Scan query should have a single result set",
316-
() -> statement.executeUpdate("scan select 2 + 2;select 2 + 3")
316+
() -> statement.executeUpdate("scan select 2 + 2;scan select 2 + 3")
317317
);
318318
}
319319

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package tech.ydb.jdbc.query;
2+
3+
import java.sql.SQLException;
4+
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.Test;
7+
8+
/**
9+
*
10+
* @author Aleksandr Gorshenin
11+
*/
12+
public class QueryLexerTest {
13+
14+
private QueryType parseQuery(YdbQueryOptions opts, String sql) throws SQLException {
15+
YdbQueryBuilder builder = new YdbQueryBuilder(sql);
16+
JdbcQueryLexer.buildQuery(builder, opts);
17+
return builder.getQueryType();
18+
}
19+
20+
private void assertMixType(YdbQueryOptions opts, String types, String sql) {
21+
SQLException ex = Assertions.assertThrows(SQLException.class, () -> {
22+
YdbQueryBuilder builder = new YdbQueryBuilder(sql);
23+
JdbcQueryLexer.buildQuery(builder, opts);
24+
}, "Mix type query must throw SQLException");
25+
Assertions.assertEquals("Query cannot contain expressions with different types: " + types, ex.getMessage());
26+
}
27+
28+
@Test
29+
public void queryTypesTest() throws SQLException {
30+
YdbQueryOptions opts = new YdbQueryOptions(true, false, false, false);
31+
32+
Assertions.assertEquals(QueryType.SCHEME_QUERY, parseQuery(opts,
33+
"CREATE TABLE test_table (id int, value text)"
34+
));
35+
Assertions.assertEquals(QueryType.SCHEME_QUERY, parseQuery(opts,
36+
"\tcreate TABLE test_table2 (id int, value text);"
37+
));
38+
39+
Assertions.assertEquals(QueryType.SCHEME_QUERY, parseQuery(opts,
40+
" drop TABLE test_table1 (id int, value text);" +
41+
"ALTER TABLE test_table2 (id int, value text);"
42+
));
43+
44+
Assertions.assertEquals(QueryType.DATA_QUERY, parseQuery(opts,
45+
"SELECT id, value FROM test_table"
46+
));
47+
Assertions.assertEquals(QueryType.DATA_QUERY, parseQuery(opts,
48+
"UPSERT INTO test_table VALUES (?, ?)"
49+
));
50+
Assertions.assertEquals(QueryType.DATA_QUERY, parseQuery(opts,
51+
"DELETE FROM test_table"
52+
));
53+
Assertions.assertEquals(QueryType.DATA_QUERY, parseQuery(opts,
54+
"SELECT id, value FROM test_table;\n" +
55+
"UPSERT INTO test_table VALUES (?, ?);" +
56+
"DELETE FROM test_table"
57+
));
58+
59+
Assertions.assertEquals(QueryType.SCAN_QUERY, parseQuery(opts,
60+
"SCAN SELECT id, value FROM test_table"
61+
));
62+
63+
Assertions.assertEquals(QueryType.EXPLAIN_QUERY, parseQuery(opts,
64+
"EXPLAIN SELECT id, value FROM test_table"
65+
));
66+
}
67+
68+
@Test
69+
public void mixQueryExceptionTest() throws SQLException {
70+
YdbQueryOptions opts = new YdbQueryOptions(true, false, false, false);
71+
72+
assertMixType(opts, "SCHEME_QUERY, DATA_QUERY",
73+
"CREATE TABLE test_table (id int, value text);" +
74+
"SELECT * FROM test_table;"
75+
);
76+
77+
assertMixType(opts, "SCHEME_QUERY, DATA_QUERY",
78+
"DROP TABLE test_table (id int, value text);SELECT * FROM test_table;"
79+
);
80+
81+
assertMixType(opts, "DATA_QUERY, SCHEME_QUERY",
82+
"SELECT * FROM test_table;CREATE TABLE test_table (id int, value text);"
83+
);
84+
85+
assertMixType(opts, "DATA_QUERY, SCHEME_QUERY",
86+
"SELECT * FROM test_table;\n\tCREATE TABLE test_table (id int, value text);"
87+
);
88+
}
89+
}

0 commit comments

Comments
 (0)