Skip to content

Commit 0ef3b6d

Browse files
Simple support for de-duplicating tuple values.
Signed-off-by: Arthur Schreiber <[email protected]>
1 parent 2836199 commit 0ef3b6d

File tree

2 files changed

+75
-53
lines changed

2 files changed

+75
-53
lines changed

go/vt/sqlparser/normalizer.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type (
4545
bindVars map[string]*querypb.BindVariable
4646
reserved *ReservedVars
4747
vals map[Literal]string
48+
tupleVals map[string]string
4849
err error
4950
inDerived int
5051
inSelect int
@@ -145,6 +146,7 @@ func newNormalizer(
145146
bindVars: bindVars,
146147
reserved: reserved,
147148
vals: make(map[Literal]string),
149+
tupleVals: make(map[string]string),
148150
bindVarNeeds: &BindVarNeeds{},
149151
keyspace: keyspace,
150152
selectLimit: selectLimit,
@@ -470,8 +472,22 @@ func (nz *normalizer) rewriteInComparisons(node *ComparisonExpr) {
470472
Value: bval.Value,
471473
})
472474
}
473-
bvname := nz.reserved.nextUnusedVar()
474-
nz.bindVars[bvname] = bvals
475+
476+
var bvname string
477+
478+
if key, err := bvals.MarshalVT(); err != nil {
479+
bvname = nz.reserved.nextUnusedVar()
480+
nz.bindVars[bvname] = bvals
481+
} else {
482+
// Check if we can find key in tuplevals
483+
if bvname, ok = nz.tupleVals[string(key)]; !ok {
484+
bvname = nz.reserved.nextUnusedVar()
485+
}
486+
487+
nz.bindVars[bvname] = bvals
488+
nz.tupleVals[string(key)] = bvname
489+
}
490+
475491
node.Right = ListArg(bvname)
476492
}
477493

go/vt/sqlparser/normalizer_test.go

