Skip to content

Commit abc27ff

Browse files
returning-star (#556)
Summary: - Support for `RETURNING *`. - Added robot test `Insert Returning Star`. - Added robot test `Insert Async Returning Star`. - Added robot test `Update Returning Star`. - Added robot test `Update Async Returning Star`. - Added robot test `Replace Returning Star`. - Added robot test `Replace Async Returning Star`.
1 parent cab2314 commit abc27ff

File tree

5 files changed

+216
-20
lines changed

5 files changed

+216
-20
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ require (
1919
github.com/spf13/cobra v1.4.0
2020
github.com/spf13/pflag v1.0.5
2121
github.com/spf13/viper v1.10.1
22-
github.com/stackql/any-sdk v0.1.4-alpha12
22+
github.com/stackql/any-sdk v0.1.4-beta03
2323
github.com/stackql/go-suffix-map v0.0.1-alpha01
2424
github.com/stackql/psql-wire v0.1.1-beta23
2525
github.com/stackql/stackql-parser v0.0.15-alpha06

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
484484
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
485485
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
486486
github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
487-
github.com/stackql/any-sdk v0.1.4-alpha12 h1:SozoNb4+7+y+0bVGmO8ozFtTTpYhEWBHVDuN9SmkFuA=
488-
github.com/stackql/any-sdk v0.1.4-alpha12/go.mod h1:AKS/g28y7m4SWL/YW8veE9MCNy8XJgaicVibemVE9e8=
487+
github.com/stackql/any-sdk v0.1.4-beta03 h1:hEpVc04jQ2BgfiyIxBVB1K4cyzjlc2BL6dH/Of4jRMU=
488+
github.com/stackql/any-sdk v0.1.4-beta03/go.mod h1:AKS/g28y7m4SWL/YW8veE9MCNy8XJgaicVibemVE9e8=
489489
github.com/stackql/go-suffix-map v0.0.1-alpha01 h1:TDUDS8bySu41Oo9p0eniUeCm43mnRM6zFEd6j6VUaz8=
490490
github.com/stackql/go-suffix-map v0.0.1-alpha01/go.mod h1:QAi+SKukOyf4dBtWy8UMy+hsXXV+yyEE4vmBkji2V7g=
491491
github.com/stackql/psql-wire v0.1.1-beta23 h1:1ayYMjZArfDcIMyEOKnm+Bp1zRCISw8pguvTFuUhhVQ=

internal/stackql/parserutil/parser_util.go

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,24 @@ func ExtractSelectColumnNames(selStmt *sqlparser.Select, formatter sqlparser.Nod
9090

9191
func ExtractInsertReturningColumnNames(
9292
insertStmt *sqlparser.Insert,
93+
starColumns []string,
94+
formatter sqlparser.NodeFormatter,
95+
) ([]ColumnHandle, error) {
96+
return extractInsertReturningColumnNames(
97+
insertStmt.SelectExprs,
98+
starColumns,
99+
formatter,
100+
)
101+
}
102+
103+
func extractInsertReturningColumnNames(
104+
returningExprs sqlparser.SelectExprs,
105+
starColumns []string,
93106
formatter sqlparser.NodeFormatter,
94107
) ([]ColumnHandle, error) {
95108
var colNames []ColumnHandle
96109
var err error
97-
for _, node := range insertStmt.SelectExprs {
110+
for _, node := range returningExprs {
98111
switch node := node.(type) {
99112
case *sqlparser.AliasedExpr:
100113
cn, cErr := inferColNameFromExpr(node.Expr, formatter, node.As.GetRawVal())
@@ -103,29 +116,37 @@ func ExtractInsertReturningColumnNames(
103116
}
104117
colNames = append(colNames, cn)
105118
case *sqlparser.StarExpr:
119+
if len(starColumns) == 0 {
120+
return nil, fmt.Errorf("no star columns provided for insert returning of star")
121+
}
122+
prefix := node.TableName.GetRawVal()
123+
for _, colName := range starColumns {
124+
if prefix != "" {
125+
colName = prefix + "." + colName
126+
}
127+
colNames = append(colNames, ColumnHandle{
128+
Name: colName,
129+
Alias: colName,
130+
})
131+
}
132+
default:
133+
err = fmt.Errorf("cannot use SelectExpr of type '%T' as a raw value", node)
134+
return nil, err
106135
}
107136
}
108137
return colNames, err
109138
}
110139

111140
func ExtractUpdateReturningColumnNames(
112141
updateStmt *sqlparser.Update,
142+
starColumns []string,
113143
formatter sqlparser.NodeFormatter,
114144
) ([]ColumnHandle, error) {
115-
var colNames []ColumnHandle
116-
var err error
117-
for _, node := range updateStmt.SelectExprs {
118-
switch node := node.(type) {
119-
case *sqlparser.AliasedExpr:
120-
cn, cErr := inferColNameFromExpr(node.Expr, formatter, node.As.GetRawVal())
121-
if cErr != nil {
122-
return nil, cErr
123-
}
124-
colNames = append(colNames, cn)
125-
case *sqlparser.StarExpr:
126-
}
127-
}
128-
return colNames, err
145+
return extractInsertReturningColumnNames(
146+
updateStmt.SelectExprs,
147+
starColumns,
148+
formatter,
149+
)
129150
}
130151

131152
func ExtractInsertColumnNames(insertStmt *sqlparser.Insert) ([]string, error) {

internal/stackql/primitivegenerator/statement_analyzer.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,8 @@ func (pb *standardPrimitiveGenerator) AnalyzeInsert(pbi planbuilderinput.PlanBui
11521152
}
11531153
columnHandles := []parserutil.ColumnHandle{}
11541154
if len(node.SelectExprs) > 0 {
1155-
columnHandles, err = parserutil.ExtractInsertReturningColumnNames(node, handlerCtx.GetASTFormatter())
1155+
starColumns, _ := methodAnalysisOutput.GetOrderedStarColumnsNames()
1156+
columnHandles, err = parserutil.ExtractInsertReturningColumnNames(node, starColumns, handlerCtx.GetASTFormatter())
11561157
if err != nil {
11571158
return err
11581159
}
@@ -1261,7 +1262,12 @@ func (pb *standardPrimitiveGenerator) AnalyzeUpdate(pbi planbuilderinput.PlanBui
12611262
}
12621263
columnHandles := []parserutil.ColumnHandle{}
12631264
if len(node.SelectExprs) > 0 {
1264-
columnHandles, err = parserutil.ExtractUpdateReturningColumnNames(node, handlerCtx.GetASTFormatter())
1265+
starColumns, _ := methodAnalysisOutput.GetOrderedStarColumnsNames()
1266+
columnHandles, err = parserutil.ExtractUpdateReturningColumnNames(
1267+
node,
1268+
starColumns,
1269+
handlerCtx.GetASTFormatter(),
1270+
)
12651271
if err != nil {
12661272
return err
12671273
}

0 commit comments

Comments
 (0)