nodeInsert handles *tree.Insert nodes.
(ctx *Context, node *tree.Insert)
| 25 | |
| 26 | // nodeInsert handles *tree.Insert nodes. |
| 27 | func nodeInsert(ctx *Context, node *tree.Insert) (insert *vitess.Insert, err error) { |
| 28 | if node == nil { |
| 29 | return nil, nil |
| 30 | } |
| 31 | ctx.Auth().PushAuthType(auth.AuthType_INSERT) |
| 32 | defer ctx.Auth().PopAuthType() |
| 33 | |
| 34 | var returningExprs vitess.SelectExprs |
| 35 | if returning, ok := node.Returning.(*tree.ReturningExprs); ok { |
| 36 | // TODO: PostgreSQL will apply any triggers before returning the value; need to test this. |
| 37 | returningExprs, err = nodeSelectExprs(ctx, tree.SelectExprs(*returning)) |
| 38 | if err != nil { |
| 39 | return nil, err |
| 40 | } |
| 41 | } |
| 42 | var ignore string |
| 43 | var onDuplicate vitess.OnDup |
| 44 | |
| 45 | if node.OnConflict != nil { |
| 46 | if isIgnore(node.OnConflict) { |
| 47 | ignore = vitess.IgnoreStr |
| 48 | } else if supportedOnConflictClause(node.OnConflict) { |
| 49 | // TODO: we are ignoring the column names, which are used to infer which index under conflict is to be checked |
| 50 | updateExprs, err := nodeUpdateExprs(ctx, node.OnConflict.Exprs) |
| 51 | if err != nil { |
| 52 | return nil, err |
| 53 | } |
| 54 | for _, updateExpr := range updateExprs { |
| 55 | onDuplicate = append(onDuplicate, updateExpr) |
| 56 | } |
| 57 | } else { |
| 58 | return nil, errors.Errorf("the ON CONFLICT clause provided is not yet supported") |
| 59 | } |
| 60 | } |
| 61 | var tableName vitess.TableName |
| 62 | switch node := node.Table.(type) { |
| 63 | case *tree.AliasedTableExpr: |
| 64 | return nil, errors.Errorf("aliased inserts are not yet supported") |
| 65 | case *tree.TableName: |
| 66 | var err error |
| 67 | tableName, err = nodeTableName(ctx, node) |
| 68 | if err != nil { |
| 69 | return nil, err |
| 70 | } |
| 71 | case *tree.TableRef: |
| 72 | return nil, errors.Errorf("table refs are not yet supported") |
| 73 | default: |
| 74 | return nil, errors.Errorf("unknown table name type in INSERT: `%T`", node) |
| 75 | } |
| 76 | var columns []vitess.ColIdent |
| 77 | if len(node.Columns) > 0 { |
| 78 | columns = make([]vitess.ColIdent, len(node.Columns)) |
| 79 | for i := range node.Columns { |
| 80 | columns[i] = vitess.NewColIdent(string(node.Columns[i])) |
| 81 | } |
| 82 | } |
| 83 | with, err := nodeWith(ctx, node.With) |
| 84 | if err != nil { |
no test coverage detected