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, --REFERENCES query.from_clause
38 --DEFERRABLE INITIALLY DEFERRED,
39 where_clause INT, --REFERENCES query.expression
40 --DEFERRABLE INITIALLY DEFERRED,
41 having_clause INT --REFERENCES query.expression
42 --DEFERRABLE INITIALLY DEFERRED
45 -- (Foreign keys to be defined later after other tables are created)
47 CREATE TABLE query.query_sequence (
48 id SERIAL PRIMARY KEY,
49 parent_query INT NOT NULL
50 REFERENCES query.stored_query
52 DEFERRABLE INITIALLY DEFERRED,
54 child_query INT NOT NULL
55 REFERENCES query.stored_query
57 DEFERRABLE INITIALLY DEFERRED,
58 CONSTRAINT query_query_seq UNIQUE( parent_query, seq_no )
61 CREATE TABLE query.datatype (
62 id SERIAL PRIMARY KEY,
63 datatype_name TEXT NOT NULL UNIQUE,
64 is_numeric BOOL NOT NULL DEFAULT FALSE,
65 is_composite BOOL NOT NULL DEFAULT FALSE,
66 CONSTRAINT qdt_comp_not_num CHECK
67 ( is_numeric IS FALSE OR is_composite IS FALSE )
70 CREATE TABLE query.subfield (
71 id SERIAL PRIMARY KEY,
72 composite_type INT NOT NULL
73 REFERENCES query.datatype(id)
75 DEFERRABLE INITIALLY DEFERRED,
77 CONSTRAINT qsf_pos_seq_no
79 subfield_type INT NOT NULL
80 REFERENCES query.datatype(id)
81 DEFERRABLE INITIALLY DEFERRED,
82 CONSTRAINT qsf_datatype_seq_no UNIQUE (composite_type, seq_no)
85 CREATE TABLE query.function_sig (
86 id SERIAL PRIMARY KEY,
87 function_name TEXT NOT NULL,
88 return_type INT REFERENCES query.datatype(id)
89 DEFERRABLE INITIALLY DEFERRED,
90 is_aggregate BOOL NOT NULL DEFAULT FALSE,
91 CONSTRAINT qfd_rtn_or_aggr CHECK
92 ( return_type IS NULL OR is_aggregate = FALSE )
95 CREATE INDEX query_function_sig_name_idx
96 ON query.function_sig (function_name);
98 CREATE TABLE query.function_param_def (
99 id SERIAL PRIMARY KEY,
100 function_id INT NOT NULL
101 REFERENCES query.function_sig( id )
103 DEFERRABLE INITIALLY DEFERRED,
105 CONSTRAINT qfpd_pos_seq_no CHECK
107 datatype INT NOT NULL
108 REFERENCES query.datatype( id )
109 DEFERRABLE INITIALLY DEFERRED,
110 CONSTRAINT qfpd_function_param_seq UNIQUE (function_id, seq_no)
113 CREATE TABLE query.expression (
114 id SERIAL PRIMARY KEY,
115 type TEXT NOT NULL CONSTRAINT predicate_type CHECK
126 'xnbet', -- not between
127 'xnex', -- not exists
135 parenthesize BOOL NOT NULL DEFAULT FALSE,
136 parent_expr INT REFERENCES query.expression
138 DEFERRABLE INITIALLY DEFERRED,
139 seq_no INT NOT NULL DEFAULT 1,
143 left_operand INT REFERENCES query.expression
144 DEFERRABLE INITIALLY DEFERRED,
146 right_operand INT REFERENCES query.expression
147 DEFERRABLE INITIALLY DEFERRED,
148 function_id INT REFERENCES query.function_sig
149 DEFERRABLE INITIALLY DEFERRED,
150 subquery INT REFERENCES query.stored_query
151 DEFERRABLE INITIALLY DEFERRED,
152 cast_type INT REFERENCES query.datatype
153 DEFERRABLE INITIALLY DEFERRED
156 CREATE UNIQUE INDEX query_expr_parent_seq
157 ON query.expression( parent_expr, seq_no )
158 WHERE parent_expr IS NOT NULL;
160 -- Due to some circular references, the following foreign key definitions
161 -- had to be deferred until query.expression existed:
163 ALTER TABLE query.stored_query
164 ADD FOREIGN KEY ( where_clause )
165 REFERENCES query.expression( id )
166 DEFERRABLE INITIALLY DEFERRED;
168 ALTER TABLE query.stored_query
169 ADD FOREIGN KEY ( having_clause )
170 REFERENCES query.expression( id )
171 DEFERRABLE INITIALLY DEFERRED;
173 CREATE TABLE query.case_branch (
174 id SERIAL PRIMARY KEY,
175 parent_expr INT NOT NULL REFERENCES query.expression
177 DEFERRABLE INITIALLY DEFERRED,
179 condition INT REFERENCES query.expression
180 DEFERRABLE INITIALLY DEFERRED,
181 result INT NOT NULL REFERENCES query.expression
182 DEFERRABLE INITIALLY DEFERRED,
183 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
186 CREATE TABLE query.from_relation (
187 id SERIAL PRIMARY KEY,
188 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
189 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
192 subquery INT REFERENCES query.stored_query,
193 function_call INT REFERENCES query.expression,
195 parent_relation INT REFERENCES query.from_relation
197 DEFERRABLE INITIALLY DEFERRED,
198 seq_no INT NOT NULL DEFAULT 1,
199 join_type TEXT CONSTRAINT good_join_type CHECK (
200 join_type IS NULL OR join_type IN
201 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
203 on_clause INT REFERENCES query.expression
204 DEFERRABLE INITIALLY DEFERRED,
205 CONSTRAINT join_or_core CHECK (
206 ( parent_relation IS NULL AND join_type IS NULL
207 AND on_clause IS NULL )
209 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
210 AND on_clause IS NOT NULL )
214 CREATE UNIQUE INDEX from_parent_seq
215 ON query.from_relation( parent_relation, seq_no )
216 WHERE parent_relation IS NOT NULL;
218 -- The following foreign key had to be deferred until
219 -- query.from_relation existed
221 ALTER TABLE query.stored_query
222 ADD FOREIGN KEY (from_clause)
223 REFERENCES query.from_relation
224 DEFERRABLE INITIALLY DEFERRED;
226 CREATE TABLE query.record_column (
227 id SERIAL PRIMARY KEY,
228 from_relation INT NOT NULL REFERENCES query.from_relation
230 DEFERRABLE INITIALLY DEFERRED,
232 column_name TEXT NOT NULL,
233 column_type INT NOT NULL REFERENCES query.datatype
235 DEFERRABLE INITIALLY DEFERRED,
236 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
239 CREATE TABLE query.select_item (
240 id SERIAL PRIMARY KEY,
241 stored_query INT NOT NULL REFERENCES query.stored_query
243 DEFERRABLE INITIALLY DEFERRED,
245 expression INT NOT NULL REFERENCES query.expression
246 DEFERRABLE INITIALLY DEFERRED,
248 grouped_by BOOL NOT NULL DEFAULT FALSE,
249 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
252 CREATE TABLE query.order_by_item (
253 id SERIAL PRIMARY KEY,
254 stored_query INT NOT NULL REFERENCES query.stored_query
256 DEFERRABLE INITIALLY DEFERRED,
258 expression INT NOT NULL REFERENCES query.expression
260 DEFERRABLE INITIALLY DEFERRED,
261 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
264 -- Create updatable views -------------------------------------------
266 -- Create updatable view for BETWEEN expressions
268 CREATE OR REPLACE VIEW query.expr_xbet AS
279 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
280 ON INSERT TO query.expr_xbet
282 INSERT INTO query.expression (
289 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
291 COALESCE(NEW.parenthesize, FALSE),
293 COALESCE(NEW.seq_no, 1)
296 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
297 ON UPDATE TO query.expr_xbet
299 UPDATE query.expression SET
301 parenthesize = NEW.parenthesize,
302 parent_expr = NEW.parent_expr,
307 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
308 ON DELETE TO query.expr_xbet
310 DELETE FROM query.expression WHERE id = OLD.id;
312 -- Create updatable view for boolean expressions
314 CREATE OR REPLACE VIEW query.expr_xbool AS
326 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
327 ON INSERT TO query.expr_xbool
329 INSERT INTO query.expression (
337 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
339 COALESCE(NEW.parenthesize, FALSE),
341 COALESCE(NEW.seq_no, 1),
345 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
346 ON UPDATE TO query.expr_xbool
348 UPDATE query.expression SET
350 parenthesize = NEW.parenthesize,
351 parent_expr = NEW.parent_expr,
353 literal = NEW.literal
357 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
358 ON DELETE TO query.expr_xbool
360 DELETE FROM query.expression WHERE id = OLD.id;
362 -- Create updatable view for CASE expressions
364 CREATE OR REPLACE VIEW query.expr_xcase AS
375 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
376 ON INSERT TO query.expr_xcase
378 INSERT INTO query.expression (
385 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
387 COALESCE(NEW.parenthesize, FALSE),
389 COALESCE(NEW.seq_no, 1)
392 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
393 ON UPDATE TO query.expr_xcase
395 UPDATE query.expression SET
397 parenthesize = NEW.parenthesize,
398 parent_expr = NEW.parent_expr,
403 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
404 ON DELETE TO query.expr_xcase
406 DELETE FROM query.expression WHERE id = OLD.id;
408 -- Create updatable view for cast expressions
410 CREATE OR REPLACE VIEW query.expr_xcast AS
423 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
424 ON INSERT TO query.expr_xcast
426 INSERT INTO query.expression (
435 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
437 COALESCE(NEW.parenthesize, FALSE),
439 COALESCE(NEW.seq_no, 1),
444 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
445 ON UPDATE TO query.expr_xcast
447 UPDATE query.expression SET
449 parenthesize = NEW.parenthesize,
450 parent_expr = NEW.parent_expr,
452 left_operand = NEW.left_operand,
453 cast_type = NEW.cast_type
457 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
458 ON DELETE TO query.expr_xcast
460 DELETE FROM query.expression WHERE id = OLD.id;
462 -- Create updatable view for column expressions
464 CREATE OR REPLACE VIEW query.expr_xcol AS
477 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
478 ON INSERT TO query.expr_xcol
480 INSERT INTO query.expression (
489 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
491 COALESCE(NEW.parenthesize, FALSE),
493 COALESCE(NEW.seq_no, 1),
498 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
499 ON UPDATE TO query.expr_xcol
501 UPDATE query.expression SET
503 parenthesize = NEW.parenthesize,
504 parent_expr = NEW.parent_expr,
506 table_alias = NEW.table_alias,
507 column_name = NEW.column_name
511 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
512 ON DELETE TO query.expr_xcol
514 DELETE FROM query.expression WHERE id = OLD.id;
516 -- Create updatable view for EXISTS expressions
518 CREATE OR REPLACE VIEW query.expr_xex AS
530 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
531 ON INSERT TO query.expr_xex
533 INSERT INTO query.expression (
541 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
543 COALESCE(NEW.parenthesize, FALSE),
545 COALESCE(NEW.seq_no, 1),
549 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
550 ON UPDATE TO query.expr_xex
552 UPDATE query.expression SET
554 parenthesize = NEW.parenthesize,
555 parent_expr = NEW.parent_expr,
557 subquery = NEW.subquery
561 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
562 ON DELETE TO query.expr_xex
564 DELETE FROM query.expression WHERE id = OLD.id;
566 -- Create updatable view for field expressions
568 CREATE OR REPLACE VIEW query.expr_xfld AS
581 CREATE OR REPLACE RULE query_expr_xfld_insert_rule AS
582 ON INSERT TO query.expr_xfld
584 INSERT INTO query.expression (
593 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
595 COALESCE(NEW.parenthesize, FALSE),
597 COALESCE(NEW.seq_no, 1),
602 CREATE OR REPLACE RULE query_expr_xfld_update_rule AS
603 ON UPDATE TO query.expr_xfld
605 UPDATE query.expression SET
607 parenthesize = NEW.parenthesize,
608 parent_expr = NEW.parent_expr,
610 column_name = NEW.column_name,
611 left_operand = NEW.left_operand
615 CREATE OR REPLACE RULE query_expr_xfld_delete_rule AS
616 ON DELETE TO query.expr_xfld
618 DELETE FROM query.expression WHERE id = OLD.id;
620 -- Create updatable view for function call expressions
622 CREATE OR REPLACE VIEW query.expr_xfunc AS
634 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
635 ON INSERT TO query.expr_xfunc
637 INSERT INTO query.expression (
645 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
647 COALESCE(NEW.parenthesize, FALSE),
649 COALESCE(NEW.seq_no, 1),
653 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
654 ON UPDATE TO query.expr_xfunc
656 UPDATE query.expression SET
658 parenthesize = NEW.parenthesize,
659 parent_expr = NEW.parent_expr,
661 function_id = NEW.function_id
665 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
666 ON DELETE TO query.expr_xfunc
668 DELETE FROM query.expression WHERE id = OLD.id;
670 -- Create updatable view for IN expressions
672 CREATE OR REPLACE VIEW query.expr_xin AS
684 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
685 ON INSERT TO query.expr_xin
687 INSERT INTO query.expression (
695 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
697 COALESCE(NEW.parenthesize, FALSE),
699 COALESCE(NEW.seq_no, 1),
703 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
704 ON UPDATE TO query.expr_xin
706 UPDATE query.expression SET
708 parenthesize = NEW.parenthesize,
709 parent_expr = NEW.parent_expr,
711 subquery = NEW.subquery
715 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
716 ON DELETE TO query.expr_xin
718 DELETE FROM query.expression WHERE id = OLD.id;
720 -- Create updatable view for NOT BETWEEN expressions
722 CREATE OR REPLACE VIEW query.expr_xnbet AS
733 CREATE OR REPLACE RULE query_expr_xnbet_insert_rule AS
734 ON INSERT TO query.expr_xnbet
736 INSERT INTO query.expression (
743 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
745 COALESCE(NEW.parenthesize, FALSE),
747 COALESCE(NEW.seq_no, 1)
750 CREATE OR REPLACE RULE query_expr_xnbet_update_rule AS
751 ON UPDATE TO query.expr_xnbet
753 UPDATE query.expression SET
755 parenthesize = NEW.parenthesize,
756 parent_expr = NEW.parent_expr,
761 CREATE OR REPLACE RULE query_expr_xnbet_delete_rule AS
762 ON DELETE TO query.expr_xnbet
764 DELETE FROM query.expression WHERE id = OLD.id;
766 -- Create updatable view for NOT EXISTS expressions
768 CREATE OR REPLACE VIEW query.expr_xnex AS
780 CREATE OR REPLACE RULE query_expr_xnex_insert_rule AS
781 ON INSERT TO query.expr_xnex
783 INSERT INTO query.expression (
791 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
793 COALESCE(NEW.parenthesize, FALSE),
795 COALESCE(NEW.seq_no, 1),
799 CREATE OR REPLACE RULE query_expr_xnex_update_rule AS
800 ON UPDATE TO query.expr_xnex
802 UPDATE query.expression SET
804 parenthesize = NEW.parenthesize,
805 parent_expr = NEW.parent_expr,
807 subquery = NEW.subquery
811 CREATE OR REPLACE RULE query_expr_xnex_delete_rule AS
812 ON DELETE TO query.expr_xnex
814 DELETE FROM query.expression WHERE id = OLD.id;
816 -- Create updatable view for NOT IN expressions
818 CREATE OR REPLACE VIEW query.expr_xnin AS
830 CREATE OR REPLACE RULE query_expr_xnin_insert_rule AS
831 ON INSERT TO query.expr_xnin
833 INSERT INTO query.expression (
841 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
843 COALESCE(NEW.parenthesize, FALSE),
845 COALESCE(NEW.seq_no, 1),
849 CREATE OR REPLACE RULE query_expr_xnin_update_rule AS
850 ON UPDATE TO query.expr_xnin
852 UPDATE query.expression SET
854 parenthesize = NEW.parenthesize,
855 parent_expr = NEW.parent_expr,
857 subquery = NEW.subquery
861 CREATE OR REPLACE RULE query_expr_xnin_delete_rule AS
862 ON DELETE TO query.expr_xnin
864 DELETE FROM query.expression WHERE id = OLD.id;
866 -- Create updatable view for NULL expressions
868 CREATE OR REPLACE VIEW query.expr_xnull AS
879 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
880 ON INSERT TO query.expr_xnull
882 INSERT INTO query.expression (
889 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
891 COALESCE(NEW.parenthesize, FALSE),
893 COALESCE(NEW.seq_no, 1)
896 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
897 ON UPDATE TO query.expr_xnull
899 UPDATE query.expression SET
901 parenthesize = NEW.parenthesize,
902 parent_expr = NEW.parent_expr,
907 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
908 ON DELETE TO query.expr_xnull
910 DELETE FROM query.expression WHERE id = OLD.id;
912 -- Create updatable view for numeric literal expressions
914 CREATE OR REPLACE VIEW query.expr_xnum AS
926 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
927 ON INSERT TO query.expr_xnum
929 INSERT INTO query.expression (
937 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
939 COALESCE(NEW.parenthesize, FALSE),
941 COALESCE(NEW.seq_no, 1),
945 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
946 ON UPDATE TO query.expr_xnum
948 UPDATE query.expression SET
950 parenthesize = NEW.parenthesize,
951 parent_expr = NEW.parent_expr,
953 literal = NEW.literal
957 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
958 ON DELETE TO query.expr_xnum
960 DELETE FROM query.expression WHERE id = OLD.id;
962 -- Create updatable view for operator expressions
964 CREATE OR REPLACE VIEW query.expr_xop AS
978 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
979 ON INSERT TO query.expr_xop
981 INSERT INTO query.expression (
991 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
993 COALESCE(NEW.parenthesize, FALSE),
995 COALESCE(NEW.seq_no, 1),
1001 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
1002 ON UPDATE TO query.expr_xop
1004 UPDATE query.expression SET
1006 parenthesize = NEW.parenthesize,
1007 parent_expr = NEW.parent_expr,
1008 seq_no = NEW.seq_no,
1009 left_operand = NEW.left_operand,
1010 operator = NEW.operator,
1011 right_operand = NEW.right_operand
1015 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
1016 ON DELETE TO query.expr_xop
1018 DELETE FROM query.expression WHERE id = OLD.id;
1020 -- Create updatable view for string literal expressions
1022 CREATE OR REPLACE VIEW query.expr_string AS
1034 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1035 ON INSERT TO query.expr_string
1037 INSERT INTO query.expression (
1045 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1047 COALESCE(NEW.parenthesize, FALSE),
1049 COALESCE(NEW.seq_no, 1),
1053 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1054 ON UPDATE TO query.expr_string
1056 UPDATE query.expression SET
1058 parenthesize = NEW.parenthesize,
1059 parent_expr = NEW.parent_expr,
1060 seq_no = NEW.seq_no,
1061 literal = NEW.literal
1065 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1066 ON DELETE TO query.expr_string
1068 DELETE FROM query.expression WHERE id = OLD.id;
1070 -- Create updatable view for subquery expressions
1072 CREATE OR REPLACE VIEW query.expr_xsubq AS
1084 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1085 ON INSERT TO query.expr_xsubq
1087 INSERT INTO query.expression (
1095 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1097 COALESCE(NEW.parenthesize, FALSE),
1099 COALESCE(NEW.seq_no, 1),
1103 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1104 ON UPDATE TO query.expr_xsubq
1106 UPDATE query.expression SET
1108 parenthesize = NEW.parenthesize,
1109 parent_expr = NEW.parent_expr,
1110 seq_no = NEW.seq_no,
1111 subquery = NEW.subquery
1115 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1116 ON DELETE TO query.expr_xsubq
1118 DELETE FROM query.expression WHERE id = OLD.id;