]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/subversion/subversion/libsvn_wc/wc-queries.sql
Update mandoc to 20160116
[FreeBSD/FreeBSD.git] / contrib / subversion / subversion / libsvn_wc / wc-queries.sql
1 /* wc-queries.sql -- queries used to interact with the wc-metadata
2  *                   SQLite database
3  *     This is intended for use with SQLite 3
4  *
5  * ====================================================================
6  *    Licensed to the Apache Software Foundation (ASF) under one
7  *    or more contributor license agreements.  See the NOTICE file
8  *    distributed with this work for additional information
9  *    regarding copyright ownership.  The ASF licenses this file
10  *    to you under the Apache License, Version 2.0 (the
11  *    "License"); you may not use this file except in compliance
12  *    with the License.  You may obtain a copy of the License at
13  *
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  *
16  *    Unless required by applicable law or agreed to in writing,
17  *    software distributed under the License is distributed on an
18  *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19  *    KIND, either express or implied.  See the License for the
20  *    specific language governing permissions and limitations
21  *    under the License.
22  * ====================================================================
23  */
24
25 /* ------------------------------------------------------------------------- */
26
27 /* these are used in wc_db.c  */
28
29 -- STMT_SELECT_NODE_INFO
30 SELECT op_depth, repos_id, repos_path, presence, kind, revision, checksum,
31   translated_size, changed_revision, changed_date, changed_author, depth,
32   symlink_target, last_mod_time, properties, moved_here, inherited_props,
33   moved_to
34 FROM nodes
35 WHERE wc_id = ?1 AND local_relpath = ?2
36 ORDER BY op_depth DESC
37
38 -- STMT_SELECT_NODE_INFO_WITH_LOCK
39 SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
40   checksum, translated_size, changed_revision, changed_date, changed_author,
41   depth, symlink_target, last_mod_time, properties, moved_here,
42   inherited_props,
43   /* All the columns until now must match those returned by
44      STMT_SELECT_NODE_INFO. The implementation of svn_wc__db_read_info()
45      assumes that these columns are followed by the lock information) */
46   lock_token, lock_owner, lock_comment, lock_date
47 FROM nodes
48 LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
49   AND nodes.repos_path = lock.repos_relpath
50 WHERE wc_id = ?1 AND local_relpath = ?2
51 ORDER BY op_depth DESC
52
53 -- STMT_SELECT_BASE_NODE
54 SELECT repos_id, repos_path, presence, kind, revision, checksum,
55   translated_size, changed_revision, changed_date, changed_author, depth,
56   symlink_target, last_mod_time, properties, file_external
57 FROM nodes
58 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
59
60 -- STMT_SELECT_BASE_NODE_WITH_LOCK
61 SELECT nodes.repos_id, nodes.repos_path, presence, kind, revision,
62   checksum, translated_size, changed_revision, changed_date, changed_author,
63   depth, symlink_target, last_mod_time, properties, file_external,
64   /* All the columns until now must match those returned by
65      STMT_SELECT_BASE_NODE. The implementation of svn_wc__db_base_get_info()
66      assumes that these columns are followed by the lock information) */
67   lock_token, lock_owner, lock_comment, lock_date
68 FROM nodes
69 LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
70   AND nodes.repos_path = lock.repos_relpath
71 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
72
73 -- STMT_SELECT_BASE_CHILDREN_INFO
74 SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
75   revision, depth, file_external
76 FROM nodes
77 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
78
79 -- STMT_SELECT_BASE_CHILDREN_INFO_LOCK
80 SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
81   revision, depth, file_external,
82   lock_token, lock_owner, lock_comment, lock_date
83 FROM nodes
84 LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
85   AND nodes.repos_path = lock.repos_relpath
86 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
87
88
89 -- STMT_SELECT_WORKING_NODE
90 SELECT op_depth, presence, kind, checksum, translated_size,
91   changed_revision, changed_date, changed_author, depth, symlink_target,
92   repos_id, repos_path, revision,
93   moved_here, moved_to, last_mod_time, properties
94 FROM nodes
95 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0
96 ORDER BY op_depth DESC
97 LIMIT 1
98
99 -- STMT_SELECT_DEPTH_NODE
100 SELECT repos_id, repos_path, presence, kind, revision, checksum,
101   translated_size, changed_revision, changed_date, changed_author, depth,
102   symlink_target, properties, moved_to, moved_here
103 FROM nodes
104 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
105
106 -- STMT_SELECT_LOWEST_WORKING_NODE
107 SELECT op_depth, presence, kind, moved_to
108 FROM nodes
109 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
110 ORDER BY op_depth
111 LIMIT 1
112
113 -- STMT_SELECT_HIGHEST_WORKING_NODE
114 SELECT op_depth
115 FROM nodes
116 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3
117 ORDER BY op_depth DESC
118 LIMIT 1
119
120 -- STMT_SELECT_ACTUAL_NODE
121 SELECT changelist, properties, conflict_data
122 FROM actual_node
123 WHERE wc_id = ?1 AND local_relpath = ?2
124
125 -- STMT_SELECT_NODE_CHILDREN_INFO
126 /* Getting rows in an advantageous order using
127      ORDER BY local_relpath, op_depth DESC
128    doesn't work as the index is created without the DESC keyword.
129    Using both local_relpath and op_depth descending does work without any
130    performance penalty. */
131 SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
132   checksum, translated_size, changed_revision, changed_date, changed_author,
133   depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
134   lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external
135 FROM nodes
136 LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
137   AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
138 WHERE wc_id = ?1 AND parent_relpath = ?2
139 ORDER BY local_relpath DESC, op_depth DESC
140
141 -- STMT_SELECT_BASE_NODE_CHILDREN_INFO
142 /* See above re: result ordering. The results of this query must be in
143 the same order as returned by STMT_SELECT_NODE_CHILDREN_INFO, because
144 read_children_info expects them to be. */
145 SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
146   checksum, translated_size, changed_revision, changed_date, changed_author,
147   depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
148   lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external
149 FROM nodes
150 LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
151   AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
152 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
153 ORDER BY local_relpath DESC
154
155 -- STMT_SELECT_NODE_CHILDREN_WALKER_INFO
156 SELECT local_relpath, op_depth, presence, kind
157 FROM nodes_current
158 WHERE wc_id = ?1 AND parent_relpath = ?2
159 ORDER BY local_relpath
160
161 -- STMT_SELECT_ACTUAL_CHILDREN_INFO
162 SELECT local_relpath, changelist, properties, conflict_data
163 FROM actual_node
164 WHERE wc_id = ?1 AND parent_relpath = ?2
165
166 -- STMT_SELECT_REPOSITORY_BY_ID
167 SELECT root, uuid FROM repository WHERE id = ?1
168
169 -- STMT_SELECT_WCROOT_NULL
170 SELECT id FROM wcroot WHERE local_abspath IS NULL
171
172 -- STMT_SELECT_REPOSITORY
173 SELECT id FROM repository WHERE root = ?1
174
175 -- STMT_INSERT_REPOSITORY
176 INSERT INTO repository (root, uuid) VALUES (?1, ?2)
177
178 -- STMT_INSERT_NODE
179 INSERT OR REPLACE INTO nodes (
180   wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
181   revision, presence, depth, kind, changed_revision, changed_date,
182   changed_author, checksum, properties, translated_size, last_mod_time,
183   dav_cache, symlink_target, file_external, moved_to, moved_here,
184   inherited_props)
185 VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14,
186         ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23)
187
188 -- STMT_SELECT_WORKING_PRESENT
189 SELECT local_relpath, kind, checksum, translated_size, last_mod_time
190 FROM nodes n
191 WHERE wc_id = ?1
192   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
193   AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
194   AND op_depth = (SELECT MAX(op_depth)
195                   FROM NODES w
196                   WHERE w.wc_id = ?1
197                     AND w.local_relpath = n.local_relpath)
198 ORDER BY local_relpath DESC
199
200 -- STMT_DELETE_NODE_RECURSIVE
201 DELETE FROM NODES
202 WHERE wc_id = ?1
203   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
204
205 -- STMT_DELETE_NODE
206 DELETE
207 FROM NODES
208 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
209
210 -- STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE
211 /* The ACTUAL_NODE applies to BASE, unless there is in at least one op_depth
212    a WORKING node that could have a conflict */
213 DELETE FROM actual_node
214 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
215   AND EXISTS(SELECT 1 FROM NODES b
216              WHERE b.wc_id = ?1
217                AND b.local_relpath = actual_node.local_relpath
218                AND op_depth = 0)
219   AND NOT EXISTS(SELECT 1 FROM NODES w
220                  WHERE w.wc_id = ?1
221                    AND w.local_relpath = actual_node.local_relpath
222                    AND op_depth > 0
223                    AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT))
224
225 -- STMT_DELETE_WORKING_BASE_DELETE
226 DELETE FROM nodes
227 WHERE wc_id = ?1 AND local_relpath = ?2
228   AND presence = MAP_BASE_DELETED
229   AND op_depth > ?3
230   AND op_depth = (SELECT MIN(op_depth) FROM nodes n
231                     WHERE n.wc_id = ?1
232                       AND n.local_relpath = nodes.local_relpath
233                       AND op_depth > ?3)
234
235 -- STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE
236 DELETE FROM nodes
237 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
238   AND presence = MAP_BASE_DELETED
239   AND op_depth > ?3
240   AND op_depth = (SELECT MIN(op_depth) FROM nodes n
241                     WHERE n.wc_id = ?1
242                       AND n.local_relpath = nodes.local_relpath
243                       AND op_depth > ?3)
244
245 -- STMT_DELETE_WORKING_RECURSIVE
246 DELETE FROM nodes
247 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
248   AND op_depth > 0
249
250 -- STMT_DELETE_BASE_RECURSIVE
251 DELETE FROM nodes
252 WHERE wc_id = ?1 AND (local_relpath = ?2 
253                       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
254   AND op_depth = 0
255
256 -- STMT_DELETE_WORKING_OP_DEPTH
257 DELETE FROM nodes
258 WHERE wc_id = ?1
259   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
260   AND op_depth = ?3
261
262 /* Full layer replacement check code for handling moves
263 The op_root must exist (or there is no layer to replace) and an op-root
264    always has presence 'normal' */
265 -- STMT_SELECT_LAYER_FOR_REPLACE
266 SELECT s.local_relpath, s.kind,
267   RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, 'normal'
268 FROM nodes s
269 WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
270 UNION ALL
271 SELECT s.local_relpath, s.kind,
272   RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, d.presence
273 FROM nodes s
274 LEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5
275      AND d.local_relpath = drp
276 WHERE s.wc_id = ?1
277   AND IS_STRICT_DESCENDANT_OF(s.local_relpath, ?2)
278   AND s.op_depth = ?3
279 ORDER BY s.local_relpath
280
281 -- STMT_SELECT_DESCENDANTS_OP_DEPTH_RV
282 SELECT local_relpath, kind
283 FROM nodes
284 WHERE wc_id = ?1
285   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
286   AND op_depth = ?3
287   AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
288 ORDER BY local_relpath DESC
289
290 -- STMT_COPY_NODE_MOVE
291 INSERT OR REPLACE INTO nodes (
292     wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
293     revision, presence, depth, kind, changed_revision, changed_date,
294     changed_author, checksum, properties, translated_size, last_mod_time,
295     symlink_target, moved_here, moved_to )
296 SELECT
297     s.wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
298     s.repos_id,
299     s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision,
300     s.changed_date, s.changed_author, s.checksum, s.properties,
301     CASE WHEN d.checksum=s.checksum THEN d.translated_size END,
302     CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END,
303     s.symlink_target, 1, d.moved_to
304 FROM nodes s
305 LEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5
306 WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
307
308 -- STMT_SELECT_NO_LONGER_MOVED_RV
309 SELECT d.local_relpath, RELPATH_SKIP_JOIN(?2, ?4, d.local_relpath) srp,
310        b.presence, b.op_depth
311 FROM nodes d
312 LEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath
313             AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x
314                               WHERE x.wc_id = ?1
315                                 AND x.local_relpath = b.local_relpath
316                                 AND x.op_depth < ?3)
317 WHERE d.wc_id = ?1
318   AND IS_STRICT_DESCENDANT_OF(d.local_relpath, ?2)
319   AND d.op_depth = ?3
320   AND NOT EXISTS(SELECT * FROM nodes s
321                  WHERE s.wc_id = ?1
322                    AND s.local_relpath = srp
323                    AND s.op_depth = ?5)
324 ORDER BY d.local_relpath DESC
325
326 -- STMT_SELECT_OP_DEPTH_CHILDREN
327 SELECT local_relpath, kind FROM nodes
328 WHERE wc_id = ?1
329   AND parent_relpath = ?2
330   AND op_depth = ?3
331   AND presence != MAP_BASE_DELETED
332   AND file_external is NULL
333 ORDER BY local_relpath
334
335 -- STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS
336 SELECT local_relpath, kind FROM nodes
337 WHERE wc_id = ?1
338   AND parent_relpath = ?2
339   AND op_depth = ?3
340   AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
341 ORDER BY local_relpath
342
343 /* Used by non-recursive revert to detect higher level children, and
344    actual-only rows that would be left orphans, if the revert
345    proceeded. */
346 -- STMT_SELECT_GE_OP_DEPTH_CHILDREN
347 SELECT 1 FROM nodes
348 WHERE wc_id = ?1 AND parent_relpath = ?2
349   AND (op_depth > ?3 OR (op_depth = ?3
350                          AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
351 UNION ALL
352 SELECT 1 FROM ACTUAL_NODE a
353 WHERE wc_id = ?1 AND parent_relpath = ?2
354   AND NOT EXISTS (SELECT 1 FROM nodes n
355                    WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath)
356
357 /* Delete the nodes shadowed by local_relpath. Not valid for the wc-root */
358 -- STMT_DELETE_SHADOWED_RECURSIVE
359 DELETE FROM nodes
360 WHERE wc_id = ?1
361   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
362   AND (op_depth < ?3
363        OR (op_depth = ?3 AND presence = MAP_BASE_DELETED))
364
365 -- STMT_CLEAR_MOVED_TO_FROM_DEST
366 UPDATE NODES SET moved_to = NULL
367 WHERE wc_id = ?1
368   AND moved_to = ?2
369
370 /* Get not-present descendants of a copied node. Not valid for the wc-root */
371 -- STMT_SELECT_NOT_PRESENT_DESCENDANTS
372 SELECT local_relpath FROM nodes
373 WHERE wc_id = ?1 AND op_depth = ?3
374   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
375   AND presence = MAP_NOT_PRESENT
376
377 -- STMT_COMMIT_DESCENDANTS_TO_BASE
378 UPDATE NODES SET op_depth = 0,
379                  repos_id = ?4,
380                  repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
381                  revision = ?6,
382                  dav_cache = NULL,
383                  moved_here = NULL,
384                  moved_to = NULL,
385                  presence = CASE presence
386                               WHEN MAP_NORMAL THEN MAP_NORMAL
387                               WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
388                               ELSE MAP_NOT_PRESENT
389                             END
390 WHERE wc_id = ?1
391   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
392   AND op_depth = ?3
393
394 -- STMT_SELECT_NODE_CHILDREN
395 /* Return all paths that are children of the directory (?1, ?2) in any
396    op-depth, including children of any underlying, replaced directories. */
397 SELECT DISTINCT local_relpath FROM nodes
398 WHERE wc_id = ?1 AND parent_relpath = ?2
399 ORDER BY local_relpath
400
401 -- STMT_SELECT_WORKING_CHILDREN
402 /* Return all paths that are children of the working version of the
403    directory (?1, ?2).  A given path is not included just because it is a
404    child of an underlying (replaced) directory, it has to be in the
405    working version of the directory. */
406 SELECT DISTINCT local_relpath FROM nodes
407 WHERE wc_id = ?1 AND parent_relpath = ?2
408   AND (op_depth > (SELECT MAX(op_depth) FROM nodes
409                    WHERE wc_id = ?1 AND local_relpath = ?2)
410        OR
411        (op_depth = (SELECT MAX(op_depth) FROM nodes
412                     WHERE wc_id = ?1 AND local_relpath = ?2)
413         AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
414 ORDER BY local_relpath
415
416 -- STMT_SELECT_BASE_NOT_PRESENT_CHILDREN
417 SELECT local_relpath FROM nodes
418 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
419   AND presence = MAP_NOT_PRESENT
420 ORDER BY local_relpath
421
422 -- STMT_SELECT_NODE_PROPS
423 SELECT properties, presence FROM nodes
424 WHERE wc_id = ?1 AND local_relpath = ?2
425 ORDER BY op_depth DESC
426
427 -- STMT_SELECT_ACTUAL_PROPS
428 SELECT properties FROM actual_node
429 WHERE wc_id = ?1 AND local_relpath = ?2
430
431 -- STMT_UPDATE_ACTUAL_PROPS
432 UPDATE actual_node SET properties = ?3
433 WHERE wc_id = ?1 AND local_relpath = ?2
434
435 -- STMT_INSERT_ACTUAL_PROPS
436 INSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties)
437 VALUES (?1, ?2, ?3, ?4)
438
439 -- STMT_INSERT_LOCK
440 INSERT OR REPLACE INTO lock
441 (repos_id, repos_relpath, lock_token, lock_owner, lock_comment,
442  lock_date)
443 VALUES (?1, ?2, ?3, ?4, ?5, ?6)
444
445 /* Not valid for the working copy root */
446 -- STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE
447 SELECT nodes.repos_id, nodes.repos_path, lock_token
448 FROM nodes
449 LEFT JOIN lock ON nodes.repos_id = lock.repos_id
450   AND nodes.repos_path = lock.repos_relpath
451 WHERE wc_id = ?1 AND op_depth = 0
452   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
453
454 -- STMT_INSERT_WCROOT
455 INSERT INTO wcroot (local_abspath)
456 VALUES (?1)
457
458 -- STMT_UPDATE_BASE_NODE_DAV_CACHE
459 UPDATE nodes SET dav_cache = ?3
460 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
461
462 -- STMT_SELECT_BASE_DAV_CACHE
463 SELECT dav_cache FROM nodes
464 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
465
466 -- STMT_SELECT_DELETION_INFO
467 SELECT b.presence, w.presence, w.op_depth, w.moved_to
468 FROM nodes w
469 LEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0
470 WHERE w.wc_id = ?1 AND w.local_relpath = ?2
471   AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d
472                     WHERE d.wc_id = ?1 AND d.local_relpath = ?2
473                       AND d.op_depth > 0)
474 LIMIT 1
475
476 -- STMT_SELECT_MOVED_TO_NODE
477 SELECT op_depth, moved_to
478 FROM nodes
479 WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL
480 ORDER BY op_depth DESC
481
482 -- STMT_SELECT_OP_DEPTH_MOVED_TO
483 SELECT op_depth, moved_to
484 FROM nodes
485 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
486   AND EXISTS(SELECT * from nodes
487              WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
488              AND presence IN (MAP_NORMAL, MAP_INCOMPLETE))
489 ORDER BY op_depth ASC
490 LIMIT 1
491
492 -- STMT_SELECT_MOVED_TO
493 SELECT moved_to
494 FROM nodes
495 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
496
497 -- STMT_SELECT_MOVED_BACK
498 SELECT u.local_relpath,
499        u.presence, u.repos_id, u.repos_path, u.revision,
500        l.presence, l.repos_id, l.repos_path, l.revision,
501        u.moved_here, u.moved_to
502 FROM nodes u
503 LEFT OUTER JOIN nodes l ON l.wc_id = ?1
504                        AND l.local_relpath = u.local_relpath
505                        AND l.op_depth = ?3
506 WHERE u.wc_id = ?1
507   AND u.local_relpath = ?2
508   AND u.op_depth = ?4
509 UNION ALL
510 SELECT u.local_relpath,
511        u.presence, u.repos_id, u.repos_path, u.revision,
512        l.presence, l.repos_id, l.repos_path, l.revision,
513        u.moved_here, NULL
514 FROM nodes u
515 LEFT OUTER JOIN nodes l ON l.wc_id=?1
516                        AND l.local_relpath=u.local_relpath
517                        AND l.op_depth=?3
518 WHERE u.wc_id = ?1
519   AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
520   AND u.op_depth = ?4
521
522 -- STMT_DELETE_LOCK
523 DELETE FROM lock
524 WHERE repos_id = ?1 AND repos_relpath = ?2
525
526 -- STMT_DELETE_LOCK_RECURSIVELY
527 DELETE FROM lock
528 WHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2))
529
530 -- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE
531 UPDATE nodes SET dav_cache = NULL
532 WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0
533   AND (local_relpath = ?2
534        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
535
536 -- STMT_RECURSIVE_UPDATE_NODE_REPO
537 UPDATE nodes SET repos_id = ?4, dav_cache = NULL
538 /* ### The Sqlite optimizer needs help here ###
539  * WHERE wc_id = ?1
540  *   AND repos_id = ?3
541  *   AND (local_relpath = ?2
542  *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/
543 WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3)
544    OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
545        AND repos_id = ?3)
546
547
548 -- STMT_UPDATE_LOCK_REPOS_ID
549 UPDATE lock SET repos_id = ?2
550 WHERE repos_id = ?1
551
552 -- STMT_UPDATE_NODE_FILEINFO
553 UPDATE nodes SET translated_size = ?3, last_mod_time = ?4
554 WHERE wc_id = ?1 AND local_relpath = ?2
555   AND op_depth = (SELECT MAX(op_depth) FROM nodes
556                   WHERE wc_id = ?1 AND local_relpath = ?2)
557
558 -- STMT_INSERT_ACTUAL_CONFLICT
559 INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
560 VALUES (?1, ?2, ?3, ?4)
561
562 -- STMT_UPDATE_ACTUAL_CONFLICT
563 UPDATE actual_node SET conflict_data = ?3
564 WHERE wc_id = ?1 AND local_relpath = ?2
565
566 -- STMT_UPDATE_ACTUAL_CHANGELISTS
567 UPDATE actual_node SET changelist = ?3
568 WHERE wc_id = ?1
569   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
570   AND local_relpath = (SELECT local_relpath FROM targets_list AS t
571                        WHERE wc_id = ?1
572                          AND t.local_relpath = actual_node.local_relpath
573                          AND kind = MAP_FILE)
574
575 -- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST
576 UPDATE actual_node SET changelist = NULL
577  WHERE wc_id = ?1 AND local_relpath = ?2
578
579 -- STMT_MARK_SKIPPED_CHANGELIST_DIRS
580 /* 7 corresponds to svn_wc_notify_skip */
581 INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist)
582 SELECT wc_id, local_relpath, 7, ?3
583 FROM targets_list
584 WHERE wc_id = ?1
585   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
586   AND kind = MAP_DIR
587
588 -- STMT_RESET_ACTUAL_WITH_CHANGELIST
589 REPLACE INTO actual_node (
590   wc_id, local_relpath, parent_relpath, changelist)
591 VALUES (?1, ?2, ?3, ?4)
592
593 -- STMT_CREATE_CHANGELIST_LIST
594 DROP TABLE IF EXISTS changelist_list;
595 CREATE TEMPORARY TABLE changelist_list (
596   wc_id  INTEGER NOT NULL,
597   local_relpath TEXT NOT NULL,
598   notify INTEGER NOT NULL,
599   changelist TEXT NOT NULL,
600   /* Order NOTIFY descending to make us show clears (27) before adds (26) */
601   PRIMARY KEY (wc_id, local_relpath, notify DESC)
602 )
603
604 /* Create notify items for when a node is removed from a changelist and
605    when a node is added to a changelist. Make sure nothing is notified
606    if there were no changes.
607 */
608 -- STMT_CREATE_CHANGELIST_TRIGGER
609 DROP TRIGGER IF EXISTS   trigger_changelist_list_change;
610 CREATE TEMPORARY TRIGGER trigger_changelist_list_change
611 BEFORE UPDATE ON actual_node
612 WHEN old.changelist IS NOT new.changelist
613 BEGIN
614   /* 27 corresponds to svn_wc_notify_changelist_clear */
615   INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
616   SELECT old.wc_id, old.local_relpath, 27, old.changelist
617    WHERE old.changelist is NOT NULL;
618
619   /* 26 corresponds to svn_wc_notify_changelist_set */
620   INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
621   SELECT new.wc_id, new.local_relpath, 26, new.changelist
622    WHERE new.changelist IS NOT NULL;
623 END
624
625 -- STMT_FINALIZE_CHANGELIST
626 DROP TRIGGER trigger_changelist_list_change;
627 DROP TABLE changelist_list;
628 DROP TABLE targets_list
629
630 -- STMT_SELECT_CHANGELIST_LIST
631 SELECT wc_id, local_relpath, notify, changelist
632 FROM changelist_list
633 ORDER BY wc_id, local_relpath ASC, notify DESC
634
635 -- STMT_CREATE_TARGETS_LIST
636 DROP TABLE IF EXISTS targets_list;
637 CREATE TEMPORARY TABLE targets_list (
638   wc_id  INTEGER NOT NULL,
639   local_relpath TEXT NOT NULL,
640   parent_relpath TEXT,
641   kind TEXT NOT NULL,
642   PRIMARY KEY (wc_id, local_relpath)
643   );
644 /* need more indicies? */
645
646 -- STMT_DROP_TARGETS_LIST
647 DROP TABLE targets_list
648
649 -- STMT_INSERT_TARGET
650 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
651 SELECT wc_id, local_relpath, parent_relpath, kind
652 FROM nodes_current
653 WHERE wc_id = ?1
654   AND local_relpath = ?2
655
656 -- STMT_INSERT_TARGET_DEPTH_FILES
657 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
658 SELECT wc_id, local_relpath, parent_relpath, kind
659 FROM nodes_current
660 WHERE wc_id = ?1
661   AND parent_relpath = ?2
662   AND kind = MAP_FILE
663
664 -- STMT_INSERT_TARGET_DEPTH_IMMEDIATES
665 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
666 SELECT wc_id, local_relpath, parent_relpath, kind
667 FROM nodes_current
668 WHERE wc_id = ?1
669   AND parent_relpath = ?2
670
671 -- STMT_INSERT_TARGET_DEPTH_INFINITY
672 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
673 SELECT wc_id, local_relpath, parent_relpath, kind
674 FROM nodes_current
675 WHERE wc_id = ?1
676   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
677
678 -- STMT_INSERT_TARGET_WITH_CHANGELIST
679 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
680 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
681   FROM actual_node AS A JOIN nodes_current AS N
682     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
683  WHERE N.wc_id = ?1
684    AND N.local_relpath = ?2
685    AND A.changelist = ?3
686
687 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES
688 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
689 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
690   FROM actual_node AS A JOIN nodes_current AS N
691     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
692  WHERE N.wc_id = ?1
693    AND N.parent_relpath = ?2
694    AND kind = MAP_FILE
695    AND A.changelist = ?3
696
697 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES
698 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
699 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
700   FROM actual_node AS A JOIN nodes_current AS N
701     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
702  WHERE N.wc_id = ?1
703    AND N.parent_relpath = ?2
704   AND A.changelist = ?3
705
706 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY
707 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
708 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
709   FROM actual_node AS A JOIN nodes_current AS N
710     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
711  WHERE N.wc_id = ?1
712    AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
713    AND A.changelist = ?3
714
715 /* Only used by commented dump_targets() in wc_db.c */
716 /*-- STMT_SELECT_TARGETS
717 SELECT local_relpath, parent_relpath from targets_list*/
718
719 -- STMT_INSERT_ACTUAL_EMPTIES
720 INSERT OR IGNORE INTO actual_node (
721      wc_id, local_relpath, parent_relpath)
722 SELECT wc_id, local_relpath, parent_relpath
723 FROM targets_list
724
725 -- STMT_INSERT_ACTUAL_EMPTIES_FILES
726 INSERT OR IGNORE INTO actual_node (
727      wc_id, local_relpath, parent_relpath)
728 SELECT wc_id, local_relpath, parent_relpath
729 FROM targets_list
730 WHERE kind=MAP_FILE
731
732 -- STMT_DELETE_ACTUAL_EMPTY
733 DELETE FROM actual_node
734 WHERE wc_id = ?1 AND local_relpath = ?2
735   AND properties IS NULL
736   AND conflict_data IS NULL
737   AND changelist IS NULL
738   AND text_mod IS NULL
739   AND older_checksum IS NULL
740   AND right_checksum IS NULL
741   AND left_checksum IS NULL
742
743 -- STMT_DELETE_ACTUAL_EMPTIES
744 DELETE FROM actual_node
745 WHERE wc_id = ?1
746   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
747   AND properties IS NULL
748   AND conflict_data IS NULL
749   AND changelist IS NULL
750   AND text_mod IS NULL
751   AND older_checksum IS NULL
752   AND right_checksum IS NULL
753   AND left_checksum IS NULL
754
755 -- STMT_DELETE_BASE_NODE
756 DELETE FROM nodes
757 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
758
759 -- STMT_DELETE_WORKING_NODE
760 DELETE FROM nodes
761 WHERE wc_id = ?1 AND local_relpath = ?2
762   AND op_depth = (SELECT MAX(op_depth) FROM nodes
763                   WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0)
764
765 -- STMT_DELETE_LOWEST_WORKING_NODE
766 DELETE FROM nodes
767 WHERE wc_id = ?1 AND local_relpath = ?2
768   AND op_depth = (SELECT MIN(op_depth) FROM nodes
769                   WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
770   AND presence = MAP_BASE_DELETED
771
772 -- STMT_DELETE_NODE_ALL_LAYERS
773 DELETE FROM nodes
774 WHERE wc_id = ?1 AND local_relpath = ?2
775
776 -- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE
777 DELETE FROM nodes
778 WHERE wc_id = ?1
779   AND (local_relpath = ?2
780        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
781   AND op_depth >= ?3
782
783 -- STMT_DELETE_ACTUAL_NODE
784 DELETE FROM actual_node
785 WHERE wc_id = ?1 AND local_relpath = ?2
786
787 /* Will not delete recursive when run on the wcroot */
788 -- STMT_DELETE_ACTUAL_NODE_RECURSIVE
789 DELETE FROM actual_node
790 WHERE wc_id = ?1
791   AND (local_relpath = ?2
792        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
793
794 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST
795 DELETE FROM actual_node
796 WHERE wc_id = ?1
797   AND local_relpath = ?2
798   AND (changelist IS NULL
799        OR NOT EXISTS (SELECT 1 FROM nodes_current c
800                       WHERE c.wc_id = ?1 AND c.local_relpath = ?2
801                         AND c.kind = MAP_FILE))
802
803 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
804 DELETE FROM actual_node
805 WHERE wc_id = ?1
806   AND (local_relpath = ?2
807        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
808   AND (changelist IS NULL
809        OR NOT EXISTS (SELECT 1 FROM nodes_current c
810                       WHERE c.wc_id = ?1
811                         AND c.local_relpath = actual_node.local_relpath
812                         AND c.kind = MAP_FILE))
813
814 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST
815 UPDATE actual_node
816 SET properties = NULL,
817     text_mod = NULL,
818     conflict_data = NULL,
819     tree_conflict_data = NULL,
820     older_checksum = NULL,
821     left_checksum = NULL,
822     right_checksum = NULL
823 WHERE wc_id = ?1 AND local_relpath = ?2
824
825 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT
826 UPDATE actual_node
827 SET properties = NULL,
828     text_mod = NULL,
829     tree_conflict_data = NULL,
830     older_checksum = NULL,
831     left_checksum = NULL,
832     right_checksum = NULL,
833     changelist = NULL
834 WHERE wc_id = ?1 AND local_relpath = ?2
835
836 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
837 UPDATE actual_node
838 SET properties = NULL,
839     text_mod = NULL,
840     conflict_data = NULL,
841     tree_conflict_data = NULL,
842     older_checksum = NULL,
843     left_checksum = NULL,
844     right_checksum = NULL
845 WHERE wc_id = ?1
846   AND (local_relpath = ?2
847        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
848
849 -- STMT_UPDATE_NODE_BASE_DEPTH
850 UPDATE nodes SET depth = ?3
851 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
852   AND kind=MAP_DIR
853   AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
854
855 -- STMT_UPDATE_NODE_BASE_PRESENCE
856 UPDATE nodes SET presence = ?3
857 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
858
859 -- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH
860 UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5
861 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
862
863 -- STMT_LOOK_FOR_WORK
864 SELECT id FROM work_queue LIMIT 1
865
866 -- STMT_INSERT_WORK_ITEM
867 INSERT INTO work_queue (work) VALUES (?1)
868
869 -- STMT_SELECT_WORK_ITEM
870 SELECT id, work FROM work_queue ORDER BY id LIMIT 1
871
872 -- STMT_DELETE_WORK_ITEM
873 DELETE FROM work_queue WHERE id = ?1
874
875 -- STMT_INSERT_OR_IGNORE_PRISTINE
876 INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
877 VALUES (?1, ?2, ?3, 0)
878
879 -- STMT_INSERT_PRISTINE
880 INSERT INTO pristine (checksum, md5_checksum, size, refcount)
881 VALUES (?1, ?2, ?3, 0)
882
883 -- STMT_SELECT_PRISTINE
884 SELECT md5_checksum
885 FROM pristine
886 WHERE checksum = ?1
887
888 -- STMT_SELECT_PRISTINE_SIZE
889 SELECT size
890 FROM pristine
891 WHERE checksum = ?1 LIMIT 1
892
893 -- STMT_SELECT_PRISTINE_BY_MD5
894 SELECT checksum
895 FROM pristine
896 WHERE md5_checksum = ?1
897
898 -- STMT_SELECT_UNREFERENCED_PRISTINES
899 SELECT checksum
900 FROM pristine
901 WHERE refcount = 0
902
903 -- STMT_DELETE_PRISTINE_IF_UNREFERENCED
904 DELETE FROM pristine
905 WHERE checksum = ?1 AND refcount = 0
906
907 -- STMT_SELECT_COPY_PRISTINES
908 /* For the root itself */
909 SELECT n.checksum, md5_checksum, size
910 FROM nodes_current n
911 LEFT JOIN pristine p ON n.checksum = p.checksum
912 WHERE wc_id = ?1
913   AND n.local_relpath = ?2
914   AND n.checksum IS NOT NULL
915 UNION ALL
916 /* And all descendants */
917 SELECT n.checksum, md5_checksum, size
918 FROM nodes n
919 LEFT JOIN pristine p ON n.checksum = p.checksum
920 WHERE wc_id = ?1
921   AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
922   AND op_depth >=
923       (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
924   AND n.checksum IS NOT NULL
925
926 -- STMT_VACUUM
927 VACUUM
928
929 -- STMT_SELECT_CONFLICT_VICTIMS
930 SELECT local_relpath, conflict_data
931 FROM actual_node
932 WHERE wc_id = ?1 AND parent_relpath = ?2 AND
933   NOT (conflict_data IS NULL)
934
935 -- STMT_INSERT_WC_LOCK
936 INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels)
937 VALUES (?1, ?2, ?3)
938
939 -- STMT_SELECT_WC_LOCK
940 SELECT locked_levels FROM wc_lock
941 WHERE wc_id = ?1 AND local_dir_relpath = ?2
942
943 -- STMT_SELECT_ANCESTOR_WCLOCKS
944 SELECT local_dir_relpath, locked_levels FROM wc_lock
945 WHERE wc_id = ?1
946   AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2)
947        OR local_dir_relpath = '')
948
949 -- STMT_DELETE_WC_LOCK
950 DELETE FROM wc_lock
951 WHERE wc_id = ?1 AND local_dir_relpath = ?2
952
953 -- STMT_FIND_WC_LOCK
954 SELECT local_dir_relpath FROM wc_lock
955 WHERE wc_id = ?1
956   AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
957
958 -- STMT_FIND_CONFLICT_DESCENDANT
959 SELECT 1 FROM actual_node
960 WHERE wc_id = ?1
961   AND local_relpath > (?2 || '/')
962   AND local_relpath < (?2 || '0') /* '0' = ascii('/') +1 */
963   AND conflict_data IS NOT NULL
964 LIMIT 1
965
966 -- STMT_DELETE_WC_LOCK_ORPHAN
967 DELETE FROM wc_lock
968 WHERE wc_id = ?1 AND local_dir_relpath = ?2
969 AND NOT EXISTS (SELECT 1 FROM nodes
970                  WHERE nodes.wc_id = ?1
971                    AND nodes.local_relpath = wc_lock.local_dir_relpath)
972
973 -- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE
974 DELETE FROM wc_lock
975 WHERE wc_id = ?1
976   AND (local_dir_relpath = ?2
977        OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2))
978   AND NOT EXISTS (SELECT 1 FROM nodes
979                    WHERE nodes.wc_id = ?1
980                      AND nodes.local_relpath = wc_lock.local_dir_relpath)
981
982 -- STMT_APPLY_CHANGES_TO_BASE_NODE
983 /* translated_size and last_mod_time are not mentioned here because they will
984    be tweaked after the working-file is installed. When we replace an existing
985    BASE node (read: bump), preserve its file_external status. */
986 INSERT OR REPLACE INTO nodes (
987   wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
988   revision, presence, depth, kind, changed_revision, changed_date,
989   changed_author, checksum, properties, dav_cache, symlink_target,
990   inherited_props, file_external )
991 VALUES (?1, ?2, 0,
992         ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17,
993         (SELECT file_external FROM nodes
994           WHERE wc_id = ?1
995             AND local_relpath = ?2
996             AND op_depth = 0))
997
998 -- STMT_INSTALL_WORKING_NODE_FOR_DELETE
999 INSERT INTO nodes (
1000     wc_id, local_relpath, op_depth,
1001     parent_relpath, presence, kind)
1002 VALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5)
1003
1004 -- STMT_REPLACE_WITH_BASE_DELETED
1005 INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath,
1006                               kind, moved_to, presence)
1007 SELECT wc_id, local_relpath, op_depth, parent_relpath,
1008        kind, moved_to, MAP_BASE_DELETED
1009   FROM nodes
1010  WHERE wc_id = ?1
1011    AND local_relpath = ?2
1012    AND op_depth = ?3
1013
1014 /* If this query is updated, STMT_INSERT_DELETE_LIST should too.
1015    Use UNION ALL instead of a simple 'OR' to avoid creating a temp table */
1016 -- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
1017 INSERT INTO nodes (
1018     wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
1019 SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
1020        kind
1021 FROM nodes
1022 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1023 UNION ALL
1024 SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
1025        kind
1026 FROM nodes
1027 WHERE wc_id = ?1
1028   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1029   AND op_depth = ?3
1030   AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1031   AND file_external IS NULL
1032 ORDER BY local_relpath
1033
1034 -- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
1035 INSERT OR REPLACE INTO nodes (
1036     wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
1037     revision, presence, depth, kind, changed_revision, changed_date,
1038     changed_author, checksum, properties, translated_size, last_mod_time,
1039     symlink_target, moved_to )
1040 SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id,
1041     repos_path, revision, presence, depth, kind, changed_revision,
1042     changed_date, changed_author, checksum, properties, translated_size,
1043     last_mod_time, symlink_target,
1044     (SELECT moved_to FROM nodes
1045      WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to
1046 FROM nodes
1047 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1048
1049 -- STMT_INSERT_DELETE_FROM_BASE
1050 INSERT INTO nodes (
1051     wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
1052 SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath,
1053     MAP_BASE_DELETED, kind
1054 FROM nodes
1055 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1056
1057 /* Not valid on the wc-root */
1058 -- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE
1059 UPDATE nodes SET op_depth = ?3 + 1
1060 WHERE wc_id = ?1
1061  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1062  AND op_depth = ?3
1063
1064 /* Duplicated SELECT body to avoid creating temporary table */
1065 -- STMT_COPY_OP_DEPTH_RECURSIVE
1066 INSERT INTO nodes (
1067     wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
1068     revision, presence, depth, kind, changed_revision, changed_date,
1069     changed_author, checksum, properties, translated_size, last_mod_time,
1070     symlink_target, moved_here, moved_to )
1071 SELECT
1072     wc_id, local_relpath, ?4, parent_relpath, repos_id,
1073     repos_path, revision, presence, depth, kind, changed_revision,
1074     changed_date, changed_author, checksum, properties, translated_size,
1075     last_mod_time, symlink_target, NULL, NULL
1076 FROM nodes
1077 WHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2
1078 UNION ALL
1079 SELECT
1080     wc_id, local_relpath, ?4, parent_relpath, repos_id,
1081     repos_path, revision, presence, depth, kind, changed_revision,
1082     changed_date, changed_author, checksum, properties, translated_size,
1083     last_mod_time, symlink_target, NULL, NULL
1084 FROM nodes
1085 WHERE wc_id = ?1 AND op_depth = ?3
1086   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1087 ORDER BY local_relpath
1088
1089 -- STMT_DOES_NODE_EXIST
1090 SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
1091 LIMIT 1
1092
1093 -- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS
1094 SELECT local_relpath FROM nodes
1095 WHERE wc_id = ?1
1096   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1097   AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED
1098 LIMIT 1
1099
1100 /* Select all excluded nodes. Not valid on the WC-root */
1101 -- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS
1102 SELECT local_relpath FROM nodes
1103 WHERE wc_id = ?1
1104   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1105   AND op_depth = 0
1106   AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED)
1107
1108 /* Creates a copy from one top level NODE to a different location */
1109 -- STMT_INSERT_WORKING_NODE_COPY_FROM
1110 INSERT OR REPLACE INTO nodes (
1111     wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1112     repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1113     changed_date, changed_author, checksum, properties, translated_size,
1114     last_mod_time, symlink_target, moved_to )
1115 SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1116     repos_id, repos_path, revision, ?6 /*presence*/, depth,
1117     ?7/*moved_here*/, kind, changed_revision, changed_date,
1118     changed_author, checksum, properties, translated_size,
1119     last_mod_time, symlink_target,
1120     (SELECT dst.moved_to FROM nodes AS dst
1121                          WHERE dst.wc_id = ?1
1122                          AND dst.local_relpath = ?3
1123                          AND dst.op_depth = ?4)
1124 FROM nodes_current
1125 WHERE wc_id = ?1 AND local_relpath = ?2
1126
1127 -- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH
1128 INSERT OR REPLACE INTO nodes (
1129     wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1130     repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1131     changed_date, changed_author, checksum, properties, translated_size,
1132     last_mod_time, symlink_target, moved_to )
1133 SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1134     repos_id, repos_path, revision, ?6 /*presence*/, depth,
1135     ?8 /*moved_here*/, kind, changed_revision, changed_date,
1136     changed_author, checksum, properties, translated_size,
1137     last_mod_time, symlink_target,
1138     (SELECT dst.moved_to FROM nodes AS dst
1139                          WHERE dst.wc_id = ?1
1140                          AND dst.local_relpath = ?3
1141                          AND dst.op_depth = ?4)
1142 FROM nodes
1143 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7
1144
1145 -- STMT_UPDATE_BASE_REVISION
1146 UPDATE nodes SET revision = ?3
1147 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1148
1149 -- STMT_UPDATE_BASE_REPOS
1150 UPDATE nodes SET repos_id = ?3, repos_path = ?4
1151 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1152
1153 -- STMT_ACTUAL_HAS_CHILDREN
1154 SELECT 1 FROM actual_node
1155 WHERE wc_id = ?1 AND parent_relpath = ?2
1156 LIMIT 1
1157
1158 -- STMT_INSERT_EXTERNAL
1159 INSERT OR REPLACE INTO externals (
1160     wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath,
1161     repos_id, def_repos_relpath, def_operational_revision, def_revision)
1162 VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
1163
1164 -- STMT_SELECT_EXTERNAL_INFO
1165 SELECT presence, kind, def_local_relpath, repos_id,
1166     def_repos_relpath, def_operational_revision, def_revision
1167 FROM externals WHERE wc_id = ?1 AND local_relpath = ?2
1168 LIMIT 1
1169
1170 -- STMT_DELETE_FILE_EXTERNALS
1171 DELETE FROM nodes
1172 WHERE wc_id = ?1
1173   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1174   AND op_depth = 0
1175   AND file_external IS NOT NULL
1176
1177 -- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS
1178 DELETE FROM externals
1179 WHERE wc_id = ?1
1180   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1181   AND kind != MAP_DIR
1182
1183 -- STMT_DELETE_EXTERNAL_REGISTATIONS
1184 DELETE FROM externals
1185 WHERE wc_id = ?1
1186   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1187
1188 /* Select all committable externals, i.e. only unpegged ones on the same
1189  * repository as the target path ?2, that are defined by WC ?1 to
1190  * live below the target path. It does not matter which ancestor has the
1191  * svn:externals definition, only the local path at which the external is
1192  * supposed to be checked out is queried.
1193  * Arguments:
1194  *  ?1: wc_id.
1195  *  ?2: the target path, local relpath inside ?1.
1196  *
1197  * ### NOTE: This statement deliberately removes file externals that live
1198  * inside an unversioned dir, because commit still breaks on those.
1199  * Once that's been fixed, the conditions below "--->8---" become obsolete. */
1200 -- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW
1201 SELECT local_relpath, kind, def_repos_relpath,
1202   (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1203 FROM externals e
1204 WHERE wc_id = ?1
1205   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1206   AND def_revision IS NULL
1207   AND repos_id = (SELECT repos_id
1208                   FROM nodes AS n
1209                   WHERE n.wc_id = ?1
1210                     AND n.local_relpath = ''
1211                     AND n.op_depth = 0)
1212   AND ((kind='dir')
1213        OR EXISTS (SELECT 1 FROM nodes
1214                   WHERE nodes.wc_id = e.wc_id
1215                   AND nodes.local_relpath = e.parent_relpath))
1216
1217 -- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW
1218 SELECT local_relpath, kind, def_repos_relpath,
1219   (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1220 FROM externals e
1221 WHERE wc_id = ?1
1222   AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2)
1223   AND parent_relpath = ?2
1224   AND def_revision IS NULL
1225   AND repos_id = (SELECT repos_id
1226                     FROM nodes AS n
1227                     WHERE n.wc_id = ?1
1228                       AND n.local_relpath = ''
1229                       AND n.op_depth = 0)
1230   AND ((kind='dir')
1231        OR EXISTS (SELECT 1 FROM nodes
1232                   WHERE nodes.wc_id = e.wc_id
1233                   AND nodes.local_relpath = e.parent_relpath))
1234
1235 -- STMT_SELECT_EXTERNALS_DEFINED
1236 SELECT local_relpath, def_local_relpath
1237 FROM externals
1238 /* ### The Sqlite optimizer needs help here ###
1239  * WHERE wc_id = ?1
1240  *   AND (def_local_relpath = ?2
1241  *        OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */
1242 WHERE (wc_id = ?1 AND def_local_relpath = ?2)
1243    OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2))
1244
1245 -- STMT_DELETE_EXTERNAL
1246 DELETE FROM externals
1247 WHERE wc_id = ?1 AND local_relpath = ?2
1248
1249 -- STMT_SELECT_EXTERNAL_PROPERTIES
1250 /* ### It would be nice if Sqlite would handle
1251  * SELECT IFNULL((SELECT properties FROM actual_node a
1252  *                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1253  *               properties),
1254  *        local_relpath, depth
1255  * FROM nodes_current n
1256  * WHERE wc_id = ?1
1257  *   AND (local_relpath = ?2
1258  *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1259  *   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1260  * ### But it would take a double table scan execution plan for it.
1261  * ### Maybe there is something else going on? */
1262 SELECT IFNULL((SELECT properties FROM actual_node a
1263                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1264               properties),
1265        local_relpath, depth
1266 FROM nodes_current n
1267 WHERE wc_id = ?1 AND local_relpath = ?2
1268   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1269 UNION ALL
1270 SELECT IFNULL((SELECT properties FROM actual_node a
1271                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1272               properties),
1273        local_relpath, depth
1274 FROM nodes_current n
1275 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1276   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1277
1278 -- STMT_SELECT_CURRENT_PROPS_RECURSIVE
1279 /* ### Ugly OR to make sqlite use the proper optimizations */
1280 SELECT IFNULL((SELECT properties FROM actual_node a
1281                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1282               properties),
1283        local_relpath
1284 FROM nodes_current n
1285 WHERE (wc_id = ?1 AND local_relpath = ?2)
1286    OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1287
1288 -- STMT_PRAGMA_LOCKING_MODE
1289 PRAGMA locking_mode = exclusive
1290
1291 /* ------------------------------------------------------------------------- */
1292
1293 /* these are used in entries.c  */
1294
1295 -- STMT_INSERT_ACTUAL_NODE
1296 INSERT OR REPLACE INTO actual_node (
1297   wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data)
1298 VALUES (?1, ?2, ?3, ?4, ?5, ?6)
1299
1300 /* ------------------------------------------------------------------------- */
1301
1302 /* these are used in upgrade.c  */
1303
1304 -- STMT_SELECT_ALL_FILES
1305 SELECT local_relpath FROM nodes_current
1306 WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
1307
1308 -- STMT_UPDATE_NODE_PROPS
1309 UPDATE nodes SET properties = ?4
1310 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1311
1312 -- STMT_PRAGMA_TABLE_INFO_NODES
1313 PRAGMA table_info("NODES")
1314
1315 /* --------------------------------------------------------------------------
1316  * Complex queries for callback walks, caching results in a temporary table.
1317  *
1318  * These target table are then used for joins against NODES, or for reporting
1319  */
1320
1321 -- STMT_CREATE_TARGET_PROP_CACHE
1322 DROP TABLE IF EXISTS target_prop_cache;
1323 CREATE TEMPORARY TABLE target_prop_cache (
1324   local_relpath TEXT NOT NULL PRIMARY KEY,
1325   kind TEXT NOT NULL,
1326   properties BLOB
1327 );
1328 /* ###  Need index?
1329 CREATE UNIQUE INDEX temp__node_props_cache_unique
1330   ON temp__node_props_cache (local_relpath) */
1331
1332 -- STMT_CACHE_TARGET_PROPS
1333 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1334  SELECT n.local_relpath, n.kind,
1335         IFNULL((SELECT properties FROM actual_node AS a
1336                  WHERE a.wc_id = n.wc_id
1337                    AND a.local_relpath = n.local_relpath),
1338                n.properties)
1339    FROM targets_list AS t
1340    JOIN nodes AS n
1341      ON n.wc_id = ?1
1342     AND n.local_relpath = t.local_relpath
1343     AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1344                       WHERE n3.wc_id = ?1
1345                         AND n3.local_relpath = t.local_relpath)
1346   WHERE t.wc_id = ?1
1347     AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1348   ORDER BY t.local_relpath
1349
1350 -- STMT_CACHE_TARGET_PRISTINE_PROPS
1351 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1352  SELECT n.local_relpath, n.kind,
1353         CASE n.presence
1354           WHEN MAP_BASE_DELETED
1355           THEN (SELECT properties FROM nodes AS p
1356                  WHERE p.wc_id = n.wc_id
1357                    AND p.local_relpath = n.local_relpath
1358                    AND p.op_depth < n.op_depth
1359                  ORDER BY p.op_depth DESC /* LIMIT 1 */)
1360           ELSE properties END
1361   FROM targets_list AS t
1362   JOIN nodes AS n
1363     ON n.wc_id = ?1
1364    AND n.local_relpath = t.local_relpath
1365    AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1366                      WHERE n3.wc_id = ?1
1367                        AND n3.local_relpath = t.local_relpath)
1368   WHERE t.wc_id = ?1
1369     AND (presence = MAP_NORMAL
1370          OR presence = MAP_INCOMPLETE
1371          OR presence = MAP_BASE_DELETED)
1372   ORDER BY t.local_relpath
1373
1374 -- STMT_SELECT_ALL_TARGET_PROP_CACHE
1375 SELECT local_relpath, properties FROM target_prop_cache
1376 ORDER BY local_relpath
1377
1378 -- STMT_DROP_TARGET_PROP_CACHE
1379 DROP TABLE target_prop_cache;
1380
1381 -- STMT_CREATE_REVERT_LIST
1382 DROP TABLE IF EXISTS revert_list;
1383 CREATE TEMPORARY TABLE revert_list (
1384    /* need wc_id if/when revert spans multiple working copies */
1385    local_relpath TEXT NOT NULL,
1386    actual INTEGER NOT NULL,         /* 1 if an actual row, 0 if a nodes row */
1387    conflict_data BLOB,
1388    notify INTEGER,         /* 1 if an actual row had props or tree conflict */
1389    op_depth INTEGER,
1390    repos_id INTEGER,
1391    kind TEXT,
1392    PRIMARY KEY (local_relpath, actual)
1393    );
1394 DROP TRIGGER IF EXISTS   trigger_revert_list_nodes;
1395 CREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1396 BEFORE DELETE ON nodes
1397 BEGIN
1398    INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1399                                       repos_id, kind)
1400    SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
1401 END;
1402 DROP TRIGGER IF EXISTS   trigger_revert_list_actual_delete;
1403 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
1404 BEFORE DELETE ON actual_node
1405 BEGIN
1406    INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1407                                       notify)
1408    SELECT OLD.local_relpath, 1, OLD.conflict_data,
1409           CASE
1410             WHEN OLD.properties IS NOT NULL
1411             THEN 1
1412             WHEN NOT EXISTS(SELECT 1 FROM NODES n
1413                             WHERE n.wc_id = OLD.wc_id
1414                               AND n.local_relpath = OLD.local_relpath)
1415             THEN 1
1416           END notify
1417    WHERE OLD.conflict_data IS NOT NULL
1418       OR notify IS NOT NULL;
1419 END;
1420 DROP TRIGGER IF EXISTS   trigger_revert_list_actual_update;
1421 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
1422 BEFORE UPDATE ON actual_node
1423 BEGIN
1424    INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1425                                       notify)
1426    SELECT OLD.local_relpath, 1, OLD.conflict_data,
1427           CASE
1428             WHEN OLD.properties IS NOT NULL
1429             THEN 1
1430             WHEN NOT EXISTS(SELECT 1 FROM NODES n
1431                             WHERE n.wc_id = OLD.wc_id
1432                               AND n.local_relpath = OLD.local_relpath)
1433             THEN 1
1434           END notify
1435    WHERE OLD.conflict_data IS NOT NULL
1436       OR notify IS NOT NULL;
1437 END
1438
1439 -- STMT_DROP_REVERT_LIST_TRIGGERS
1440 DROP TRIGGER trigger_revert_list_nodes;
1441 DROP TRIGGER trigger_revert_list_actual_delete;
1442 DROP TRIGGER trigger_revert_list_actual_update
1443
1444 -- STMT_SELECT_REVERT_LIST
1445 SELECT actual, notify, kind, op_depth, repos_id, conflict_data
1446 FROM revert_list
1447 WHERE local_relpath = ?1
1448 ORDER BY actual DESC
1449
1450 -- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1451 SELECT local_relpath, kind
1452 FROM revert_list
1453 WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1454   AND op_depth >= ?2
1455   AND repos_id IS NOT NULL
1456 ORDER BY local_relpath
1457
1458 -- STMT_DELETE_REVERT_LIST
1459 DELETE FROM revert_list WHERE local_relpath = ?1
1460
1461 -- STMT_SELECT_REVERT_LIST_RECURSIVE
1462 SELECT p.local_relpath, n.kind, a.notify, a.kind
1463 FROM (SELECT DISTINCT local_relpath
1464       FROM revert_list
1465       WHERE (local_relpath = ?1
1466         OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))) p
1467
1468 LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0
1469 LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1
1470 ORDER BY p.local_relpath
1471
1472 -- STMT_DELETE_REVERT_LIST_RECURSIVE
1473 DELETE FROM revert_list
1474 WHERE (local_relpath = ?1
1475        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1476
1477 -- STMT_DROP_REVERT_LIST
1478 DROP TABLE IF EXISTS revert_list
1479
1480 -- STMT_CREATE_DELETE_LIST
1481 DROP TABLE IF EXISTS delete_list;
1482 CREATE TEMPORARY TABLE delete_list (
1483 /* ### we should put the wc_id in here in case a delete spans multiple
1484    ### working copies. queries, etc will need to be adjusted.  */
1485    local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE
1486    )
1487
1488 /* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE.
1489    A subquery is used instead of nodes_current to avoid a table scan */
1490 -- STMT_INSERT_DELETE_LIST
1491 INSERT INTO delete_list(local_relpath)
1492 SELECT ?2
1493 UNION ALL
1494 SELECT local_relpath FROM nodes AS n
1495 WHERE wc_id = ?1
1496   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1497   AND op_depth >= ?3
1498   AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
1499                   WHERE s.wc_id = ?1
1500                     AND s.local_relpath = n.local_relpath)
1501   AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1502   AND file_external IS NULL
1503 ORDER by local_relpath
1504
1505 -- STMT_SELECT_DELETE_LIST
1506 SELECT local_relpath FROM delete_list
1507 ORDER BY local_relpath
1508
1509 -- STMT_FINALIZE_DELETE
1510 DROP TABLE IF EXISTS delete_list
1511
1512 -- STMT_CREATE_UPDATE_MOVE_LIST
1513 DROP TABLE IF EXISTS update_move_list;
1514 CREATE TEMPORARY TABLE update_move_list (
1515 /* ### we should put the wc_id in here in case a move update spans multiple
1516    ### working copies. queries, etc will need to be adjusted.  */
1517   local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
1518   action INTEGER NOT NULL,
1519   kind TEXT NOT NULL,
1520   content_state INTEGER NOT NULL,
1521   prop_state  INTEGER NOT NULL
1522   )
1523
1524 -- STMT_INSERT_UPDATE_MOVE_LIST
1525 INSERT INTO update_move_list(local_relpath, action, kind, content_state,
1526   prop_state)
1527 VALUES (?1, ?2, ?3, ?4, ?5)
1528
1529 -- STMT_SELECT_UPDATE_MOVE_LIST
1530 SELECT local_relpath, action, kind, content_state, prop_state
1531 FROM update_move_list
1532 ORDER BY local_relpath
1533
1534 -- STMT_FINALIZE_UPDATE_MOVE
1535 DROP TABLE IF EXISTS update_move_list
1536
1537 -- STMT_MOVE_NOTIFY_TO_REVERT
1538 INSERT INTO revert_list (local_relpath, notify, kind, actual)
1539        SELECT local_relpath, 2, kind, 1 FROM update_move_list;
1540 DROP TABLE update_move_list
1541
1542 /* ------------------------------------------------------------------------- */
1543
1544 /* Queries for revision status. */
1545
1546 -- STMT_SELECT_MIN_MAX_REVISIONS
1547 SELECT MIN(revision), MAX(revision),
1548        MIN(changed_revision), MAX(changed_revision) FROM nodes
1549   WHERE wc_id = ?1
1550     AND (local_relpath = ?2
1551          OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1552     AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1553     AND file_external IS NULL
1554     AND op_depth = 0
1555
1556 -- STMT_HAS_SPARSE_NODES
1557 SELECT 1 FROM nodes
1558 WHERE wc_id = ?1
1559   AND (local_relpath = ?2
1560        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1561   AND op_depth = 0
1562   AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED)
1563         OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN))
1564   AND file_external IS NULL
1565 LIMIT 1
1566
1567 -- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1568 SELECT 1 FROM nodes
1569 WHERE wc_id = ?1
1570   AND (local_relpath = ?2
1571        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1572   AND op_depth > 0
1573 LIMIT 1
1574
1575 -- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1576 SELECT 1 FROM actual_node
1577 WHERE wc_id = ?1
1578   AND (local_relpath = ?2
1579        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1580   AND properties IS NOT NULL
1581 LIMIT 1
1582
1583 -- STMT_HAS_SWITCHED
1584 SELECT 1
1585 FROM nodes
1586 WHERE wc_id = ?1
1587   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1588   AND op_depth = 0
1589   AND file_external IS NULL
1590   AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1591   AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
1592 LIMIT 1
1593
1594 -- STMT_SELECT_MOVED_FROM_RELPATH
1595 SELECT local_relpath, op_depth FROM nodes
1596 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1597
1598 -- STMT_UPDATE_MOVED_TO_RELPATH
1599 UPDATE nodes SET moved_to = ?4
1600 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1601
1602 -- STMT_CLEAR_MOVED_TO_RELPATH
1603 UPDATE nodes SET moved_to = NULL
1604 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1605
1606 -- STMT_CLEAR_MOVED_HERE_RECURSIVE
1607 UPDATE nodes SET moved_here = NULL
1608 WHERE wc_id = ?1
1609  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1610  AND op_depth = ?3
1611
1612 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1.
1613  * Each row returns a moved-here path (always a child of ?2) in the first
1614  * column, and its matching moved-away (deleted) path in the second column. */
1615 -- STMT_SELECT_MOVED_HERE_CHILDREN
1616 SELECT moved_to, local_relpath FROM nodes
1617 WHERE wc_id = ?1 AND op_depth > 0
1618   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1619
1620 /* If the node is moved here (r.moved_here = 1) we are really interested in
1621    where the node was moved from. To obtain that we need the op_depth, but
1622    this form of select only allows a single return value */
1623 -- STMT_SELECT_MOVED_FOR_DELETE
1624 SELECT local_relpath, moved_to, op_depth,
1625        (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1626         WHERE r.wc_id = ?1
1627           AND r.local_relpath = n.local_relpath
1628           AND r.op_depth < n.op_depth
1629         ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1630  FROM nodes n
1631 WHERE wc_id = ?1
1632   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1633   AND moved_to IS NOT NULL
1634   AND op_depth >= ?3
1635
1636 -- STMT_SELECT_MOVED_FROM_FOR_DELETE
1637 SELECT local_relpath, op_depth,
1638        (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1639         WHERE r.wc_id = ?1
1640           AND r.local_relpath = n.local_relpath
1641           AND r.op_depth < n.op_depth
1642         ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1643  FROM nodes n
1644 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1645
1646 -- STMT_UPDATE_MOVED_TO_DESCENDANTS
1647 UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1648  WHERE wc_id = ?1
1649    AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1650
1651 -- STMT_CLEAR_MOVED_TO_DESCENDANTS
1652 UPDATE nodes SET moved_to = NULL
1653  WHERE wc_id = ?1
1654    AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1655
1656 -- STMT_SELECT_MOVED_PAIR3
1657 SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
1658 FROM nodes n
1659 JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
1660  AND d.op_depth = (SELECT MIN(dd.op_depth)
1661                     FROM nodes dd
1662                     WHERE dd.wc_id = ?1
1663                       AND dd.local_relpath = d.local_relpath
1664                       AND dd.op_depth > ?3)
1665 WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3
1666   AND d.moved_to IS NOT NULL
1667 UNION ALL
1668 SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
1669 FROM nodes n
1670 JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
1671  AND d.op_depth = (SELECT MIN(dd.op_depth)
1672                     FROM nodes dd
1673                     WHERE dd.wc_id = ?1
1674                       AND dd.local_relpath = d.local_relpath
1675                       AND dd.op_depth > ?3)
1676 WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1677   AND n.op_depth = ?3
1678   AND d.moved_to IS NOT NULL
1679 ORDER BY n.local_relpath
1680
1681 -- STMT_SELECT_MOVED_OUTSIDE
1682 SELECT local_relpath, moved_to, op_depth FROM nodes
1683 WHERE wc_id = ?1
1684   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1685   AND op_depth >= ?3
1686   AND moved_to IS NOT NULL
1687   AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1688
1689 -- STMT_SELECT_MOVED_DESCENDANTS_SRC
1690 SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to
1691 FROM nodes n
1692 JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath
1693  AND s.op_depth = (SELECT MIN(d.op_depth)
1694                     FROM nodes d
1695                     WHERE d.wc_id = ?1
1696                       AND d.local_relpath = s.local_relpath
1697                       AND d.op_depth > ?3)
1698 WHERE n.wc_id = ?1 AND n.op_depth = ?3
1699   AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2))
1700   AND s.moved_to IS NOT NULL
1701
1702 -- STMT_COMMIT_UPDATE_ORIGIN
1703 UPDATE nodes SET repos_id = ?4,
1704                  repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
1705                  revision = ?6
1706 WHERE wc_id = ?1
1707   AND (local_relpath = ?2
1708        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1709   AND op_depth = ?3
1710
1711 -- STMT_HAS_LAYER_BETWEEN
1712 SELECT 1 FROM NODES
1713 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1714
1715 -- STMT_SELECT_REPOS_PATH_REVISION
1716 SELECT local_relpath, repos_path, revision FROM nodes
1717 WHERE wc_id = ?1
1718   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1719   AND op_depth = 0
1720 ORDER BY local_relpath
1721
1722 -- STMT_SELECT_HAS_NON_FILE_CHILDREN
1723 SELECT 1 FROM nodes
1724 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != MAP_FILE
1725 LIMIT 1
1726
1727 -- STMT_SELECT_HAS_GRANDCHILDREN
1728 SELECT 1 FROM nodes
1729 WHERE wc_id = ?1
1730   AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1731   AND op_depth = ?3
1732   AND file_external IS NULL
1733 LIMIT 1
1734
1735 /* ------------------------------------------------------------------------- */
1736
1737 /* Queries for verification. */
1738
1739 -- STMT_SELECT_ALL_NODES
1740 SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1741 WHERE wc_id = ?1
1742
1743 /* ------------------------------------------------------------------------- */
1744
1745 /* Queries for cached inherited properties. */
1746
1747 /* Select the inherited properties of a single base node. */
1748 -- STMT_SELECT_IPROPS
1749 SELECT inherited_props FROM nodes
1750 WHERE wc_id = ?1
1751   AND local_relpath = ?2
1752   AND op_depth = 0
1753
1754 /* Update the inherited properties of a single base node. */
1755 -- STMT_UPDATE_IPROP
1756 UPDATE nodes
1757 SET inherited_props = ?3
1758 WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
1759
1760 /* Select a single path if its base node has cached inherited properties. */
1761 -- STMT_SELECT_IPROPS_NODE
1762 SELECT local_relpath, repos_path FROM nodes
1763 WHERE wc_id = ?1
1764   AND local_relpath = ?2
1765   AND op_depth = 0
1766   AND (inherited_props not null)
1767
1768 /* Select all paths whose base nodes are below a given path, which
1769    have cached inherited properties. */
1770 -- STMT_SELECT_IPROPS_RECURSIVE
1771 SELECT local_relpath, repos_path FROM nodes
1772 WHERE wc_id = ?1
1773   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1774   AND op_depth = 0
1775   AND (inherited_props not null)
1776
1777 -- STMT_SELECT_IPROPS_CHILDREN
1778 SELECT local_relpath, repos_path FROM nodes
1779 WHERE wc_id = ?1
1780   AND parent_relpath = ?2
1781   AND op_depth = 0
1782   AND (inherited_props not null)
1783
1784 -- STMT_HAVE_STAT1_TABLE
1785 SELECT 1 FROM sqlite_master WHERE name='sqlite_stat1' AND type='table'
1786 LIMIT 1
1787
1788 /* ------------------------------------------------------------------------- */
1789
1790 /* Grab all the statements related to the schema.  */
1791
1792 -- include: wc-metadata
1793 -- include: wc-checks