]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/subversion/subversion/libsvn_wc/wc-queries.sql
MFC r275385 (by bapt):
[FreeBSD/stable/10.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 /* Testing shows DELETE is faster than TRUNCATE on NFS and
1291    exclusive-locking is mostly used on remote file systems. */
1292 PRAGMA journal_mode = DELETE
1293
1294 /* ------------------------------------------------------------------------- */
1295
1296 /* these are used in entries.c  */
1297
1298 -- STMT_INSERT_ACTUAL_NODE
1299 INSERT OR REPLACE INTO actual_node (
1300   wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data)
1301 VALUES (?1, ?2, ?3, ?4, ?5, ?6)
1302
1303 /* ------------------------------------------------------------------------- */
1304
1305 /* these are used in upgrade.c  */
1306
1307 -- STMT_SELECT_ALL_FILES
1308 SELECT local_relpath FROM nodes_current
1309 WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
1310
1311 -- STMT_UPDATE_NODE_PROPS
1312 UPDATE nodes SET properties = ?4
1313 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1314
1315 -- STMT_PRAGMA_TABLE_INFO_NODES
1316 PRAGMA table_info("NODES")
1317
1318 /* --------------------------------------------------------------------------
1319  * Complex queries for callback walks, caching results in a temporary table.
1320  *
1321  * These target table are then used for joins against NODES, or for reporting
1322  */
1323
1324 -- STMT_CREATE_TARGET_PROP_CACHE
1325 DROP TABLE IF EXISTS target_prop_cache;
1326 CREATE TEMPORARY TABLE target_prop_cache (
1327   local_relpath TEXT NOT NULL PRIMARY KEY,
1328   kind TEXT NOT NULL,
1329   properties BLOB
1330 );
1331 /* ###  Need index?
1332 CREATE UNIQUE INDEX temp__node_props_cache_unique
1333   ON temp__node_props_cache (local_relpath) */
1334
1335 -- STMT_CACHE_TARGET_PROPS
1336 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1337  SELECT n.local_relpath, n.kind,
1338         IFNULL((SELECT properties FROM actual_node AS a
1339                  WHERE a.wc_id = n.wc_id
1340                    AND a.local_relpath = n.local_relpath),
1341                n.properties)
1342    FROM targets_list AS t
1343    JOIN nodes AS n
1344      ON n.wc_id = ?1
1345     AND n.local_relpath = t.local_relpath
1346     AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1347                       WHERE n3.wc_id = ?1
1348                         AND n3.local_relpath = t.local_relpath)
1349   WHERE t.wc_id = ?1
1350     AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1351   ORDER BY t.local_relpath
1352
1353 -- STMT_CACHE_TARGET_PRISTINE_PROPS
1354 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1355  SELECT n.local_relpath, n.kind,
1356         CASE n.presence
1357           WHEN MAP_BASE_DELETED
1358           THEN (SELECT properties FROM nodes AS p
1359                  WHERE p.wc_id = n.wc_id
1360                    AND p.local_relpath = n.local_relpath
1361                    AND p.op_depth < n.op_depth
1362                  ORDER BY p.op_depth DESC /* LIMIT 1 */)
1363           ELSE properties END
1364   FROM targets_list AS t
1365   JOIN nodes AS n
1366     ON n.wc_id = ?1
1367    AND n.local_relpath = t.local_relpath
1368    AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1369                      WHERE n3.wc_id = ?1
1370                        AND n3.local_relpath = t.local_relpath)
1371   WHERE t.wc_id = ?1
1372     AND (presence = MAP_NORMAL
1373          OR presence = MAP_INCOMPLETE
1374          OR presence = MAP_BASE_DELETED)
1375   ORDER BY t.local_relpath
1376
1377 -- STMT_SELECT_ALL_TARGET_PROP_CACHE
1378 SELECT local_relpath, properties FROM target_prop_cache
1379 ORDER BY local_relpath
1380
1381 -- STMT_DROP_TARGET_PROP_CACHE
1382 DROP TABLE target_prop_cache;
1383
1384 -- STMT_CREATE_REVERT_LIST
1385 DROP TABLE IF EXISTS revert_list;
1386 CREATE TEMPORARY TABLE revert_list (
1387    /* need wc_id if/when revert spans multiple working copies */
1388    local_relpath TEXT NOT NULL,
1389    actual INTEGER NOT NULL,         /* 1 if an actual row, 0 if a nodes row */
1390    conflict_data BLOB,
1391    notify INTEGER,         /* 1 if an actual row had props or tree conflict */
1392    op_depth INTEGER,
1393    repos_id INTEGER,
1394    kind TEXT,
1395    PRIMARY KEY (local_relpath, actual)
1396    );
1397 DROP TRIGGER IF EXISTS   trigger_revert_list_nodes;
1398 CREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1399 BEFORE DELETE ON nodes
1400 BEGIN
1401    INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1402                                       repos_id, kind)
1403    SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
1404 END;
1405 DROP TRIGGER IF EXISTS   trigger_revert_list_actual_delete;
1406 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
1407 BEFORE DELETE ON actual_node
1408 BEGIN
1409    INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1410                                       notify)
1411    SELECT OLD.local_relpath, 1, OLD.conflict_data,
1412           CASE
1413             WHEN OLD.properties IS NOT NULL
1414             THEN 1
1415             WHEN NOT EXISTS(SELECT 1 FROM NODES n
1416                             WHERE n.wc_id = OLD.wc_id
1417                               AND n.local_relpath = OLD.local_relpath)
1418             THEN 1
1419           END notify
1420    WHERE OLD.conflict_data IS NOT NULL
1421       OR notify IS NOT NULL;
1422 END;
1423 DROP TRIGGER IF EXISTS   trigger_revert_list_actual_update;
1424 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
1425 BEFORE UPDATE ON actual_node
1426 BEGIN
1427    INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1428                                       notify)
1429    SELECT OLD.local_relpath, 1, OLD.conflict_data,
1430           CASE
1431             WHEN OLD.properties IS NOT NULL
1432             THEN 1
1433             WHEN NOT EXISTS(SELECT 1 FROM NODES n
1434                             WHERE n.wc_id = OLD.wc_id
1435                               AND n.local_relpath = OLD.local_relpath)
1436             THEN 1
1437           END notify
1438    WHERE OLD.conflict_data IS NOT NULL
1439       OR notify IS NOT NULL;
1440 END
1441
1442 -- STMT_DROP_REVERT_LIST_TRIGGERS
1443 DROP TRIGGER trigger_revert_list_nodes;
1444 DROP TRIGGER trigger_revert_list_actual_delete;
1445 DROP TRIGGER trigger_revert_list_actual_update
1446
1447 -- STMT_SELECT_REVERT_LIST
1448 SELECT actual, notify, kind, op_depth, repos_id, conflict_data
1449 FROM revert_list
1450 WHERE local_relpath = ?1
1451 ORDER BY actual DESC
1452
1453 -- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1454 SELECT local_relpath, kind
1455 FROM revert_list
1456 WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1457   AND op_depth >= ?2
1458   AND repos_id IS NOT NULL
1459 ORDER BY local_relpath
1460
1461 -- STMT_DELETE_REVERT_LIST
1462 DELETE FROM revert_list WHERE local_relpath = ?1
1463
1464 -- STMT_SELECT_REVERT_LIST_RECURSIVE
1465 SELECT p.local_relpath, n.kind, a.notify, a.kind
1466 FROM (SELECT DISTINCT local_relpath
1467       FROM revert_list
1468       WHERE (local_relpath = ?1
1469         OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))) p
1470
1471 LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0
1472 LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1
1473 ORDER BY p.local_relpath
1474
1475 -- STMT_DELETE_REVERT_LIST_RECURSIVE
1476 DELETE FROM revert_list
1477 WHERE (local_relpath = ?1
1478        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1479
1480 -- STMT_DROP_REVERT_LIST
1481 DROP TABLE IF EXISTS revert_list
1482
1483 -- STMT_CREATE_DELETE_LIST
1484 DROP TABLE IF EXISTS delete_list;
1485 CREATE TEMPORARY TABLE delete_list (
1486 /* ### we should put the wc_id in here in case a delete spans multiple
1487    ### working copies. queries, etc will need to be adjusted.  */
1488    local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE
1489    )
1490
1491 /* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE.
1492    A subquery is used instead of nodes_current to avoid a table scan */
1493 -- STMT_INSERT_DELETE_LIST
1494 INSERT INTO delete_list(local_relpath)
1495 SELECT ?2
1496 UNION ALL
1497 SELECT local_relpath FROM nodes AS n
1498 WHERE wc_id = ?1
1499   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1500   AND op_depth >= ?3
1501   AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
1502                   WHERE s.wc_id = ?1
1503                     AND s.local_relpath = n.local_relpath)
1504   AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1505   AND file_external IS NULL
1506 ORDER by local_relpath
1507
1508 -- STMT_SELECT_DELETE_LIST
1509 SELECT local_relpath FROM delete_list
1510 ORDER BY local_relpath
1511
1512 -- STMT_FINALIZE_DELETE
1513 DROP TABLE IF EXISTS delete_list
1514
1515 -- STMT_CREATE_UPDATE_MOVE_LIST
1516 DROP TABLE IF EXISTS update_move_list;
1517 CREATE TEMPORARY TABLE update_move_list (
1518 /* ### we should put the wc_id in here in case a move update spans multiple
1519    ### working copies. queries, etc will need to be adjusted.  */
1520   local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
1521   action INTEGER NOT NULL,
1522   kind TEXT NOT NULL,
1523   content_state INTEGER NOT NULL,
1524   prop_state  INTEGER NOT NULL
1525   )
1526
1527 -- STMT_INSERT_UPDATE_MOVE_LIST
1528 INSERT INTO update_move_list(local_relpath, action, kind, content_state,
1529   prop_state)
1530 VALUES (?1, ?2, ?3, ?4, ?5)
1531
1532 -- STMT_SELECT_UPDATE_MOVE_LIST
1533 SELECT local_relpath, action, kind, content_state, prop_state
1534 FROM update_move_list
1535 ORDER BY local_relpath
1536
1537 -- STMT_FINALIZE_UPDATE_MOVE
1538 DROP TABLE IF EXISTS update_move_list
1539
1540 -- STMT_MOVE_NOTIFY_TO_REVERT
1541 INSERT INTO revert_list (local_relpath, notify, kind, actual)
1542        SELECT local_relpath, 2, kind, 1 FROM update_move_list;
1543 DROP TABLE update_move_list
1544
1545 /* ------------------------------------------------------------------------- */
1546
1547 /* Queries for revision status. */
1548
1549 -- STMT_SELECT_MIN_MAX_REVISIONS
1550 SELECT MIN(revision), MAX(revision),
1551        MIN(changed_revision), MAX(changed_revision) FROM nodes
1552   WHERE wc_id = ?1
1553     AND (local_relpath = ?2
1554          OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1555     AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1556     AND file_external IS NULL
1557     AND op_depth = 0
1558
1559 -- STMT_HAS_SPARSE_NODES
1560 SELECT 1 FROM nodes
1561 WHERE wc_id = ?1
1562   AND (local_relpath = ?2
1563        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1564   AND op_depth = 0
1565   AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED)
1566         OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN))
1567   AND file_external IS NULL
1568 LIMIT 1
1569
1570 -- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1571 SELECT 1 FROM nodes
1572 WHERE wc_id = ?1
1573   AND (local_relpath = ?2
1574        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1575   AND op_depth > 0
1576 LIMIT 1
1577
1578 -- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1579 SELECT 1 FROM actual_node
1580 WHERE wc_id = ?1
1581   AND (local_relpath = ?2
1582        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1583   AND properties IS NOT NULL
1584 LIMIT 1
1585
1586 -- STMT_HAS_SWITCHED
1587 SELECT 1
1588 FROM nodes
1589 WHERE wc_id = ?1
1590   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1591   AND op_depth = 0
1592   AND file_external IS NULL
1593   AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1594   AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
1595 LIMIT 1
1596
1597 -- STMT_SELECT_MOVED_FROM_RELPATH
1598 SELECT local_relpath, op_depth FROM nodes
1599 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1600
1601 -- STMT_UPDATE_MOVED_TO_RELPATH
1602 UPDATE nodes SET moved_to = ?4
1603 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1604
1605 -- STMT_CLEAR_MOVED_TO_RELPATH
1606 UPDATE nodes SET moved_to = NULL
1607 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1608
1609 -- STMT_CLEAR_MOVED_HERE_RECURSIVE
1610 UPDATE nodes SET moved_here = NULL
1611 WHERE wc_id = ?1
1612  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1613  AND op_depth = ?3
1614
1615 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1.
1616  * Each row returns a moved-here path (always a child of ?2) in the first
1617  * column, and its matching moved-away (deleted) path in the second column. */
1618 -- STMT_SELECT_MOVED_HERE_CHILDREN
1619 SELECT moved_to, local_relpath FROM nodes
1620 WHERE wc_id = ?1 AND op_depth > 0
1621   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1622
1623 /* If the node is moved here (r.moved_here = 1) we are really interested in
1624    where the node was moved from. To obtain that we need the op_depth, but
1625    this form of select only allows a single return value */
1626 -- STMT_SELECT_MOVED_FOR_DELETE
1627 SELECT local_relpath, moved_to, op_depth,
1628        (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1629         WHERE r.wc_id = ?1
1630           AND r.local_relpath = n.local_relpath
1631           AND r.op_depth < n.op_depth
1632         ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1633  FROM nodes n
1634 WHERE wc_id = ?1
1635   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1636   AND moved_to IS NOT NULL
1637   AND op_depth >= ?3
1638
1639 -- STMT_SELECT_MOVED_FROM_FOR_DELETE
1640 SELECT local_relpath, op_depth,
1641        (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1642         WHERE r.wc_id = ?1
1643           AND r.local_relpath = n.local_relpath
1644           AND r.op_depth < n.op_depth
1645         ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1646  FROM nodes n
1647 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1648
1649 -- STMT_UPDATE_MOVED_TO_DESCENDANTS
1650 UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1651  WHERE wc_id = ?1
1652    AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1653
1654 -- STMT_CLEAR_MOVED_TO_DESCENDANTS
1655 UPDATE nodes SET moved_to = NULL
1656  WHERE wc_id = ?1
1657    AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1658
1659 -- STMT_SELECT_MOVED_PAIR3
1660 SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
1661 FROM nodes n
1662 JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
1663  AND d.op_depth = (SELECT MIN(dd.op_depth)
1664                     FROM nodes dd
1665                     WHERE dd.wc_id = ?1
1666                       AND dd.local_relpath = d.local_relpath
1667                       AND dd.op_depth > ?3)
1668 WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3
1669   AND d.moved_to IS NOT NULL
1670 UNION ALL
1671 SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
1672 FROM nodes n
1673 JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
1674  AND d.op_depth = (SELECT MIN(dd.op_depth)
1675                     FROM nodes dd
1676                     WHERE dd.wc_id = ?1
1677                       AND dd.local_relpath = d.local_relpath
1678                       AND dd.op_depth > ?3)
1679 WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1680   AND n.op_depth = ?3
1681   AND d.moved_to IS NOT NULL
1682 ORDER BY n.local_relpath
1683
1684 -- STMT_SELECT_MOVED_OUTSIDE
1685 SELECT local_relpath, moved_to, op_depth FROM nodes
1686 WHERE wc_id = ?1
1687   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1688   AND op_depth >= ?3
1689   AND moved_to IS NOT NULL
1690   AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1691
1692 -- STMT_SELECT_MOVED_DESCENDANTS_SRC
1693 SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to
1694 FROM nodes n
1695 JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath
1696  AND s.op_depth = (SELECT MIN(d.op_depth)
1697                     FROM nodes d
1698                     WHERE d.wc_id = ?1
1699                       AND d.local_relpath = s.local_relpath
1700                       AND d.op_depth > ?3)
1701 WHERE n.wc_id = ?1 AND n.op_depth = ?3
1702   AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2))
1703   AND s.moved_to IS NOT NULL
1704
1705 -- STMT_COMMIT_UPDATE_ORIGIN
1706 UPDATE nodes SET repos_id = ?4,
1707                  repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
1708                  revision = ?6
1709 WHERE wc_id = ?1
1710   AND (local_relpath = ?2
1711        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1712   AND op_depth = ?3
1713
1714 -- STMT_HAS_LAYER_BETWEEN
1715 SELECT 1 FROM NODES
1716 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1717
1718 -- STMT_SELECT_REPOS_PATH_REVISION
1719 SELECT local_relpath, repos_path, revision FROM nodes
1720 WHERE wc_id = ?1
1721   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1722   AND op_depth = 0
1723 ORDER BY local_relpath
1724
1725 -- STMT_SELECT_HAS_NON_FILE_CHILDREN
1726 SELECT 1 FROM nodes
1727 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != MAP_FILE
1728 LIMIT 1
1729
1730 -- STMT_SELECT_HAS_GRANDCHILDREN
1731 SELECT 1 FROM nodes
1732 WHERE wc_id = ?1
1733   AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1734   AND op_depth = ?3
1735   AND file_external IS NULL
1736 LIMIT 1
1737
1738 /* ------------------------------------------------------------------------- */
1739
1740 /* Queries for verification. */
1741
1742 -- STMT_SELECT_ALL_NODES
1743 SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1744 WHERE wc_id = ?1
1745
1746 /* ------------------------------------------------------------------------- */
1747
1748 /* Queries for cached inherited properties. */
1749
1750 /* Select the inherited properties of a single base node. */
1751 -- STMT_SELECT_IPROPS
1752 SELECT inherited_props FROM nodes
1753 WHERE wc_id = ?1
1754   AND local_relpath = ?2
1755   AND op_depth = 0
1756
1757 /* Update the inherited properties of a single base node. */
1758 -- STMT_UPDATE_IPROP
1759 UPDATE nodes
1760 SET inherited_props = ?3
1761 WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
1762
1763 /* Select a single path if its base node has cached inherited properties. */
1764 -- STMT_SELECT_IPROPS_NODE
1765 SELECT local_relpath, repos_path FROM nodes
1766 WHERE wc_id = ?1
1767   AND local_relpath = ?2
1768   AND op_depth = 0
1769   AND (inherited_props not null)
1770
1771 /* Select all paths whose base nodes are below a given path, which
1772    have cached inherited properties. */
1773 -- STMT_SELECT_IPROPS_RECURSIVE
1774 SELECT local_relpath, repos_path FROM nodes
1775 WHERE wc_id = ?1
1776   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1777   AND op_depth = 0
1778   AND (inherited_props not null)
1779
1780 -- STMT_SELECT_IPROPS_CHILDREN
1781 SELECT local_relpath, repos_path FROM nodes
1782 WHERE wc_id = ?1
1783   AND parent_relpath = ?2
1784   AND op_depth = 0
1785   AND (inherited_props not null)
1786
1787 -- STMT_HAVE_STAT1_TABLE
1788 SELECT 1 FROM sqlite_master WHERE name='sqlite_stat1' AND type='table'
1789 LIMIT 1
1790
1791 /* ------------------------------------------------------------------------- */
1792
1793 /* Grab all the statements related to the schema.  */
1794
1795 -- include: wc-metadata
1796 -- include: wc-checks