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
47 -- (Foreign keys to be defined later after other tables are created)
49 CREATE TABLE query.query_sequence (
50 id SERIAL PRIMARY KEY,
51 parent_query INT NOT NULL
52 REFERENCES query.stored_query
54 DEFERRABLE INITIALLY DEFERRED,
56 child_query INT NOT NULL
57 REFERENCES query.stored_query
59 DEFERRABLE INITIALLY DEFERRED,
60 CONSTRAINT query_query_seq UNIQUE( parent_query, seq_no )
63 CREATE TABLE query.datatype (
64 id SERIAL PRIMARY KEY,
65 datatype_name TEXT NOT NULL UNIQUE,
66 is_numeric BOOL NOT NULL DEFAULT FALSE,
67 is_composite BOOL NOT NULL DEFAULT FALSE,
68 CONSTRAINT qdt_comp_not_num CHECK
69 ( is_numeric IS FALSE OR is_composite IS FALSE )
72 -- Leave room to seed with stock datatypes
73 -- before adding customized ones
74 SELECT setval( 'query.datatype_id_seq', 1000 );
76 CREATE TABLE query.subfield (
77 id SERIAL PRIMARY KEY,
78 composite_type INT NOT NULL
79 REFERENCES query.datatype(id)
81 DEFERRABLE INITIALLY DEFERRED,
83 CONSTRAINT qsf_pos_seq_no
85 subfield_type INT NOT NULL
86 REFERENCES query.datatype(id)
87 DEFERRABLE INITIALLY DEFERRED,
88 CONSTRAINT qsf_datatype_seq_no UNIQUE (composite_type, seq_no)
91 CREATE TABLE query.function_sig (
92 id SERIAL PRIMARY KEY,
93 function_name TEXT NOT NULL,
94 return_type INT REFERENCES query.datatype(id)
95 DEFERRABLE INITIALLY DEFERRED,
96 is_aggregate BOOL NOT NULL DEFAULT FALSE,
97 CONSTRAINT qfd_rtn_or_aggr CHECK
98 ( return_type IS NULL OR is_aggregate = FALSE )
101 CREATE INDEX query_function_sig_name_idx
102 ON query.function_sig (function_name);
104 CREATE TABLE query.function_param_def (
105 id SERIAL PRIMARY KEY,
106 function_id INT NOT NULL
107 REFERENCES query.function_sig( id )
109 DEFERRABLE INITIALLY DEFERRED,
111 CONSTRAINT qfpd_pos_seq_no CHECK
113 datatype INT NOT NULL
114 REFERENCES query.datatype( id )
115 DEFERRABLE INITIALLY DEFERRED,
116 CONSTRAINT qfpd_function_param_seq UNIQUE (function_id, seq_no)
119 CREATE TABLE query.bind_variable (
120 name TEXT PRIMARY KEY,
122 CONSTRAINT bind_variable_type CHECK
123 ( type in ( 'string', 'number', 'string_list', 'number_list' )),
124 description TEXT NOT NULL,
125 default_value TEXT, -- to be encoded in JSON
129 CREATE TABLE query.expression (
130 id SERIAL PRIMARY KEY,
131 type TEXT NOT NULL CONSTRAINT expression_type CHECK
134 'xbind', -- bind variable
142 'xisnull', -- is null
150 parenthesize BOOL NOT NULL DEFAULT FALSE,
151 parent_expr INT REFERENCES query.expression
153 DEFERRABLE INITIALLY DEFERRED,
154 seq_no INT NOT NULL DEFAULT 1,
158 left_operand INT REFERENCES query.expression
159 DEFERRABLE INITIALLY DEFERRED,
161 right_operand INT REFERENCES query.expression
162 DEFERRABLE INITIALLY DEFERRED,
163 function_id INT REFERENCES query.function_sig
164 DEFERRABLE INITIALLY DEFERRED,
165 subquery INT REFERENCES query.stored_query
166 DEFERRABLE INITIALLY DEFERRED,
167 cast_type INT REFERENCES query.datatype
168 DEFERRABLE INITIALLY DEFERRED,
169 negate BOOL NOT NULL DEFAULT FALSE,
170 bind_variable TEXT REFERENCES query.bind_variable
171 DEFERRABLE INITIALLY DEFERRED
174 CREATE UNIQUE INDEX query_expr_parent_seq
175 ON query.expression( parent_expr, seq_no )
176 WHERE parent_expr IS NOT NULL;
178 -- Due to some circular references, the following foreign key definitions
179 -- had to be deferred until query.expression existed:
181 ALTER TABLE query.stored_query
182 ADD FOREIGN KEY ( where_clause )
183 REFERENCES query.expression( id )
184 DEFERRABLE INITIALLY DEFERRED;
186 ALTER TABLE query.stored_query
187 ADD FOREIGN KEY ( having_clause )
188 REFERENCES query.expression( id )
189 DEFERRABLE INITIALLY DEFERRED;
191 CREATE TABLE query.case_branch (
192 id SERIAL PRIMARY KEY,
193 parent_expr INT NOT NULL REFERENCES query.expression
195 DEFERRABLE INITIALLY DEFERRED,
197 condition INT REFERENCES query.expression
198 DEFERRABLE INITIALLY DEFERRED,
199 result INT NOT NULL REFERENCES query.expression
200 DEFERRABLE INITIALLY DEFERRED,
201 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
204 CREATE TABLE query.from_relation (
205 id SERIAL PRIMARY KEY,
206 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
207 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
210 subquery INT REFERENCES query.stored_query,
211 function_call INT REFERENCES query.expression,
213 parent_relation INT REFERENCES query.from_relation
215 DEFERRABLE INITIALLY DEFERRED,
216 seq_no INT NOT NULL DEFAULT 1,
217 join_type TEXT CONSTRAINT good_join_type CHECK (
218 join_type IS NULL OR join_type IN
219 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
221 on_clause INT REFERENCES query.expression
222 DEFERRABLE INITIALLY DEFERRED,
223 CONSTRAINT join_or_core CHECK (
224 ( parent_relation IS NULL AND join_type IS NULL
225 AND on_clause IS NULL )
227 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
228 AND on_clause IS NOT NULL )
232 CREATE UNIQUE INDEX from_parent_seq
233 ON query.from_relation( parent_relation, seq_no )
234 WHERE parent_relation IS NOT NULL;
236 -- The following foreign key had to be deferred until
237 -- query.from_relation existed
239 ALTER TABLE query.stored_query
240 ADD FOREIGN KEY (from_clause)
241 REFERENCES query.from_relation
242 DEFERRABLE INITIALLY DEFERRED;
244 CREATE TABLE query.record_column (
245 id SERIAL PRIMARY KEY,
246 from_relation INT NOT NULL REFERENCES query.from_relation
248 DEFERRABLE INITIALLY DEFERRED,
250 column_name TEXT NOT NULL,
251 column_type INT NOT NULL REFERENCES query.datatype
253 DEFERRABLE INITIALLY DEFERRED,
254 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
257 CREATE TABLE query.select_item (
258 id SERIAL PRIMARY KEY,
259 stored_query INT NOT NULL REFERENCES query.stored_query
261 DEFERRABLE INITIALLY DEFERRED,
263 expression INT NOT NULL REFERENCES query.expression
264 DEFERRABLE INITIALLY DEFERRED,
266 grouped_by BOOL NOT NULL DEFAULT FALSE,
267 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
270 CREATE TABLE query.order_by_item (
271 id SERIAL PRIMARY KEY,
272 stored_query INT NOT NULL REFERENCES query.stored_query
274 DEFERRABLE INITIALLY DEFERRED,
276 expression INT NOT NULL REFERENCES query.expression
278 DEFERRABLE INITIALLY DEFERRED,
279 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
282 -- Create updatable views -------------------------------------------
284 -- Create updatable view for BETWEEN expressions
286 CREATE OR REPLACE VIEW query.expr_xbet AS
299 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
300 ON INSERT TO query.expr_xbet
302 INSERT INTO query.expression (
311 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
313 COALESCE(NEW.parenthesize, FALSE),
315 COALESCE(NEW.seq_no, 1),
317 COALESCE(NEW.negate, false)
320 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
321 ON UPDATE TO query.expr_xbet
323 UPDATE query.expression SET
325 parenthesize = NEW.parenthesize,
326 parent_expr = NEW.parent_expr,
328 left_operand = NEW.left_operand,
333 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
334 ON DELETE TO query.expr_xbet
336 DELETE FROM query.expression WHERE id = OLD.id;
338 -- Create updatable view for bind variable expressions
340 CREATE OR REPLACE VIEW query.expr_xbind AS
352 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
353 ON INSERT TO query.expr_xbind
355 INSERT INTO query.expression (
363 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
365 COALESCE(NEW.parenthesize, FALSE),
367 COALESCE(NEW.seq_no, 1),
371 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
372 ON UPDATE TO query.expr_xbind
374 UPDATE query.expression SET
376 parenthesize = NEW.parenthesize,
377 parent_expr = NEW.parent_expr,
379 bind_variable = NEW.bind_variable
383 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
384 ON DELETE TO query.expr_xbind
386 DELETE FROM query.expression WHERE id = OLD.id;
388 -- Create updatable view for boolean expressions
390 CREATE OR REPLACE VIEW query.expr_xbool AS
403 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
404 ON INSERT TO query.expr_xbool
406 INSERT INTO query.expression (
415 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
417 COALESCE(NEW.parenthesize, FALSE),
419 COALESCE(NEW.seq_no, 1),
421 COALESCE(NEW.negate, false)
424 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
425 ON UPDATE TO query.expr_xbool
427 UPDATE query.expression SET
429 parenthesize = NEW.parenthesize,
430 parent_expr = NEW.parent_expr,
432 literal = NEW.literal,
437 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
438 ON DELETE TO query.expr_xbool
440 DELETE FROM query.expression WHERE id = OLD.id;
442 -- Create updatable view for CASE expressions
444 CREATE OR REPLACE VIEW query.expr_xcase AS
457 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
458 ON INSERT TO query.expr_xcase
460 INSERT INTO query.expression (
469 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
471 COALESCE(NEW.parenthesize, FALSE),
473 COALESCE(NEW.seq_no, 1),
475 COALESCE(NEW.negate, false)
478 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
479 ON UPDATE TO query.expr_xcase
481 UPDATE query.expression SET
483 parenthesize = NEW.parenthesize,
484 parent_expr = NEW.parent_expr,
486 left_operand = NEW.left_operand,
491 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
492 ON DELETE TO query.expr_xcase
494 DELETE FROM query.expression WHERE id = OLD.id;
496 -- Create updatable view for cast expressions
498 CREATE OR REPLACE VIEW query.expr_xcast AS
512 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
513 ON INSERT TO query.expr_xcast
515 INSERT INTO query.expression (
525 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
527 COALESCE(NEW.parenthesize, FALSE),
529 COALESCE(NEW.seq_no, 1),
532 COALESCE(NEW.negate, false)
535 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
536 ON UPDATE TO query.expr_xcast
538 UPDATE query.expression SET
540 parenthesize = NEW.parenthesize,
541 parent_expr = NEW.parent_expr,
543 left_operand = NEW.left_operand,
544 cast_type = NEW.cast_type,
549 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
550 ON DELETE TO query.expr_xcast
552 DELETE FROM query.expression WHERE id = OLD.id;
554 -- Create updatable view for column expressions
556 CREATE OR REPLACE VIEW query.expr_xcol AS
570 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
571 ON INSERT TO query.expr_xcol
573 INSERT INTO query.expression (
583 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
585 COALESCE(NEW.parenthesize, FALSE),
587 COALESCE(NEW.seq_no, 1),
590 COALESCE(NEW.negate, false)
593 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
594 ON UPDATE TO query.expr_xcol
596 UPDATE query.expression SET
598 parenthesize = NEW.parenthesize,
599 parent_expr = NEW.parent_expr,
601 table_alias = NEW.table_alias,
602 column_name = NEW.column_name,
607 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
608 ON DELETE TO query.expr_xcol
610 DELETE FROM query.expression WHERE id = OLD.id;
612 -- Create updatable view for EXISTS expressions
614 CREATE OR REPLACE VIEW query.expr_xex AS
627 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
628 ON INSERT TO query.expr_xex
630 INSERT INTO query.expression (
639 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
641 COALESCE(NEW.parenthesize, FALSE),
643 COALESCE(NEW.seq_no, 1),
645 COALESCE(NEW.negate, false)
648 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
649 ON UPDATE TO query.expr_xex
651 UPDATE query.expression SET
653 parenthesize = NEW.parenthesize,
654 parent_expr = NEW.parent_expr,
656 subquery = NEW.subquery,
661 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
662 ON DELETE TO query.expr_xex
664 DELETE FROM query.expression WHERE id = OLD.id;
666 -- Create updatable view for function call expressions
668 CREATE OR REPLACE VIEW query.expr_xfunc AS
682 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
683 ON INSERT TO query.expr_xfunc
685 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),
702 COALESCE(NEW.negate, false)
705 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
706 ON UPDATE TO query.expr_xfunc
708 UPDATE query.expression SET
710 parenthesize = NEW.parenthesize,
711 parent_expr = NEW.parent_expr,
713 column_name = NEW.column_name,
714 function_id = NEW.function_id,
719 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
720 ON DELETE TO query.expr_xfunc
722 DELETE FROM query.expression WHERE id = OLD.id;
724 -- Create updatable view for IN expressions
726 CREATE OR REPLACE VIEW query.expr_xin AS
740 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
741 ON INSERT TO query.expr_xin
743 INSERT INTO query.expression (
753 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
755 COALESCE(NEW.parenthesize, FALSE),
757 COALESCE(NEW.seq_no, 1),
760 COALESCE(NEW.negate, false)
763 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
764 ON UPDATE TO query.expr_xin
766 UPDATE query.expression SET
768 parenthesize = NEW.parenthesize,
769 parent_expr = NEW.parent_expr,
771 left_operand = NEW.left_operand,
772 subquery = NEW.subquery,
777 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
778 ON DELETE TO query.expr_xin
780 DELETE FROM query.expression WHERE id = OLD.id;
782 -- Create updatable view for IS NULL expressions
784 CREATE OR REPLACE VIEW query.expr_xisnull AS
797 CREATE OR REPLACE RULE query_expr_xisnull_insert_rule AS
798 ON INSERT TO query.expr_xisnull
800 INSERT INTO query.expression (
809 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
811 COALESCE(NEW.parenthesize, FALSE),
813 COALESCE(NEW.seq_no, 1),
815 COALESCE(NEW.negate, false)
818 CREATE OR REPLACE RULE query_expr_xisnull_update_rule AS
819 ON UPDATE TO query.expr_xisnull
821 UPDATE query.expression SET
823 parenthesize = NEW.parenthesize,
824 parent_expr = NEW.parent_expr,
826 left_operand = NEW.left_operand,
831 CREATE OR REPLACE RULE query_expr_xisnull_delete_rule AS
832 ON DELETE TO query.expr_xisnull
834 DELETE FROM query.expression WHERE id = OLD.id;
836 -- Create updatable view for NULL expressions
838 CREATE OR REPLACE VIEW query.expr_xnull AS
850 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
851 ON INSERT TO query.expr_xnull
853 INSERT INTO query.expression (
861 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
863 COALESCE(NEW.parenthesize, FALSE),
865 COALESCE(NEW.seq_no, 1),
866 COALESCE(NEW.negate, false)
869 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
870 ON UPDATE TO query.expr_xnull
872 UPDATE query.expression SET
874 parenthesize = NEW.parenthesize,
875 parent_expr = NEW.parent_expr,
881 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
882 ON DELETE TO query.expr_xnull
884 DELETE FROM query.expression WHERE id = OLD.id;
886 -- Create updatable view for numeric literal expressions
888 CREATE OR REPLACE VIEW query.expr_xnum AS
900 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
901 ON INSERT TO query.expr_xnum
903 INSERT INTO query.expression (
911 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
913 COALESCE(NEW.parenthesize, FALSE),
915 COALESCE(NEW.seq_no, 1),
919 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
920 ON UPDATE TO query.expr_xnum
922 UPDATE query.expression SET
924 parenthesize = NEW.parenthesize,
925 parent_expr = NEW.parent_expr,
927 literal = NEW.literal
931 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
932 ON DELETE TO query.expr_xnum
934 DELETE FROM query.expression WHERE id = OLD.id;
936 -- Create updatable view for operator expressions
938 CREATE OR REPLACE VIEW query.expr_xop AS
953 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
954 ON INSERT TO query.expr_xop
956 INSERT INTO query.expression (
967 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
969 COALESCE(NEW.parenthesize, FALSE),
971 COALESCE(NEW.seq_no, 1),
975 COALESCE(NEW.negate, false)
978 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
979 ON UPDATE TO query.expr_xop
981 UPDATE query.expression SET
983 parenthesize = NEW.parenthesize,
984 parent_expr = NEW.parent_expr,
986 left_operand = NEW.left_operand,
987 operator = NEW.operator,
988 right_operand = NEW.right_operand,
993 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
994 ON DELETE TO query.expr_xop
996 DELETE FROM query.expression WHERE id = OLD.id;
998 -- Create updatable view for series expressions,
999 -- i.e. series of expressions separated by operators
1001 CREATE OR REPLACE VIEW query.expr_xser AS
1014 CREATE OR REPLACE RULE query_expr_xser_insert_rule AS
1015 ON INSERT TO query.expr_xser
1017 INSERT INTO query.expression (
1026 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1028 COALESCE(NEW.parenthesize, FALSE),
1030 COALESCE(NEW.seq_no, 1),
1032 COALESCE(NEW.negate, false)
1035 CREATE OR REPLACE RULE query_expr_xser_update_rule AS
1036 ON UPDATE TO query.expr_xser
1038 UPDATE query.expression SET
1040 parenthesize = NEW.parenthesize,
1041 parent_expr = NEW.parent_expr,
1042 seq_no = NEW.seq_no,
1043 operator = NEW.operator,
1048 CREATE OR REPLACE RULE query_expr_xser_delete_rule AS
1049 ON DELETE TO query.expr_xser
1051 DELETE FROM query.expression WHERE id = OLD.id;
1053 -- Create updatable view for string literal expressions
1055 CREATE OR REPLACE VIEW query.expr_xstr AS
1067 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1068 ON INSERT TO query.expr_xstr
1070 INSERT INTO query.expression (
1078 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1080 COALESCE(NEW.parenthesize, FALSE),
1082 COALESCE(NEW.seq_no, 1),
1086 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1087 ON UPDATE TO query.expr_xstr
1089 UPDATE query.expression SET
1091 parenthesize = NEW.parenthesize,
1092 parent_expr = NEW.parent_expr,
1093 seq_no = NEW.seq_no,
1094 literal = NEW.literal
1098 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1099 ON DELETE TO query.expr_xstr
1101 DELETE FROM query.expression WHERE id = OLD.id;
1103 -- Create updatable view for subquery expressions
1105 CREATE OR REPLACE VIEW query.expr_xsubq AS
1118 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1119 ON INSERT TO query.expr_xsubq
1121 INSERT INTO query.expression (
1130 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1132 COALESCE(NEW.parenthesize, FALSE),
1134 COALESCE(NEW.seq_no, 1),
1136 COALESCE(NEW.negate, false)
1139 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1140 ON UPDATE TO query.expr_xsubq
1142 UPDATE query.expression SET
1144 parenthesize = NEW.parenthesize,
1145 parent_expr = NEW.parent_expr,
1146 seq_no = NEW.seq_no,
1147 subquery = NEW.subquery,
1152 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1153 ON DELETE TO query.expr_xsubq
1155 DELETE FROM query.expression WHERE id = OLD.id;