From 32b5826d1afb118c5dcd67943d10ebadc6c0283f Mon Sep 17 00:00:00 2001 From: Travis Date: Fri, 28 Aug 2020 16:53:42 -0500 Subject: [PATCH] fix bug on left/right join mapping --- server/grpc_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ sql/extract.go | 4 ++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/server/grpc_test.go b/server/grpc_test.go index f3521f1e9..1b5cc415e 100644 --- a/server/grpc_test.go +++ b/server/grpc_test.go @@ -755,6 +755,46 @@ func TestQuerySQLUnary(t *testing.T) { }, eq: equal, }, + // The following cases test different paths within the `case *sqlparser.AndExpr` + // of extract.go by providing different WHERE conditions. + { + // len(left) == 2 && len(right) == 1 + // right[0].table == left[0].table + sql: "select _id from grouper g INNER JOIN joiner j ON g._id = j.grouperid where g.color = 'red' and j.jointype = 2 and g.age = 16", + exp: tableResponse{ + headers: []columnInfo{{"_id", "uint64"}}, + rows: []row{ + {[]columnResponse{uint64(8)}}, + {[]columnResponse{uint64(9)}}, + }, + }, + eq: equalUnordered, + }, + { + // len(left) == 2 && len(right) == 1 + // right[0].table == left[1].table { + sql: "select _id from grouper g INNER JOIN joiner j ON g._id = j.grouperid where j.jointype = 2 and g.color = 'red' and g.age = 16", + exp: tableResponse{ + headers: []columnInfo{{"_id", "uint64"}}, + rows: []row{ + {[]columnResponse{uint64(8)}}, + {[]columnResponse{uint64(9)}}, + }, + }, + eq: equalUnordered, + }, + { + // len(left) == 1 && len(right) == 1 && left[0].table != right[0].table + sql: "select _id from grouper g INNER JOIN joiner j ON g._id = j.grouperid where g.color = 'red' and g.age = 16 and j.jointype = 2", + exp: tableResponse{ + headers: []columnInfo{{"_id", "uint64"}}, + rows: []row{ + {[]columnResponse{uint64(8)}}, + {[]columnResponse{uint64(9)}}, + }, + }, + eq: equalUnordered, + }, } for i, test := range tests { diff --git a/sql/extract.go b/sql/extract.go index 464d69383..419811efa 100644 --- a/sql/extract.go +++ b/sql/extract.go @@ -1042,12 +1042,12 @@ func extractWheres(indexes []*pilosa.Index, tbls parseTables, expr sqlparser.Exp return []*tableWhere{left[0], right[0]}, nil } return nil, errors.Errorf("no matching table on right: %s", left[0].table.name) - } else if len(left) == 1 && len(right) == 2 { + } else if len(left) == 2 && len(right) == 1 { // if left(2) and right(1), // then intersect the 1's and return final(2) if right[0].table == left[0].table { right[0].where = Intersect(right[0].where, left[0].where) - return []*tableWhere{left[0], right[1]}, nil + return []*tableWhere{left[1], right[0]}, nil } else if right[0].table == left[1].table { right[0].where = Intersect(right[0].where, left[1].where) return []*tableWhere{left[0], right[0]}, nil