BuildRowIter implements the interface sql.ExecBuilderNode.
(ctx *sql.Context, b sql.NodeExecBuilder, r sql.Row)
| 75 | |
| 76 | // BuildRowIter implements the interface sql.ExecBuilderNode. |
| 77 | func (te *TriggerExecution) BuildRowIter(ctx *sql.Context, b sql.NodeExecBuilder, r sql.Row) (sql.RowIter, error) { |
| 78 | sourceIter, err := b.Build(ctx, te.Source, r) |
| 79 | if err != nil { |
| 80 | return nil, err |
| 81 | } |
| 82 | // If there are no triggers, then we'll just return the source iter |
| 83 | if len(te.Triggers) == 0 { |
| 84 | return sourceIter, nil |
| 85 | } |
| 86 | trigFuncs := make([]framework.InterpretedFunction, len(te.Triggers)) |
| 87 | whens := make([]framework.InterpretedFunction, len(te.Triggers)) |
| 88 | for i, trig := range te.Triggers { |
| 89 | trigFuncs[i], err = te.loadTriggerFunction(ctx, trig) |
| 90 | if err != nil { |
| 91 | return nil, err |
| 92 | } |
| 93 | // If we have a WHEN expression, then we need to build a "function" to execute the expression |
| 94 | if len(trig.When) > 0 { |
| 95 | whens[i] = framework.InterpretedFunction{ |
| 96 | ID: trigFuncs[i].ID, // Assign the same ID just so we have a valid one for later |
| 97 | ReturnType: pgtypes.Bool, |
| 98 | Statements: trig.When, |
| 99 | } |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | tgOp := "" |
| 104 | switch te.Source.(type) { |
| 105 | case *plan.InsertInto: |
| 106 | tgOp = "INSERT" |
| 107 | case *plan.Update: |
| 108 | tgOp = "UPDATE" |
| 109 | case *plan.DeleteFrom: |
| 110 | tgOp = "DELETE" |
| 111 | case *plan.Truncate: |
| 112 | tgOp = "TRUNCATE" |
| 113 | } |
| 114 | |
| 115 | return &triggerExecutionIter{ |
| 116 | functions: trigFuncs, |
| 117 | whens: whens, |
| 118 | split: te.Split, |
| 119 | treturn: te.Return, |
| 120 | runner: te.Runner.Runner, |
| 121 | sch: te.Sch, |
| 122 | source: sourceIter, |
| 123 | tgOp: tgOp, |
| 124 | timing: te.Timing, |
| 125 | }, nil |
| 126 | } |
| 127 | |
| 128 | // Schema implements the interface sql.ExecBuilderNode. |
| 129 | func (te *TriggerExecution) Schema(ctx *sql.Context) sql.Schema { |
nothing calls this directly
no test coverage detected