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

Function prepareTransformation

backend/plugin/parser/pg/backup.go:275–365  ·  view source on GitHub ↗
(ctx context.Context, tCtx base.TransformContext, statement string)

Source from the content-addressed store, hash-verified

273}
274
275func prepareTransformation(ctx context.Context, tCtx base.TransformContext, statement string) ([]statementInfo, error) {
276 stmts, err := ParsePg(statement)
277 if err != nil {
278 return nil, errors.Wrap(err, "failed to parse statement")
279 }
280
281 if tCtx.GetDatabaseMetadataFunc == nil {
282 return nil, errors.New("GetDatabaseMetadataFunc is not set in TransformContext")
283 }
284
285 _, metadata, err := tCtx.GetDatabaseMetadataFunc(ctx, tCtx.InstanceID, tCtx.DatabaseName)
286 if err != nil {
287 return nil, errors.Wrap(err, "failed to get database metadata")
288 }
289
290 searchPath := metadata.GetSearchPath()
291 var dmls []statementInfo
292 // Node locations ascend across statements, so a single incremental mapper
293 // converts all offsets in one pass instead of rescanning from byte 0.
294 posMapper := base.NewByteOffsetPositionMapper(statement)
295
296 for i, stmt := range stmts {
297 if stmt.Empty() {
298 continue
299 }
300
301 switch n := stmt.AST.(type) {
302 case *ast.VariableSetStmt:
303 if strings.EqualFold(n.Name, "search_path") && n.Args != nil {
304 var newSearchPath []string
305 for _, arg := range n.Args.Items {
306 if ac, ok := arg.(*ast.A_Const); ok {
307 if s, ok := ac.Val.(*ast.String); ok {
308 newSearchPath = append(newSearchPath, s.Str)
309 }
310 }
311 }
312 if len(newSearchPath) > 0 {
313 searchPath = newSearchPath
314 }
315 }
316 case *ast.UpdateStmt:
317 table, err := extractTableReferenceFromRangeVar(n.Relation, metadata, searchPath)
318 if err != nil {
319 return nil, errors.Wrapf(err, "failed to extract table reference from update statement at offset %d", i)
320 }
321 if table == nil {
322 continue
323 }
324 table.StatementType = StatementTypeUpdate
325 nodeLoc := n.Loc
326 startPos := posMapper.Position(nodeLoc.Start)
327 startPos.Column-- // 0-based column to match existing convention
328 endPos := posMapper.Position(nodeLoc.End)
329 dmls = append(dmls, statementInfo{
330 offset: i,
331 statement: stmt.Text,
332 node: n,

Callers 1

TransformDMLToSelectFunction · 0.70

Calls 6

PositionMethod · 0.95
ParsePgFunction · 0.85
GetSearchPathMethod · 0.45

Tested by

no test coverage detected