1/* This file is automatically generated from wc-checks.sql and token-map.h.
2 * Do not edit this file -- edit the source and rerun gen-make.py */
3
4#define STMT_VERIFICATION_TRIGGERS 0
5#define STMT_0_INFO {"STMT_VERIFICATION_TRIGGERS", NULL}
6#define STMT_0 \
7  "CREATE TEMPORARY TRIGGER no_repository_updates BEFORE UPDATE ON repository " \
8  "BEGIN " \
9  "  SELECT RAISE(FAIL, 'Updates to REPOSITORY are not allowed.'); " \
10  "END; " \
11  "CREATE TEMPORARY TRIGGER validation_01 BEFORE INSERT ON nodes " \
12  "WHEN NOT ((new.local_relpath = '' AND new.parent_relpath IS NULL) " \
13  "          OR (relpath_depth(new.local_relpath) " \
14  "              = relpath_depth(new.parent_relpath) + 1)) " \
15  "BEGIN " \
16  "  SELECT RAISE(FAIL, 'WC DB validity check 01 failed'); " \
17  "END; " \
18  "CREATE TEMPORARY TRIGGER validation_02 BEFORE INSERT ON nodes " \
19  "WHEN NOT new.op_depth <= relpath_depth(new.local_relpath) " \
20  "BEGIN " \
21  "  SELECT RAISE(FAIL, 'WC DB validity check 02 failed'); " \
22  "END; " \
23  "CREATE TEMPORARY TRIGGER validation_03 BEFORE INSERT ON nodes " \
24  "WHEN NOT ( " \
25  "    (new.op_depth = relpath_depth(new.local_relpath)) " \
26  "    OR " \
27  "    (EXISTS (SELECT 1 FROM nodes " \
28  "              WHERE wc_id = new.wc_id AND op_depth = new.op_depth " \
29  "                AND local_relpath = new.parent_relpath)) " \
30  "  ) " \
31  " AND NOT (new.file_external IS NOT NULL AND new.op_depth = 0) " \
32  "BEGIN " \
33  "  SELECT RAISE(FAIL, 'WC DB validity check 03 failed'); " \
34  "END; " \
35  "CREATE TEMPORARY TRIGGER validation_04 BEFORE INSERT ON actual_node " \
36  "WHEN NOT (new.local_relpath = '' " \
37  "          OR EXISTS (SELECT 1 FROM nodes " \
38  "                       WHERE wc_id = new.wc_id " \
39  "                         AND local_relpath = new.parent_relpath)) " \
40  "BEGIN " \
41  "  SELECT RAISE(FAIL, 'WC DB validity check 04 failed'); " \
42  "END; " \
43  ""
44
45#define STMT_STATIC_VERIFY 1
46#define STMT_1_INFO {"STMT_STATIC_VERIFY", NULL}
47#define STMT_1 \
48  "SELECT local_relpath, op_depth, 1, 'Invalid parent relpath set in NODES' " \
49  "FROM nodes n WHERE local_relpath != '' " \
50  " AND (parent_relpath IS NULL " \
51  "      OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
52  "      OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
53  "UNION ALL " \
54  "SELECT local_relpath, -1, 2, 'Invalid parent relpath set in ACTUAL' " \
55  "FROM actual_node a WHERE local_relpath != '' " \
56  " AND (parent_relpath IS NULL " \
57  "      OR NOT (((local_relpath) > (CASE (parent_relpath) WHEN '' THEN '' ELSE (parent_relpath) || '/' END)) AND ((local_relpath) < CASE (parent_relpath) WHEN '' THEN X'FFFF' ELSE (parent_relpath) || '0' END)) " \
58  "      OR relpath_depth(local_relpath) != relpath_depth(parent_relpath)+1) " \
59  "UNION ALL " \
60  "SELECT local_relpath, -1, 10, 'No ancestor in ACTUAL' " \
61  "FROM actual_node a WHERE local_relpath != '' " \
62  " AND NOT EXISTS(SELECT 1 from nodes i " \
63  "                WHERE i.wc_id=a.wc_id " \
64  "                  AND i.local_relpath=a.parent_relpath) " \
65  " AND NOT EXISTS(SELECT 1 from nodes i " \
66  "                WHERE i.wc_id=a.wc_id " \
67  "                  AND i.local_relpath=a.local_relpath) " \
68  "UNION ALL " \
69  "SELECT a.local_relpath, -1, 11, 'Bad or Unneeded actual data' " \
70  "FROM actual_node a " \
71  "LEFT JOIN nodes n on n.wc_id = a.wc_id AND n.local_relpath = a.local_relpath " \
72  "   AND n.op_depth = (SELECT MAX(op_depth) from nodes i " \
73  "                     WHERE i.wc_id=a.wc_id AND i.local_relpath=a.local_relpath) " \
74  "WHERE (a.properties IS NOT NULL " \
75  "       AND (n.presence IS NULL " \
76  "            OR n.presence NOT IN ('normal', 'incomplete'))) " \
77  "   OR (a.changelist IS NOT NULL AND (n.kind IS NOT NULL AND n.kind != 'file')) " \
78  "   OR (a.conflict_data IS NULL AND a.properties IS NULL AND a.changelist IS NULL) " \
79  " AND NOT EXISTS(SELECT 1 from nodes i " \
80  "                WHERE i.wc_id=a.wc_id " \
81  "                  AND i.local_relpath=a.parent_relpath) " \
82  "UNION ALL " \
83  "SELECT local_relpath, op_depth, 20, 'No ancestor in NODES' " \
84  "FROM nodes n WHERE local_relpath != '' " \
85  " AND file_external IS NULL " \
86  " AND NOT EXISTS(SELECT 1 from nodes i " \
87  "                WHERE i.wc_id=n.wc_id " \
88  "                  AND i.local_relpath=n.parent_relpath " \
89  "                  AND i.op_depth <= n.op_depth) " \
90  "UNION ALL " \
91  "SELECT local_relpath, op_depth, 21, 'Unneeded node data' " \
92  "FROM nodes " \
93  "WHERE presence NOT IN ('normal', 'incomplete') " \
94  "AND (properties IS NOT NULL " \
95  "     OR checksum IS NOT NULL " \
96  "     OR depth IS NOT NULL " \
97  "     OR symlink_target IS NOT NULL " \
98  "     OR changed_revision IS NOT NULL " \
99  "     OR (changed_date IS NOT NULL AND changed_date != 0) " \
100  "     OR changed_author IS NOT NULL " \
101  "     OR translated_size IS NOT NULL " \
102  "     OR last_mod_time IS NOT NULL " \
103  "     OR dav_cache IS NOT NULL " \
104  "     OR file_external IS NOT NULL " \
105  "     OR inherited_props IS NOT NULL) " \
106  "UNION ALL " \
107  "SELECT local_relpath, op_depth, 22, 'Unneeded base-deleted node data' " \
108  "FROM nodes " \
109  "WHERE presence IN ('base-deleted') " \
110  "AND (repos_id IS NOT NULL " \
111  "     OR repos_path IS NOT NULL " \
112  "     OR revision IS NOT NULL) " \
113  "UNION ALL " \
114  "SELECT local_relpath, op_depth, 23, 'Kind specific data invalid on normal' " \
115  "FROM nodes " \
116  "WHERE presence IN ('normal', 'incomplete') " \
117  "AND (kind IS NULL " \
118  "     OR (repos_path IS NULL " \
119  "         AND (properties IS NOT NULL " \
120  "              OR changed_revision IS NOT NULL " \
121  "              OR changed_author IS NOT NULL " \
122  "              OR (changed_date IS NOT NULL AND changed_date != 0))) " \
123  "     OR (CASE WHEN kind = 'file' AND repos_path IS NOT NULL " \
124  "                                   THEN checksum IS NULL " \
125  "                                   ELSE checksum IS NOT NULL END) " \
126  "     OR (CASE WHEN kind = 'dir' THEN depth IS NULL " \
127  "                                  ELSE depth IS NOT NULL END) " \
128  "     OR (CASE WHEN kind = 'symlink' THEN symlink_target IS NULL " \
129  "                                      ELSE symlink_target IS NOT NULL END)) " \
130  "UNION ALL " \
131  "SELECT local_relpath, op_depth, 24, 'Invalid op-depth for local add' " \
132  "FROM nodes " \
133  "WHERE presence IN ('normal', 'incomplete') " \
134  "  AND repos_path IS NULL " \
135  "  AND op_depth != relpath_depth(local_relpath) " \
136  "UNION ALL " \
137  "SELECT local_relpath, op_depth, 25, 'Node missing op-depth ancestor' " \
138  "FROM nodes n " \
139  "WHERE op_depth < relpath_depth(local_relpath) " \
140  "  AND file_external IS NULL " \
141  "  AND NOT EXISTS(SELECT 1 FROM nodes p " \
142  "                 WHERE p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
143  "                   AND p.op_depth=n.op_depth " \
144  "                   AND (p.presence IN ('normal', 'incomplete') " \
145  "                        OR (p.presence IN ('base-deleted', 'not-present') " \
146  "                            AND n.presence = 'base-deleted'))) " \
147  "UNION ALL " \
148  "SELECT n.local_relpath, n.op_depth, 26, 'Copied descendant mismatch' " \
149  "FROM nodes n " \
150  "JOIN nodes p " \
151  "  ON p.wc_id=n.wc_id AND p.local_relpath=n.parent_relpath " \
152  "  AND n.op_depth=p.op_depth " \
153  "WHERE n.op_depth > 0 AND n.presence IN ('normal', 'incomplete') " \
154  "   AND (n.repos_id != p.repos_id " \
155  "        OR n.repos_path != " \
156  "           (CASE WHEN (n.parent_relpath) = '' THEN (CASE WHEN (p.repos_path) = '' THEN (n.local_relpath) WHEN (n.local_relpath) = '' THEN (p.repos_path) ELSE (p.repos_path) || '/' || (n.local_relpath) END) WHEN (p.repos_path) = '' THEN (CASE WHEN (n.parent_relpath) = '' THEN (n.local_relpath)  WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath)  THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN '' WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+2) END END) WHEN SUBSTR((n.local_relpath), 1, LENGTH(n.parent_relpath)) = (n.parent_relpath) THEN CASE WHEN LENGTH(n.parent_relpath) = LENGTH(n.local_relpath) THEN (p.repos_path) WHEN SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1, 1) = '/' THEN (p.repos_path) || SUBSTR((n.local_relpath), LENGTH(n.parent_relpath)+1) END END) " \
157  "        OR n.revision != p.revision " \
158  "        OR p.kind != 'dir' " \
159  "        OR n.moved_here IS NOT p.moved_here) " \
160  "UNION ALL " \
161  "SELECT n.local_relpath, n.op_depth, 27, 'Invalid op-root presence' " \
162  "FROM nodes n " \
163  "WHERE n.op_depth = relpath_depth(local_relpath) " \
164  "  AND presence NOT IN ('normal', 'incomplete', 'base-deleted') " \
165  "UNION ALL " \
166  "SELECT n.local_relpath, s.op_depth, 28, 'Incomplete shadowing' " \
167  "FROM nodes n " \
168  "JOIN nodes s ON s.wc_id=n.wc_id AND s.local_relpath=n.local_relpath " \
169  " AND s.op_depth = relpath_depth(s.local_relpath) " \
170  " AND s.op_depth = (SELECT MIN(op_depth) FROM nodes d " \
171  "                   WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
172  "                     AND d.op_depth > n.op_depth) " \
173  "WHERE n.presence IN ('normal', 'incomplete') " \
174  "  AND EXISTS(SELECT 1 " \
175  "             FROM nodes dn " \
176  "             WHERE dn.wc_id=n.wc_id AND dn.op_depth=n.op_depth " \
177  "               AND dn.presence IN ('normal', 'incomplete') " \
178  "               AND (((dn.local_relpath) > (CASE (n.local_relpath) WHEN '' THEN '' ELSE (n.local_relpath) || '/' END)) AND ((dn.local_relpath) < CASE (n.local_relpath) WHEN '' THEN X'FFFF' ELSE (n.local_relpath) || '0' END)) " \
179  "               AND dn.file_external IS NULL " \
180  "               AND NOT EXISTS(SELECT 1 " \
181  "                              FROM nodes ds " \
182  "                              WHERE ds.wc_id=n.wc_id AND ds.op_depth=s.op_depth " \
183  "                                AND ds.local_relpath=dn.local_relpath)) " \
184  "UNION ALL " \
185  "SELECT s.local_relpath, s.op_depth, 29, 'Invalid base-delete' " \
186  "FROM nodes s " \
187  "LEFT JOIN nodes n ON n.wc_id=s.wc_id AND n.local_relpath=s.local_relpath " \
188  " AND n.op_depth = (SELECT MAX(op_depth) FROM nodes d " \
189  "                   WHERE d.wc_id=s.wc_id AND d.local_relpath=s.local_relpath " \
190  "                     AND d.op_depth < s.op_depth) " \
191  "WHERE s.presence = 'base-deleted' " \
192  "  AND (n.presence IS NULL " \
193  "       OR n.presence NOT IN ('normal', 'incomplete') " \
194  "       ) " \
195  "UNION ALL " \
196  "SELECT n.local_relpath, n.op_depth, 30, 'Invalid data for BASE' " \
197  "FROM nodes n " \
198  "WHERE n.op_depth = 0 " \
199  "  AND (n.moved_to IS NOT NULL " \
200  "       OR n.moved_here IS NOT NULL) " \
201  "UNION ALL " \
202  "SELECT d.local_relpath, d.op_depth, 60, 'Moved here without origin' " \
203  "FROM nodes d " \
204  "WHERE d.op_depth = relpath_depth(d.local_relpath) " \
205  "  AND d.moved_here IS NOT NULL " \
206  "  AND NOT EXISTS(SELECT 1 FROM nodes s " \
207  "                 WHERE s.wc_id = d.wc_id AND s.moved_to = d.local_relpath) " \
208  "UNION ALL " \
209  "SELECT s.local_relpath, s.op_depth, 61, 'Moved to without target' " \
210  "FROM nodes s " \
211  "WHERE s.moved_to IS NOT NULL " \
212  "  AND NOT EXISTS(SELECT 1 FROM nodes d " \
213  "                 WHERE d.wc_id = s.wc_id AND d.local_relpath = s.moved_to " \
214  "                   AND d.op_depth = relpath_depth(d.local_relpath) " \
215  "                   AND d.moved_here =1 AND d.repos_path IS NOT NULL) " \
216  ""
217
218#define WC_CHECKS_SQL_DECLARE_STATEMENTS(varname) \
219  static const char * const varname[] = { \
220    STMT_0, \
221    STMT_1, \
222    NULL \
223  }
224
225#define WC_CHECKS_SQL_DECLARE_STATEMENT_INFO(varname) \
226  static const char * const varname[][2] = { \
227    STMT_0_INFO, \
228    STMT_1_INFO, \
229    {NULL, NULL} \
230  }
231