Skip to content

Commit 9d61683

Browse files
authored
Revert "clean up func getPkValueExpr" (#14522)
Reverts #14378
1 parent 0801f6b commit 9d61683

File tree

2 files changed

+56
-105
lines changed

2 files changed

+56
-105
lines changed

pkg/sql/plan/build_constraint_util.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,14 @@ func setTableExprToDmlTableInfo(ctx CompilerContext, tbl tree.TableExpr, tblInfo
210210
tbl = aliasTbl.Expr
211211
}
212212

213-
if joinTbl, ok := tbl.(*tree.JoinTableExpr); ok {
213+
if jionTbl, ok := tbl.(*tree.JoinTableExpr); ok {
214214
tblInfo.needAggFilter = true
215-
err := setTableExprToDmlTableInfo(ctx, joinTbl.Left, tblInfo, aliasMap, withMap)
215+
err := setTableExprToDmlTableInfo(ctx, jionTbl.Left, tblInfo, aliasMap, withMap)
216216
if err != nil {
217217
return err
218218
}
219-
if joinTbl.Right != nil {
220-
return setTableExprToDmlTableInfo(ctx, joinTbl.Right, tblInfo, aliasMap, withMap)
219+
if jionTbl.Right != nil {
220+
return setTableExprToDmlTableInfo(ctx, jionTbl.Right, tblInfo, aliasMap, withMap)
221221
}
222222
return nil
223223
}

pkg/sql/plan/build_insert.go

Lines changed: 52 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,6 @@ func getPkValueExpr(builder *QueryBuilder, ctx CompilerContext, tableDef *TableD
301301
var insertRowIdx int
302302
var pkColIdx int
303303

304-
// handles UUID types specifically by creating a VARCHAR type and casting the UUID to a string.
305-
// If the expression is nil, it creates a constant expression with either the UUID value or a constant value.
306304
for insertRowIdx, pkColIdx = range pkPosInValues {
307305
valExprs := make([]*Expr, rowsCount)
308306
rowTyp := bat.Vecs[insertRowIdx].GetType()
@@ -360,35 +358,7 @@ func getPkValueExpr(builder *QueryBuilder, ctx CompilerContext, tableDef *TableD
360358
}
361359

362360
if pkColLength == 1 {
363-
if rowsCount <= 3 {
364-
// pk = a1 or pk = a2 or pk = a3
365-
var orExpr *Expr
366-
for i := 0; i < rowsCount; i++ {
367-
expr, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "=", []*Expr{{
368-
Typ: colTyp,
369-
Expr: &plan.Expr_Col{
370-
Col: &ColRef{
371-
ColPos: int32(pkColIdx),
372-
Name: tableDef.Pkey.PkeyColName,
373-
},
374-
},
375-
}, colExprs[0][i]})
376-
if err != nil {
377-
return nil
378-
}
379-
380-
if i == 0 {
381-
orExpr = expr
382-
} else {
383-
orExpr, err = BindFuncExprImplByPlanExpr(builder.GetContext(), "or", []*Expr{orExpr, expr})
384-
if err != nil {
385-
return nil
386-
}
387-
}
388-
}
389-
return []*Expr{orExpr}
390-
} else {
391-
// pk in (a1, a2, a3)
361+
if rowsCount > 1 {
392362
// args in list must be constant
393363
expr, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "in", []*Expr{{
394364
Typ: colTyp,
@@ -416,13 +386,58 @@ func getPkValueExpr(builder *QueryBuilder, ctx CompilerContext, tableDef *TableD
416386
return nil
417387
}
418388
return []*Expr{expr}
389+
} else {
390+
var orExpr *Expr
391+
for i := 0; i < rowsCount; i++ {
392+
expr, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "=", []*Expr{{
393+
Typ: colTyp,
394+
Expr: &plan.Expr_Col{
395+
Col: &ColRef{
396+
ColPos: int32(pkColIdx),
397+
Name: tableDef.Pkey.PkeyColName,
398+
},
399+
},
400+
}, colExprs[0][i]})
401+
if err != nil {
402+
return nil
403+
}
404+
405+
if i == 0 {
406+
orExpr = expr
407+
} else {
408+
orExpr, err = BindFuncExprImplByPlanExpr(builder.GetContext(), "or", []*Expr{orExpr, expr})
409+
if err != nil {
410+
return nil
411+
}
412+
}
413+
}
414+
return []*Expr{orExpr}
419415
}
420416
} else {
421-
var orExpr *Expr
422-
if rowsCount <= 3 {
423-
// ppk1 = a1 and ppk2 = a2 or ppk1 = b1 and ppk2 = b2 or ppk1 = c1 and ppk2 = c2
424-
var andExpr *Expr
417+
// multi cols pk & one row for insert
418+
if rowsCount == 1 {
419+
filterExprs := make([]*Expr, pkColLength)
420+
for insertRowIdx, pkColIdx = range pkPosInValues {
421+
expr, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "=", []*Expr{{
422+
Typ: tableDef.Cols[insertRowIdx].Typ,
423+
Expr: &plan.Expr_Col{
424+
Col: &ColRef{
425+
ColPos: int32(pkColIdx),
426+
Name: tableDef.Cols[insertRowIdx].Name,
427+
},
428+
},
429+
}, colExprs[pkColIdx][0]})
430+
if err != nil {
431+
return nil
432+
}
433+
filterExprs[pkColIdx] = expr
434+
}
435+
return filterExprs
436+
} else {
437+
// seems serial function have poor performance. we have to use or function
438+
var orExpr *Expr
425439
for i := 0; i < rowsCount; i++ {
440+
var andExpr *Expr
426441
for insertRowIdx, pkColIdx = range pkPosInValues {
427442
eqExpr, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "=", []*Expr{{
428443
Typ: tableDef.Cols[insertRowIdx].Typ,
@@ -436,6 +451,7 @@ func getPkValueExpr(builder *QueryBuilder, ctx CompilerContext, tableDef *TableD
436451
if err != nil {
437452
return nil
438453
}
454+
439455
if andExpr == nil {
440456
andExpr = eqExpr
441457
} else {
@@ -445,6 +461,7 @@ func getPkValueExpr(builder *QueryBuilder, ctx CompilerContext, tableDef *TableD
445461
}
446462
}
447463
}
464+
448465
if i == 0 {
449466
orExpr = andExpr
450467
} else {
@@ -455,72 +472,6 @@ func getPkValueExpr(builder *QueryBuilder, ctx CompilerContext, tableDef *TableD
455472
}
456473
}
457474
return []*Expr{orExpr}
458-
} else {
459-
// __cpkey__ in (serial(a1,b1,c1,d1),serial(a2,b2,c2,d2),xxx)
460-
inExprs := make([]*plan.Expr, rowsCount)
461-
462-
// serialize
463-
for i := 0; i < rowsCount; i++ {
464-
serExprs := make([]*plan.Expr, 0, len(pkPosInValues))
465-
for insertRowIdx, pkColIdx := range pkPosInValues {
466-
serExprs = append(serExprs, &plan.Expr{
467-
Typ: tableDef.Cols[insertRowIdx].Typ,
468-
Expr: &plan.Expr_Col{
469-
Col: &ColRef{
470-
ColPos: int32(pkColIdx),
471-
Name: tableDef.Cols[insertRowIdx].Name,
472-
},
473-
},
474-
})
475-
}
476-
cpk, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "serial", []*Expr{
477-
{
478-
Expr: &plan.Expr_List{
479-
List: &plan.ExprList{
480-
List: serExprs,
481-
},
482-
},
483-
Typ: &plan.Type{
484-
Id: int32(types.T_tuple),
485-
},
486-
},
487-
})
488-
if err != nil {
489-
return nil
490-
}
491-
inExprs[i] = cpk
492-
}
493-
494-
expr, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "in", []*Expr{
495-
{
496-
Typ: colTyp,
497-
Expr: &plan.Expr_Col{
498-
Col: &ColRef{
499-
ColPos: int32(len(pkPosInValues)),
500-
Name: tableDef.Pkey.PkeyColName,
501-
},
502-
},
503-
}, {
504-
Expr: &plan.Expr_List{
505-
List: &plan.ExprList{
506-
List: inExprs,
507-
},
508-
},
509-
Typ: &plan.Type{
510-
Id: int32(types.T_tuple),
511-
},
512-
},
513-
})
514-
if err != nil {
515-
return nil
516-
}
517-
518-
expr2, err := ConstantFold(batch.EmptyForConstFoldBatch, expr, proc, false)
519-
if err != nil {
520-
return nil
521-
}
522-
523-
return []*Expr{expr2}
524475
}
525476
}
526477
}

0 commit comments

Comments
 (0)