From ab573a9f7dac33f3358fdb75d7a19de0ff0cf6c0 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Fri, 27 Jan 2023 09:31:57 +0100 Subject: [PATCH] handle system databases other that information_schema correctly (#12175) Signed-off-by: Andres Taylor Signed-off-by: Andres Taylor --- .../vtgate/gen4/system_schema_test.go | 12 ++++ .../testdata/systemtables_cases80.json | 57 +++++++++++++++++++ go/vt/vtgate/semantics/table_collector.go | 3 +- 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/go/test/endtoend/vtgate/gen4/system_schema_test.go b/go/test/endtoend/vtgate/gen4/system_schema_test.go index 5f9bec3287f..c075479bb11 100644 --- a/go/test/endtoend/vtgate/gen4/system_schema_test.go +++ b/go/test/endtoend/vtgate/gen4/system_schema_test.go @@ -214,3 +214,15 @@ func TestMultipleSchemaPredicates(t *testing.T) { require.Error(t, err) require.Contains(t, err.Error(), "specifying two different database in the query is not supported") } + +func TestQuerySystemTables(t *testing.T) { + defer cluster.PanicHandler(t) + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + utils.Exec(t, conn, `select * from sys.sys_config`) + utils.Exec(t, conn, "select * from mysql.`db`") + utils.Exec(t, conn, "select * from performance_schema.error_log") +} diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json index 41b30d32151..84b860f7284 100644 --- a/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json @@ -1866,5 +1866,62 @@ "information_schema.key_column_usage" ] } + }, + { + "comment": "select variable, value from sys.sys_config", + "query": "select variable, value from sys.sys_config", + "plan": { + "QueryType": "SELECT", + "Original": "select variable, value from sys.sys_config", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select variable, value from sys.sys_config where 1 != 1", + "Query": "select variable, value from sys.sys_config", + "Table": "sys.sys_config" + } + } + }, + { + "comment": "select host, db from mysql.`db`", + "query": "select host, db from mysql.`db`", + "plan": { + "QueryType": "SELECT", + "Original": "select host, db from mysql.`db`", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select host, db from mysql.db where 1 != 1", + "Query": "select host, db from mysql.db", + "Table": "mysql.db" + } + } + }, + { + "comment": "select logged, prio from performance_schema.error_log", + "query": "select logged, prio from performance_schema.error_log", + "plan": { + "QueryType": "SELECT", + "Original": "select logged, prio from performance_schema.error_log", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select logged, prio from performance_schema.error_log where 1 != 1", + "Query": "select logged, prio from performance_schema.error_log", + "Table": "performance_schema.error_log" + } + } } ] diff --git a/go/vt/vtgate/semantics/table_collector.go b/go/vt/vtgate/semantics/table_collector.go index 8266287abe9..16bebf364d7 100644 --- a/go/vt/vtgate/semantics/table_collector.go +++ b/go/vt/vtgate/semantics/table_collector.go @@ -87,7 +87,8 @@ func (tc *tableCollector) up(cursor *sqlparser.Cursor) error { isInfSchema := sqlparser.SystemSchema(t.Qualifier.String()) var err error tbl, vindex, _, _, _, err = tc.si.FindTableOrVindex(t) - if err != nil { + if err != nil && !isInfSchema { + // if we are dealing with a system table, it might not be available in the vschema, but that is OK return err } if tbl == nil && vindex != nil {