@@ -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