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 -- Leave room to seed with stock datatypes
71 -- before adding customized ones
72 SELECT setval( 'query.datatype_id_seq', 1000 );
74 CREATE TABLE query.subfield (
75 id SERIAL PRIMARY KEY,
76 composite_type INT NOT NULL
77 REFERENCES query.datatype(id)
79 DEFERRABLE INITIALLY DEFERRED,
81 CONSTRAINT qsf_pos_seq_no
83 subfield_type INT NOT NULL
84 REFERENCES query.datatype(id)
85 DEFERRABLE INITIALLY DEFERRED,
86 CONSTRAINT qsf_datatype_seq_no UNIQUE (composite_type, seq_no)
89 CREATE TABLE query.function_sig (
90 id SERIAL PRIMARY KEY,
91 function_name TEXT NOT NULL,
92 return_type INT REFERENCES query.datatype(id)
93 DEFERRABLE INITIALLY DEFERRED,
94 is_aggregate BOOL NOT NULL DEFAULT FALSE,
95 CONSTRAINT qfd_rtn_or_aggr CHECK
96 ( return_type IS NULL OR is_aggregate = FALSE )
99 CREATE INDEX query_function_sig_name_idx
100 ON query.function_sig (function_name);
102 CREATE TABLE query.function_param_def (
103 id SERIAL PRIMARY KEY,
104 function_id INT NOT NULL
105 REFERENCES query.function_sig( id )
107 DEFERRABLE INITIALLY DEFERRED,
109 CONSTRAINT qfpd_pos_seq_no CHECK
111 datatype INT NOT NULL
112 REFERENCES query.datatype( id )
113 DEFERRABLE INITIALLY DEFERRED,
114 CONSTRAINT qfpd_function_param_seq UNIQUE (function_id, seq_no)
117 CREATE TABLE query.bind_variable (
118 name TEXT PRIMARY KEY,
120 CONSTRAINT bind_variable_type CHECK
121 ( type in ( 'string', 'number', 'string_list', 'number_list' )),
122 description TEXT NOT NULL,
123 default_value TEXT, -- to be encoded in JSON
127 CREATE TABLE query.expression (
128 id SERIAL PRIMARY KEY,
129 type TEXT NOT NULL CONSTRAINT expression_type CHECK
132 'xbind', -- bind variable
140 'xisnull', -- is null
148 parenthesize BOOL NOT NULL DEFAULT FALSE,
149 parent_expr INT REFERENCES query.expression
151 DEFERRABLE INITIALLY DEFERRED,
152 seq_no INT NOT NULL DEFAULT 1,
156 left_operand INT REFERENCES query.expression
157 DEFERRABLE INITIALLY DEFERRED,
159 right_operand INT REFERENCES query.expression
160 DEFERRABLE INITIALLY DEFERRED,
161 function_id INT REFERENCES query.function_sig
162 DEFERRABLE INITIALLY DEFERRED,
163 subquery INT REFERENCES query.stored_query
164 DEFERRABLE INITIALLY DEFERRED,
165 cast_type INT REFERENCES query.datatype
166 DEFERRABLE INITIALLY DEFERRED,
167 negate BOOL NOT NULL DEFAULT FALSE,
168 bind_variable TEXT REFERENCES query.bind_variable
169 DEFERRABLE INITIALLY DEFERRED
172 CREATE UNIQUE INDEX query_expr_parent_seq
173 ON query.expression( parent_expr, seq_no )
174 WHERE parent_expr IS NOT NULL;
176 -- Due to some circular references, the following foreign key definitions
177 -- had to be deferred until query.expression existed:
179 ALTER TABLE query.stored_query
180 ADD FOREIGN KEY ( where_clause )
181 REFERENCES query.expression( id )
182 DEFERRABLE INITIALLY DEFERRED;
184 ALTER TABLE query.stored_query
185 ADD FOREIGN KEY ( having_clause )
186 REFERENCES query.expression( id )
187 DEFERRABLE INITIALLY DEFERRED;
189 CREATE TABLE query.case_branch (
190 id SERIAL PRIMARY KEY,
191 parent_expr INT NOT NULL REFERENCES query.expression
193 DEFERRABLE INITIALLY DEFERRED,
195 condition INT REFERENCES query.expression
196 DEFERRABLE INITIALLY DEFERRED,
197 result INT NOT NULL REFERENCES query.expression
198 DEFERRABLE INITIALLY DEFERRED,
199 CONSTRAINT case_branch_parent_seq UNIQUE (parent_expr, seq_no)
202 CREATE TABLE query.from_relation (
203 id SERIAL PRIMARY KEY,
204 type TEXT NOT NULL CONSTRAINT relation_type CHECK (
205 type IN ( 'RELATION', 'SUBQUERY', 'FUNCTION' ) ),
208 subquery INT REFERENCES query.stored_query,
209 function_call INT REFERENCES query.expression,
211 parent_relation INT REFERENCES query.from_relation
213 DEFERRABLE INITIALLY DEFERRED,
214 seq_no INT NOT NULL DEFAULT 1,
215 join_type TEXT CONSTRAINT good_join_type CHECK (
216 join_type IS NULL OR join_type IN
217 ( 'INNER', 'LEFT', 'RIGHT', 'FULL' )
219 on_clause INT REFERENCES query.expression
220 DEFERRABLE INITIALLY DEFERRED,
221 CONSTRAINT join_or_core CHECK (
222 ( parent_relation IS NULL AND join_type IS NULL
223 AND on_clause IS NULL )
225 ( parent_relation IS NOT NULL AND join_type IS NOT NULL
226 AND on_clause IS NOT NULL )
230 CREATE UNIQUE INDEX from_parent_seq
231 ON query.from_relation( parent_relation, seq_no )
232 WHERE parent_relation IS NOT NULL;
234 -- The following foreign key had to be deferred until
235 -- query.from_relation existed
237 ALTER TABLE query.stored_query
238 ADD FOREIGN KEY (from_clause)
239 REFERENCES query.from_relation
240 DEFERRABLE INITIALLY DEFERRED;
242 CREATE TABLE query.record_column (
243 id SERIAL PRIMARY KEY,
244 from_relation INT NOT NULL REFERENCES query.from_relation
246 DEFERRABLE INITIALLY DEFERRED,
248 column_name TEXT NOT NULL,
249 column_type INT NOT NULL REFERENCES query.datatype
251 DEFERRABLE INITIALLY DEFERRED,
252 CONSTRAINT column_sequence UNIQUE (from_relation, seq_no)
255 CREATE TABLE query.select_item (
256 id SERIAL PRIMARY KEY,
257 stored_query INT NOT NULL REFERENCES query.stored_query
259 DEFERRABLE INITIALLY DEFERRED,
261 expression INT NOT NULL REFERENCES query.expression
262 DEFERRABLE INITIALLY DEFERRED,
264 grouped_by BOOL NOT NULL DEFAULT FALSE,
265 CONSTRAINT select_sequence UNIQUE( stored_query, seq_no )
268 CREATE TABLE query.order_by_item (
269 id SERIAL PRIMARY KEY,
270 stored_query INT NOT NULL REFERENCES query.stored_query
272 DEFERRABLE INITIALLY DEFERRED,
274 expression INT NOT NULL REFERENCES query.expression
276 DEFERRABLE INITIALLY DEFERRED,
277 CONSTRAINT order_by_sequence UNIQUE( stored_query, seq_no )
280 -- Create updatable views -------------------------------------------
282 -- Create updatable view for BETWEEN expressions
284 CREATE OR REPLACE VIEW query.expr_xbet AS
297 CREATE OR REPLACE RULE query_expr_xbet_insert_rule AS
298 ON INSERT TO query.expr_xbet
300 INSERT INTO query.expression (
309 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
311 COALESCE(NEW.parenthesize, FALSE),
313 COALESCE(NEW.seq_no, 1),
315 COALESCE(NEW.negate, false)
318 CREATE OR REPLACE RULE query_expr_xbet_update_rule AS
319 ON UPDATE TO query.expr_xbet
321 UPDATE query.expression SET
323 parenthesize = NEW.parenthesize,
324 parent_expr = NEW.parent_expr,
326 left_operand = NEW.left_operand,
331 CREATE OR REPLACE RULE query_expr_xbet_delete_rule AS
332 ON DELETE TO query.expr_xbet
334 DELETE FROM query.expression WHERE id = OLD.id;
336 -- Create updatable view for bind variable expressions
338 CREATE OR REPLACE VIEW query.expr_xbind AS
350 CREATE OR REPLACE RULE query_expr_xbind_insert_rule AS
351 ON INSERT TO query.expr_xbind
353 INSERT INTO query.expression (
361 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
363 COALESCE(NEW.parenthesize, FALSE),
365 COALESCE(NEW.seq_no, 1),
369 CREATE OR REPLACE RULE query_expr_xbind_update_rule AS
370 ON UPDATE TO query.expr_xbind
372 UPDATE query.expression SET
374 parenthesize = NEW.parenthesize,
375 parent_expr = NEW.parent_expr,
377 bind_variable = NEW.bind_variable
381 CREATE OR REPLACE RULE query_expr_xbind_delete_rule AS
382 ON DELETE TO query.expr_xbind
384 DELETE FROM query.expression WHERE id = OLD.id;
386 -- Create updatable view for boolean expressions
388 CREATE OR REPLACE VIEW query.expr_xbool AS
401 CREATE OR REPLACE RULE query_expr_xbool_insert_rule AS
402 ON INSERT TO query.expr_xbool
404 INSERT INTO query.expression (
413 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
415 COALESCE(NEW.parenthesize, FALSE),
417 COALESCE(NEW.seq_no, 1),
419 COALESCE(NEW.negate, false)
422 CREATE OR REPLACE RULE query_expr_xbool_update_rule AS
423 ON UPDATE TO query.expr_xbool
425 UPDATE query.expression SET
427 parenthesize = NEW.parenthesize,
428 parent_expr = NEW.parent_expr,
430 literal = NEW.literal,
435 CREATE OR REPLACE RULE query_expr_xbool_delete_rule AS
436 ON DELETE TO query.expr_xbool
438 DELETE FROM query.expression WHERE id = OLD.id;
440 -- Create updatable view for CASE expressions
442 CREATE OR REPLACE VIEW query.expr_xcase AS
455 CREATE OR REPLACE RULE query_expr_xcase_insert_rule AS
456 ON INSERT TO query.expr_xcase
458 INSERT INTO query.expression (
467 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
469 COALESCE(NEW.parenthesize, FALSE),
471 COALESCE(NEW.seq_no, 1),
473 COALESCE(NEW.negate, false)
476 CREATE OR REPLACE RULE query_expr_xcase_update_rule AS
477 ON UPDATE TO query.expr_xcase
479 UPDATE query.expression SET
481 parenthesize = NEW.parenthesize,
482 parent_expr = NEW.parent_expr,
484 left_operand = NEW.left_operand,
489 CREATE OR REPLACE RULE query_expr_xcase_delete_rule AS
490 ON DELETE TO query.expr_xcase
492 DELETE FROM query.expression WHERE id = OLD.id;
494 -- Create updatable view for cast expressions
496 CREATE OR REPLACE VIEW query.expr_xcast AS
510 CREATE OR REPLACE RULE query_expr_xcast_insert_rule AS
511 ON INSERT TO query.expr_xcast
513 INSERT INTO query.expression (
523 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
525 COALESCE(NEW.parenthesize, FALSE),
527 COALESCE(NEW.seq_no, 1),
530 COALESCE(NEW.negate, false)
533 CREATE OR REPLACE RULE query_expr_xcast_update_rule AS
534 ON UPDATE TO query.expr_xcast
536 UPDATE query.expression SET
538 parenthesize = NEW.parenthesize,
539 parent_expr = NEW.parent_expr,
541 left_operand = NEW.left_operand,
542 cast_type = NEW.cast_type,
547 CREATE OR REPLACE RULE query_expr_xcast_delete_rule AS
548 ON DELETE TO query.expr_xcast
550 DELETE FROM query.expression WHERE id = OLD.id;
552 -- Create updatable view for column expressions
554 CREATE OR REPLACE VIEW query.expr_xcol AS
568 CREATE OR REPLACE RULE query_expr_xcol_insert_rule AS
569 ON INSERT TO query.expr_xcol
571 INSERT INTO query.expression (
581 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
583 COALESCE(NEW.parenthesize, FALSE),
585 COALESCE(NEW.seq_no, 1),
588 COALESCE(NEW.negate, false)
591 CREATE OR REPLACE RULE query_expr_xcol_update_rule AS
592 ON UPDATE TO query.expr_xcol
594 UPDATE query.expression SET
596 parenthesize = NEW.parenthesize,
597 parent_expr = NEW.parent_expr,
599 table_alias = NEW.table_alias,
600 column_name = NEW.column_name,
605 CREATE OR REPLACE RULE query_expr_xcol_delete_rule AS
606 ON DELETE TO query.expr_xcol
608 DELETE FROM query.expression WHERE id = OLD.id;
610 -- Create updatable view for EXISTS expressions
612 CREATE OR REPLACE VIEW query.expr_xex AS
625 CREATE OR REPLACE RULE query_expr_xex_insert_rule AS
626 ON INSERT TO query.expr_xex
628 INSERT INTO query.expression (
637 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
639 COALESCE(NEW.parenthesize, FALSE),
641 COALESCE(NEW.seq_no, 1),
643 COALESCE(NEW.negate, false)
646 CREATE OR REPLACE RULE query_expr_xex_update_rule AS
647 ON UPDATE TO query.expr_xex
649 UPDATE query.expression SET
651 parenthesize = NEW.parenthesize,
652 parent_expr = NEW.parent_expr,
654 subquery = NEW.subquery,
659 CREATE OR REPLACE RULE query_expr_xex_delete_rule AS
660 ON DELETE TO query.expr_xex
662 DELETE FROM query.expression WHERE id = OLD.id;
664 -- Create updatable view for function call expressions
666 CREATE OR REPLACE VIEW query.expr_xfunc AS
680 CREATE OR REPLACE RULE query_expr_xfunc_insert_rule AS
681 ON INSERT TO query.expr_xfunc
683 INSERT INTO query.expression (
693 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
695 COALESCE(NEW.parenthesize, FALSE),
697 COALESCE(NEW.seq_no, 1),
700 COALESCE(NEW.negate, false)
703 CREATE OR REPLACE RULE query_expr_xfunc_update_rule AS
704 ON UPDATE TO query.expr_xfunc
706 UPDATE query.expression SET
708 parenthesize = NEW.parenthesize,
709 parent_expr = NEW.parent_expr,
711 column_name = NEW.column_name,
712 function_id = NEW.function_id,
717 CREATE OR REPLACE RULE query_expr_xfunc_delete_rule AS
718 ON DELETE TO query.expr_xfunc
720 DELETE FROM query.expression WHERE id = OLD.id;
722 -- Create updatable view for IN expressions
724 CREATE OR REPLACE VIEW query.expr_xin AS
738 CREATE OR REPLACE RULE query_expr_xin_insert_rule AS
739 ON INSERT TO query.expr_xin
741 INSERT INTO query.expression (
751 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
753 COALESCE(NEW.parenthesize, FALSE),
755 COALESCE(NEW.seq_no, 1),
758 COALESCE(NEW.negate, false)
761 CREATE OR REPLACE RULE query_expr_xin_update_rule AS
762 ON UPDATE TO query.expr_xin
764 UPDATE query.expression SET
766 parenthesize = NEW.parenthesize,
767 parent_expr = NEW.parent_expr,
769 left_operand = NEW.left_operand,
770 subquery = NEW.subquery,
775 CREATE OR REPLACE RULE query_expr_xin_delete_rule AS
776 ON DELETE TO query.expr_xin
778 DELETE FROM query.expression WHERE id = OLD.id;
780 -- Create updatable view for IS NULL expressions
782 CREATE OR REPLACE VIEW query.expr_xisnull AS
795 CREATE OR REPLACE RULE query_expr_xisnull_insert_rule AS
796 ON INSERT TO query.expr_xisnull
798 INSERT INTO query.expression (
807 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
809 COALESCE(NEW.parenthesize, FALSE),
811 COALESCE(NEW.seq_no, 1),
813 COALESCE(NEW.negate, false)
816 CREATE OR REPLACE RULE query_expr_xisnull_update_rule AS
817 ON UPDATE TO query.expr_xisnull
819 UPDATE query.expression SET
821 parenthesize = NEW.parenthesize,
822 parent_expr = NEW.parent_expr,
824 left_operand = NEW.left_operand,
829 CREATE OR REPLACE RULE query_expr_xisnull_delete_rule AS
830 ON DELETE TO query.expr_xisnull
832 DELETE FROM query.expression WHERE id = OLD.id;
834 -- Create updatable view for NULL expressions
836 CREATE OR REPLACE VIEW query.expr_xnull AS
848 CREATE OR REPLACE RULE query_expr_xnull_insert_rule AS
849 ON INSERT TO query.expr_xnull
851 INSERT INTO query.expression (
859 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
861 COALESCE(NEW.parenthesize, FALSE),
863 COALESCE(NEW.seq_no, 1),
864 COALESCE(NEW.negate, false)
867 CREATE OR REPLACE RULE query_expr_xnull_update_rule AS
868 ON UPDATE TO query.expr_xnull
870 UPDATE query.expression SET
872 parenthesize = NEW.parenthesize,
873 parent_expr = NEW.parent_expr,
879 CREATE OR REPLACE RULE query_expr_xnull_delete_rule AS
880 ON DELETE TO query.expr_xnull
882 DELETE FROM query.expression WHERE id = OLD.id;
884 -- Create updatable view for numeric literal expressions
886 CREATE OR REPLACE VIEW query.expr_xnum AS
898 CREATE OR REPLACE RULE query_expr_xnum_insert_rule AS
899 ON INSERT TO query.expr_xnum
901 INSERT INTO query.expression (
909 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
911 COALESCE(NEW.parenthesize, FALSE),
913 COALESCE(NEW.seq_no, 1),
917 CREATE OR REPLACE RULE query_expr_xnum_update_rule AS
918 ON UPDATE TO query.expr_xnum
920 UPDATE query.expression SET
922 parenthesize = NEW.parenthesize,
923 parent_expr = NEW.parent_expr,
925 literal = NEW.literal
929 CREATE OR REPLACE RULE query_expr_xnum_delete_rule AS
930 ON DELETE TO query.expr_xnum
932 DELETE FROM query.expression WHERE id = OLD.id;
934 -- Create updatable view for operator expressions
936 CREATE OR REPLACE VIEW query.expr_xop AS
951 CREATE OR REPLACE RULE query_expr_xop_insert_rule AS
952 ON INSERT TO query.expr_xop
954 INSERT INTO query.expression (
965 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
967 COALESCE(NEW.parenthesize, FALSE),
969 COALESCE(NEW.seq_no, 1),
973 COALESCE(NEW.negate, false)
976 CREATE OR REPLACE RULE query_expr_xop_update_rule AS
977 ON UPDATE TO query.expr_xop
979 UPDATE query.expression SET
981 parenthesize = NEW.parenthesize,
982 parent_expr = NEW.parent_expr,
984 left_operand = NEW.left_operand,
985 operator = NEW.operator,
986 right_operand = NEW.right_operand,
991 CREATE OR REPLACE RULE query_expr_xop_delete_rule AS
992 ON DELETE TO query.expr_xop
994 DELETE FROM query.expression WHERE id = OLD.id;
996 -- Create updatable view for series expressions,
997 -- i.e. series of expressions separated by operators
999 CREATE OR REPLACE VIEW query.expr_xser AS
1012 CREATE OR REPLACE RULE query_expr_xser_insert_rule AS
1013 ON INSERT TO query.expr_xser
1015 INSERT INTO query.expression (
1024 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1026 COALESCE(NEW.parenthesize, FALSE),
1028 COALESCE(NEW.seq_no, 1),
1030 COALESCE(NEW.negate, false)
1033 CREATE OR REPLACE RULE query_expr_xser_update_rule AS
1034 ON UPDATE TO query.expr_xser
1036 UPDATE query.expression SET
1038 parenthesize = NEW.parenthesize,
1039 parent_expr = NEW.parent_expr,
1040 seq_no = NEW.seq_no,
1041 operator = NEW.operator,
1046 CREATE OR REPLACE RULE query_expr_xser_delete_rule AS
1047 ON DELETE TO query.expr_xser
1049 DELETE FROM query.expression WHERE id = OLD.id;
1051 -- Create updatable view for string literal expressions
1053 CREATE OR REPLACE VIEW query.expr_xstr AS
1065 CREATE OR REPLACE RULE query_expr_string_insert_rule AS
1066 ON INSERT TO query.expr_xstr
1068 INSERT INTO query.expression (
1076 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1078 COALESCE(NEW.parenthesize, FALSE),
1080 COALESCE(NEW.seq_no, 1),
1084 CREATE OR REPLACE RULE query_expr_string_update_rule AS
1085 ON UPDATE TO query.expr_xstr
1087 UPDATE query.expression SET
1089 parenthesize = NEW.parenthesize,
1090 parent_expr = NEW.parent_expr,
1091 seq_no = NEW.seq_no,
1092 literal = NEW.literal
1096 CREATE OR REPLACE RULE query_expr_string_delete_rule AS
1097 ON DELETE TO query.expr_xstr
1099 DELETE FROM query.expression WHERE id = OLD.id;
1101 -- Create updatable view for subquery expressions
1103 CREATE OR REPLACE VIEW query.expr_xsubq AS
1116 CREATE OR REPLACE RULE query_expr_xsubq_insert_rule AS
1117 ON INSERT TO query.expr_xsubq
1119 INSERT INTO query.expression (
1128 COALESCE(NEW.id, NEXTVAL('query.expression_id_seq'::REGCLASS)),
1130 COALESCE(NEW.parenthesize, FALSE),
1132 COALESCE(NEW.seq_no, 1),
1134 COALESCE(NEW.negate, false)
1137 CREATE OR REPLACE RULE query_expr_xsubq_update_rule AS
1138 ON UPDATE TO query.expr_xsubq
1140 UPDATE query.expression SET
1142 parenthesize = NEW.parenthesize,
1143 parent_expr = NEW.parent_expr,
1144 seq_no = NEW.seq_no,
1145 subquery = NEW.subquery,
1150 CREATE OR REPLACE RULE query_expr_xsubq_delete_rule AS
1151 ON DELETE TO query.expr_xsubq
1153 DELETE FROM query.expression WHERE id = OLD.id;