MCPcopy Create free account
hub / github.com/bytebase/bytebase / prepareTransformation

Function prepareTransformation

backend/plugin/parser/tsql/backup.go:191–242  ·  view source on GitHub ↗
(databaseName, statement string)

Source from the content-addressed store, hash-verified

189}
190
191func prepareTransformation(databaseName, statement string) ([]statementInfo, error) {
192 parsedStatements, err := parseTSQLStatements(statement)
193 if err != nil {
194 return nil, errors.Wrap(err, "failed to parse statement")
195 }
196
197 var dmls []statementInfo
198 for _, parsedStatement := range parsedStatements {
199 node, ok := GetOmniNode(parsedStatement.AST)
200 if !ok || node == nil {
201 continue
202 }
203 var (
204 table *TableReference
205 statementType StatementType
206 err error
207 )
208 switch n := node.(type) {
209 case *ast.UpdateStmt:
210 table, err = resolveDMLTargetTable(n.Relation, n.FromClause, databaseName)
211 statementType = StatementTypeUpdate
212 case *ast.DeleteStmt:
213 table, err = resolveDMLTargetTable(n.Relation, n.FromClause, databaseName)
214 statementType = StatementTypeDelete
215 default:
216 continue
217 }
218 if err != nil {
219 return nil, err
220 }
221 if table == nil {
222 return nil, errors.Errorf("failed to resolve DML target table")
223 }
224 if strings.HasPrefix(table.Table, "#") {
225 slog.Info("prior backup: skipping DML targeting temp table",
226 "table", table.Table,
227 "statementType", statementType)
228 continue
229 }
230 table.StatementType = statementType
231 loc := dmlNodeLoc(node)
232 dmls = append(dmls, statementInfo{
233 statement: parsedStatement.Text,
234 node: node,
235 table: table,
236 startPosition: positionFromByteOffset(parsedStatement.Start, parsedStatement.Text, loc.Start),
237 endPosition: positionFromByteOffset(parsedStatement.Start, parsedStatement.Text, dmlEndOffset(parsedStatement.Text, loc)),
238 })
239 }
240
241 return dmls, nil
242}
243
244func resolveDMLTargetTable(relation ast.TableExpr, fromClause *ast.List, databaseName string) (*TableReference, error) {
245 table, err := tableReferenceFromTableExpr(relation, databaseName, defaultSchema)

Callers 1

TransformDMLToSelectFunction · 0.70

Calls 8

parseTSQLStatementsFunction · 0.85
dmlNodeLocFunction · 0.85
positionFromByteOffsetFunction · 0.85
dmlEndOffsetFunction · 0.85
ErrorfMethod · 0.80
InfoMethod · 0.80
GetOmniNodeFunction · 0.70
resolveDMLTargetTableFunction · 0.70

Tested by

no test coverage detected