Skip to content

Commit fc79dd1

Browse files
- Shims continue.
1 parent 99051c1 commit fc79dd1

File tree

9 files changed

+146
-10
lines changed

9 files changed

+146
-10
lines changed

internal/stackql/astanalysis/annotatedast/annotated_ast.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func NewAnnotatedAst(parent AnnotatedAst, ast sqlparser.Statement) (AnnotatedAst
1717
tableSQLDataSources: make(map[string]sql_datasource.SQLDataSource),
1818
selectMetadataMap: make(map[*sqlparser.Select]selectmetadata.SelectMetadata),
1919
whereParamMaps: make(map[*sqlparser.Where]parserutil.ParameterMap),
20+
insertRowsParamMap: parserutil.NewParameterMap(),
2021
insertRowsIndirect: make(map[*sqlparser.Insert]astindirect.Indirect),
2122
selectIndirectCache: make(map[*sqlparser.Select]astindirect.Indirect),
2223
execIndirectCache: make(map[*sqlparser.Exec]astindirect.Indirect),
@@ -39,6 +40,8 @@ type AnnotatedAst interface {
3940
SetSelectMetadata(*sqlparser.Select, selectmetadata.SelectMetadata)
4041
SetSQLDataSource(node sqlparser.SQLNode, sqlDataSource sql_datasource.SQLDataSource)
4142
SetWhereParamMapsEntry(*sqlparser.Where, parserutil.ParameterMap)
43+
SetInsertRowsParamMap(parserutil.ParameterMap)
44+
GetInsertRowsParamMap() parserutil.ParameterMap
4245
GetWhereParamMapsEntry(*sqlparser.Where) (parserutil.ParameterMap, bool)
4346
IsReadOnly() bool
4447
SetInsertRowsIndirect(node *sqlparser.Insert, indirect astindirect.Indirect)
@@ -60,6 +63,7 @@ type standardAnnotatedAst struct {
6063
tableSQLDataSources map[string]sql_datasource.SQLDataSource
6164
selectMetadataMap map[*sqlparser.Select]selectmetadata.SelectMetadata
6265
whereParamMaps map[*sqlparser.Where]parserutil.ParameterMap
66+
insertRowsParamMap parserutil.ParameterMap
6367
selectIndirectCache map[*sqlparser.Select]astindirect.Indirect
6468
unionIndirectCache map[*sqlparser.Union]astindirect.Indirect
6569
execIndirectCache map[*sqlparser.Exec]astindirect.Indirect
@@ -91,6 +95,17 @@ func (aa *standardAnnotatedAst) GetSelectIndirect(selNode *sqlparser.Select) (as
9195
return rv, ok
9296
}
9397

98+
func (aa *standardAnnotatedAst) SetInsertRowsParamMap(paramMap parserutil.ParameterMap) {
99+
aa.insertRowsParamMap = paramMap
100+
}
101+
102+
func (aa *standardAnnotatedAst) GetInsertRowsParamMap() parserutil.ParameterMap {
103+
if aa.insertRowsParamMap == nil {
104+
aa.insertRowsParamMap = parserutil.NewParameterMap()
105+
}
106+
return aa.insertRowsParamMap
107+
}
108+
94109
func (aa *standardAnnotatedAst) SetSelectIndirect(selNode *sqlparser.Select, indirect astindirect.Indirect) {
95110
aa.selectIndirectCache[selNode] = indirect
96111
}

internal/stackql/astvisit/param_extract.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,7 @@ func (v *standardParserParamAstVisitor) Visit(node sqlparser.SQLNode) error {
146146
return node.Table.Accept(v)
147147

148148
case *sqlparser.Insert:
149-
buf.AstPrintf(node, "%s %v%sinto %v%v%v %v%v",
150-
node.Action,
151-
node.Comments, node.Ignore,
152-
node.Table, node.Partitions, node.Columns, node.Rows, node.OnDup)
149+
node.Rows.Accept(v)
153150

154151
case *sqlparser.Update:
155152
buf.AstPrintf(node, "update %v%s%v set %v%v%v%v",

internal/stackql/planbuilder/plan_builder.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/stackql/any-sdk/anysdk"
1111

1212
"github.com/stackql/any-sdk/pkg/logging"
13+
"github.com/stackql/any-sdk/pkg/streaming"
1314
"github.com/stackql/stackql/internal/stackql/acid/txn_context"
1415
"github.com/stackql/stackql/internal/stackql/astanalysis/routeanalysis"
1516
"github.com/stackql/stackql/internal/stackql/handler"
@@ -24,6 +25,7 @@ import (
2425
"github.com/stackql/stackql/internal/stackql/primitivebuilder"
2526
"github.com/stackql/stackql/internal/stackql/primitivegenerator"
2627
"github.com/stackql/stackql/internal/stackql/primitivegraph"
28+
"github.com/stackql/stackql/internal/stackql/tableinsertioncontainer"
2729
"github.com/stackql/stackql/internal/stackql/tablemetadata"
2830
"github.com/stackql/stackql/internal/stackql/util"
2931

@@ -919,9 +921,36 @@ func (pgb *standardPlanGraphBuilder) handleInsert(pbi planbuilderinput.PlanBuild
919921
if isPhysicalTable {
920922
bldrInput.SetIsTargetPhysicalTable(true)
921923
}
922-
bldr := primitivebuilder.NewInsertOrUpdate(
923-
bldrInput,
924-
)
924+
var bldr primitivebuilder.Builder
925+
if len(node.SelectExprs) > 0 {
926+
// Two cases:
927+
// 1. Synchronous. Equivalent to select.
928+
// 2. Asynchronous. Whole other story.
929+
tableMeta, tableMetaExists := bldrInput.GetTableMetadata()
930+
if !tableMetaExists {
931+
return fmt.Errorf("could not obtain table metadata for node '%s'", node.Action)
932+
}
933+
rc, rcErr := tableinsertioncontainer.NewTableInsertionContainer(
934+
tableMeta,
935+
handlerCtx.GetSQLEngine(),
936+
handlerCtx.GetTxnCounterMgr(),
937+
)
938+
if rcErr != nil {
939+
return rcErr
940+
}
941+
bldr = primitivebuilder.NewSingleSelectAcquire(
942+
pgb.planGraphHolder,
943+
handlerCtx,
944+
rc,
945+
primitiveGenerator.GetPrimitiveComposer().GetInsertPreparedStatementCtx(),
946+
nil,
947+
streaming.NewNopMapStream(),
948+
)
949+
} else {
950+
bldr = primitivebuilder.NewInsertOrUpdate(
951+
bldrInput,
952+
)
953+
}
925954
err = bldr.Build()
926955
if err != nil {
927956
return err

internal/stackql/primitivebuilder/sql_data_source_single_select_acquire.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ func (ss *sqlDataSourceSingleSelectAcquire) Build() error {
108108
if err != nil {
109109
return err
110110
}
111-
// targetTableName := annotationCtx.GetHIDs().GetStackQLTableName()
112-
// inputQuery := fmt.Sprintf(`INSERT INTO %s ( %s ) VALUES ( ?, )`, targetTableName, projectionStr, tableName)
113111
//nolint:revive // no big deal
114112
ex := func(pc primitive.IPrimitiveCtx) internaldto.ExecutorOutput {
115113
// ss.tableMeta.GetP

internal/stackql/primitivegenerator/statement_analyzer.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,11 +1088,50 @@ func (pb *standardPrimitiveGenerator) AnalyzeInsert(pbi planbuilderinput.PlanBui
10881088
if err != nil {
10891089
return err
10901090
}
1091+
pb.parseComments(node.Comments)
1092+
1093+
if tbl.IsPhysicalTable() {
1094+
return nil
1095+
}
1096+
svc, err := tbl.GetService()
1097+
if err != nil {
1098+
return err
1099+
}
10911100

1101+
if pb.PrimitiveComposer.IsAwait() && !method.IsAwaitable() {
1102+
return fmt.Errorf("method %s is not awaitable", method.GetName())
1103+
}
1104+
if pb.PrimitiveComposer.IsAwait() && !method.IsAwaitable() {
1105+
return fmt.Errorf("method %s is not awaitable", method.GetName())
1106+
}
1107+
analysisInput := anysdk.NewMethodAnalysisInput(
1108+
method,
1109+
svc,
1110+
true,
1111+
[]anysdk.ColumnDescriptor{},
1112+
)
1113+
analyser := anysdk.NewMethodAnalyzer()
1114+
methodAnalysisOutput, analysisErr := analyser.AnalyzeUnaryAction(analysisInput)
1115+
if analysisErr != nil {
1116+
return analysisErr
1117+
}
10921118
err = pb.buildRequestContext(node, tbl, nil, insertValOnlyRows)
10931119
if err != nil {
10941120
return err
10951121
}
1122+
err = pb.analyzeUnaryAction(
1123+
pbi,
1124+
handlerCtx,
1125+
node,
1126+
nil,
1127+
tbl,
1128+
[]parserutil.ColumnHandle{},
1129+
methodAnalysisOutput,
1130+
)
1131+
if err != nil {
1132+
return err
1133+
}
1134+
pb.PrimitiveComposer.SetTable(node, tbl)
10961135
return nil
10971136
}
10981137

internal/stackql/primitivegenerator/unary_selection.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package primitivegenerator
22

33
import (
44
"fmt"
5+
"strings"
56

67
"github.com/stackql/any-sdk/anysdk"
78
"github.com/stackql/stackql/internal/stackql/astvisit"
@@ -206,7 +207,18 @@ func (pb *standardPrimitiveGenerator) analyzeUnaryAction(
206207
if itemObjS != nil {
207208
itemSchemaName = itemObjS.GetName()
208209
}
209-
hIDs := internaldto.NewHeirarchyIdentifiers(rawhIDs.GetProviderStr(), rawhIDs.GetServiceStr(), itemSchemaName, "")
210+
publishedMethodKey := ""
211+
switch node := node.(type) {
212+
case *sqlparser.Insert:
213+
publishedMethodKey = node.Action
214+
case *sqlparser.Update:
215+
publishedMethodKey = node.Action
216+
case *sqlparser.Delete:
217+
publishedMethodKey = "delete"
218+
default:
219+
}
220+
hIDs := internaldto.NewHeirarchyIdentifiers(
221+
rawhIDs.GetProviderStr(), rawhIDs.GetServiceStr(), itemSchemaName, strings.ToLower(publishedMethodKey))
210222

211223
// annotatedInsertTabulation := util.NewAnnotatedTabulation(insertTabulation, hIDs, inputTableName, "")
212224

internal/stackql/taxonomy/hierarchy.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ func GetTableNameFromStatement(node sqlparser.SQLNode, formatter sqlparser.NodeF
136136
}
137137
case *sqlparser.Exec:
138138
return n.MethodName.GetRawVal()
139+
case *sqlparser.Insert:
140+
return n.Table.GetRawVal()
139141
case *sqlparser.Delete:
140142
if len(n.TableExprs) != 1 {
141143
return astformat.String(n, formatter)

test/registry/src/googleapis.com/v0.1.2/services/storage-v1.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,6 +1327,17 @@ components:
13271327
openAPIDocKey: '200'
13281328
name: buckets
13291329
title: buckets
1330+
sqlVerbs:
1331+
select:
1332+
- $ref: '#/components/x-stackQL-resources/buckets/methods/get'
1333+
- $ref: '#/components/x-stackQL-resources/buckets/methods/list'
1334+
insert:
1335+
- $ref: '#/components/x-stackQL-resources/buckets/methods/insert'
1336+
update:
1337+
- $ref: '#/components/x-stackQL-resources/buckets/methods/patch'
1338+
- $ref: '#/components/x-stackQL-resources/buckets/methods/update'
1339+
delete:
1340+
- $ref: '#/components/x-stackQL-resources/buckets/methods/delete'
13301341
channels:
13311342
id: google.storage.channels
13321343
methods:

test/robot/functional/stackql_mocked_from_cmd_line.robot

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8479,3 +8479,36 @@ Select Materialized View of Join of Flattened Paginated Projection From Transfor
84798479
... ${stdErrStr}
84808480
... stdout=${CURDIR}/tmp/Select-Materialized-View-of-Join-of-Flattened-Paginated-Projection-From-Transformed-JSON-and-XML-Response-Bodies.tmp
84818481
... stderr=${CURDIR}/tmp/Select-Materialized-View-of-Join-of-Flattened-Paginated-Projection-From-Transformed-JSON-and-XML-Response-Bodies-stderr.tmp
8482+
8483+
Insert Returning Simple Projection
8484+
[Documentation] Insert a row into a table and return projected new object values. Totally wrong atm.
8485+
${inputStr} = Catenate
8486+
... insert into google.storage.buckets( project, data__name) select 'testing-project', 'silly-bucket' returning projectNumber, name;
8487+
# ${stdErrStr} = Catenate SEPARATOR=\n
8488+
# ... DDL Execution Completed
8489+
${outputStrSQLite} = Catenate SEPARATOR=\n
8490+
... |-----------------|--------------|
8491+
... |${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}val_0${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}val_1${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|
8492+
... |-----------------|--------------|
8493+
... |${SPACE}testing-project${SPACE}|${SPACE}silly-bucket${SPACE}|
8494+
... |-----------------|--------------|
8495+
${outputStrPostgres} = Catenate SEPARATOR=\n
8496+
... |-----------------|--------------|
8497+
... |${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}val_0${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|${SPACE}${SPACE}${SPACE}${SPACE}val_1${SPACE}${SPACE}${SPACE}${SPACE}${SPACE}|
8498+
... |-----------------|--------------|
8499+
... |${SPACE}testing-project${SPACE}|${SPACE}silly-bucket${SPACE}|
8500+
... |-----------------|--------------|
8501+
${outputStr} = Set Variable If "${SQL_BACKEND}" == "postgres_tcp" ${outputStrPostgres} ${outputStrSQLite}
8502+
Should Stackql Exec Inline Equal Both Streams
8503+
... ${STACKQL_EXE}
8504+
... ${OKTA_SECRET_STR}
8505+
... ${GITHUB_SECRET_STR}
8506+
... ${K8S_SECRET_STR}
8507+
... ${REGISTRY_NO_VERIFY_CFG_STR}
8508+
... ${AUTH_CFG_STR}
8509+
... ${SQL_BACKEND_CFG_STR_CANONICAL}
8510+
... ${inputStr}
8511+
... ${outputStr}
8512+
... ${EMPTY}
8513+
... stdout=${CURDIR}/tmp/Insert-Returning-Simple-Projection.tmp
8514+
... stderr=${CURDIR}/tmp/Insert-Returning-Simple-Projection-stderr.tmp

0 commit comments

Comments
 (0)