import { AlterTriggerAction } from "./AlterAction"; import { BaseNode, Keyword } from "./Base"; import { RelationKind } from "./CreateTable"; import { Expr, Identifier, ListExpr, EntityName, ParenExpr, BinaryExpr } from "./Expr"; import { BlockStmt } from "./ProceduralLanguage"; export type AllTriggerNodes = AllTriggerStatements | TriggerEvent | TriggerTarget | ForEachClause | WhenClause | FromReferencedTableClause | TriggerTimingClause | TriggerReferencingClause | TriggerTransition | ExecuteClause; export type AllTriggerStatements = CreateTriggerStmt | AlterTriggerStmt | DropTriggerStmt; export interface CreateTriggerStmt extends BaseNode { type: "create_trigger_stmt"; createKw: Keyword<"CREATE">; orReplaceKw?: [Keyword<"OR">, Keyword<"REPLACE">]; kind?: RelationKind; triggerKw: Keyword<"TRIGGER">; ifNotExistsKw?: [Keyword<"IF">, Keyword<"NOT">, Keyword<"EXISTS">]; name: EntityName; timeKw?: Keyword<"BEFORE" | "AFTER"> | [Keyword<"INSTEAD">, Keyword<"OF">]; event: TriggerEventExpr; target: TriggerTarget; clauses: TriggerClause[]; body: BlockStmt | ExecuteClause; } export type TriggerEventExpr = BinaryExpr, TriggerEventExpr> | TriggerEvent; export interface TriggerEvent extends BaseNode { type: "trigger_event"; eventKw: Keyword<"INSERT" | "DELETE" | "UPDATE" | "TRUNCATE">; ofKw?: Keyword<"OF">; columns?: ListExpr; } export interface TriggerTarget extends BaseNode { type: "trigger_target"; onKw: Keyword<"ON">; table: EntityName; } type TriggerClause = ForEachClause | WhenClause | FromReferencedTableClause | TriggerTimingClause | TriggerReferencingClause; export interface ForEachClause extends BaseNode { type: "for_each_clause"; forEachKw: [Keyword<"FOR">, Keyword<"EACH">] | Keyword<"FOR">; itemKw: Keyword<"ROW" | "STATEMENT">; } export interface WhenClause extends BaseNode { type: "when_clause"; whenKw?: Keyword<"WHEN">; expr: Expr; } export interface FromReferencedTableClause extends BaseNode { type: "from_referenced_table_clause"; fromKw: Keyword<"FROM">; table: EntityName; } export interface TriggerTimingClause extends BaseNode { type: "trigger_timing_clause"; timingKw?: [Keyword<"NOT">, Keyword<"DEFERRABLE">] | Keyword<"DEFERRABLE"> | [Keyword<"INITIALLY">, Keyword<"DEFERRED">] | [Keyword<"INITIALLY">, Keyword<"IMMEDIATE">] | [Keyword<"DEFERRABLE">, Keyword<"INITIALLY">, Keyword<"DEFERRED">] | [Keyword<"DEFERRABLE">, Keyword<"INITIALLY">, Keyword<"IMMEDIATE">]; } export interface TriggerReferencingClause extends BaseNode { type: "trigger_referencing_clause"; referencingKw: Keyword<"REFERENCING">; transitions: ListExpr; } export interface TriggerTransition extends BaseNode { type: "trigger_transition"; oldOrNewKw: Keyword<"OLD" | "NEW">; rowOrTableKw: Keyword<"TABLE" | "ROW">; asKw?: Keyword<"AS">; name: Identifier; } export interface ExecuteClause extends BaseNode { type: "execute_clause"; executeKw: Keyword<"EXECUTE">; functionKw: Keyword<"FUNCTION" | "PROCEDURE">; name: EntityName; args: ParenExpr>; } export interface AlterTriggerStmt extends BaseNode { type: "alter_trigger_stmt"; alterTriggerKw: [Keyword<"ALTER">, Keyword<"TRIGGER">]; trigger: EntityName; target: TriggerTarget; action: AlterTriggerAction; } export interface DropTriggerStmt extends BaseNode { type: "drop_trigger_stmt"; dropTriggerKw: [Keyword<"DROP">, Keyword<"TRIGGER">]; ifExistsKw?: [Keyword<"IF">, Keyword<"EXISTS">]; trigger: EntityName; target?: TriggerTarget; behaviorKw?: Keyword<"CASCADE" | "RESTRICT">; } export {};