Skip to content

Commit 1884eba

Browse files
returning-star
Summary: - Support for `RETURNING *`. - Added robot test `Insert Returning Star`.
1 parent cab2314 commit 1884eba

File tree

5 files changed

+46
-4
lines changed

5 files changed

+46
-4
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-beta02
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-beta02 h1:4o4cQhhbp0euKCxQjYkciDNCBfxkOa+F3ZibV67K+4E=
488+
github.com/stackql/any-sdk v0.1.4-beta02/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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ func ExtractSelectColumnNames(selStmt *sqlparser.Select, formatter sqlparser.Nod
9090

9191
func ExtractInsertReturningColumnNames(
9292
insertStmt *sqlparser.Insert,
93+
starColumns []string,
9394
formatter sqlparser.NodeFormatter,
9495
) ([]ColumnHandle, error) {
9596
var colNames []ColumnHandle
@@ -103,6 +104,22 @@ func ExtractInsertReturningColumnNames(
103104
}
104105
colNames = append(colNames, cn)
105106
case *sqlparser.StarExpr:
107+
if len(starColumns) == 0 {
108+
return nil, fmt.Errorf("no star columns provided for insert returning of star")
109+
}
110+
prefix := node.TableName.GetRawVal()
111+
for _, colName := range starColumns {
112+
if prefix != "" {
113+
colName = prefix + "." + colName
114+
}
115+
colNames = append(colNames, ColumnHandle{
116+
Name: colName,
117+
Alias: colName,
118+
})
119+
}
120+
default:
121+
err = fmt.Errorf("cannot use SelectExpr of type '%T' as a raw value", node)
122+
return nil, err
106123
}
107124
}
108125
return colNames, err

internal/stackql/primitivegenerator/statement_analyzer.go

Lines changed: 2 additions & 1 deletion
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
}

test/robot/functional/stackql_mocked_from_cmd_line.robot

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8749,3 +8749,27 @@ Replace Async Returning Simple Projection
87498749
... ${stdErrStr}
87508750
... stdout=${CURDIR}/tmp/Replace-Async-Returning-Simple-Projection.tmp
87518751
... stderr=${CURDIR}/tmp/Replace-Async-Returning-Simple-Projection-stderr.tmp
8752+
8753+
Insert Returning Star
8754+
[Documentation] Insert a row into a table and return all new object values. For synchronously created objects.
8755+
${inputStr} = Catenate
8756+
... insert into google.storage.buckets( project, data__name) select 'testing-project', 'silly-bucket' returning *;
8757+
${outputStr} = Catenate SEPARATOR=\n
8758+
... |------|-----------|---------|------|-----------------------|-----------------------|------------------|------------|------|--------------------------------------------------------------------------------------------------------------------------|--------------|----------------|--------|-----------|----------|--------------|---------|----------------|--------------|-------|---------------|-----------------|---------|--------------|------------------------------------------------------|--------------|--------------------------|--------------------------|------------|---------|
8759+
... |${SPACE}acl${SPACE}${SPACE}|${SPACE}autoclass${SPACE}|${SPACE}billing${SPACE}|${SPACE}cors${SPACE}|${SPACE}customPlacementConfig${SPACE}|${SPACE}defaultEventBasedHold${SPACE}|${SPACE}defaultObjectAcl${SPACE}|${SPACE}encryption${SPACE}|${SPACE}etag${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}iamConfiguration${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}id${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}kind${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}labels${SPACE}|${SPACE}lifecycle${SPACE}|${SPACE}location${SPACE}|${SPACE}locationType${SPACE}|${SPACE}logging${SPACE}|${SPACE}metageneration${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}name${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}owner${SPACE}|${SPACE}projectNumber${SPACE}|${SPACE}retentionPolicy${SPACE}|${SPACE}${SPACE}${SPACE}rpo${SPACE}${SPACE}${SPACE}|${SPACE}satisfiesPZS${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}selfLink${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}storageClass${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}timeCreated${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}updated${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}versioning${SPACE}|${SPACE}website${SPACE}|
8760+
... |------|-----------|---------|------|-----------------------|-----------------------|------------------|------------|------|--------------------------------------------------------------------------------------------------------------------------|--------------|----------------|--------|-----------|----------|--------------|---------|----------------|--------------|-------|---------------|-----------------|---------|--------------|------------------------------------------------------|--------------|--------------------------|--------------------------|------------|---------|
8761+
... |${SPACE}null${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}CAE=${SPACE}|${SPACE}{"bucketPolicyOnly":{"enabled":false},"publicAccessPrevention":"inherited","uniformBucketLevelAccess":{"enabled":false}}${SPACE}|${SPACE}silly-bucket${SPACE}|${SPACE}storage#bucket${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}US${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}multi-region${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}1${SPACE}|${SPACE}silly-bucket${SPACE}|${SPACE}null${SPACE}${SPACE}|${SPACE}${SPACE}100000000001${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}DEFAULT${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}https://www.googleapis.com/storage/v1/b/silly-bucket${SPACE}|${SPACE}STANDARD${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}2025-07-03T00:03:44.250Z${SPACE}|${SPACE}2025-07-03T00:03:44.250Z${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}null${SPACE}${SPACE}${SPACE}${SPACE}|
8762+
... |------|-----------|---------|------|-----------------------|-----------------------|------------------|------------|------|--------------------------------------------------------------------------------------------------------------------------|--------------|----------------|--------|-----------|----------|--------------|---------|----------------|--------------|-------|---------------|-----------------|---------|--------------|------------------------------------------------------|--------------|--------------------------|--------------------------|------------|---------|
8763+
Should Stackql Exec Inline Equal Both Streams
8764+
... ${STACKQL_EXE}
8765+
... ${OKTA_SECRET_STR}
8766+
... ${GITHUB_SECRET_STR}
8767+
... ${K8S_SECRET_STR}
8768+
... ${REGISTRY_NO_VERIFY_CFG_STR}
8769+
... ${AUTH_CFG_STR}
8770+
... ${SQL_BACKEND_CFG_STR_CANONICAL}
8771+
... ${inputStr}
8772+
... ${outputStr}
8773+
... ${EMPTY}
8774+
... stdout=${CURDIR}/tmp/Insert-Returning-Star.tmp
8775+
... stderr=${CURDIR}/tmp/Insert-Returning-Star-stderr.tmp

0 commit comments

Comments
 (0)