RowIter implements the interface sql.ExecSourceRel.
(ctx *sql.Context, r sql.Row)
| 87 | |
| 88 | // RowIter implements the interface sql.ExecSourceRel. |
| 89 | func (c *CreateTrigger) RowIter(ctx *sql.Context, r sql.Row) (sql.RowIter, error) { |
| 90 | schema, err := core.GetSchemaName(ctx, nil, c.Name.SchemaName()) |
| 91 | if err != nil { |
| 92 | return nil, err |
| 93 | } |
| 94 | triggerID := id.NewTrigger(schema, c.Name.TableName(), c.Name.TriggerName()) |
| 95 | relationType, err := core.GetRelationType(ctx, schema, c.Name.TableName()) |
| 96 | if err != nil { |
| 97 | return nil, err |
| 98 | } |
| 99 | if relationType == core.RelationType_DoesNotExist { |
| 100 | return nil, errors.Errorf(`relation "%s" does not exist`, c.Name.TableName()) |
| 101 | } else if relationType != core.RelationType_Table { |
| 102 | return nil, errors.Errorf(`"%s" is not a table or view`, c.Name.TableName()) |
| 103 | } |
| 104 | function, err := loadFunction(ctx, nil, c.Function) |
| 105 | if err != nil { |
| 106 | return nil, err |
| 107 | } |
| 108 | if !function.ID.IsValid() { |
| 109 | return nil, errors.Errorf("function %s() does not exist", c.Function.FunctionName()) |
| 110 | } |
| 111 | if function.ReturnType != pgtypes.Trigger.ID { |
| 112 | return nil, errors.Errorf(`function %s must return type trigger`, function.ID.FunctionName()) |
| 113 | } |
| 114 | trigCollection, err := core.GetTriggersCollectionFromContext(ctx, ctx.GetCurrentDatabase()) |
| 115 | if err != nil { |
| 116 | return nil, err |
| 117 | } |
| 118 | if c.Replace && trigCollection.HasTrigger(ctx, triggerID) { |
| 119 | if err = trigCollection.DropTrigger(ctx, triggerID); err != nil { |
| 120 | return nil, err |
| 121 | } |
| 122 | } |
| 123 | err = trigCollection.AddTrigger(ctx, triggers.Trigger{ |
| 124 | ID: triggerID, |
| 125 | Function: function.ID, |
| 126 | Timing: c.Timing, |
| 127 | Events: c.Events, |
| 128 | ForEachRow: c.ForEachRow, |
| 129 | When: c.When, |
| 130 | Deferrable: triggers.TriggerDeferrable_NotDeferrable, |
| 131 | ReferencedTableName: "", |
| 132 | Constraint: false, |
| 133 | OldTransitionName: "", |
| 134 | NewTransitionName: "", |
| 135 | Arguments: c.Arguments, |
| 136 | Definition: c.Definition, |
| 137 | }) |
| 138 | if err != nil { |
| 139 | return nil, err |
| 140 | } |
| 141 | return sql.RowsToRowIter(), nil |
| 142 | } |
| 143 | |
| 144 | // Schema implements the interface sql.ExecSourceRel. |
| 145 | func (c *CreateTrigger) Schema(ctx *sql.Context) sql.Schema { |
nothing calls this directly
no test coverage detected