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
137 'xisnull', -- is null
145 parenthesize BOOL NOT NULL DEFAULT FALSE,
146 parent_expr INT REFERENCES query.expression
148 DEFERRABLE INITIALLY DEFERRED,
149 seq_no INT NOT NULL DEFAULT 1,
153 left_operand INT REFERENCES query.expression
154 DEFERRABLE INITIALLY DEFERRED,
156 right_operand INT REFERENCES query.expression
157 DEFERRABLE INITIALLY DEFERRED,
158 function_id INT REFERENCES query.function_sig
159 DEFERRABLE INITIALLY DEFERRED,
160 subquery INT REFERENCES query.stored_query
161 DEFERRABLE INITIALLY DEFERRED,
162 cast_type INT REFERENCES query.datatype
163 DEFERRABLE INITIALLY DEFERRED,
164 negate BOOL NOT NULL DEFAULT FALSE,
165 bind_variable TEXT REFERENCES query.bind_variable
166 DEFERRABLE INITIALLY DEFERRED
169 CREATE UNIQUE INDEX query_expr_parent_seq
170 ON query.expression( parent_expr, seq_no )
171 WHERE parent_expr IS NOT NULL;
173 -- Due to some circular references, the following foreign key definitions
174 -- had to be deferred until query.expression existed:
176 ALTER TABLE query.stored_query
177 ADD FOREIGN KEY ( where_clause )
178 REFERENCES query.expression( id )
179 DEFERRABLE INITIALLY DEFERRED;
181 ALTER TABLE query.stored_query
182 ADD FOREIGN KEY ( having_clause )
183 REFERENCES query.expression( id )
184 DEFERRABLE INITIALLY DEFERRED;
186 CREATE TABLE query.case_branch (
187 id SERIAL PRIMARY KEY,
188 parent_expr INT NOT NULL REFERENCES query.expression
190 DEFERRABLE INITIALLY DEFERRED,
192 condition INT REFERENCES query.expression
193 DEFERRABLE INITIALLY DEFERRED,
194 result INT NOT NULL REFERENCES query.expression
195 DEFERRABLE INITIALLY DEFERRED,
196 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
199 CREATE TABLE query.from_relation (
200 id SERIAL PRIMARY KEY,
201 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
202 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
205 subquery INT REFERENCES query.stored_query,
206 function_call INT REFERENCES query.expression,
208 parent_relation INT REFERENCES query.from_relation
210 DEFERRABLE INITIALLY DEFERRED,
211 seq_no INT NOT NULL DEFAULT 1,
212 join_type TEXT CONSTRAINT good_join_type CHECK (
213 join_type IS NULL OR join_type IN
214 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
216 on_clause INT REFERENCES query.expression
217 DEFERRABLE INITIALLY DEFERRED,
218 CONSTRAINT join_or_core CHECK (
219 ( parent_relation IS NULL AND join_type IS NULL
220 AND on_clause IS NULL )
222 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
223 AND on_clause IS NOT NULL )
227 CREATE UNIQUE INDEX from_parent_seq
228 ON query.from_relation( parent_relation, seq_no )
229 WHERE parent_relation IS NOT NULL;
231 -- The following foreign key had to be deferred until
232 -- query.from_relation existed
234 ALTER TABLE query.stored_query
235 ADD FOREIGN KEY (from_clause)
236 REFERENCES query.from_relation
237 DEFERRABLE INITIALLY DEFERRED;
239 CREATE TABLE query.record_column (
240 id SERIAL PRIMARY KEY,
241 from_relation INT NOT NULL REFERENCES query.from_relation
243 DEFERRABLE INITIALLY DEFERRED,
245 column_name TEXT NOT NULL,
246 column_type INT NOT NULL REFERENCES query.datatype
248 DEFERRABLE INITIALLY DEFERRED,
249 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
252 CREATE TABLE query.select_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
259 DEFERRABLE INITIALLY DEFERRED,
261 grouped_by BOOL NOT NULL DEFAULT FALSE,
262 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
265 CREATE TABLE query.order_by_item (
266 id SERIAL PRIMARY KEY,
267 stored_query INT NOT NULL REFERENCES query.stored_query
269 DEFERRABLE INITIALLY DEFERRED,
271 expression INT NOT NULL REFERENCES query.expression
273 DEFERRABLE INITIALLY DEFERRED,
274 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
277 -- Create updatable views -------------------------------------------
279 -- Create updatable view for BETWEEN expressions
281 CREATE OR REPLACE VIEW query.expr_xbet AS
293 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
294 ON INSERT TO query.expr_xbet
296 INSERT INTO query.expression (
304 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
306 COALESCE(NEW.parenthesize, FALSE),
308 COALESCE(NEW.seq_no, 1),
312 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
313 ON UPDATE TO query.expr_xbet
315 UPDATE query.expression SET
317 parenthesize = NEW.parenthesize,
318 parent_expr = NEW.parent_expr,
324 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
325 ON DELETE TO query.expr_xbet
327 DELETE FROM query.expression WHERE id = OLD.id;
329 -- Create updatable view for bind variable expressions
331 CREATE OR REPLACE VIEW query.expr_xbind AS
343 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
344 ON INSERT TO query.expr_xbind
346 INSERT INTO query.expression (
354 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
356 COALESCE(NEW.parenthesize, FALSE),
358 COALESCE(NEW.seq_no, 1),
362 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
363 ON UPDATE TO query.expr_xbind
365 UPDATE query.expression SET
367 parenthesize = NEW.parenthesize,
368 parent_expr = NEW.parent_expr,
370 bind_variable = NEW.bind_variable
374 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
375 ON DELETE TO query.expr_xbind
377 DELETE FROM query.expression WHERE id = OLD.id;
379 -- Create updatable view for bind variable expressions
381 CREATE OR REPLACE VIEW query.expr_xbind AS
393 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
394 ON INSERT TO query.expr_xbind
396 INSERT INTO query.expression (
404 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
406 COALESCE(NEW.parenthesize, FALSE),
408 COALESCE(NEW.seq_no, 1),
412 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
413 ON UPDATE TO query.expr_xbind
415 UPDATE query.expression SET
417 parenthesize = NEW.parenthesize,
418 parent_expr = NEW.parent_expr,
420 bind_variable = NEW.bind_variable
424 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
425 ON DELETE TO query.expr_xbind
427 DELETE FROM query.expression WHERE id = OLD.id;
429 -- Create updatable view for boolean expressions
431 CREATE OR REPLACE VIEW query.expr_xbool AS
444 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
445 ON INSERT TO query.expr_xbool
447 INSERT INTO query.expression (
456 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
458 COALESCE(NEW.parenthesize, FALSE),
460 COALESCE(NEW.seq_no, 1),
465 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
466 ON UPDATE TO query.expr_xbool
468 UPDATE query.expression SET
470 parenthesize = NEW.parenthesize,
471 parent_expr = NEW.parent_expr,
473 literal = NEW.literal,
478 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
479 ON DELETE TO query.expr_xbool
481 DELETE FROM query.expression WHERE id = OLD.id;
483 -- Create updatable view for CASE expressions
485 CREATE OR REPLACE VIEW query.expr_xcase AS
497 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
498 ON INSERT TO query.expr_xcase
500 INSERT INTO query.expression (
508 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
510 COALESCE(NEW.parenthesize, FALSE),
512 COALESCE(NEW.seq_no, 1),
516 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
517 ON UPDATE TO query.expr_xcase
519 UPDATE query.expression SET
521 parenthesize = NEW.parenthesize,
522 parent_expr = NEW.parent_expr,
528 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
529 ON DELETE TO query.expr_xcase
531 DELETE FROM query.expression WHERE id = OLD.id;
533 -- Create updatable view for cast expressions
535 CREATE OR REPLACE VIEW query.expr_xcast AS
549 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
550 ON INSERT TO query.expr_xcast
552 INSERT INTO query.expression (
562 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
564 COALESCE(NEW.parenthesize, FALSE),
566 COALESCE(NEW.seq_no, 1),
572 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
573 ON UPDATE TO query.expr_xcast
575 UPDATE query.expression SET
577 parenthesize = NEW.parenthesize,
578 parent_expr = NEW.parent_expr,
580 left_operand = NEW.left_operand,
581 cast_type = NEW.cast_type,
586 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
587 ON DELETE TO query.expr_xcast
589 DELETE FROM query.expression WHERE id = OLD.id;
591 -- Create updatable view for column expressions
593 CREATE OR REPLACE VIEW query.expr_xcol AS
607 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
608 ON INSERT TO query.expr_xcol
610 INSERT INTO query.expression (
620 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
622 COALESCE(NEW.parenthesize, FALSE),
624 COALESCE(NEW.seq_no, 1),
630 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
631 ON UPDATE TO query.expr_xcol
633 UPDATE query.expression SET
635 parenthesize = NEW.parenthesize,
636 parent_expr = NEW.parent_expr,
638 table_alias = NEW.table_alias,
639 column_name = NEW.column_name,
644 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
645 ON DELETE TO query.expr_xcol
647 DELETE FROM query.expression WHERE id = OLD.id;
649 -- Create updatable view for EXISTS expressions
651 CREATE OR REPLACE VIEW query.expr_xex AS
664 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
665 ON INSERT TO query.expr_xex
667 INSERT INTO query.expression (
676 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
678 COALESCE(NEW.parenthesize, FALSE),
680 COALESCE(NEW.seq_no, 1),
685 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
686 ON UPDATE TO query.expr_xex
688 UPDATE query.expression SET
690 parenthesize = NEW.parenthesize,
691 parent_expr = NEW.parent_expr,
693 subquery = NEW.subquery,
698 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
699 ON DELETE TO query.expr_xex
701 DELETE FROM query.expression WHERE id = OLD.id;
703 -- Create updatable view for field expressions
705 CREATE OR REPLACE VIEW query.expr_xfld AS
719 CREATE OR REPLACE RULE query_expr_xfld_insert_rule AS
720 ON INSERT TO query.expr_xfld
722 INSERT INTO query.expression (
732 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
734 COALESCE(NEW.parenthesize, FALSE),
736 COALESCE(NEW.seq_no, 1),
742 CREATE OR REPLACE RULE query_expr_xfld_update_rule AS
743 ON UPDATE TO query.expr_xfld
745 UPDATE query.expression SET
747 parenthesize = NEW.parenthesize,
748 parent_expr = NEW.parent_expr,
750 column_name = NEW.column_name,
751 left_operand = NEW.left_operand,
756 CREATE OR REPLACE RULE query_expr_xfld_delete_rule AS
757 ON DELETE TO query.expr_xfld
759 DELETE FROM query.expression WHERE id = OLD.id;
761 -- Create updatable view for function call expressions
763 CREATE OR REPLACE VIEW query.expr_xfunc AS
776 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
777 ON INSERT TO query.expr_xfunc
779 INSERT INTO query.expression (
788 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
790 COALESCE(NEW.parenthesize, FALSE),
792 COALESCE(NEW.seq_no, 1),
797 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
798 ON UPDATE TO query.expr_xfunc
800 UPDATE query.expression SET
802 parenthesize = NEW.parenthesize,
803 parent_expr = NEW.parent_expr,
805 function_id = NEW.function_id,
810 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
811 ON DELETE TO query.expr_xfunc
813 DELETE FROM query.expression WHERE id = OLD.id;
815 -- Create updatable view for IN expressions
817 CREATE OR REPLACE VIEW query.expr_xin AS
831 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
832 ON INSERT TO query.expr_xin
834 INSERT INTO query.expression (
844 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
846 COALESCE(NEW.parenthesize, FALSE),
848 COALESCE(NEW.seq_no, 1),
854 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
855 ON UPDATE TO query.expr_xin
857 UPDATE query.expression SET
859 parenthesize = NEW.parenthesize,
860 parent_expr = NEW.parent_expr,
862 left_operand = NEW.left_operand,
863 subquery = NEW.subquery,
868 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
869 ON DELETE TO query.expr_xin
871 DELETE FROM query.expression WHERE id = OLD.id;
873 -- Create updatable view for IS NULL expressions
875 CREATE OR REPLACE VIEW query.expr_xisnull AS
888 CREATE OR REPLACE RULE query_expr_xisnull_insert_rule AS
889 ON INSERT TO query.expr_xisnull
891 INSERT INTO query.expression (
900 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
902 COALESCE(NEW.parenthesize, FALSE),
904 COALESCE(NEW.seq_no, 1),
909 CREATE OR REPLACE RULE query_expr_xisnull_update_rule AS
910 ON UPDATE TO query.expr_xisnull
912 UPDATE query.expression SET
914 parenthesize = NEW.parenthesize,
915 parent_expr = NEW.parent_expr,
917 left_operand = NEW.left_operand,
922 CREATE OR REPLACE RULE query_expr_xisnull_delete_rule AS
923 ON DELETE TO query.expr_xisnull
925 DELETE FROM query.expression WHERE id = OLD.id;
927 -- Create updatable view for NULL expressions
929 CREATE OR REPLACE VIEW query.expr_xnull AS
941 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
942 ON INSERT TO query.expr_xnull
944 INSERT INTO query.expression (
952 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
954 COALESCE(NEW.parenthesize, FALSE),
956 COALESCE(NEW.seq_no, 1),
960 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
961 ON UPDATE TO query.expr_xnull
963 UPDATE query.expression SET
965 parenthesize = NEW.parenthesize,
966 parent_expr = NEW.parent_expr,
972 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
973 ON DELETE TO query.expr_xnull
975 DELETE FROM query.expression WHERE id = OLD.id;
977 -- Create updatable view for numeric literal expressions
979 CREATE OR REPLACE VIEW query.expr_xnum AS
991 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
992 ON INSERT TO query.expr_xnum
994 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),
1010 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
1011 ON UPDATE TO query.expr_xnum
1013 UPDATE query.expression SET
1015 parenthesize = NEW.parenthesize,
1016 parent_expr = NEW.parent_expr,
1017 seq_no = NEW.seq_no,
1018 literal = NEW.literal
1022 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
1023 ON DELETE TO query.expr_xnum
1025 DELETE FROM query.expression WHERE id = OLD.id;
1027 -- Create updatable view for operator expressions
1029 CREATE OR REPLACE VIEW query.expr_xop AS
1044 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
1045 ON INSERT TO query.expr_xop
1047 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),
1069 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
1070 ON UPDATE TO query.expr_xop
1072 UPDATE query.expression SET
1074 parenthesize = NEW.parenthesize,
1075 parent_expr = NEW.parent_expr,
1076 seq_no = NEW.seq_no,
1077 left_operand = NEW.left_operand,
1078 operator = NEW.operator,
1079 right_operand = NEW.right_operand,
1084 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
1085 ON DELETE TO query.expr_xop
1087 DELETE FROM query.expression WHERE id = OLD.id;
1089 -- Create updatable view for series expressions,
1090 -- i.e. series of expressions separated by operators
1092 CREATE OR REPLACE VIEW query.expr_xser AS
1105 CREATE OR REPLACE RULE query_expr_xser_insert_rule AS
1106 ON INSERT TO query.expr_xser
1108 INSERT INTO query.expression (
1117 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1119 COALESCE(NEW.parenthesize, FALSE),
1121 COALESCE(NEW.seq_no, 1),
1126 CREATE OR REPLACE RULE query_expr_xser_update_rule AS
1127 ON UPDATE TO query.expr_xser
1129 UPDATE query.expression SET
1131 parenthesize = NEW.parenthesize,
1132 parent_expr = NEW.parent_expr,
1133 seq_no = NEW.seq_no,
1134 operator = NEW.operator,
1139 CREATE OR REPLACE RULE query_expr_xser_delete_rule AS
1140 ON DELETE TO query.expr_xser
1142 DELETE FROM query.expression WHERE id = OLD.id;
1144 -- Create updatable view for string literal expressions
1146 CREATE OR REPLACE VIEW query.expr_xstr AS
1158 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1159 ON INSERT TO query.expr_xstr
1161 INSERT INTO query.expression (
1169 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1171 COALESCE(NEW.parenthesize, FALSE),
1173 COALESCE(NEW.seq_no, 1),
1177 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1178 ON UPDATE TO query.expr_xstr
1180 UPDATE query.expression SET
1182 parenthesize = NEW.parenthesize,
1183 parent_expr = NEW.parent_expr,
1184 seq_no = NEW.seq_no,
1185 literal = NEW.literal
1189 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1190 ON DELETE TO query.expr_xstr
1192 DELETE FROM query.expression WHERE id = OLD.id;
1194 -- Create updatable view for subquery expressions
1196 CREATE OR REPLACE VIEW query.expr_xsubq AS
1209 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1210 ON INSERT TO query.expr_xsubq
1212 INSERT INTO query.expression (
1221 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1223 COALESCE(NEW.parenthesize, FALSE),
1225 COALESCE(NEW.seq_no, 1),
1230 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1231 ON UPDATE TO query.expr_xsubq
1233 UPDATE query.expression SET
1235 parenthesize = NEW.parenthesize,
1236 parent_expr = NEW.parent_expr,
1237 seq_no = NEW.seq_no,
1238 subquery = NEW.subquery,
1243 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1244 ON DELETE TO query.expr_xsubq
1246 DELETE FROM query.expression WHERE id = OLD.id;