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.bind_variable (
114 name TEXT PRIMARY KEY,
116 CONSTRAINT bind_variable_type CHECK
117 ( type in ( 'string', 'number', 'string_list', 'number_list' )),
118 description TEXT NOT NULL,
119 default_value TEXT, -- to be encoded in JSON
123 CREATE TABLE query.expression (
124 id SERIAL PRIMARY KEY,
125 type TEXT NOT NULL CONSTRAINT expression_type CHECK
128 'xbind', -- bind variable
143 parenthesize BOOL NOT NULL DEFAULT FALSE,
144 parent_expr INT REFERENCES query.expression
146 DEFERRABLE INITIALLY DEFERRED,
147 seq_no INT NOT NULL DEFAULT 1,
151 left_operand INT REFERENCES query.expression
152 DEFERRABLE INITIALLY DEFERRED,
154 right_operand INT REFERENCES query.expression
155 DEFERRABLE INITIALLY DEFERRED,
156 function_id INT REFERENCES query.function_sig
157 DEFERRABLE INITIALLY DEFERRED,
158 subquery INT REFERENCES query.stored_query
159 DEFERRABLE INITIALLY DEFERRED,
160 cast_type INT REFERENCES query.datatype
161 DEFERRABLE INITIALLY DEFERRED,
162 negate BOOL NOT NULL DEFAULT FALSE,
163 bind_variable TEXT REFERENCES query.bind_variable
164 DEFERRABLE INITIALLY DEFERRED
167 CREATE UNIQUE INDEX query_expr_parent_seq
168 ON query.expression( parent_expr, seq_no )
169 WHERE parent_expr IS NOT NULL;
171 -- Due to some circular references, the following foreign key definitions
172 -- had to be deferred until query.expression existed:
174 ALTER TABLE query.stored_query
175 ADD FOREIGN KEY ( where_clause )
176 REFERENCES query.expression( id )
177 DEFERRABLE INITIALLY DEFERRED;
179 ALTER TABLE query.stored_query
180 ADD FOREIGN KEY ( having_clause )
181 REFERENCES query.expression( id )
182 DEFERRABLE INITIALLY DEFERRED;
184 CREATE TABLE query.case_branch (
185 id SERIAL PRIMARY KEY,
186 parent_expr INT NOT NULL REFERENCES query.expression
188 DEFERRABLE INITIALLY DEFERRED,
190 condition INT REFERENCES query.expression
191 DEFERRABLE INITIALLY DEFERRED,
192 result INT NOT NULL REFERENCES query.expression
193 DEFERRABLE INITIALLY DEFERRED,
194 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
197 CREATE TABLE query.from_relation (
198 id SERIAL PRIMARY KEY,
199 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
200 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
203 subquery INT REFERENCES query.stored_query,
204 function_call INT REFERENCES query.expression,
206 parent_relation INT REFERENCES query.from_relation
208 DEFERRABLE INITIALLY DEFERRED,
209 seq_no INT NOT NULL DEFAULT 1,
210 join_type TEXT CONSTRAINT good_join_type CHECK (
211 join_type IS NULL OR join_type IN
212 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
214 on_clause INT REFERENCES query.expression
215 DEFERRABLE INITIALLY DEFERRED,
216 CONSTRAINT join_or_core CHECK (
217 ( parent_relation IS NULL AND join_type IS NULL
218 AND on_clause IS NULL )
220 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
221 AND on_clause IS NOT NULL )
225 CREATE UNIQUE INDEX from_parent_seq
226 ON query.from_relation( parent_relation, seq_no )
227 WHERE parent_relation IS NOT NULL;
229 -- The following foreign key had to be deferred until
230 -- query.from_relation existed
232 ALTER TABLE query.stored_query
233 ADD FOREIGN KEY (from_clause)
234 REFERENCES query.from_relation
235 DEFERRABLE INITIALLY DEFERRED;
237 CREATE TABLE query.record_column (
238 id SERIAL PRIMARY KEY,
239 from_relation INT NOT NULL REFERENCES query.from_relation
241 DEFERRABLE INITIALLY DEFERRED,
243 column_name TEXT NOT NULL,
244 column_type INT NOT NULL REFERENCES query.datatype
246 DEFERRABLE INITIALLY DEFERRED,
247 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
250 CREATE TABLE query.select_item (
251 id SERIAL PRIMARY KEY,
252 stored_query INT NOT NULL REFERENCES query.stored_query
254 DEFERRABLE INITIALLY DEFERRED,
256 expression INT NOT NULL REFERENCES query.expression
257 DEFERRABLE INITIALLY DEFERRED,
259 grouped_by BOOL NOT NULL DEFAULT FALSE,
260 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
263 CREATE TABLE query.order_by_item (
264 id SERIAL PRIMARY KEY,
265 stored_query INT NOT NULL REFERENCES query.stored_query
267 DEFERRABLE INITIALLY DEFERRED,
269 expression INT NOT NULL REFERENCES query.expression
271 DEFERRABLE INITIALLY DEFERRED,
272 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
275 -- Create updatable views -------------------------------------------
277 -- Create updatable view for BETWEEN expressions
279 CREATE OR REPLACE VIEW query.expr_xbet AS
291 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
292 ON INSERT TO query.expr_xbet
294 INSERT INTO query.expression (
302 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
304 COALESCE(NEW.parenthesize, FALSE),
306 COALESCE(NEW.seq_no, 1),
310 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
311 ON UPDATE TO query.expr_xbet
313 UPDATE query.expression SET
315 parenthesize = NEW.parenthesize,
316 parent_expr = NEW.parent_expr,
322 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
323 ON DELETE TO query.expr_xbet
325 DELETE FROM query.expression WHERE id = OLD.id;
327 -- Create updatable view for bind variable expressions
329 CREATE OR REPLACE VIEW query.expr_xbind AS
341 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
342 ON INSERT TO query.expr_xbind
344 INSERT INTO query.expression (
352 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
354 COALESCE(NEW.parenthesize, FALSE),
356 COALESCE(NEW.seq_no, 1),
360 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
361 ON UPDATE TO query.expr_xbind
363 UPDATE query.expression SET
365 parenthesize = NEW.parenthesize,
366 parent_expr = NEW.parent_expr,
368 bind_variable = NEW.bind_variable
372 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
373 ON DELETE TO query.expr_xbind
375 DELETE FROM query.expression WHERE id = OLD.id;
377 -- Create updatable view for bind variable expressions
379 CREATE OR REPLACE VIEW query.expr_xbind AS
391 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
392 ON INSERT TO query.expr_xbind
394 INSERT INTO query.expression (
402 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
404 COALESCE(NEW.parenthesize, FALSE),
406 COALESCE(NEW.seq_no, 1),
410 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
411 ON UPDATE TO query.expr_xbind
413 UPDATE query.expression SET
415 parenthesize = NEW.parenthesize,
416 parent_expr = NEW.parent_expr,
418 bind_variable = NEW.bind_variable
422 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
423 ON DELETE TO query.expr_xbind
425 DELETE FROM query.expression WHERE id = OLD.id;
427 -- Create updatable view for boolean expressions
429 CREATE OR REPLACE VIEW query.expr_xbool AS
442 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
443 ON INSERT TO query.expr_xbool
445 INSERT INTO query.expression (
454 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
456 COALESCE(NEW.parenthesize, FALSE),
458 COALESCE(NEW.seq_no, 1),
463 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
464 ON UPDATE TO query.expr_xbool
466 UPDATE query.expression SET
468 parenthesize = NEW.parenthesize,
469 parent_expr = NEW.parent_expr,
471 literal = NEW.literal,
476 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
477 ON DELETE TO query.expr_xbool
479 DELETE FROM query.expression WHERE id = OLD.id;
481 -- Create updatable view for CASE expressions
483 CREATE OR REPLACE VIEW query.expr_xcase AS
495 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
496 ON INSERT TO query.expr_xcase
498 INSERT INTO query.expression (
506 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
508 COALESCE(NEW.parenthesize, FALSE),
510 COALESCE(NEW.seq_no, 1),
514 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
515 ON UPDATE TO query.expr_xcase
517 UPDATE query.expression SET
519 parenthesize = NEW.parenthesize,
520 parent_expr = NEW.parent_expr,
526 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
527 ON DELETE TO query.expr_xcase
529 DELETE FROM query.expression WHERE id = OLD.id;
531 -- Create updatable view for cast expressions
533 CREATE OR REPLACE VIEW query.expr_xcast AS
547 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
548 ON INSERT TO query.expr_xcast
550 INSERT INTO query.expression (
560 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
562 COALESCE(NEW.parenthesize, FALSE),
564 COALESCE(NEW.seq_no, 1),
570 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
571 ON UPDATE TO query.expr_xcast
573 UPDATE query.expression SET
575 parenthesize = NEW.parenthesize,
576 parent_expr = NEW.parent_expr,
578 left_operand = NEW.left_operand,
579 cast_type = NEW.cast_type,
584 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
585 ON DELETE TO query.expr_xcast
587 DELETE FROM query.expression WHERE id = OLD.id;
589 -- Create updatable view for column expressions
591 CREATE OR REPLACE VIEW query.expr_xcol AS
605 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
606 ON INSERT TO query.expr_xcol
608 INSERT INTO query.expression (
618 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
620 COALESCE(NEW.parenthesize, FALSE),
622 COALESCE(NEW.seq_no, 1),
628 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
629 ON UPDATE TO query.expr_xcol
631 UPDATE query.expression SET
633 parenthesize = NEW.parenthesize,
634 parent_expr = NEW.parent_expr,
636 table_alias = NEW.table_alias,
637 column_name = NEW.column_name,
642 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
643 ON DELETE TO query.expr_xcol
645 DELETE FROM query.expression WHERE id = OLD.id;
647 -- Create updatable view for EXISTS expressions
649 CREATE OR REPLACE VIEW query.expr_xex AS
662 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
663 ON INSERT TO query.expr_xex
665 INSERT INTO query.expression (
674 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
676 COALESCE(NEW.parenthesize, FALSE),
678 COALESCE(NEW.seq_no, 1),
683 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
684 ON UPDATE TO query.expr_xex
686 UPDATE query.expression SET
688 parenthesize = NEW.parenthesize,
689 parent_expr = NEW.parent_expr,
691 subquery = NEW.subquery,
696 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
697 ON DELETE TO query.expr_xex
699 DELETE FROM query.expression WHERE id = OLD.id;
701 -- Create updatable view for field expressions
703 CREATE OR REPLACE VIEW query.expr_xfld AS
717 CREATE OR REPLACE RULE query_expr_xfld_insert_rule AS
718 ON INSERT TO query.expr_xfld
720 INSERT INTO query.expression (
730 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
732 COALESCE(NEW.parenthesize, FALSE),
734 COALESCE(NEW.seq_no, 1),
740 CREATE OR REPLACE RULE query_expr_xfld_update_rule AS
741 ON UPDATE TO query.expr_xfld
743 UPDATE query.expression SET
745 parenthesize = NEW.parenthesize,
746 parent_expr = NEW.parent_expr,
748 column_name = NEW.column_name,
749 left_operand = NEW.left_operand,
754 CREATE OR REPLACE RULE query_expr_xfld_delete_rule AS
755 ON DELETE TO query.expr_xfld
757 DELETE FROM query.expression WHERE id = OLD.id;
759 -- Create updatable view for function call expressions
761 CREATE OR REPLACE VIEW query.expr_xfunc AS
774 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
775 ON INSERT TO query.expr_xfunc
777 INSERT INTO query.expression (
786 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
788 COALESCE(NEW.parenthesize, FALSE),
790 COALESCE(NEW.seq_no, 1),
795 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
796 ON UPDATE TO query.expr_xfunc
798 UPDATE query.expression SET
800 parenthesize = NEW.parenthesize,
801 parent_expr = NEW.parent_expr,
803 function_id = NEW.function_id,
808 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
809 ON DELETE TO query.expr_xfunc
811 DELETE FROM query.expression WHERE id = OLD.id;
813 -- Create updatable view for IN expressions
815 CREATE OR REPLACE VIEW query.expr_xin AS
829 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
830 ON INSERT TO query.expr_xin
832 INSERT INTO query.expression (
842 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
844 COALESCE(NEW.parenthesize, FALSE),
846 COALESCE(NEW.seq_no, 1),
852 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
853 ON UPDATE TO query.expr_xin
855 UPDATE query.expression SET
857 parenthesize = NEW.parenthesize,
858 parent_expr = NEW.parent_expr,
860 left_operand = NEW.left_operand,
861 subquery = NEW.subquery,
866 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
867 ON DELETE TO query.expr_xin
869 DELETE FROM query.expression WHERE id = OLD.id;
871 -- Create updatable view for NULL expressions
873 CREATE OR REPLACE VIEW query.expr_xnull AS
885 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
886 ON INSERT TO query.expr_xnull
888 INSERT INTO query.expression (
896 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
898 COALESCE(NEW.parenthesize, FALSE),
900 COALESCE(NEW.seq_no, 1),
904 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
905 ON UPDATE TO query.expr_xnull
907 UPDATE query.expression SET
909 parenthesize = NEW.parenthesize,
910 parent_expr = NEW.parent_expr,
916 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
917 ON DELETE TO query.expr_xnull
919 DELETE FROM query.expression WHERE id = OLD.id;
921 -- Create updatable view for numeric literal expressions
923 CREATE OR REPLACE VIEW query.expr_xnum AS
935 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
936 ON INSERT TO query.expr_xnum
938 INSERT INTO query.expression (
946 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
948 COALESCE(NEW.parenthesize, FALSE),
950 COALESCE(NEW.seq_no, 1),
954 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
955 ON UPDATE TO query.expr_xnum
957 UPDATE query.expression SET
959 parenthesize = NEW.parenthesize,
960 parent_expr = NEW.parent_expr,
962 literal = NEW.literal
966 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
967 ON DELETE TO query.expr_xnum
969 DELETE FROM query.expression WHERE id = OLD.id;
971 -- Create updatable view for operator expressions
973 CREATE OR REPLACE VIEW query.expr_xop AS
988 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
989 ON INSERT TO query.expr_xop
991 INSERT INTO query.expression (
1002 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1004 COALESCE(NEW.parenthesize, FALSE),
1006 COALESCE(NEW.seq_no, 1),
1013 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
1014 ON UPDATE TO query.expr_xop
1016 UPDATE query.expression SET
1018 parenthesize = NEW.parenthesize,
1019 parent_expr = NEW.parent_expr,
1020 seq_no = NEW.seq_no,
1021 left_operand = NEW.left_operand,
1022 operator = NEW.operator,
1023 right_operand = NEW.right_operand,
1028 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
1029 ON DELETE TO query.expr_xop
1031 DELETE FROM query.expression WHERE id = OLD.id;
1033 -- Create updatable view for string literal expressions
1035 CREATE OR REPLACE VIEW query.expr_xstr AS
1047 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1048 ON INSERT TO query.expr_xstr
1050 INSERT INTO query.expression (
1058 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1060 COALESCE(NEW.parenthesize, FALSE),
1062 COALESCE(NEW.seq_no, 1),
1066 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1067 ON UPDATE TO query.expr_xstr
1069 UPDATE query.expression SET
1071 parenthesize = NEW.parenthesize,
1072 parent_expr = NEW.parent_expr,
1073 seq_no = NEW.seq_no,
1074 literal = NEW.literal
1078 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1079 ON DELETE TO query.expr_xstr
1081 DELETE FROM query.expression WHERE id = OLD.id;
1083 -- Create updatable view for subquery expressions
1085 CREATE OR REPLACE VIEW query.expr_xsubq AS
1098 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1099 ON INSERT TO query.expr_xsubq
1101 INSERT INTO query.expression (
1110 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1112 COALESCE(NEW.parenthesize, FALSE),
1114 COALESCE(NEW.seq_no, 1),
1119 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1120 ON UPDATE TO query.expr_xsubq
1122 UPDATE query.expression SET
1124 parenthesize = NEW.parenthesize,
1125 parent_expr = NEW.parent_expr,
1126 seq_no = NEW.seq_no,
1127 subquery = NEW.subquery,
1132 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1133 ON DELETE TO query.expr_xsubq
1135 DELETE FROM query.expression WHERE id = OLD.id;