byzer-org/byzer-lang

【Bug】Sql JDBC ET 变量覆盖有误

ZhengshuaiPENG opened this issue · 0 comments

背景说明

声明一个 sqlserver 的 JDBC 连接

set USER_NAME=`select aes_decrypt("2hSPXJVHGW19mMVf+WocKw==")` where type="sql" and scope="session";
set PASSPWORD=`select aes_decrypt("zxOfGfgBYAIFlchS9GcRJg==")` where type="sql"  and scope="session";
set DB_NAME = "DEMO_DB" where scope = "session";
set JDBC_URL="jdbc:sqlserver://xxxxx:1433;databaseName=${DB_NAME};encrypt=true;trustServerCertificate=true" ";


CONNECT jdbc where
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
and user= "${USER_NAME}"
and password = "${PASSWORD}"
as mssql_db_poc;

然后我们通过 SQL JDBC ET 来完成一个 ddl,比如 truncate table

run command as JDBC.`mssql_db_poc._` where 
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
and user= "${USER_NAME}"
and password = "${PASSWORD}"
and `driver-statement-0`="truncate table titanic_statistics;";

正确的行为设计

  • 这里在使用 rum command as JDBC 语句时,引用了上述语句中声明的 CONNECT 变量 mssql_db_poc, 理论上此时应该是不需要在 where 语句中声明 url/driver/username/password 等一系列变量的,是可以直接使用 mssql_db_poc 所定义的变量的。
  • 如果在 使用 rum command as JDBC 语句在where中定义了 url/driver/username/password 这一系列变量,则应该可以覆盖上述 mssql_db_poc 引用的变量。当前的行为是,mssql_db_poc 覆盖了where 语句中的声明。不符合设计

另外如果在 Connect 语句中,不在where 语句中填写 user/password ,而将 user 和 password 声明进 jdbc url 时,这种情况是可以建立和 jdbc 的连接的,并可以在 load jdbc 语句进行加载 db 中的表的。 但接下来使用 run command as JDBC 时,如果在 where 语句中的 user 和 password 中引用变量时就会报错,必须要明文,示例如下

set USER_NAME=`select aes_decrypt("2hSPXJVHGW19mMVf+WocKw==")` where type="sql" and scope="session";
set PASSPWORD=`select aes_decrypt("zxOfGfgBYAIFlchS9GcRJg==")` where type="sql"  and scope="session";
set DB_NAME = "DEMO_DB" where scope = "session";

set JDBC_URL="jdbc:sqlserver://xxxxx:1433;databaseName=${DB_NAME};user=${USER_NAME};password=${PASSWORD};encrypt=true;trustServerCertificate=true" ";


CONNECT jdbc where
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
as mssql_db_poc;

然后我们通过 SQL JDBC ET 来完成一个 ddl,比如 truncate table

run command as JDBC.`mssql_db_poc._` where 
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
and user= "${USER_NAME}"
and password = "${PASSWORD}"
and `driver-statement-0`="truncate table titanic_statistics;";

这样写的话,就会报错,必须要在where 语句中显式的写 user 和 password 的值