MCPcopy Create free account
hub / github.com/dolthub/doltgresql / nodeInsert

Function nodeInsert

server/ast/insert.go:27–124  ·  view source on GitHub ↗

nodeInsert handles *tree.Insert nodes.

(ctx *Context, node *tree.Insert)

Source from the content-addressed store, hash-verified

25
26// nodeInsert handles *tree.Insert nodes.
27func 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 {

Callers 1

ConvertFunction · 0.85

Calls 13

SelectExprsTypeAlias · 0.92
nodeSelectExprsFunction · 0.85
isIgnoreFunction · 0.85
nodeUpdateExprsFunction · 0.85
nodeTableNameFunction · 0.85
nodeWithFunction · 0.85
nodeSelectFunction · 0.85
PushAuthTypeMethod · 0.80
AuthMethod · 0.80
PopAuthTypeMethod · 0.80
ErrorfMethod · 0.65

Tested by

no test coverage detected