Skip to content

Commit 36847af

Browse files
authored
Fix multishard routing for Auxular expression in routing by expression (#1483)
1 parent f887e96 commit 36847af

4 files changed

Lines changed: 60 additions & 11 deletions

File tree

router/qrouter/proxy_routing.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func (qr *ProxyQrouter) computeRoutingExpr(
9393
ret = append(ret, b)
9494
return nil
9595
}
96+
9697
if len(rm.ParamRefs[*qualName][rExpr.ColRefs[i].ColName]) == 0 && len(rm.Exprs[*qualName][rExpr.ColRefs[i].ColName]) == 0 {
9798
return nil
9899
}
@@ -185,10 +186,10 @@ func (qr *ProxyQrouter) routingTuples(ctx context.Context, rm *rmeta.RoutingMeta
185186
ExecTarget: currroute,
186187
TargetSessionAttrs: tsa,
187188
})
188-
return nil
189-
}
190-
if err := rec(lvl + 1); err != nil {
191-
return err
189+
} else {
190+
if err := rec(lvl + 1); err != nil {
191+
return err
192+
}
192193
}
193194
}
194195

router/qrouter/proxy_routing_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,23 @@ func TestRoutingByExpression(t *testing.T) {
368368
assert.NoError(err)
369369

370370
for _, tt := range []tcase{
371+
{
372+
query: `
373+
WITH vals(x,y) AS (VALUES(5, 'jidw'), (100, 'jidw'))
374+
SELECT * FROM distrr_mm_test d JOIN vals v ON d.id1 = v.x AND d.id2 = v.y;`,
375+
exp: &plan.ScatterPlan{
376+
ExecTargets: []kr.ShardKey{
377+
{
378+
Name: "sh2",
379+
},
380+
{
381+
Name: "sh1",
382+
},
383+
},
384+
},
385+
err: nil,
386+
},
387+
371388
{
372389
query: "INSERT INTO distrr_mm_test (id1, id2) VALUES(100, 'jidw');",
373390
exp: &plan.ShardDispatchPlan{

test/regress/tests/router/expected/expression_routing.out

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ NOTICE: send query to shard(s) : sh4
144144
WITH vals (x, y, z) AS (VALUES(1, 'ziziziz', 32), (2, 'ziiziziziz', 32))
145145
SELECT * FROM
146146
tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y;
147-
NOTICE: send query to shard(s) : sh3
147+
NOTICE: send query to shard(s) : sh3,sh4
148148
id1 | id2 | val | x | y | z
149149
-----+------------+--------+---+------------+----
150150
1 | ziziziz | abab | 1 | ziziziz | 32
@@ -154,9 +154,34 @@ NOTICE: send query to shard(s) : sh3
154154
(4 rows)
155155

156156
-- TODO: fix
157-
--WITH vals (x, y, z) AS (VALUES (4, 'yyuyuyuyu', 32), (1, 'ziziziz', 32))
158-
-- SELECT * FROM
159-
-- tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y /* __spqr__engine_v2: true */;
157+
WITH vals (x, y, z) AS (VALUES (4, 'yyuyuyuyu', 32), (1, 'ziziziz', 32))
158+
SELECT * FROM
159+
tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y /* __spqr__engine_v2: true */;
160+
NOTICE: send query to shard(s) : sh1,sh3,sh4
161+
id1 | id2 | val | x | y | z
162+
-----+-----------+--------+---+-----------+----
163+
4 | yyuyuyuyu | ababba | 4 | yyuyuyuyu | 32
164+
4 | yyuyuyuyu | saassa | 4 | yyuyuyuyu | 32
165+
1 | ziziziz | abab | 1 | ziziziz | 32
166+
1 | ziziziz | assaas | 1 | ziziziz | 32
167+
(4 rows)
168+
169+
WITH vals (x, y, z) AS (VALUES (4, 'yyuyuyuyu', 32), (1, 'ziziziz', 32), (0, 'aba', 3), (1, 'ziziziz', 3))
170+
SELECT * FROM
171+
tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y /* __spqr__engine_v2: true */;
172+
NOTICE: send query to shard(s) : sh1,sh2,sh3,sh4
173+
id1 | id2 | val | x | y | z
174+
-----+-----------+-----------+---+-----------+----
175+
4 | yyuyuyuyu | ababba | 4 | yyuyuyuyu | 32
176+
4 | yyuyuyuyu | saassa | 4 | yyuyuyuyu | 32
177+
0 | aba | ababababb | 0 | aba | 3
178+
0 | aba | asas | 0 | aba | 3
179+
1 | ziziziz | abab | 1 | ziziziz | 3
180+
1 | ziziziz | abab | 1 | ziziziz | 32
181+
1 | ziziziz | assaas | 1 | ziziziz | 3
182+
1 | ziziziz | assaas | 1 | ziziziz | 32
183+
(8 rows)
184+
160185
UPDATE tr SET val = 1123 WHERE id1 = 1 AND id2 = 'ziziziz';
161186
NOTICE: send query to shard(s) : sh3
162187
DELETE FROM tr WHERE id1 = 1 AND id2 = 'ziziziz' RETURNING *;

test/regress/tests/router/sql/expression_routing.sql

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,15 @@ WITH vals (x, y, z) AS (VALUES(1, 'ziziziz', 32), (2, 'ziiziziziz', 32))
4747

4848

4949
-- TODO: fix
50-
--WITH vals (x, y, z) AS (VALUES (4, 'yyuyuyuyu', 32), (1, 'ziziziz', 32))
51-
-- SELECT * FROM
52-
-- tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y /* __spqr__engine_v2: true */;
50+
WITH vals (x, y, z) AS (VALUES (4, 'yyuyuyuyu', 32), (1, 'ziziziz', 32))
51+
SELECT * FROM
52+
tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y /* __spqr__engine_v2: true */;
53+
54+
55+
WITH vals (x, y, z) AS (VALUES (4, 'yyuyuyuyu', 32), (1, 'ziziziz', 32), (0, 'aba', 3), (1, 'ziziziz', 3))
56+
SELECT * FROM
57+
tr JOIN vals ON tr.id1 = vals.x AND tr.id2 = vals.y /* __spqr__engine_v2: true */;
58+
5359

5460
UPDATE tr SET val = 1123 WHERE id1 = 1 AND id2 = 'ziziziz';
5561

0 commit comments

Comments
 (0)