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,
193 table_alias TEXT NOT NULL,
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 and table_alias 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 INSERT INTO config.upgrade_log (version) VALUES ('0107'); -- Scott McKellar
269 CREATE OR REPLACE VIEW query.expr_xbet AS
280 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
281 ON INSERT TO query.expr_xbet
283 INSERT INTO query.expression (
290 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
292 COALESCE(NEW.parenthesize, FALSE),
294 COALESCE(NEW.seq_no, 1)
297 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
298 ON UPDATE TO query.expr_xbet
300 UPDATE query.expression SET
302 parenthesize = NEW.parenthesize,
303 parent_expr = NEW.parent_expr,
308 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
309 ON DELETE TO query.expr_xbet
311 DELETE FROM query.expression WHERE id = OLD.id;
313 -- Create updatable view for boolean expressions
315 CREATE OR REPLACE VIEW query.expr_xbool AS
327 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
328 ON INSERT TO query.expr_xbool
330 INSERT INTO query.expression (
338 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
340 COALESCE(NEW.parenthesize, FALSE),
342 COALESCE(NEW.seq_no, 1),
346 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
347 ON UPDATE TO query.expr_xbool
349 UPDATE query.expression SET
351 parenthesize = NEW.parenthesize,
352 parent_expr = NEW.parent_expr,
354 literal = NEW.literal
358 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
359 ON DELETE TO query.expr_xbool
361 DELETE FROM query.expression WHERE id = OLD.id;
363 -- Create updatable view for CASE expressions
365 CREATE OR REPLACE VIEW query.expr_xcase AS
376 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
377 ON INSERT TO query.expr_xcase
379 INSERT INTO query.expression (
386 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
388 COALESCE(NEW.parenthesize, FALSE),
390 COALESCE(NEW.seq_no, 1)
393 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
394 ON UPDATE TO query.expr_xcase
396 UPDATE query.expression SET
398 parenthesize = NEW.parenthesize,
399 parent_expr = NEW.parent_expr,
404 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
405 ON DELETE TO query.expr_xcase
407 DELETE FROM query.expression WHERE id = OLD.id;
409 -- Create updatable view for cast expressions
411 CREATE OR REPLACE VIEW query.expr_xcast AS
424 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
425 ON INSERT TO query.expr_xcast
427 INSERT INTO query.expression (
436 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
438 COALESCE(NEW.parenthesize, FALSE),
440 COALESCE(NEW.seq_no, 1),
445 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
446 ON UPDATE TO query.expr_xcast
448 UPDATE query.expression SET
450 parenthesize = NEW.parenthesize,
451 parent_expr = NEW.parent_expr,
453 left_operand = NEW.left_operand,
454 cast_type = NEW.cast_type
458 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
459 ON DELETE TO query.expr_xcast
461 DELETE FROM query.expression WHERE id = OLD.id;
463 -- Create updatable view for column expressions
465 CREATE OR REPLACE VIEW query.expr_xcol AS
478 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
479 ON INSERT TO query.expr_xcol
481 INSERT INTO query.expression (
490 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
492 COALESCE(NEW.parenthesize, FALSE),
494 COALESCE(NEW.seq_no, 1),
499 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
500 ON UPDATE TO query.expr_xcol
502 UPDATE query.expression SET
504 parenthesize = NEW.parenthesize,
505 parent_expr = NEW.parent_expr,
507 table_alias = NEW.table_alias,
508 column_name = NEW.column_name
512 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
513 ON DELETE TO query.expr_xcol
515 DELETE FROM query.expression WHERE id = OLD.id;
517 -- Create updatable view for EXISTS expressions
519 CREATE OR REPLACE VIEW query.expr_xex AS
531 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
532 ON INSERT TO query.expr_xex
534 INSERT INTO query.expression (
542 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
544 COALESCE(NEW.parenthesize, FALSE),
546 COALESCE(NEW.seq_no, 1),
550 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
551 ON UPDATE TO query.expr_xex
553 UPDATE query.expression SET
555 parenthesize = NEW.parenthesize,
556 parent_expr = NEW.parent_expr,
558 subquery = NEW.subquery
562 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
563 ON DELETE TO query.expr_xex
565 DELETE FROM query.expression WHERE id = OLD.id;
567 -- Create updatable view for field expressions
569 CREATE OR REPLACE VIEW query.expr_xfld AS
582 CREATE OR REPLACE RULE query_expr_xfld_insert_rule AS
583 ON INSERT TO query.expr_xfld
585 INSERT INTO query.expression (
594 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
596 COALESCE(NEW.parenthesize, FALSE),
598 COALESCE(NEW.seq_no, 1),
603 CREATE OR REPLACE RULE query_expr_xfld_update_rule AS
604 ON UPDATE TO query.expr_xfld
606 UPDATE query.expression SET
608 parenthesize = NEW.parenthesize,
609 parent_expr = NEW.parent_expr,
611 column_name = NEW.column_name,
612 left_operand = NEW.left_operand
616 CREATE OR REPLACE RULE query_expr_xfld_delete_rule AS
617 ON DELETE TO query.expr_xfld
619 DELETE FROM query.expression WHERE id = OLD.id;
621 -- Create updatable view for function call expressions
623 CREATE OR REPLACE VIEW query.expr_xfunc AS
635 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
636 ON INSERT TO query.expr_xfunc
638 INSERT INTO query.expression (
646 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
648 COALESCE(NEW.parenthesize, FALSE),
650 COALESCE(NEW.seq_no, 1),
654 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
655 ON UPDATE TO query.expr_xfunc
657 UPDATE query.expression SET
659 parenthesize = NEW.parenthesize,
660 parent_expr = NEW.parent_expr,
662 function_id = NEW.function_id
666 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
667 ON DELETE TO query.expr_xfunc
669 DELETE FROM query.expression WHERE id = OLD.id;
671 -- Create updatable view for IN expressions
673 CREATE OR REPLACE VIEW query.expr_xin AS
685 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
686 ON INSERT TO query.expr_xin
688 INSERT INTO query.expression (
696 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
698 COALESCE(NEW.parenthesize, FALSE),
700 COALESCE(NEW.seq_no, 1),
704 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
705 ON UPDATE TO query.expr_xin
707 UPDATE query.expression SET
709 parenthesize = NEW.parenthesize,
710 parent_expr = NEW.parent_expr,
712 subquery = NEW.subquery
716 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
717 ON DELETE TO query.expr_xin
719 DELETE FROM query.expression WHERE id = OLD.id;
721 -- Create updatable view for NOT BETWEEN expressions
723 CREATE OR REPLACE VIEW query.expr_xnbet AS
734 CREATE OR REPLACE RULE query_expr_xnbet_insert_rule AS
735 ON INSERT TO query.expr_xnbet
737 INSERT INTO query.expression (
744 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
746 COALESCE(NEW.parenthesize, FALSE),
748 COALESCE(NEW.seq_no, 1)
751 CREATE OR REPLACE RULE query_expr_xnbet_update_rule AS
752 ON UPDATE TO query.expr_xnbet
754 UPDATE query.expression SET
756 parenthesize = NEW.parenthesize,
757 parent_expr = NEW.parent_expr,
762 CREATE OR REPLACE RULE query_expr_xnbet_delete_rule AS
763 ON DELETE TO query.expr_xnbet
765 DELETE FROM query.expression WHERE id = OLD.id;
767 -- Create updatable view for NOT EXISTS expressions
769 CREATE OR REPLACE VIEW query.expr_xnex AS
781 CREATE OR REPLACE RULE query_expr_xnex_insert_rule AS
782 ON INSERT TO query.expr_xnex
784 INSERT INTO query.expression (
792 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
794 COALESCE(NEW.parenthesize, FALSE),
796 COALESCE(NEW.seq_no, 1),
800 CREATE OR REPLACE RULE query_expr_xnex_update_rule AS
801 ON UPDATE TO query.expr_xnex
803 UPDATE query.expression SET
805 parenthesize = NEW.parenthesize,
806 parent_expr = NEW.parent_expr,
808 subquery = NEW.subquery
812 CREATE OR REPLACE RULE query_expr_xnex_delete_rule AS
813 ON DELETE TO query.expr_xnex
815 DELETE FROM query.expression WHERE id = OLD.id;
817 -- Create updatable view for NOT IN expressions
819 CREATE OR REPLACE VIEW query.expr_xnin AS
831 CREATE OR REPLACE RULE query_expr_xnin_insert_rule AS
832 ON INSERT TO query.expr_xnin
834 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),
850 CREATE OR REPLACE RULE query_expr_xnin_update_rule AS
851 ON UPDATE TO query.expr_xnin
853 UPDATE query.expression SET
855 parenthesize = NEW.parenthesize,
856 parent_expr = NEW.parent_expr,
858 subquery = NEW.subquery
862 CREATE OR REPLACE RULE query_expr_xnin_delete_rule AS
863 ON DELETE TO query.expr_xnin
865 DELETE FROM query.expression WHERE id = OLD.id;
867 -- Create updatable view for NULL expressions
869 CREATE OR REPLACE VIEW query.expr_xnull AS
880 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
881 ON INSERT TO query.expr_xnull
883 INSERT INTO query.expression (
890 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
892 COALESCE(NEW.parenthesize, FALSE),
894 COALESCE(NEW.seq_no, 1)
897 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
898 ON UPDATE TO query.expr_xnull
900 UPDATE query.expression SET
902 parenthesize = NEW.parenthesize,
903 parent_expr = NEW.parent_expr,
908 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
909 ON DELETE TO query.expr_xnull
911 DELETE FROM query.expression WHERE id = OLD.id;
913 -- Create updatable view for numeric literal expressions
915 CREATE OR REPLACE VIEW query.expr_xnum AS
927 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
928 ON INSERT TO query.expr_xnum
930 INSERT INTO query.expression (
938 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
940 COALESCE(NEW.parenthesize, FALSE),
942 COALESCE(NEW.seq_no, 1),
946 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
947 ON UPDATE TO query.expr_xnum
949 UPDATE query.expression SET
951 parenthesize = NEW.parenthesize,
952 parent_expr = NEW.parent_expr,
954 literal = NEW.literal
958 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
959 ON DELETE TO query.expr_xnum
961 DELETE FROM query.expression WHERE id = OLD.id;
963 -- Create updatable view for operator expressions
965 CREATE OR REPLACE VIEW query.expr_xop AS
979 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
980 ON INSERT TO query.expr_xop
982 INSERT INTO query.expression (
992 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
994 COALESCE(NEW.parenthesize, FALSE),
996 COALESCE(NEW.seq_no, 1),
1002 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
1003 ON UPDATE TO query.expr_xop
1005 UPDATE query.expression SET
1007 parenthesize = NEW.parenthesize,
1008 parent_expr = NEW.parent_expr,
1009 seq_no = NEW.seq_no,
1010 left_operand = NEW.left_operand,
1011 operator = NEW.operator,
1012 right_operand = NEW.right_operand
1016 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
1017 ON DELETE TO query.expr_xop
1019 DELETE FROM query.expression WHERE id = OLD.id;
1021 -- Create updatable view for string literal expressions
1023 CREATE OR REPLACE VIEW query.expr_string AS
1035 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1036 ON INSERT TO query.expr_string
1038 INSERT INTO query.expression (
1046 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1048 COALESCE(NEW.parenthesize, FALSE),
1050 COALESCE(NEW.seq_no, 1),
1054 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1055 ON UPDATE TO query.expr_string
1057 UPDATE query.expression SET
1059 parenthesize = NEW.parenthesize,
1060 parent_expr = NEW.parent_expr,
1061 seq_no = NEW.seq_no,
1062 literal = NEW.literal
1066 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1067 ON DELETE TO query.expr_string
1069 DELETE FROM query.expression WHERE id = OLD.id;
1071 -- Create updatable view for subquery expressions
1073 CREATE OR REPLACE VIEW query.expr_xsubq AS
1085 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1086 ON INSERT TO query.expr_xsubq
1088 INSERT INTO query.expression (
1096 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1098 COALESCE(NEW.parenthesize, FALSE),
1100 COALESCE(NEW.seq_no, 1),
1104 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1105 ON UPDATE TO query.expr_xsubq
1107 UPDATE query.expression SET
1109 parenthesize = NEW.parenthesize,
1110 parent_expr = NEW.parent_expr,
1111 seq_no = NEW.seq_no,
1112 subquery = NEW.subquery
1116 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1117 ON DELETE TO query.expr_xsubq
1119 DELETE FROM query.expression WHERE id = OLD.id;