From e8b1db3c3c1baf49355fd3d848b7e349fa7eaffa Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 24 Mar 2021 14:49:58 +0530 Subject: [PATCH 1/3] added planbuilder test case Signed-off-by: Harshit Gangal --- go/vt/vtgate/planbuilder/plan_test.go | 14 ++++++++++++++ .../planbuilder/testdata/sysschema_default.txt | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 go/vt/vtgate/planbuilder/testdata/sysschema_default.txt diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index b4a90bdc698..6d8ff1ef3e3 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -252,6 +252,20 @@ func TestWithDefaultKeyspaceFromFile(t *testing.T) { testFile(t, "call_cases.txt", testOutputTempDir, vschema, false) } +func TestWithSystemSchemaAsDefaultKeyspace(t *testing.T) { + // We are testing this separately so we can set a default keyspace + testOutputTempDir, err := ioutil.TempDir("", "plan_test") + require.NoError(t, err) + defer os.RemoveAll(testOutputTempDir) + vschema := &vschemaWrapper{ + v: loadSchema(t, "schema_test.json"), + keyspace: &vindexes.Keyspace{Name: "mysql"}, + tabletType: topodatapb.TabletType_MASTER, + } + + testFile(t, "sysschema_default.txt", testOutputTempDir, vschema, false) +} + func TestOtherPlanningFromFile(t *testing.T) { // We are testing this separately so we can set a default keyspace testOutputTempDir, err := ioutil.TempDir("", "plan_test") diff --git a/go/vt/vtgate/planbuilder/testdata/sysschema_default.txt b/go/vt/vtgate/planbuilder/testdata/sysschema_default.txt new file mode 100644 index 00000000000..f6e58dd2c18 --- /dev/null +++ b/go/vt/vtgate/planbuilder/testdata/sysschema_default.txt @@ -0,0 +1,17 @@ +# max_allowed_packet +"select @@max_allowed_packet from dual" +{ + "QueryType": "SELECT", + "Original": "select @@max_allowed_packet from dual", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectReference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select @@max_allowed_packet from dual where 1 != 1", + "Query": "select @@max_allowed_packet from dual", + "Table": "dual" + } +} From d58b562b49364f99b9ec9aa227a4465d599e8245 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 24 Mar 2021 14:51:08 +0530 Subject: [PATCH 2/3] get any keyspace if system schema is default keyspace Signed-off-by: Harshit Gangal --- go/vt/vtgate/planbuilder/plan_test.go | 18 ++++++++++++++++-- go/vt/vtgate/vcursor_impl.go | 13 ++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index 6d8ff1ef3e3..1f719d5cc20 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -381,8 +381,8 @@ func (vw *vschemaWrapper) FindTableOrVindex(tab sqlparser.TableName) (*vindexes. if err != nil { return nil, nil, destKeyspace, destTabletType, destTarget, err } - if destKeyspace == "" && vw.keyspace != nil { - destKeyspace = vw.keyspace.Name + if destKeyspace == "" { + destKeyspace = vw.getActualKeyspace() } table, vindex, err := vw.v.FindTableOrVindex(destKeyspace, tab.Name.String(), topodatapb.TabletType_MASTER) if err != nil { @@ -391,6 +391,20 @@ func (vw *vschemaWrapper) FindTableOrVindex(tab sqlparser.TableName) (*vindexes. return table, vindex, destKeyspace, destTabletType, destTarget, nil } +func (vw *vschemaWrapper) getActualKeyspace() string { + if vw.keyspace == nil { + return "" + } + if !sqlparser.SystemSchema(vw.keyspace.Name) { + return vw.keyspace.Name + } + ks, err := vw.AnyKeyspace() + if err != nil { + return "" + } + return ks.Name +} + func (vw *vschemaWrapper) DefaultKeyspace() (*vindexes.Keyspace, error) { return vw.v.Keyspaces["main"].Keyspace, nil } diff --git a/go/vt/vtgate/vcursor_impl.go b/go/vt/vtgate/vcursor_impl.go index 6124d815a3d..78a8eb40704 100644 --- a/go/vt/vtgate/vcursor_impl.go +++ b/go/vt/vtgate/vcursor_impl.go @@ -282,7 +282,7 @@ func (vc *vcursorImpl) FindTableOrVindex(name sqlparser.TableName) (*vindexes.Ta return nil, nil, "", destTabletType, nil, err } if destKeyspace == "" { - destKeyspace = vc.keyspace + destKeyspace = vc.getActualKeyspace() } table, vindex, err := vc.vschema.FindTableOrVindex(destKeyspace, name.Name.String(), vc.tabletType) if err != nil { @@ -291,6 +291,17 @@ func (vc *vcursorImpl) FindTableOrVindex(name sqlparser.TableName) (*vindexes.Ta return table, vindex, destKeyspace, destTabletType, dest, nil } +func (vc *vcursorImpl) getActualKeyspace() string { + if !sqlparser.SystemSchema(vc.keyspace) { + return vc.keyspace + } + ks, err := vc.AnyKeyspace() + if err != nil { + return "" + } + return ks.Name +} + // DefaultKeyspace returns the default keyspace of the current request // if there is one. If the keyspace specified in the target cannot be // identified, it returns an error. From dd30d847e0dfea0a62e2d2d2ab55056db5db0af7 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 24 Mar 2021 14:51:40 +0530 Subject: [PATCH 3/3] added e2e test Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/system_schema_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/go/test/endtoend/vtgate/system_schema_test.go b/go/test/endtoend/vtgate/system_schema_test.go index 5954ee5af76..1a0f3b63403 100644 --- a/go/test/endtoend/vtgate/system_schema_test.go +++ b/go/test/endtoend/vtgate/system_schema_test.go @@ -139,6 +139,7 @@ func TestConnectWithSystemSchema(t *testing.T) { connParams.DbName = dbname conn, err := mysql.Connect(ctx, &connParams) require.NoError(t, err) + exec(t, conn, `select @@max_allowed_packet from dual`) conn.Close() } } @@ -146,12 +147,12 @@ func TestConnectWithSystemSchema(t *testing.T) { func TestUseSystemSchema(t *testing.T) { defer cluster.PanicHandler(t) ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() for _, dbname := range []string{"information_schema", "mysql", "performance_schema", "sys"} { - conn, err := mysql.Connect(ctx, &vtParams) - require.NoError(t, err) - exec(t, conn, fmt.Sprintf("use %s", dbname)) - conn.Close() + exec(t, conn, `select @@max_allowed_packet from dual`) } }