(databaseName, statement string)
| 189 | } |
| 190 | |
| 191 | func 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 | |
| 244 | func resolveDMLTargetTable(relation ast.TableExpr, fromClause *ast.List, databaseName string) (*TableReference, error) { |
| 245 | table, err := tableReferenceFromTableExpr(relation, databaseName, defaultSchema) |
no test coverage detected