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
122 CREATE TABLE query.expression (
123 id SERIAL PRIMARY KEY,
124 type TEXT NOT NULL CONSTRAINT expression_type CHECK
127 'xbind', -- bind variable
142 parenthesize BOOL NOT NULL DEFAULT FALSE,
143 parent_expr INT REFERENCES query.expression
145 DEFERRABLE INITIALLY DEFERRED,
146 seq_no INT NOT NULL DEFAULT 1,
150 left_operand INT REFERENCES query.expression
151 DEFERRABLE INITIALLY DEFERRED,
153 right_operand INT REFERENCES query.expression
154 DEFERRABLE INITIALLY DEFERRED,
155 function_id INT REFERENCES query.function_sig
156 DEFERRABLE INITIALLY DEFERRED,
157 subquery INT REFERENCES query.stored_query
158 DEFERRABLE INITIALLY DEFERRED,
159 cast_type INT REFERENCES query.datatype
160 DEFERRABLE INITIALLY DEFERRED,
161 negate BOOL NOT NULL DEFAULT FALSE,
162 bind_variable TEXT REFERENCES query.bind_variable
163 DEFERRABLE INITIALLY DEFERRED
166 CREATE UNIQUE INDEX query_expr_parent_seq
167 ON query.expression( parent_expr, seq_no )
168 WHERE parent_expr IS NOT NULL;
170 -- Due to some circular references, the following foreign key definitions
171 -- had to be deferred until query.expression existed:
173 ALTER TABLE query.stored_query
174 ADD FOREIGN KEY ( where_clause )
175 REFERENCES query.expression( id )
176 DEFERRABLE INITIALLY DEFERRED;
178 ALTER TABLE query.stored_query
179 ADD FOREIGN KEY ( having_clause )
180 REFERENCES query.expression( id )
181 DEFERRABLE INITIALLY DEFERRED;
183 CREATE TABLE query.case_branch (
184 id SERIAL PRIMARY KEY,
185 parent_expr INT NOT NULL REFERENCES query.expression
187 DEFERRABLE INITIALLY DEFERRED,
189 condition INT REFERENCES query.expression
190 DEFERRABLE INITIALLY DEFERRED,
191 result INT NOT NULL REFERENCES query.expression
192 DEFERRABLE INITIALLY DEFERRED,
193 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
196 CREATE TABLE query.from_relation (
197 id SERIAL PRIMARY KEY,
198 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
199 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
202 subquery INT REFERENCES query.stored_query,
203 function_call INT REFERENCES query.expression,
205 parent_relation INT REFERENCES query.from_relation
207 DEFERRABLE INITIALLY DEFERRED,
208 seq_no INT NOT NULL DEFAULT 1,
209 join_type TEXT CONSTRAINT good_join_type CHECK (
210 join_type IS NULL OR join_type IN
211 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
213 on_clause INT REFERENCES query.expression
214 DEFERRABLE INITIALLY DEFERRED,
215 CONSTRAINT join_or_core CHECK (
216 ( parent_relation IS NULL AND join_type IS NULL
217 AND on_clause IS NULL )
219 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
220 AND on_clause IS NOT NULL )
224 CREATE UNIQUE INDEX from_parent_seq
225 ON query.from_relation( parent_relation, seq_no )
226 WHERE parent_relation IS NOT NULL;
228 -- The following foreign key had to be deferred until
229 -- query.from_relation existed
231 ALTER TABLE query.stored_query
232 ADD FOREIGN KEY (from_clause)
233 REFERENCES query.from_relation
234 DEFERRABLE INITIALLY DEFERRED;
236 CREATE TABLE query.record_column (
237 id SERIAL PRIMARY KEY,
238 from_relation INT NOT NULL REFERENCES query.from_relation
240 DEFERRABLE INITIALLY DEFERRED,
242 column_name TEXT NOT NULL,
243 column_type INT NOT NULL REFERENCES query.datatype
245 DEFERRABLE INITIALLY DEFERRED,
246 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
249 CREATE TABLE query.select_item (
250 id SERIAL PRIMARY KEY,
251 stored_query INT NOT NULL REFERENCES query.stored_query
253 DEFERRABLE INITIALLY DEFERRED,
255 expression INT NOT NULL REFERENCES query.expression
256 DEFERRABLE INITIALLY DEFERRED,
258 grouped_by BOOL NOT NULL DEFAULT FALSE,
259 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
262 CREATE TABLE query.order_by_item (
263 id SERIAL PRIMARY KEY,
264 stored_query INT NOT NULL REFERENCES query.stored_query
266 DEFERRABLE INITIALLY DEFERRED,
268 expression INT NOT NULL REFERENCES query.expression
270 DEFERRABLE INITIALLY DEFERRED,
271 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
274 -- Create updatable views -------------------------------------------
276 -- Create updatable view for BETWEEN expressions
278 CREATE OR REPLACE VIEW query.expr_xbet AS
290 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
291 ON INSERT TO query.expr_xbet
293 INSERT INTO query.expression (
301 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
303 COALESCE(NEW.parenthesize, FALSE),
305 COALESCE(NEW.seq_no, 1),
309 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
310 ON UPDATE TO query.expr_xbet
312 UPDATE query.expression SET
314 parenthesize = NEW.parenthesize,
315 parent_expr = NEW.parent_expr,
321 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
322 ON DELETE TO query.expr_xbet
324 DELETE FROM query.expression WHERE id = OLD.id;
326 -- Create updatable view for bind variable expressions
328 CREATE OR REPLACE VIEW query.expr_xbind AS
340 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
341 ON INSERT TO query.expr_xbind
343 INSERT INTO query.expression (
351 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
353 COALESCE(NEW.parenthesize, FALSE),
355 COALESCE(NEW.seq_no, 1),
359 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
360 ON UPDATE TO query.expr_xbind
362 UPDATE query.expression SET
364 parenthesize = NEW.parenthesize,
365 parent_expr = NEW.parent_expr,
367 bind_variable = NEW.bind_variable
371 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
372 ON DELETE TO query.expr_xbind
374 DELETE FROM query.expression WHERE id = OLD.id;
376 -- Create updatable view for bind variable expressions
378 CREATE OR REPLACE VIEW query.expr_xbind AS
390 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
391 ON INSERT TO query.expr_xbind
393 INSERT INTO query.expression (
401 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
403 COALESCE(NEW.parenthesize, FALSE),
405 COALESCE(NEW.seq_no, 1),
409 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
410 ON UPDATE TO query.expr_xbind
412 UPDATE query.expression SET
414 parenthesize = NEW.parenthesize,
415 parent_expr = NEW.parent_expr,
417 bind_variable = NEW.bind_variable
421 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
422 ON DELETE TO query.expr_xbind
424 DELETE FROM query.expression WHERE id = OLD.id;
426 -- Create updatable view for boolean expressions
428 CREATE OR REPLACE VIEW query.expr_xbool AS
441 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
442 ON INSERT TO query.expr_xbool
444 INSERT INTO query.expression (
453 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
455 COALESCE(NEW.parenthesize, FALSE),
457 COALESCE(NEW.seq_no, 1),
462 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
463 ON UPDATE TO query.expr_xbool
465 UPDATE query.expression SET
467 parenthesize = NEW.parenthesize,
468 parent_expr = NEW.parent_expr,
470 literal = NEW.literal,
475 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
476 ON DELETE TO query.expr_xbool
478 DELETE FROM query.expression WHERE id = OLD.id;
480 -- Create updatable view for CASE expressions
482 CREATE OR REPLACE VIEW query.expr_xcase AS
494 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
495 ON INSERT TO query.expr_xcase
497 INSERT INTO query.expression (
505 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
507 COALESCE(NEW.parenthesize, FALSE),
509 COALESCE(NEW.seq_no, 1),
513 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
514 ON UPDATE TO query.expr_xcase
516 UPDATE query.expression SET
518 parenthesize = NEW.parenthesize,
519 parent_expr = NEW.parent_expr,
525 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
526 ON DELETE TO query.expr_xcase
528 DELETE FROM query.expression WHERE id = OLD.id;
530 -- Create updatable view for cast expressions
532 CREATE OR REPLACE VIEW query.expr_xcast AS
546 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
547 ON INSERT TO query.expr_xcast
549 INSERT INTO query.expression (
559 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
561 COALESCE(NEW.parenthesize, FALSE),
563 COALESCE(NEW.seq_no, 1),
569 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
570 ON UPDATE TO query.expr_xcast
572 UPDATE query.expression SET
574 parenthesize = NEW.parenthesize,
575 parent_expr = NEW.parent_expr,
577 left_operand = NEW.left_operand,
578 cast_type = NEW.cast_type,
583 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
584 ON DELETE TO query.expr_xcast
586 DELETE FROM query.expression WHERE id = OLD.id;
588 -- Create updatable view for column expressions
590 CREATE OR REPLACE VIEW query.expr_xcol AS
604 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
605 ON INSERT TO query.expr_xcol
607 INSERT INTO query.expression (
617 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
619 COALESCE(NEW.parenthesize, FALSE),
621 COALESCE(NEW.seq_no, 1),
627 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
628 ON UPDATE TO query.expr_xcol
630 UPDATE query.expression SET
632 parenthesize = NEW.parenthesize,
633 parent_expr = NEW.parent_expr,
635 table_alias = NEW.table_alias,
636 column_name = NEW.column_name,
641 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
642 ON DELETE TO query.expr_xcol
644 DELETE FROM query.expression WHERE id = OLD.id;
646 -- Create updatable view for EXISTS expressions
648 CREATE OR REPLACE VIEW query.expr_xex AS
661 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
662 ON INSERT TO query.expr_xex
664 INSERT INTO query.expression (
673 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
675 COALESCE(NEW.parenthesize, FALSE),
677 COALESCE(NEW.seq_no, 1),
682 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
683 ON UPDATE TO query.expr_xex
685 UPDATE query.expression SET
687 parenthesize = NEW.parenthesize,
688 parent_expr = NEW.parent_expr,
690 subquery = NEW.subquery,
695 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
696 ON DELETE TO query.expr_xex
698 DELETE FROM query.expression WHERE id = OLD.id;
700 -- Create updatable view for field expressions
702 CREATE OR REPLACE VIEW query.expr_xfld AS
716 CREATE OR REPLACE RULE query_expr_xfld_insert_rule AS
717 ON INSERT TO query.expr_xfld
719 INSERT INTO query.expression (
729 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
731 COALESCE(NEW.parenthesize, FALSE),
733 COALESCE(NEW.seq_no, 1),
739 CREATE OR REPLACE RULE query_expr_xfld_update_rule AS
740 ON UPDATE TO query.expr_xfld
742 UPDATE query.expression SET
744 parenthesize = NEW.parenthesize,
745 parent_expr = NEW.parent_expr,
747 column_name = NEW.column_name,
748 left_operand = NEW.left_operand,
753 CREATE OR REPLACE RULE query_expr_xfld_delete_rule AS
754 ON DELETE TO query.expr_xfld
756 DELETE FROM query.expression WHERE id = OLD.id;
758 -- Create updatable view for function call expressions
760 CREATE OR REPLACE VIEW query.expr_xfunc AS
773 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
774 ON INSERT TO query.expr_xfunc
776 INSERT INTO query.expression (
785 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
787 COALESCE(NEW.parenthesize, FALSE),
789 COALESCE(NEW.seq_no, 1),
794 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
795 ON UPDATE TO query.expr_xfunc
797 UPDATE query.expression SET
799 parenthesize = NEW.parenthesize,
800 parent_expr = NEW.parent_expr,
802 function_id = NEW.function_id,
807 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
808 ON DELETE TO query.expr_xfunc
810 DELETE FROM query.expression WHERE id = OLD.id;
812 -- Create updatable view for IN expressions
814 CREATE OR REPLACE VIEW query.expr_xin AS
828 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
829 ON INSERT TO query.expr_xin
831 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),
851 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
852 ON UPDATE TO query.expr_xin
854 UPDATE query.expression SET
856 parenthesize = NEW.parenthesize,
857 parent_expr = NEW.parent_expr,
859 left_operand = NEW.left_operand,
860 subquery = NEW.subquery,
865 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
866 ON DELETE TO query.expr_xin
868 DELETE FROM query.expression WHERE id = OLD.id;
870 -- Create updatable view for NULL expressions
872 CREATE OR REPLACE VIEW query.expr_xnull AS
884 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
885 ON INSERT TO query.expr_xnull
887 INSERT INTO query.expression (
895 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
897 COALESCE(NEW.parenthesize, FALSE),
899 COALESCE(NEW.seq_no, 1),
903 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
904 ON UPDATE TO query.expr_xnull
906 UPDATE query.expression SET
908 parenthesize = NEW.parenthesize,
909 parent_expr = NEW.parent_expr,
915 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
916 ON DELETE TO query.expr_xnull
918 DELETE FROM query.expression WHERE id = OLD.id;
920 -- Create updatable view for numeric literal expressions
922 CREATE OR REPLACE VIEW query.expr_xnum AS
934 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
935 ON INSERT TO query.expr_xnum
937 INSERT INTO query.expression (
945 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
947 COALESCE(NEW.parenthesize, FALSE),
949 COALESCE(NEW.seq_no, 1),
953 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
954 ON UPDATE TO query.expr_xnum
956 UPDATE query.expression SET
958 parenthesize = NEW.parenthesize,
959 parent_expr = NEW.parent_expr,
961 literal = NEW.literal
965 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
966 ON DELETE TO query.expr_xnum
968 DELETE FROM query.expression WHERE id = OLD.id;
970 -- Create updatable view for operator expressions
972 CREATE OR REPLACE VIEW query.expr_xop AS
987 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
988 ON INSERT TO query.expr_xop
990 INSERT INTO query.expression (
1001 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1003 COALESCE(NEW.parenthesize, FALSE),
1005 COALESCE(NEW.seq_no, 1),
1012 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
1013 ON UPDATE TO query.expr_xop
1015 UPDATE query.expression SET
1017 parenthesize = NEW.parenthesize,
1018 parent_expr = NEW.parent_expr,
1019 seq_no = NEW.seq_no,
1020 left_operand = NEW.left_operand,
1021 operator = NEW.operator,
1022 right_operand = NEW.right_operand,
1027 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
1028 ON DELETE TO query.expr_xop
1030 DELETE FROM query.expression WHERE id = OLD.id;
1032 -- Create updatable view for string literal expressions
1034 CREATE OR REPLACE VIEW query.expr_xstr AS
1046 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1047 ON INSERT TO query.expr_xstr
1049 INSERT INTO query.expression (
1057 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1059 COALESCE(NEW.parenthesize, FALSE),
1061 COALESCE(NEW.seq_no, 1),
1065 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1066 ON UPDATE TO query.expr_xstr
1068 UPDATE query.expression SET
1070 parenthesize = NEW.parenthesize,
1071 parent_expr = NEW.parent_expr,
1072 seq_no = NEW.seq_no,
1073 literal = NEW.literal
1077 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1078 ON DELETE TO query.expr_xstr
1080 DELETE FROM query.expression WHERE id = OLD.id;
1082 -- Create updatable view for subquery expressions
1084 CREATE OR REPLACE VIEW query.expr_xsubq AS
1097 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1098 ON INSERT TO query.expr_xsubq
1100 INSERT INTO query.expression (
1109 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1111 COALESCE(NEW.parenthesize, FALSE),
1113 COALESCE(NEW.seq_no, 1),
1118 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1119 ON UPDATE TO query.expr_xsubq
1121 UPDATE query.expression SET
1123 parenthesize = NEW.parenthesize,
1124 parent_expr = NEW.parent_expr,
1125 seq_no = NEW.seq_no,
1126 subquery = NEW.subquery,
1131 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1132 ON DELETE TO query.expr_xsubq
1134 DELETE FROM query.expression WHERE id = OLD.id;