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