pgq/triggers: Survive setup errors better
authorMarko Kreen <markokr@gmail.com>
Mon, 10 May 2010 08:42:34 +0000 (11:42 +0300)
committerMarko Kreen <markokr@gmail.com>
Mon, 10 May 2010 10:15:04 +0000 (13:15 +0300)
sql/pgq/triggers/common.c
sql/pgq/triggers/common.h
sql/pgq/triggers/qbuilder.c

index d01a7e8c49dc3cda09b28971df7c32bc5a68a5da..0bfa8d2e2774556f811507f11e71e1f658fd510e 100644 (file)
@@ -497,7 +497,7 @@ void pgq_prepare_event(struct PgqTriggerEvent *ev, TriggerData *tg, bool newstyl
         */
        if (newstyle) {
                ev->tgargs = find_trigger_info(ev->info, tg->tg_trigger->tgoid, false);
-               if (!ev->tgargs) {
+               if (!ev->tgargs || !ev->tgargs->finalized) {
                        ev->tgargs = find_trigger_info(ev->info, tg->tg_trigger->tgoid, true);
                        parse_newstyle_args(ev, tg);
                }
@@ -511,6 +511,7 @@ void pgq_prepare_event(struct PgqTriggerEvent *ev, TriggerData *tg, bool newstyl
        } else {
                parse_oldstyle_args(ev, tg);
        }
+       ev->tgargs->finalized = true;
 
        /*
         * init data
index fac8f0d8c76aec54add55fb26fc0bda8c724c074..89d12187acbe10b63875b6a56d91d0c652a8c0c2 100644 (file)
@@ -45,14 +45,15 @@ typedef struct PgqTriggerEvent PgqTriggerEvent;
 struct PgqTriggerInfo {
        struct PgqTriggerInfo *next;
        Oid tgoid;
-
-       const char *ignore_list;
-       const char *pkey_list;
+       bool finalized;
 
        bool skip;
        bool backup;
        bool custom_fields;
 
+       const char *ignore_list;
+       const char *pkey_list;
+
        struct QueryBuilder *query[EV_NFIELDS];
 };
 
index 8492959f2fdd2a3547189e04e2b4e9303cad018e..4aab78a411502a986bb6dc6316d5fceb44c04c77 100644 (file)
@@ -123,6 +123,9 @@ int qb_execute(struct QueryBuilder *q, void *arg)
        char nulls[FUNC_MAX_ARGS];
        int i;
 
+       if (!q->plan)
+               elog(ERROR, "QB: query not prepared yet");
+
        for (i = 0; i < q->nargs; i++) {
                bool isnull = false;
                values[i] = q->op->value_lookup(arg, q->arg_map[i], &isnull);