londiste.local_add_table: use pg_trigger instead of information_schema
authorMarko Kreen <markokr@gmail.com>
Tue, 1 Jun 2010 14:25:28 +0000 (17:25 +0300)
committerMarko Kreen <markokr@gmail.com>
Wed, 9 Jun 2010 14:51:06 +0000 (17:51 +0300)
information_schema uses ordinary strings as trigger names, so the
sorting order is random due to locale rules.

sql/londiste/functions/londiste.local_add_table.sql

index 9a18b50108568bc43587520274dd62301302e000..c31ac76fe2f5e9d4dae5b7330514e1f867d98790 100644 (file)
@@ -120,18 +120,21 @@ begin
     -- Don't report all the trigger names, 8.3 does not have array_accum
     -- available
 
-    select max(trigger_name)
-         into logtrg_previous
-         from information_schema.triggers,
-              londiste.split_fqname(fq_table_name)
-        where event_object_schema = schema_part
-            and event_object_table = name_part
-            and condition_timing = 'AFTER'
-           and substring(trigger_name from 1 for 10) != '_londiste_'
-            and substring(trigger_name from char_length(trigger_name) - 6) != '_logger'
-            and trigger_name < logtrg_name;
+   select tg.tgname into logtrg_previous
+        from pg_class r, pg_trigger tg
+        where r.oid = londiste.find_table_oid(fq_table_name)
+          and not tg.tgisconstraint
+          and tg.tgname < logtrg_name::name
+          -- per-row AFTER trigger
+          and (tg.tgtype & 3) = 1   -- bits: 0:ROW, 1:BEFORE
+          -- current londiste
+          and tg.tgfoid not in ('pgq.sqltriga'::regproc::oid, 'pgq.logutriga'::regproc::oid)
+          -- old londiste
+          and substring(tg.tgname from 1 for 10) != '_londiste_'
+          and substring(tg.tgname from char_length(tg.tgname) - 6) != '_logger'
+        order by 1 limit 1;
 
-    if logtrg_previous then
+    if logtrg_previous is not null then
        select 301,
               'Table added: ' || fq_table_name
                               || ', but londiste trigger is not first: '