wangzhigang1999 commented on code in PR #7419:
URL: https://github.com/apache/kyuubi/pull/7419#discussion_r3151638435
##########
externals/kyuubi-jdbc-engine/src/main/scala/org/apache/kyuubi/engine/jdbc/dialect/JdbcDialect.scala:
##########
@@ -82,6 +82,20 @@ abstract class JdbcDialect extends SupportServiceLoader with
Logging {
def getSchemaHelper(): SchemaHelper
+ /**
+ * Switch the current database on the backend connection.
+ *
+ * Called during session open when the client specified a database in the
connection URL
+ * (populated by the Hive JDBC driver into `USE_DATABASE`). Dialects that
support an
+ * in-session database context switch (e.g. MySQL's `USE db`) should
override this and
+ * return `true` on success; the default is a no-op that returns `false`,
meaning the
+ * backend has no notion of "current database" that applies to this session.
+ *
+ * The return value is used by `JdbcOperationManager` to decide whether the
requested
+ * database can be treated as the effective schema filter for metadata
operations.
+ */
+ def setCurrentDatabase(connection: Connection, database: String): Boolean =
false
Review Comment:
Good question — looked into this and it's a bit subtle. `setSchema` doesn't
reliably work for the MySQL family in mysql-connector-j's default config: the
[`databaseTerm` connection
property](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)
selects which of `setCatalog` / `setSchema` actually switches the session
database (the other returns without effect for that mode). Verified by
black-box testing — under default config calling `setSchema` alone does not
change the session database, reproducing the original bug. This also affects
`StarRocksDialect` / `DorisDialect` since they share the same driver — the
property is driver-side, not a server feature.
Two options I'm considering, happy to take direction:
**Option A — keep `USE db` as-is** in `MySQLDialect` (current PR). Simple,
always works regardless of driver config, but it's hand-rolled SQL.
**Option B — go through JDBC standard API, MySQL-family only**:
Keep `JdbcDialect.setCurrentDatabase` as the default no-op returning `false`
(PG / Oracle / etc. unchanged from this PR). Only `MySQLDialect` overrides it:
```scala
// MySQLDialect: invoke both — under mysql-connector-j the databaseTerm
// property selects which one actually switches the database, so calling
// both ensures the switch happens regardless of how the user configured
// the URL. Inherited by StarRocksDialect / DorisDialect.
override def setCurrentDatabase(connection: Connection, database: String):
Boolean = {
connection.setCatalog(database)
connection.setSchema(database)
true
}
```
This still avoids the hand-rolled `USE` SQL and goes through the JDBC
standard API, but doesn't touch any non-MySQL dialect's behavior.
WDYT?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]