(databaseName, statement string)
| 183 | } |
| 184 | |
| 185 | func prepareTransformation(databaseName, statement string) ([]statementInfo, error) { |
| 186 | statements, err := SplitSQL(statement) |
| 187 | if err != nil { |
| 188 | return nil, errors.Wrap(err, "failed to split PLSQL") |
| 189 | } |
| 190 | |
| 191 | var result []statementInfo |
| 192 | positionMapper := base.NewByteOffsetPositionMapper(statement) |
| 193 | for i, stmt := range statements { |
| 194 | if stmt.Empty { |
| 195 | continue |
| 196 | } |
| 197 | list, err := ParsePLSQLOmni(stmt.Text) |
| 198 | if err != nil { |
| 199 | return nil, errors.Wrap(err, "failed to parse PLSQL") |
| 200 | } |
| 201 | for _, item := range list.Items { |
| 202 | raw, ok := item.(*oracleast.RawStmt) |
| 203 | if !ok || raw.Stmt == nil { |
| 204 | continue |
| 205 | } |
| 206 | info := extractOmniDML(databaseName, raw.Stmt, stmt.Text) |
| 207 | if info == nil { |
| 208 | continue |
| 209 | } |
| 210 | info.offset = i |
| 211 | if stmt.Range != nil { |
| 212 | info.startPosition = positionMapper.Position(int(stmt.Range.Start) + raw.Loc.Start) |
| 213 | info.endPosition = positionMapper.Position(int(stmt.Range.Start) + max(raw.Loc.End-1, raw.Loc.Start)) |
| 214 | } else { |
| 215 | info.startPosition = stmt.Start |
| 216 | info.endPosition = stmt.End |
| 217 | } |
| 218 | info.fullSQL = stmt.Text |
| 219 | result = append(result, *info) |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | if len(result) == 0 { |
| 224 | return nil, errNoBackupableDML |
| 225 | } |
| 226 | return result, nil |
| 227 | } |
| 228 | |
| 229 | func extractOmniDML(databaseName string, node oracleast.StmtNode, fullSQL string) *statementInfo { |
| 230 | switch n := node.(type) { |
no test coverage detected