Lines changed: 57 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,13 @@ func TestNormalize(t *testing.T) {
317317
"bv1": sqltypes.TestBindVariable([]any{1, "2"}),
318318
},
319319
}, {
320-
// EXPLAIN query will be normalized and not parameterized
320+
// repeated IN clause with vals
321+
in: "select * from t where v1 in (1, '2') OR v2 in (1, '2')",
322+
outstmt: "select * from t where v1 in ::bv1 or v2 in ::bv1",
323+
outbv: map[string]*querypb.BindVariable{
324+
"bv1": sqltypes.TestBindVariable([]any{1, "2"}),
325+
},
326+
}, { // EXPLAIN query will be normalized and not parameterized
321327
in: "explain select @x from t where v1 in (1, '2')",
322328
outstmt: "explain select :__vtudvx as `@x` from t where v1 in (1, '2')",
323329
outbv: map[string]*querypb.BindVariable{},
@@ -1320,9 +1326,9 @@ JOIN warehouse%d AS w ON c_w_id=w_id
13201326
WHERE w_id = %d
13211327
AND c_d_id = %d
13221328
AND c_id = %d`,
1323-
`SELECT d_next_o_id, d_tax
1324-
FROM district%d
1325-
WHERE d_w_id = %d
1329+
`SELECT d_next_o_id, d_tax
1330+
FROM district%d
1331+
WHERE d_w_id = %d
13261332
AND d_id = %d FOR UPDATE`,
13271333
`UPDATE district%d
13281334
SET d_next_o_id = %d
@@ -1332,130 +1338,130 @@ WHERE d_id = %d AND d_w_id= %d`,
13321338
VALUES (%d,%d,%d,%d,NOW(),%d,%d)`,
13331339
`INSERT INTO new_orders%d (no_o_id, no_d_id, no_w_id)
13341340
VALUES (%d,%d,%d)`,
1335-
`SELECT i_price, i_name, i_data
1341+
`SELECT i_price, i_name, i_data
13361342
FROM item%d
13371343
WHERE i_id = %d`,
1338-
`SELECT s_quantity, s_data, s_dist_%s s_dist
1339-
FROM stock%d
1344+
`SELECT s_quantity, s_data, s_dist_%s s_dist
1345+
FROM stock%d
13401346
WHERE s_i_id = %d AND s_w_id= %d FOR UPDATE`,
13411347
`UPDATE stock%d
13421348
SET s_quantity = %d
1343-
WHERE s_i_id = %d
1349+
WHERE s_i_id = %d
13441350
AND s_w_id= %d`,
13451351
`INSERT INTO order_line%d
13461352
(ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info)
13471353
VALUES (%d,%d,%d,%d,%d,%d,%d,%d,'%s')`,
13481354
`UPDATE warehouse%d
1349-
SET w_ytd = w_ytd + %d
1355+
SET w_ytd = w_ytd + %d
13501356
WHERE w_id = %d`,
13511357
`SELECT w_street_1, w_street_2, w_city, w_state, w_zip, w_name
13521358
FROM warehouse%d
13531359
WHERE w_id = %d`,
1354-
`UPDATE district%d
1355-
SET d_ytd = d_ytd + %d
1356-
WHERE d_w_id = %d
1360+
`UPDATE district%d
1361+
SET d_ytd = d_ytd + %d
1362+
WHERE d_w_id = %d
13571363
AND d_id= %d`,
1358-
`SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name
1364+
`SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name
13591365
FROM district%d
1360-
WHERE d_w_id = %d
1366+
WHERE d_w_id = %d
13611367
AND d_id = %d`,
13621368
`SELECT count(c_id) namecnt
13631369
FROM customer%d
1364-
WHERE c_w_id = %d
1370+
WHERE c_w_id = %d
13651371
AND c_d_id= %d
13661372
AND c_last='%s'`,
13671373
`SELECT c_first, c_middle, c_last, c_street_1,
13681374
c_street_2, c_city, c_state, c_zip, c_phone,
13691375
c_credit, c_credit_lim, c_discount, c_balance, c_ytd_payment, c_since
13701376
FROM customer%d
1371-
WHERE c_w_id = %d
1377+
WHERE c_w_id = %d
13721378
AND c_d_id= %d
13731379
AND c_id=%d FOR UPDATE`,
13741380
`SELECT c_data
13751381
FROM customer%d
1376-
WHERE c_w_id = %d
1382+
WHERE c_w_id = %d
13771383
AND c_d_id=%d
13781384
AND c_id= %d`,
13791385
`UPDATE customer%d
13801386
SET c_balance=%f, c_ytd_payment=%f, c_data='%s'
1381-
WHERE c_w_id = %d
1387+
WHERE c_w_id = %d
13821388
AND c_d_id=%d
13831389
AND c_id=%d`,
13841390
`UPDATE customer%d
13851391
SET c_balance=%f, c_ytd_payment=%f
1386-
WHERE c_w_id = %d
1392+
WHERE c_w_id = %d
13871393
AND c_d_id=%d
13881394
AND c_id=%d`,
13891395
`INSERT INTO history%d
13901396
(h_c_d_id, h_c_w_id, h_c_id, h_d_id, h_w_id, h_date, h_amount, h_data)
13911397
VALUES (%d,%d,%d,%d,%d,NOW(),%d,'%s')`,
13921398
`SELECT count(c_id) namecnt
13931399
FROM customer%d
1394-
WHERE c_w_id = %d
1400+
WHERE c_w_id = %d
13951401
AND c_d_id= %d
13961402
AND c_last='%s'`,
13971403
`SELECT c_balance, c_first, c_middle, c_id
13981404
FROM customer%d
1399-
WHERE c_w_id = %d
1405+
WHERE c_w_id = %d
14001406
AND c_d_id= %d
14011407
AND c_last='%s' ORDER BY c_first`,
14021408
`SELECT c_balance, c_first, c_middle, c_last
14031409
FROM customer%d
1404-
WHERE c_w_id = %d
1410+
WHERE c_w_id = %d
14051411
AND c_d_id=%d
14061412
AND c_id=%d`,
14071413
`SELECT o_id, o_carrier_id, o_entry_d
1408-
FROM orders%d
1409-
WHERE o_w_id = %d
1410-
AND o_d_id = %d
1411-
AND o_c_id = %d
1414+
FROM orders%d
1415+
WHERE o_w_id = %d
1416+
AND o_d_id = %d
1417+
AND o_c_id = %d
14121418
ORDER BY o_id DESC`,
14131419
`SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d
14141420
FROM order_line%d WHERE ol_w_id = %d AND ol_d_id = %d AND ol_o_id = %d`,
14151421
`SELECT no_o_id
1416-
FROM new_orders%d
1417-
WHERE no_d_id = %d
1418-
AND no_w_id = %d
1422+
FROM new_orders%d
1423+
WHERE no_d_id = %d
1424+
AND no_w_id = %d
14191425
ORDER BY no_o_id ASC LIMIT 1 FOR UPDATE`,
14201426
`DELETE FROM new_orders%d
1421-
WHERE no_o_id = %d
1422-
AND no_d_id = %d
1427+
WHERE no_o_id = %d
1428+
AND no_d_id = %d
14231429
AND no_w_id = %d`,
14241430
`SELECT o_c_id
1425-
FROM orders%d
1426-
WHERE o_id = %d
1427-
AND o_d_id = %d
1431+
FROM orders%d
1432+
WHERE o_id = %d
1433+
AND o_d_id = %d
14281434
AND o_w_id = %d`,
1429-
`UPDATE orders%d
1435+
`UPDATE orders%d
14301436
SET o_carrier_id = %d
1431-
WHERE o_id = %d
1432-
AND o_d_id = %d
1437+
WHERE o_id = %d
1438+
AND o_d_id = %d
14331439
AND o_w_id = %d`,
1434-
`UPDATE order_line%d
1440+
`UPDATE order_line%d
14351441
SET ol_delivery_d = NOW()
1436-
WHERE ol_o_id = %d
1437-
AND ol_d_id = %d
1442+
WHERE ol_o_id = %d
1443+
AND ol_d_id = %d
14381444
AND ol_w_id = %d`,
14391445
`SELECT SUM(ol_amount) sm
1440-
FROM order_line%d
1441-
WHERE ol_o_id = %d
1442-
AND ol_d_id = %d
1446+
FROM order_line%d
1447+
WHERE ol_o_id = %d
1448+
AND ol_d_id = %d
14431449
AND ol_w_id = %d`,
1444-
`UPDATE customer%d
1450+
`UPDATE customer%d
14451451
SET c_balance = c_balance + %f,
14461452
c_delivery_cnt = c_delivery_cnt + 1
1447-
WHERE c_id = %d
1448-
AND c_d_id = %d
1453+
WHERE c_id = %d
1454+
AND c_d_id = %d
14491455
AND c_w_id = %d`,
1450-
`SELECT d_next_o_id
1456+
`SELECT d_next_o_id
14511457
FROM district%d
14521458
WHERE d_id = %d AND d_w_id= %d`,
14531459
`SELECT COUNT(DISTINCT(s.s_i_id))
14541460
FROM stock%d AS s
1455-
JOIN order_line%d AS ol ON ol.ol_w_id=s.s_w_id AND ol.ol_i_id=s.s_i_id
1456-
WHERE ol.ol_w_id = %d
1461+
JOIN order_line%d AS ol ON ol.ol_w_id=s.s_w_id AND ol.ol_i_id=s.s_i_id
1462+
WHERE ol.ol_w_id = %d
14571463
AND ol.ol_d_id = %d
1458-
AND ol.ol_o_id < %d
1464+
AND ol.ol_o_id < %d
14591465
AND ol.ol_o_id >= %d
14601466
AND s.s_w_id= %d
14611467
AND s.s_quantity < %d `,
@@ -1466,7 +1472,7 @@ AND ol_o_id < %d AND ol_o_id >= %d`,
14661472
WHERE s_w_id = %d AND s_i_id = %d
14671473
AND s_quantity < %d`,
14681474
`SELECT min(no_o_id) mo
1469-
FROM new_orders%d
1475+
FROM new_orders%d
14701476
WHERE no_w_id = %d AND no_d_id = %d`,
14711477
`SELECT o_id FROM orders%d o, (SELECT o_c_id,o_w_id,o_d_id,count(distinct o_id) FROM orders%d WHERE o_w_id=%d AND o_d_id=%d AND o_id > 2100 AND o_id < %d GROUP BY o_c_id,o_d_id,o_w_id having count( distinct o_id) > 1 limit 1) t WHERE t.o_w_id=o.o_w_id and t.o_d_id=o.o_d_id and t.o_c_id=o.o_c_id limit 1 `,
14721478
`DELETE FROM order_line%d where ol_w_id=%d AND ol_d_id=%d AND ol_o_id=%d`,

0 commit comments

Comments
 (0)