[vectorized](jdbc) fix external table of oracle have keyworld column (#15487)

if column name is keyword of oracle, the query will report error
This commit is contained in:
zhangstar333
2022-12-31 12:48:26 +08:00
committed by GitHub
parent 781fa17993
commit c47bdf6606
4 changed files with 12 additions and 2 deletions

View File

@ -96,6 +96,11 @@ public class OdbcTable extends Table {
return list.stream().map(s -> "\"" + s + "\"").collect(Collectors.joining("."));
}
private static String oracleProperName(String name) {
List<String> list = Arrays.asList(name.split("\\."));
return list.stream().map(s -> "\"" + s.toUpperCase() + "\"").collect(Collectors.joining("."));
}
public static String databaseProperName(TOdbcTableType tableType, String name) {
switch (tableType) {
case MYSQL:
@ -104,6 +109,8 @@ public class OdbcTable extends Table {
return mssqlProperName(name);
case POSTGRESQL:
return psqlProperName(name);
case ORACLE:
return oracleProperName(name);
default:
return name;
}

View File

@ -1312,7 +1312,7 @@ public class QueryPlanTest extends TestWithFeService {
// this table is Oracle ODBC table, so abs(k1) should not be pushed down
queryStr = "explain select * from odbc_oracle where k1 > 10 and abs(k1) > 10";
explainString = getSQLPlanOrErrorMsg(queryStr);
Assert.assertTrue(explainString.contains("k1 > 10"));
Assert.assertTrue(explainString.contains("\"K1\" > 10"));
Assert.assertTrue(!explainString.contains("abs(k1) > 10"));
}
@ -1352,7 +1352,7 @@ public class QueryPlanTest extends TestWithFeService {
String explainString = getSQLPlanOrErrorMsg(queryStr);
Assert.assertTrue(explainString.contains("TABLENAME IN DORIS: odbc_oracle"));
Assert.assertTrue(explainString.contains("TABLE TYPE: ORACLE"));
Assert.assertTrue(explainString.contains("TABLENAME OF EXTERNAL TABLE: tbl1"));
Assert.assertTrue(explainString.contains("TABLENAME OF EXTERNAL TABLE: \"TBL1\""));
// enable transaction of ODBC Sink
Deencapsulation.setField(connectContext.getSessionVariable(), "enableOdbcTransaction", true);