Hello, for now I don't use DDL triggers, but I decided to try a few things,
since I didn't understand at first glance how they were encoded. This
information in constants.h is misleading

// that's how DDL trigger action types are encoded
//    (TRIGGER_TYPE_DDL | DDL_TRIGGER_{AFTER | BEFORE} 
        [ | DDL_TRIGGER_??? ...])

I think it's
//    (TRIGGER_TYPE_DDL | DDL_TRIGGER_{AFTER | BEFORE} 
        [ | (QUADCONST(1) << DDL_TRIGGER_??? ...)])

parse.y says:

%type <uint64Val> trigger_ddl_type
trigger_ddl_type
        : trigger_ddl_type_items
        | ANY DDL STATEMENT
                {
                        $$ = TRIGGER_TYPE_DDL |
(0x7FFFFFFFFFFFFFFFULL & ~(FB_UINT64) TRIGGER_TYPE_MASK & ~1ULL);
                }
        ;

Ok, let's try:
SQL> create trigger tr before any ddl statement as begin end;
SQL> commit;
SQL> select rdb$trigger_type from rdb$triggers;
....
                    6
                    3
  9223372036854767614

This is somewhat smaller than 2^63 due to the trigger mask.

SQL> show triggers;
Trigger name                     Invalid
================================ =======
TR

SQL> show trigger tr;
TR, Sequence: 0, Type: BEFORE CREATE TABLE OR ALTER TABLE OR DROP TABLE OR
CREATE PROCEDURE OR ALTER PROCEDURE OR DROP PROCEDURE OR CREATE FUNCTION OR
ALTER FUNCTION OR DROP FUNCTION OR CREATE TRIGGER OR ALTER TRIGGER OR DROP
TRIGGER OR   OR CREATE EXCEPTION OR ALTER EXCEPTION OR DROP EXCEPTION OR
CREATE VIEW OR ALTER VIEW OR DROP VIEW OR CREATE DOMAIN OR ALTER DOMAIN OR
DROP DOMAIN OR CREATE ROLE OR ALTER ROLE OR DROP ROLE OR CREATE INDEX OR
ALTER INDEX OR DROP INDEX OR CREATE SEQUENCE OR ALTER SEQUENCE OR DROP
SEQUENCE OR CREATE USER OR ALTER USER OR DROP USER OR CREATE COLLATION OR
DROP COLLATION OR ALTER CHARACTER SET OR CREATE PACKAGE OR ALTER PACKAGE OR
DROP PACKAGE OR CREATE PACKAGE BODY OR DROP PACKAGE BODY OR CREATE MAPPING
OR ALTER MAPPING OR DROP MAPPING OR <unknown> OR <unknown> OR <unknown> OR
<unknown> OR <unknown> OR <unknown> OR <unknown> OR <unknown> OR <unknown>
OR <unknown> OR <unknown> OR <unknown> OR <unknown> OR <unknown> OR
<unknown>, Active
as begin end
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+

Ouch! Since I didn't do the code, I would prefer to not put my muddy paws
there. The presence of
OR   OR
in the output seems to indicate that the mask defined as
const FB_UINT64 TRIGGER_TYPE_MASK                       
        = (QUADCONST(3) << TRIGGER_TYPE_SHIFT);
is not being skipped.

C.
---
Claudio Valderrama C.
Consultant, SW developer.


------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment 
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to