(c context.Context, conn *sql.Conn)
| 656 | } |
| 657 | |
| 658 | func (s *gstate) execute(c context.Context, conn *sql.Conn) (err error) { |
| 659 | |
| 660 | if err = s.validateAndUpdateVars(c); err != nil { |
| 661 | return |
| 662 | } |
| 663 | |
| 664 | if s.cs.st.qc != nil { |
| 665 | for i := range s.cs.st.qc.Selects { |
| 666 | if msg := s.cs.st.qc.Selects[i].PartitionFilterRequired; msg != "" { |
| 667 | return errors.New(msg) |
| 668 | } |
| 669 | } |
| 670 | } |
| 671 | |
| 672 | var args args |
| 673 | if args, err = s.argList(c); err != nil { |
| 674 | return |
| 675 | } |
| 676 | |
| 677 | cs := s.cs |
| 678 | dbType := s.getTargetDBCtx().dbtype |
| 679 | |
| 680 | // Use Dialect to check for multi-statement scripts (e.g., SQLite) |
| 681 | dialect := s.getTargetPsqlCompiler().GetDialect() |
| 682 | parts := dialect.SplitQuery(cs.st.sql) |
| 683 | |
| 684 | if len(parts) > 1 { |
| 685 | // Multi-statement script execution |
| 686 | c1, span := s.gj.spanStart(c, "Execute Script") |
| 687 | defer span.End() |
| 688 | |
| 689 | argIdx := 0 |
| 690 | for i, stmt := range parts { |
| 691 | // Count parameters (?) in this statement to slice arguments |
| 692 | nParams := strings.Count(stmt, "?") |
| 693 | var stmtArgs []interface{} |
| 694 | |
| 695 | if nParams > 0 { |
| 696 | if argIdx+nParams > len(args.values) { |
| 697 | span.Error(fmt.Errorf("script: not enough arguments for statement %d", i)) |
| 698 | return fmt.Errorf("script: not enough arguments") |
| 699 | } |
| 700 | stmtArgs = args.values[argIdx : argIdx+nParams] |
| 701 | argIdx += nParams |
| 702 | } |
| 703 | |
| 704 | stmt, stmtArgs, err = prepareQueryArgsForDB(s.getTargetDBCtx().dbtype, stmt, stmtArgs) |
| 705 | if err != nil { |
| 706 | span.Error(err) |
| 707 | return err |
| 708 | } |
| 709 | |
| 710 | upperStmt := strings.ToUpper(strings.TrimSpace(stmt)) |
| 711 | |
| 712 | isReturning := strings.Contains(upperStmt, "RETURNING") |
| 713 | isSelect := (strings.HasPrefix(upperStmt, "SELECT") && !strings.Contains(upperStmt, " INTO ")) || strings.HasPrefix(upperStmt, "WITH") |
| 714 | |
| 715 | // Check for @gj_ids hint |
no test coverage detected