diff --git a/go/vt/vtgate/planbuilder/select.go b/go/vt/vtgate/planbuilder/select.go index 2a5f0c97933..66e6d3e8c9a 100644 --- a/go/vt/vtgate/planbuilder/select.go +++ b/go/vt/vtgate/planbuilder/select.go @@ -146,7 +146,7 @@ func (pb *primitiveBuilder) processSelect(sel *sqlparser.Select, outer *symtab) } func handleDualSelects(sel *sqlparser.Select, vschema ContextVSchema) (engine.Primitive, error) { - if !isOnlyDual(sel.From) { + if !isOnlyDual(sel) { return nil, nil } @@ -191,11 +191,16 @@ func buildLockingPrimitive(sel *sqlparser.Select, vschema ContextVSchema) (engin }, nil } -func isOnlyDual(from sqlparser.TableExprs) bool { - if len(from) > 1 { +func isOnlyDual(sel *sqlparser.Select) bool { + if sel.Where != nil || sel.GroupBy != nil || sel.Having != nil || sel.Limit != nil || sel.OrderBy != nil { + // we can only deal with queries without any other subclauses - just SELECT and FROM, nothing else is allowed return false } - table, ok := from[0].(*sqlparser.AliasedTableExpr) + + if len(sel.From) > 1 { + return false + } + table, ok := sel.From[0].(*sqlparser.AliasedTableExpr) if !ok { return false } diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.txt b/go/vt/vtgate/planbuilder/testdata/select_cases.txt index 17aa01ebe0c..35750f6e37d 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.txt @@ -1349,6 +1349,24 @@ } } +# don't filter on the vtgate +"select 42 from dual where false" +{ + "QueryType": "SELECT", + "Original": "select 42 from dual where false", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectReference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 42 from dual where 1 != 1", + "Query": "select 42 from dual where false", + "Table": "dual" + } +} + # testing SingleRow Projection with arithmetics "select 42+2" {