1 -- Script to create the query schema and the tables therein
5 DROP SCHEMA IF EXISTS query CASCADE;
7 COMMENT ON SCHEMA actor IS $$
9 * Copyright (C) 2009 Equinox Software, Inc. / Georgia Public Library Service
10 * Scott McKellar <scott@esilibrary.com>
14 * Contains tables designed to represent user-defined queries for
15 * reports and the like.
19 * This program is free software; you can redistribute it and/or
20 * modify it under the terms of the GNU General Public License
21 * as published by the Free Software Foundation; either version 2
22 * of the License, or (at your option) any later version.
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
31 CREATE TABLE query.stored_query (
32 id SERIAL PRIMARY KEY,
33 type TEXT NOT NULL CONSTRAINT query_type CHECK
34 ( type IN ( 'SELECT', 'UNION', 'INTERSECT', 'EXCEPT' ) ),
35 use_all BOOLEAN NOT NULL DEFAULT FALSE,
36 use_distinct BOOLEAN NOT NULL DEFAULT FALSE,
37 from_clause INT NOT NULL , --REFERENCES query.from_clause
38 where_clause INT , --REFERENCES query.expression
39 --DEFERRABLE INITIALLY DEFERRED,
40 having_clause INT --REFERENCES query.expression
41 --DEFERRABLE INITIALLY DEFERRED
44 -- (Foreign keys to be defined later after other tables are created)
46 CREATE TABLE query.query_sequence (
47 id SERIAL PRIMARY KEY,
48 parent_query INT NOT NULL
49 REFERENCES query.stored_query
51 DEFERRABLE INITIALLY DEFERRED,
53 child_query INT NOT NULL
54 REFERENCES query.stored_query
56 DEFERRABLE INITIALLY DEFERRED,
57 CONSTRAINT query_query_seq UNIQUE( parent_query, seq_no )
60 CREATE TABLE query.datatype (
61 id SERIAL PRIMARY KEY,
62 datatype_name TEXT NOT NULL UNIQUE,
63 is_numeric BOOL NOT NULL DEFAULT FALSE,
64 is_composite BOOL NOT NULL DEFAULT FALSE,
65 CONSTRAINT qdt_comp_not_num CHECK
66 ( is_numeric IS FALSE OR is_composite IS FALSE )
69 CREATE TABLE query.subfield (
70 id SERIAL PRIMARY KEY,
71 composite_type INT NOT NULL
72 REFERENCES query.datatype(id)
74 DEFERRABLE INITIALLY DEFERRED,
76 CONSTRAINT qsf_pos_seq_no
78 subfield_type INT NOT NULL
79 REFERENCES query.datatype(id)
80 DEFERRABLE INITIALLY DEFERRED,
81 CONSTRAINT qsf_datatype_seq_no UNIQUE (composite_type, seq_no)
84 CREATE TABLE query.function_sig (
85 id SERIAL PRIMARY KEY,
86 function_name TEXT NOT NULL,
87 return_type INT REFERENCES query.datatype(id)
88 DEFERRABLE INITIALLY DEFERRED,
89 is_aggregate BOOL NOT NULL DEFAULT FALSE,
90 CONSTRAINT qfd_rtn_or_aggr CHECK
91 ( return_type IS NULL OR is_aggregate = FALSE )
94 CREATE INDEX query_function_sig_name_idx
95 ON query.function_sig (function_name);
97 CREATE TABLE query.function_param_def (
98 id SERIAL PRIMARY KEY,
99 function_id INT NOT NULL
100 REFERENCES query.function_sig( id )
102 DEFERRABLE INITIALLY DEFERRED,
104 CONSTRAINT qfpd_pos_seq_no CHECK
106 datatype INT NOT NULL
107 REFERENCES query.datatype( id )
108 DEFERRABLE INITIALLY DEFERRED,
109 CONSTRAINT qfpd_function_param_seq UNIQUE (function_id, seq_no)
112 CREATE TABLE query.expression (
113 id SERIAL PRIMARY KEY,
114 type TEXT NOT NULL CONSTRAINT predicate_type CHECK
125 'xnbet', -- not between
126 'xnex', -- not exists
134 parenthesize BOOL NOT NULL DEFAULT FALSE,
135 parent_expr INT REFERENCES query.expression
137 DEFERRABLE INITIALLY DEFERRED,
138 seq_no INT NOT NULL DEFAULT 1,
142 left_operand INT REFERENCES query.expression
143 DEFERRABLE INITIALLY DEFERRED,
145 right_operand INT REFERENCES query.expression
146 DEFERRABLE INITIALLY DEFERRED,
147 function_id INT REFERENCES query.function_sig
148 DEFERRABLE INITIALLY DEFERRED,
149 subquery INT REFERENCES query.stored_query
150 DEFERRABLE INITIALLY DEFERRED,
151 cast_type INT REFERENCES query.datatype
152 DEFERRABLE INITIALLY DEFERRED
155 CREATE UNIQUE INDEX query_expr_parent_seq
156 ON query.expression( parent_expr, seq_no )
157 WHERE parent_expr IS NOT NULL;
159 -- Due to some circular references, the following foreign key definitions
160 -- had to be deferred until query.expression existed:
162 ALTER TABLE query.stored_query
163 ADD FOREIGN KEY ( where_clause )
164 REFERENCES query.expression( id )
165 DEFERRABLE INITIALLY DEFERRED;
167 ALTER TABLE query.stored_query
168 ADD FOREIGN KEY ( having_clause )
169 REFERENCES query.expression( id )
170 DEFERRABLE INITIALLY DEFERRED;
172 CREATE TABLE query.case_branch (
173 id SERIAL PRIMARY KEY,
174 parent_expr INT NOT NULL REFERENCES query.expression
176 DEFERRABLE INITIALLY DEFERRED,
178 condition INT REFERENCES query.expression
179 DEFERRABLE INITIALLY DEFERRED,
180 result INT NOT NULL REFERENCES query.expression
181 DEFERRABLE INITIALLY DEFERRED,
182 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
185 CREATE TABLE query.from_relation (
186 id SERIAL PRIMARY KEY,
187 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
188 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
191 subquery INT REFERENCES query.stored_query,
192 function_call INT REFERENCES query.expression,
194 parent_relation INT REFERENCES query.from_relation
196 DEFERRABLE INITIALLY DEFERRED,
197 seq_no INT NOT NULL DEFAULT 1,
198 join_type TEXT CONSTRAINT good_join_type CHECK (
199 join_type IS NULL OR join_type IN
200 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
202 on_clause INT REFERENCES query.expression
203 DEFERRABLE INITIALLY DEFERRED,
204 CONSTRAINT join_or_core CHECK (
205 ( parent_relation IS NULL AND join_type IS NULL
206 AND on_clause IS NULL )
208 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
209 AND on_clause IS NOT NULL )
213 CREATE UNIQUE INDEX from_parent_seq
214 ON query.from_relation( parent_relation, seq_no )
215 WHERE parent_relation IS NOT NULL;
217 -- The following foreign key had to be deferred until
218 -- query.from_relation existed
220 ALTER TABLE query.stored_query
221 ADD FOREIGN KEY (from_clause)
222 REFERENCES query.from_relation
223 DEFERRABLE INITIALLY DEFERRED;
225 CREATE TABLE query.record_column (
226 id SERIAL PRIMARY KEY,
227 from_relation INT NOT NULL REFERENCES query.from_relation
229 DEFERRABLE INITIALLY DEFERRED,
231 column_name TEXT NOT NULL,
232 column_type INT NOT NULL REFERENCES query.datatype
234 DEFERRABLE INITIALLY DEFERRED,
235 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
238 CREATE TABLE query.select_item (
239 id SERIAL PRIMARY KEY,
240 stored_query INT NOT NULL REFERENCES query.stored_query
242 DEFERRABLE INITIALLY DEFERRED,
244 expression INT NOT NULL REFERENCES query.expression
245 DEFERRABLE INITIALLY DEFERRED,
247 grouped_by BOOL NOT NULL DEFAULT FALSE,
248 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
251 CREATE TABLE query.order_by_item (
252 id SERIAL PRIMARY KEY,
253 stored_query INT NOT NULL REFERENCES query.stored_query
255 DEFERRABLE INITIALLY DEFERRED,
257 expression INT NOT NULL REFERENCES query.expression
259 DEFERRABLE INITIALLY DEFERRED,
260 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
263 -- Create updatable views -------------------------------------------
265 -- Create updatable view for BETWEEN expressions
267 CREATE OR REPLACE VIEW query.expr_xbet AS
278 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
279 ON INSERT TO query.expr_xbet
281 INSERT INTO query.expression (
288 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
290 COALESCE(NEW.parenthesize, FALSE),
292 COALESCE(NEW.seq_no, 1)
295 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
296 ON UPDATE TO query.expr_xbet
298 UPDATE query.expression SET
300 parenthesize = NEW.parenthesize,
301 parent_expr = NEW.parent_expr,
306 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
307 ON DELETE TO query.expr_xbet
309 DELETE FROM query.expression WHERE id = OLD.id;
311 -- Create updatable view for boolean expressions
313 CREATE OR REPLACE VIEW query.expr_xbool AS
325 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
326 ON INSERT TO query.expr_xbool
328 INSERT INTO query.expression (
336 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
338 COALESCE(NEW.parenthesize, FALSE),
340 COALESCE(NEW.seq_no, 1),
344 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
345 ON UPDATE TO query.expr_xbool
347 UPDATE query.expression SET
349 parenthesize = NEW.parenthesize,
350 parent_expr = NEW.parent_expr,
352 literal = NEW.literal
356 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
357 ON DELETE TO query.expr_xbool
359 DELETE FROM query.expression WHERE id = OLD.id;
361 -- Create updatable view for CASE expressions
363 CREATE OR REPLACE VIEW query.expr_xcase AS
374 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
375 ON INSERT TO query.expr_xcase
377 INSERT INTO query.expression (
384 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
386 COALESCE(NEW.parenthesize, FALSE),
388 COALESCE(NEW.seq_no, 1)
391 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
392 ON UPDATE TO query.expr_xcase
394 UPDATE query.expression SET
396 parenthesize = NEW.parenthesize,
397 parent_expr = NEW.parent_expr,
402 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
403 ON DELETE TO query.expr_xcase
405 DELETE FROM query.expression WHERE id = OLD.id;
407 -- Create updatable view for cast expressions
409 CREATE OR REPLACE VIEW query.expr_xcast AS
422 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
423 ON INSERT TO query.expr_xcast
425 INSERT INTO query.expression (
434 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
436 COALESCE(NEW.parenthesize, FALSE),
438 COALESCE(NEW.seq_no, 1),
443 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
444 ON UPDATE TO query.expr_xcast
446 UPDATE query.expression SET
448 parenthesize = NEW.parenthesize,
449 parent_expr = NEW.parent_expr,
451 left_operand = NEW.left_operand,
452 cast_type = NEW.cast_type
456 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
457 ON DELETE TO query.expr_xcast
459 DELETE FROM query.expression WHERE id = OLD.id;
461 -- Create updatable view for column expressions
463 CREATE OR REPLACE VIEW query.expr_xcol AS
476 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
477 ON INSERT TO query.expr_xcol
479 INSERT INTO query.expression (
488 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
490 COALESCE(NEW.parenthesize, FALSE),
492 COALESCE(NEW.seq_no, 1),
497 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
498 ON UPDATE TO query.expr_xcol
500 UPDATE query.expression SET
502 parenthesize = NEW.parenthesize,
503 parent_expr = NEW.parent_expr,
505 table_alias = NEW.table_alias,
506 column_name = NEW.column_name
510 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
511 ON DELETE TO query.expr_xcol
513 DELETE FROM query.expression WHERE id = OLD.id;
515 -- Create updatable view for EXISTS expressions
517 CREATE OR REPLACE VIEW query.expr_xex AS
529 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
530 ON INSERT TO query.expr_xex
532 INSERT INTO query.expression (
540 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
542 COALESCE(NEW.parenthesize, FALSE),
544 COALESCE(NEW.seq_no, 1),
548 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
549 ON UPDATE TO query.expr_xex
551 UPDATE query.expression SET
553 parenthesize = NEW.parenthesize,
554 parent_expr = NEW.parent_expr,
556 subquery = NEW.subquery
560 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
561 ON DELETE TO query.expr_xex
563 DELETE FROM query.expression WHERE id = OLD.id;
565 -- Create updatable view for field expressions
567 CREATE OR REPLACE VIEW query.expr_xfld AS
580 CREATE OR REPLACE RULE query_expr_xfld_insert_rule AS
581 ON INSERT TO query.expr_xfld
583 INSERT INTO query.expression (
592 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
594 COALESCE(NEW.parenthesize, FALSE),
596 COALESCE(NEW.seq_no, 1),
601 CREATE OR REPLACE RULE query_expr_xfld_update_rule AS
602 ON UPDATE TO query.expr_xfld
604 UPDATE query.expression SET
606 parenthesize = NEW.parenthesize,
607 parent_expr = NEW.parent_expr,
609 column_name = NEW.column_name,
610 left_operand = NEW.left_operand
614 CREATE OR REPLACE RULE query_expr_xfld_delete_rule AS
615 ON DELETE TO query.expr_xfld
617 DELETE FROM query.expression WHERE id = OLD.id;
619 -- Create updatable view for function call expressions
621 CREATE OR REPLACE VIEW query.expr_xfunc AS
633 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
634 ON INSERT TO query.expr_xfunc
636 INSERT INTO query.expression (
644 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
646 COALESCE(NEW.parenthesize, FALSE),
648 COALESCE(NEW.seq_no, 1),
652 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
653 ON UPDATE TO query.expr_xfunc
655 UPDATE query.expression SET
657 parenthesize = NEW.parenthesize,
658 parent_expr = NEW.parent_expr,
660 function_id = NEW.function_id
664 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
665 ON DELETE TO query.expr_xfunc
667 DELETE FROM query.expression WHERE id = OLD.id;
669 -- Create updatable view for IN expressions
671 CREATE OR REPLACE VIEW query.expr_xin AS
683 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
684 ON INSERT TO query.expr_xin
686 INSERT INTO query.expression (
694 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
696 COALESCE(NEW.parenthesize, FALSE),
698 COALESCE(NEW.seq_no, 1),
702 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
703 ON UPDATE TO query.expr_xin
705 UPDATE query.expression SET
707 parenthesize = NEW.parenthesize,
708 parent_expr = NEW.parent_expr,
710 subquery = NEW.subquery
714 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
715 ON DELETE TO query.expr_xin
717 DELETE FROM query.expression WHERE id = OLD.id;
719 -- Create updatable view for NOT BETWEEN expressions
721 CREATE OR REPLACE VIEW query.expr_xnbet AS
732 CREATE OR REPLACE RULE query_expr_xnbet_insert_rule AS
733 ON INSERT TO query.expr_xnbet
735 INSERT INTO query.expression (
742 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
744 COALESCE(NEW.parenthesize, FALSE),
746 COALESCE(NEW.seq_no, 1)
749 CREATE OR REPLACE RULE query_expr_xnbet_update_rule AS
750 ON UPDATE TO query.expr_xnbet
752 UPDATE query.expression SET
754 parenthesize = NEW.parenthesize,
755 parent_expr = NEW.parent_expr,
760 CREATE OR REPLACE RULE query_expr_xnbet_delete_rule AS
761 ON DELETE TO query.expr_xnbet
763 DELETE FROM query.expression WHERE id = OLD.id;
765 -- Create updatable view for NOT EXISTS expressions
767 CREATE OR REPLACE VIEW query.expr_xnex AS
779 CREATE OR REPLACE RULE query_expr_xnex_insert_rule AS
780 ON INSERT TO query.expr_xnex
782 INSERT INTO query.expression (
790 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
792 COALESCE(NEW.parenthesize, FALSE),
794 COALESCE(NEW.seq_no, 1),
798 CREATE OR REPLACE RULE query_expr_xnex_update_rule AS
799 ON UPDATE TO query.expr_xnex
801 UPDATE query.expression SET
803 parenthesize = NEW.parenthesize,
804 parent_expr = NEW.parent_expr,
806 subquery = NEW.subquery
810 CREATE OR REPLACE RULE query_expr_xnex_delete_rule AS
811 ON DELETE TO query.expr_xnex
813 DELETE FROM query.expression WHERE id = OLD.id;
815 -- Create updatable view for NOT IN expressions
817 CREATE OR REPLACE VIEW query.expr_xnin AS
829 CREATE OR REPLACE RULE query_expr_xnin_insert_rule AS
830 ON INSERT TO query.expr_xnin
832 INSERT INTO query.expression (
840 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
842 COALESCE(NEW.parenthesize, FALSE),
844 COALESCE(NEW.seq_no, 1),
848 CREATE OR REPLACE RULE query_expr_xnin_update_rule AS
849 ON UPDATE TO query.expr_xnin
851 UPDATE query.expression SET
853 parenthesize = NEW.parenthesize,
854 parent_expr = NEW.parent_expr,
856 subquery = NEW.subquery
860 CREATE OR REPLACE RULE query_expr_xnin_delete_rule AS
861 ON DELETE TO query.expr_xnin
863 DELETE FROM query.expression WHERE id = OLD.id;
865 -- Create updatable view for NULL expressions
867 CREATE OR REPLACE VIEW query.expr_xnull AS
878 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
879 ON INSERT TO query.expr_xnull
881 INSERT INTO query.expression (
888 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
890 COALESCE(NEW.parenthesize, FALSE),
892 COALESCE(NEW.seq_no, 1)
895 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
896 ON UPDATE TO query.expr_xnull
898 UPDATE query.expression SET
900 parenthesize = NEW.parenthesize,
901 parent_expr = NEW.parent_expr,
906 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
907 ON DELETE TO query.expr_xnull
909 DELETE FROM query.expression WHERE id = OLD.id;
911 -- Create updatable view for numeric literal expressions
913 CREATE OR REPLACE VIEW query.expr_xnum AS
925 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
926 ON INSERT TO query.expr_xnum
928 INSERT INTO query.expression (
936 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
938 COALESCE(NEW.parenthesize, FALSE),
940 COALESCE(NEW.seq_no, 1),
944 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
945 ON UPDATE TO query.expr_xnum
947 UPDATE query.expression SET
949 parenthesize = NEW.parenthesize,
950 parent_expr = NEW.parent_expr,
952 literal = NEW.literal
956 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
957 ON DELETE TO query.expr_xnum
959 DELETE FROM query.expression WHERE id = OLD.id;
961 -- Create updatable view for operator expressions
963 CREATE OR REPLACE VIEW query.expr_xop AS
977 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
978 ON INSERT TO query.expr_xop
980 INSERT INTO query.expression (
990 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
992 COALESCE(NEW.parenthesize, FALSE),
994 COALESCE(NEW.seq_no, 1),
1000 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
1001 ON UPDATE TO query.expr_xop
1003 UPDATE query.expression SET
1005 parenthesize = NEW.parenthesize,
1006 parent_expr = NEW.parent_expr,
1007 seq_no = NEW.seq_no,
1008 left_operand = NEW.left_operand,
1009 operator = NEW.operator,
1010 right_operand = NEW.right_operand
1014 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
1015 ON DELETE TO query.expr_xop
1017 DELETE FROM query.expression WHERE id = OLD.id;
1019 -- Create updatable view for string literal expressions
1021 CREATE OR REPLACE VIEW query.expr_string AS
1033 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1034 ON INSERT TO query.expr_string
1036 INSERT INTO query.expression (
1044 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1046 COALESCE(NEW.parenthesize, FALSE),
1048 COALESCE(NEW.seq_no, 1),
1052 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1053 ON UPDATE TO query.expr_string
1055 UPDATE query.expression SET
1057 parenthesize = NEW.parenthesize,
1058 parent_expr = NEW.parent_expr,
1059 seq_no = NEW.seq_no,
1060 literal = NEW.literal
1064 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1065 ON DELETE TO query.expr_string
1067 DELETE FROM query.expression WHERE id = OLD.id;
1069 -- Create updatable view for subquery expressions
1071 CREATE OR REPLACE VIEW query.expr_xsubq AS
1083 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1084 ON INSERT TO query.expr_xsubq
1086 INSERT INTO query.expression (
1094 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1096 COALESCE(NEW.parenthesize, FALSE),
1098 COALESCE(NEW.seq_no, 1),
1102 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1103 ON UPDATE TO query.expr_xsubq
1105 UPDATE query.expression SET
1107 parenthesize = NEW.parenthesize,
1108 parent_expr = NEW.parent_expr,
1109 seq_no = NEW.seq_no,
1110 subquery = NEW.subquery
1114 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1115 ON DELETE TO query.expr_xsubq
1117 DELETE FROM query.expression WHERE id = OLD.id;