]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/subversion/subversion/libsvn_wc/wc-queries.sql
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.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
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_OP_DEPTH_MOVED_TO
421 SELECT op_depth, moved_to, repos_path, revision
422 FROM nodes
423 WHERE wc_id = ?1 AND local_relpath = ?2
424  AND op_depth <= (SELECT MIN(op_depth) FROM nodes
425                   WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
426 ORDER BY op_depth DESC
427
428 -- STMT_SELECT_MOVED_TO
429 SELECT moved_to
430 FROM nodes
431 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
432
433 -- STMT_SELECT_MOVED_HERE
434 SELECT moved_here, presence, repos_path, revision
435 FROM nodes
436 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3
437 ORDER BY op_depth
438
439 -- STMT_SELECT_MOVED_BACK
440 SELECT u.local_relpath,
441        u.presence, u.repos_id, u.repos_path, u.revision,
442        l.presence, l.repos_id, l.repos_path, l.revision,
443        u.moved_here, u.moved_to
444 FROM nodes u
445 LEFT OUTER JOIN nodes l ON l.wc_id = ?1
446                        AND l.local_relpath = u.local_relpath
447                        AND l.op_depth = ?3
448 WHERE u.wc_id = ?1
449   AND u.local_relpath = ?2
450   AND u.op_depth = ?4
451 UNION ALL
452 SELECT u.local_relpath,
453        u.presence, u.repos_id, u.repos_path, u.revision,
454        l.presence, l.repos_id, l.repos_path, l.revision,
455        u.moved_here, NULL
456 FROM nodes u
457 LEFT OUTER JOIN nodes l ON l.wc_id=?1
458                        AND l.local_relpath=u.local_relpath
459                        AND l.op_depth=?3
460 WHERE u.wc_id = ?1
461   AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
462   AND u.op_depth = ?4
463
464 -- STMT_DELETE_MOVED_BACK
465 DELETE FROM nodes
466 WHERE wc_id = ?1
467   AND (local_relpath = ?2
468        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
469   AND op_depth = ?3
470
471 -- STMT_DELETE_LOCK
472 DELETE FROM lock
473 WHERE repos_id = ?1 AND repos_relpath = ?2
474
475 -- STMT_DELETE_LOCK_RECURSIVELY
476 DELETE FROM lock
477 WHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2))
478
479 -- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE
480 UPDATE nodes SET dav_cache = NULL
481 WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0
482   AND (local_relpath = ?2
483        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
484
485 -- STMT_RECURSIVE_UPDATE_NODE_REPO
486 UPDATE nodes SET repos_id = ?4, dav_cache = NULL
487 /* ### The Sqlite optimizer needs help here ###
488  * WHERE wc_id = ?1
489  *   AND repos_id = ?3
490  *   AND (local_relpath = ?2
491  *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/
492 WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3)
493    OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
494        AND repos_id = ?3)
495  
496
497 -- STMT_UPDATE_LOCK_REPOS_ID
498 UPDATE lock SET repos_id = ?2
499 WHERE repos_id = ?1
500
501 -- STMT_UPDATE_NODE_FILEINFO
502 UPDATE nodes SET translated_size = ?3, last_mod_time = ?4
503 WHERE wc_id = ?1 AND local_relpath = ?2
504   AND op_depth = (SELECT MAX(op_depth) FROM nodes
505                   WHERE wc_id = ?1 AND local_relpath = ?2)
506
507 -- STMT_INSERT_ACTUAL_CONFLICT
508 INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
509 VALUES (?1, ?2, ?3, ?4)
510
511 -- STMT_UPDATE_ACTUAL_CONFLICT
512 UPDATE actual_node SET conflict_data = ?3
513 WHERE wc_id = ?1 AND local_relpath = ?2
514
515 -- STMT_UPDATE_ACTUAL_CHANGELISTS
516 UPDATE actual_node SET changelist = ?3
517 WHERE wc_id = ?1
518   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
519   AND local_relpath = (SELECT local_relpath FROM targets_list AS t
520                        WHERE wc_id = ?1
521                          AND t.local_relpath = actual_node.local_relpath
522                          AND kind = MAP_FILE)
523
524 -- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST
525 UPDATE actual_node SET changelist = NULL
526  WHERE wc_id = ?1 AND local_relpath = ?2
527
528 -- STMT_MARK_SKIPPED_CHANGELIST_DIRS
529 /* 7 corresponds to svn_wc_notify_skip */
530 INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist)
531 SELECT wc_id, local_relpath, 7, ?3
532 FROM targets_list
533 WHERE wc_id = ?1
534   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
535   AND kind = MAP_DIR
536
537 -- STMT_RESET_ACTUAL_WITH_CHANGELIST
538 REPLACE INTO actual_node (
539   wc_id, local_relpath, parent_relpath, changelist)
540 VALUES (?1, ?2, ?3, ?4)
541
542 -- STMT_CREATE_CHANGELIST_LIST
543 DROP TABLE IF EXISTS changelist_list;
544 CREATE TEMPORARY TABLE changelist_list (
545   wc_id  INTEGER NOT NULL,
546   local_relpath TEXT NOT NULL,
547   notify INTEGER NOT NULL,
548   changelist TEXT NOT NULL,
549   /* Order NOTIFY descending to make us show clears (27) before adds (26) */
550   PRIMARY KEY (wc_id, local_relpath, notify DESC)
551 )
552
553 /* Create notify items for when a node is removed from a changelist and
554    when a node is added to a changelist. Make sure nothing is notified
555    if there were no changes.
556 */
557 -- STMT_CREATE_CHANGELIST_TRIGGER
558 DROP TRIGGER IF EXISTS   trigger_changelist_list_change;
559 CREATE TEMPORARY TRIGGER trigger_changelist_list_change
560 BEFORE UPDATE ON actual_node
561 WHEN old.changelist IS NOT new.changelist
562 BEGIN
563   /* 27 corresponds to svn_wc_notify_changelist_clear */
564   INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
565   SELECT old.wc_id, old.local_relpath, 27, old.changelist
566    WHERE old.changelist is NOT NULL;
567
568   /* 26 corresponds to svn_wc_notify_changelist_set */
569   INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
570   SELECT new.wc_id, new.local_relpath, 26, new.changelist
571    WHERE new.changelist IS NOT NULL;
572 END
573
574 -- STMT_FINALIZE_CHANGELIST
575 DROP TRIGGER trigger_changelist_list_change;
576 DROP TABLE changelist_list;
577 DROP TABLE targets_list
578
579 -- STMT_SELECT_CHANGELIST_LIST
580 SELECT wc_id, local_relpath, notify, changelist
581 FROM changelist_list
582 ORDER BY wc_id, local_relpath ASC, notify DESC
583
584 -- STMT_CREATE_TARGETS_LIST
585 DROP TABLE IF EXISTS targets_list;
586 CREATE TEMPORARY TABLE targets_list (
587   wc_id  INTEGER NOT NULL,
588   local_relpath TEXT NOT NULL,
589   parent_relpath TEXT,
590   kind TEXT NOT NULL,
591   PRIMARY KEY (wc_id, local_relpath)
592   );
593 /* need more indicies? */
594
595 -- STMT_DROP_TARGETS_LIST
596 DROP TABLE targets_list
597
598 -- STMT_INSERT_TARGET
599 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
600 SELECT wc_id, local_relpath, parent_relpath, kind
601 FROM nodes_current
602 WHERE wc_id = ?1
603   AND local_relpath = ?2
604
605 -- STMT_INSERT_TARGET_DEPTH_FILES
606 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
607 SELECT wc_id, local_relpath, parent_relpath, kind
608 FROM nodes_current
609 WHERE wc_id = ?1
610   AND parent_relpath = ?2
611   AND kind = MAP_FILE
612
613 -- STMT_INSERT_TARGET_DEPTH_IMMEDIATES
614 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
615 SELECT wc_id, local_relpath, parent_relpath, kind
616 FROM nodes_current
617 WHERE wc_id = ?1
618   AND parent_relpath = ?2
619
620 -- STMT_INSERT_TARGET_DEPTH_INFINITY
621 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
622 SELECT wc_id, local_relpath, parent_relpath, kind
623 FROM nodes_current
624 WHERE wc_id = ?1
625   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
626
627 -- STMT_INSERT_TARGET_WITH_CHANGELIST
628 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
629 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
630   FROM actual_node AS A JOIN nodes_current AS N
631     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
632  WHERE N.wc_id = ?1
633    AND N.local_relpath = ?2
634    AND A.changelist = ?3
635
636 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES
637 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
638 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
639   FROM actual_node AS A JOIN nodes_current AS N
640     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
641  WHERE N.wc_id = ?1
642    AND N.parent_relpath = ?2
643    AND kind = MAP_FILE
644    AND A.changelist = ?3
645
646 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES
647 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
648 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
649   FROM actual_node AS A JOIN nodes_current AS N
650     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
651  WHERE N.wc_id = ?1
652    AND N.parent_relpath = ?2
653   AND A.changelist = ?3
654
655 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY
656 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
657 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
658   FROM actual_node AS A JOIN nodes_current AS N
659     ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
660  WHERE N.wc_id = ?1
661    AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
662    AND A.changelist = ?3
663
664 /* Only used by commented dump_targets() in wc_db.c */
665 /*-- STMT_SELECT_TARGETS
666 SELECT local_relpath, parent_relpath from targets_list*/
667
668 -- STMT_INSERT_ACTUAL_EMPTIES
669 INSERT OR IGNORE INTO actual_node (
670      wc_id, local_relpath, parent_relpath)
671 SELECT wc_id, local_relpath, parent_relpath
672 FROM targets_list
673
674 -- STMT_DELETE_ACTUAL_EMPTY
675 DELETE FROM actual_node
676 WHERE wc_id = ?1 AND local_relpath = ?2
677   AND properties IS NULL
678   AND conflict_data IS NULL
679   AND changelist IS NULL
680   AND text_mod IS NULL
681   AND older_checksum IS NULL
682   AND right_checksum IS NULL
683   AND left_checksum IS NULL
684
685 -- STMT_DELETE_ACTUAL_EMPTIES
686 DELETE FROM actual_node
687 WHERE wc_id = ?1
688   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
689   AND properties IS NULL
690   AND conflict_data IS NULL
691   AND changelist IS NULL
692   AND text_mod IS NULL
693   AND older_checksum IS NULL
694   AND right_checksum IS NULL
695   AND left_checksum IS NULL
696
697 -- STMT_DELETE_BASE_NODE
698 DELETE FROM nodes
699 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
700
701 -- STMT_DELETE_WORKING_NODE
702 DELETE FROM nodes
703 WHERE wc_id = ?1 AND local_relpath = ?2
704   AND op_depth = (SELECT MAX(op_depth) FROM nodes
705                   WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0)
706
707 -- STMT_DELETE_LOWEST_WORKING_NODE
708 DELETE FROM nodes
709 WHERE wc_id = ?1 AND local_relpath = ?2
710   AND op_depth = (SELECT MIN(op_depth) FROM nodes
711                   WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
712   AND presence = MAP_BASE_DELETED
713
714 -- STMT_DELETE_ALL_LAYERS
715 DELETE FROM nodes
716 WHERE wc_id = ?1 AND local_relpath = ?2
717
718 -- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE
719 DELETE FROM nodes
720 WHERE wc_id = ?1
721   AND (local_relpath = ?2
722        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
723   AND op_depth >= ?3
724
725 -- STMT_DELETE_ACTUAL_NODE
726 DELETE FROM actual_node
727 WHERE wc_id = ?1 AND local_relpath = ?2
728
729 /* Will not delete recursive when run on the wcroot */
730 -- STMT_DELETE_ACTUAL_NODE_RECURSIVE
731 DELETE FROM actual_node
732 WHERE wc_id = ?1
733   AND (local_relpath = ?2
734        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
735
736 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST
737 DELETE FROM actual_node
738 WHERE wc_id = ?1
739   AND local_relpath = ?2
740   AND (changelist IS NULL
741        OR NOT EXISTS (SELECT 1 FROM nodes_current c
742                       WHERE c.wc_id = ?1 AND c.local_relpath = ?2
743                         AND c.kind = MAP_FILE))
744
745 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
746 DELETE FROM actual_node
747 WHERE wc_id = ?1
748   AND (local_relpath = ?2
749        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
750   AND (changelist IS NULL
751        OR NOT EXISTS (SELECT 1 FROM nodes_current c
752                       WHERE c.wc_id = ?1 
753                         AND c.local_relpath = actual_node.local_relpath
754                         AND c.kind = MAP_FILE))
755
756 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST
757 UPDATE actual_node
758 SET properties = NULL,
759     text_mod = NULL,
760     conflict_data = NULL,
761     tree_conflict_data = NULL,
762     older_checksum = NULL,
763     left_checksum = NULL,
764     right_checksum = NULL
765 WHERE wc_id = ?1 AND local_relpath = ?2
766
767 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
768 UPDATE actual_node
769 SET properties = NULL,
770     text_mod = NULL,
771     conflict_data = NULL,
772     tree_conflict_data = NULL,
773     older_checksum = NULL,
774     left_checksum = NULL,
775     right_checksum = NULL
776 WHERE wc_id = ?1
777   AND (local_relpath = ?2
778        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
779
780 -- STMT_UPDATE_NODE_BASE_DEPTH
781 UPDATE nodes SET depth = ?3
782 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
783   AND kind=MAP_DIR
784
785 -- STMT_UPDATE_NODE_BASE_PRESENCE
786 UPDATE nodes SET presence = ?3
787 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
788
789 -- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH
790 UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5
791 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
792
793 -- STMT_LOOK_FOR_WORK
794 SELECT id FROM work_queue LIMIT 1
795
796 -- STMT_INSERT_WORK_ITEM
797 INSERT INTO work_queue (work) VALUES (?1)
798
799 -- STMT_SELECT_WORK_ITEM
800 SELECT id, work FROM work_queue ORDER BY id LIMIT 1
801
802 -- STMT_DELETE_WORK_ITEM
803 DELETE FROM work_queue WHERE id = ?1
804
805 -- STMT_INSERT_OR_IGNORE_PRISTINE
806 INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
807 VALUES (?1, ?2, ?3, 0)
808
809 -- STMT_INSERT_PRISTINE
810 INSERT INTO pristine (checksum, md5_checksum, size, refcount)
811 VALUES (?1, ?2, ?3, 0)
812
813 -- STMT_SELECT_PRISTINE
814 SELECT md5_checksum
815 FROM pristine
816 WHERE checksum = ?1
817
818 -- STMT_SELECT_PRISTINE_SIZE
819 SELECT size
820 FROM pristine
821 WHERE checksum = ?1 LIMIT 1
822
823 -- STMT_SELECT_PRISTINE_BY_MD5
824 SELECT checksum
825 FROM pristine
826 WHERE md5_checksum = ?1
827
828 -- STMT_SELECT_UNREFERENCED_PRISTINES
829 SELECT checksum
830 FROM pristine
831 WHERE refcount = 0
832
833 -- STMT_DELETE_PRISTINE_IF_UNREFERENCED
834 DELETE FROM pristine
835 WHERE checksum = ?1 AND refcount = 0
836
837 -- STMT_SELECT_COPY_PRISTINES
838 /* For the root itself */
839 SELECT n.checksum, md5_checksum, size
840 FROM nodes_current n
841 LEFT JOIN pristine p ON n.checksum = p.checksum
842 WHERE wc_id = ?1
843   AND n.local_relpath = ?2
844   AND n.checksum IS NOT NULL
845 UNION ALL
846 /* And all descendants */
847 SELECT n.checksum, md5_checksum, size
848 FROM nodes n
849 LEFT JOIN pristine p ON n.checksum = p.checksum
850 WHERE wc_id = ?1
851   AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
852   AND op_depth >=
853       (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
854   AND n.checksum IS NOT NULL
855
856 -- STMT_VACUUM
857 VACUUM
858
859 -- STMT_SELECT_CONFLICT_VICTIMS
860 SELECT local_relpath, conflict_data
861 FROM actual_node
862 WHERE wc_id = ?1 AND parent_relpath = ?2 AND
863   NOT (conflict_data IS NULL)
864
865 -- STMT_INSERT_WC_LOCK
866 INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels)
867 VALUES (?1, ?2, ?3)
868
869 -- STMT_SELECT_WC_LOCK
870 SELECT locked_levels FROM wc_lock
871 WHERE wc_id = ?1 AND local_dir_relpath = ?2
872
873 -- STMT_SELECT_ANCESTOR_WCLOCKS
874 SELECT local_dir_relpath, locked_levels FROM wc_lock
875 WHERE wc_id = ?1
876   AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2)
877        OR local_dir_relpath = '')
878
879 -- STMT_DELETE_WC_LOCK
880 DELETE FROM wc_lock
881 WHERE wc_id = ?1 AND local_dir_relpath = ?2
882
883 -- STMT_FIND_WC_LOCK
884 SELECT local_dir_relpath FROM wc_lock
885 WHERE wc_id = ?1
886   AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
887
888 -- STMT_DELETE_WC_LOCK_ORPHAN
889 DELETE FROM wc_lock
890 WHERE wc_id = ?1 AND local_dir_relpath = ?2
891 AND NOT EXISTS (SELECT 1 FROM nodes
892                  WHERE nodes.wc_id = ?1
893                    AND nodes.local_relpath = wc_lock.local_dir_relpath)
894
895 -- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE
896 DELETE FROM wc_lock
897 WHERE wc_id = ?1
898   AND (local_dir_relpath = ?2
899        OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2))
900   AND NOT EXISTS (SELECT 1 FROM nodes
901                    WHERE nodes.wc_id = ?1
902                      AND nodes.local_relpath = wc_lock.local_dir_relpath)
903
904 -- STMT_APPLY_CHANGES_TO_BASE_NODE
905 /* translated_size and last_mod_time are not mentioned here because they will
906    be tweaked after the working-file is installed. When we replace an existing
907    BASE node (read: bump), preserve its file_external status. */
908 INSERT OR REPLACE INTO nodes (
909   wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
910   revision, presence, depth, kind, changed_revision, changed_date,
911   changed_author, checksum, properties, dav_cache, symlink_target,
912   inherited_props, file_external )
913 VALUES (?1, ?2, 0,
914         ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17,
915         (SELECT file_external FROM nodes
916           WHERE wc_id = ?1
917             AND local_relpath = ?2
918             AND op_depth = 0))
919
920 -- STMT_INSTALL_WORKING_NODE_FOR_DELETE
921 INSERT OR REPLACE INTO nodes (
922     wc_id, local_relpath, op_depth,
923     parent_relpath, presence, kind)
924 VALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5)
925
926 -- STMT_DELETE_NO_LOWER_LAYER
927 DELETE FROM nodes
928  WHERE wc_id = ?1
929    AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
930    AND op_depth = ?3
931    AND NOT EXISTS (SELECT 1 FROM nodes n
932                     WHERE n.wc_id = ?1
933                     AND n.local_relpath = nodes.local_relpath
934                     AND n.op_depth = ?4
935                     AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE))
936
937 -- STMT_REPLACE_WITH_BASE_DELETED
938 INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath,
939                               kind, moved_to, presence)
940 SELECT wc_id, local_relpath, op_depth, parent_relpath,
941        kind, moved_to, MAP_BASE_DELETED
942   FROM nodes
943  WHERE wc_id = ?1
944    AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
945    AND op_depth = ?3
946
947 /* If this query is updated, STMT_INSERT_DELETE_LIST should too. */
948 -- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
949 INSERT INTO nodes (
950     wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
951 SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
952        kind
953 FROM nodes
954 WHERE wc_id = ?1
955   AND (local_relpath = ?2
956        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
957   AND op_depth = ?3
958   AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
959   AND file_external IS NULL
960
961 -- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
962 INSERT INTO nodes (
963     wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
964     revision, presence, depth, kind, changed_revision, changed_date,
965     changed_author, checksum, properties, translated_size, last_mod_time,
966     symlink_target )
967 SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id,
968     repos_path, revision, presence, depth, kind, changed_revision,
969     changed_date, changed_author, checksum, properties, translated_size,
970     last_mod_time, symlink_target
971 FROM nodes
972 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
973
974 -- STMT_INSERT_DELETE_FROM_BASE
975 INSERT INTO nodes (
976     wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
977 SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath,
978     MAP_BASE_DELETED, kind
979 FROM nodes
980 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
981
982 /* Not valid on the wc-root */
983 -- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE
984 UPDATE nodes SET op_depth = ?3 + 1
985 WHERE wc_id = ?1
986  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
987  AND op_depth = ?3
988
989 -- STMT_UPDATE_OP_DEPTH_RECURSIVE
990 UPDATE nodes SET op_depth = ?4, moved_here = NULL
991 WHERE wc_id = ?1
992  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
993  AND op_depth = ?3
994
995 -- STMT_DOES_NODE_EXIST
996 SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
997 LIMIT 1
998
999 -- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS
1000 SELECT local_relpath FROM nodes
1001 WHERE wc_id = ?1
1002   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1003   AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED
1004 LIMIT 1
1005
1006 /* Select all excluded nodes. Not valid on the WC-root */
1007 -- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS
1008 SELECT local_relpath FROM nodes
1009 WHERE wc_id = ?1
1010   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1011   AND op_depth = 0
1012   AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED)
1013
1014 /* Creates a copy from one top level NODE to a different location */
1015 -- STMT_INSERT_WORKING_NODE_COPY_FROM
1016 INSERT OR REPLACE INTO nodes (
1017     wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1018     repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1019     changed_date, changed_author, checksum, properties, translated_size,
1020     last_mod_time, symlink_target, moved_to )
1021 SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1022     repos_id, repos_path, revision, ?6 /*presence*/, depth,
1023     ?7/*moved_here*/, kind, changed_revision, changed_date,
1024     changed_author, checksum, properties, translated_size,
1025     last_mod_time, symlink_target,
1026     (SELECT dst.moved_to FROM nodes AS dst
1027                          WHERE dst.wc_id = ?1
1028                          AND dst.local_relpath = ?3
1029                          AND dst.op_depth = ?4)
1030 FROM nodes_current
1031 WHERE wc_id = ?1 AND local_relpath = ?2
1032
1033 -- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH
1034 INSERT OR REPLACE INTO nodes (
1035     wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1036     repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1037     changed_date, changed_author, checksum, properties, translated_size,
1038     last_mod_time, symlink_target, moved_to )
1039 SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1040     repos_id, repos_path, revision, ?6 /*presence*/, depth,
1041     ?8 /*moved_here*/, kind, changed_revision, changed_date,
1042     changed_author, checksum, properties, translated_size,
1043     last_mod_time, symlink_target,
1044     (SELECT dst.moved_to FROM nodes AS dst
1045                          WHERE dst.wc_id = ?1
1046                          AND dst.local_relpath = ?3
1047                          AND dst.op_depth = ?4)
1048 FROM nodes
1049 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7
1050
1051 -- STMT_UPDATE_BASE_REVISION
1052 UPDATE nodes SET revision = ?3
1053 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1054
1055 -- STMT_UPDATE_BASE_REPOS
1056 UPDATE nodes SET repos_id = ?3, repos_path = ?4
1057 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1058
1059 -- STMT_ACTUAL_HAS_CHILDREN
1060 SELECT 1 FROM actual_node
1061 WHERE wc_id = ?1 AND parent_relpath = ?2
1062 LIMIT 1
1063
1064 -- STMT_INSERT_EXTERNAL
1065 INSERT OR REPLACE INTO externals (
1066     wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath,
1067     repos_id, def_repos_relpath, def_operational_revision, def_revision)
1068 VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
1069
1070 -- STMT_SELECT_EXTERNAL_INFO
1071 SELECT presence, kind, def_local_relpath, repos_id,
1072     def_repos_relpath, def_operational_revision, def_revision
1073 FROM externals WHERE wc_id = ?1 AND local_relpath = ?2
1074 LIMIT 1
1075
1076 -- STMT_DELETE_FILE_EXTERNALS
1077 DELETE FROM nodes
1078 WHERE wc_id = ?1
1079   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1080   AND op_depth = 0
1081   AND file_external IS NOT NULL
1082
1083 -- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS
1084 DELETE FROM externals
1085 WHERE wc_id = ?1
1086   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1087   AND kind != MAP_DIR
1088
1089 -- STMT_DELETE_EXTERNAL_REGISTATIONS
1090 DELETE FROM externals
1091 WHERE wc_id = ?1
1092   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1093
1094 /* Select all committable externals, i.e. only unpegged ones on the same
1095  * repository as the target path ?2, that are defined by WC ?1 to
1096  * live below the target path. It does not matter which ancestor has the
1097  * svn:externals definition, only the local path at which the external is
1098  * supposed to be checked out is queried.
1099  * Arguments:
1100  *  ?1: wc_id.
1101  *  ?2: the target path, local relpath inside ?1.
1102  *
1103  * ### NOTE: This statement deliberately removes file externals that live
1104  * inside an unversioned dir, because commit still breaks on those.
1105  * Once that's been fixed, the conditions below "--->8---" become obsolete. */
1106 -- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW
1107 SELECT local_relpath, kind, def_repos_relpath,
1108   (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1109 FROM externals e
1110 WHERE wc_id = ?1
1111   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1112   AND def_revision IS NULL
1113   AND repos_id = (SELECT repos_id
1114                   FROM nodes AS n
1115                   WHERE n.wc_id = ?1
1116                     AND n.local_relpath = ''
1117                     AND n.op_depth = 0)
1118   AND ((kind='dir')
1119        OR EXISTS (SELECT 1 FROM nodes
1120                   WHERE nodes.wc_id = e.wc_id
1121                   AND nodes.local_relpath = e.parent_relpath))
1122
1123 -- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW
1124 SELECT local_relpath, kind, def_repos_relpath,
1125   (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1126 FROM externals e
1127 WHERE wc_id = ?1
1128   AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2)
1129   AND parent_relpath = ?2
1130   AND def_revision IS NULL
1131   AND repos_id = (SELECT repos_id
1132                     FROM nodes AS n
1133                     WHERE n.wc_id = ?1
1134                       AND n.local_relpath = ''
1135                       AND n.op_depth = 0)
1136   AND ((kind='dir')
1137        OR EXISTS (SELECT 1 FROM nodes
1138                   WHERE nodes.wc_id = e.wc_id
1139                   AND nodes.local_relpath = e.parent_relpath))
1140
1141 -- STMT_SELECT_EXTERNALS_DEFINED
1142 SELECT local_relpath, def_local_relpath
1143 FROM externals
1144 /* ### The Sqlite optimizer needs help here ###
1145  * WHERE wc_id = ?1
1146  *   AND (def_local_relpath = ?2
1147  *        OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */
1148 WHERE (wc_id = ?1 AND def_local_relpath = ?2)
1149    OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2))
1150
1151 -- STMT_DELETE_EXTERNAL
1152 DELETE FROM externals
1153 WHERE wc_id = ?1 AND local_relpath = ?2
1154
1155 -- STMT_SELECT_EXTERNAL_PROPERTIES
1156 /* ### It would be nice if Sqlite would handle
1157  * SELECT IFNULL((SELECT properties FROM actual_node a
1158  *                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1159  *               properties),
1160  *        local_relpath, depth
1161  * FROM nodes_current n
1162  * WHERE wc_id = ?1
1163  *   AND (local_relpath = ?2
1164  *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1165  *   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1166  * ### But it would take a double table scan execution plan for it.
1167  * ### Maybe there is something else going on? */
1168 SELECT IFNULL((SELECT properties FROM actual_node a
1169                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1170               properties),
1171        local_relpath, depth
1172 FROM nodes_current n
1173 WHERE wc_id = ?1 AND local_relpath = ?2
1174   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1175 UNION ALL
1176 SELECT IFNULL((SELECT properties FROM actual_node a
1177                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1178               properties),
1179        local_relpath, depth
1180 FROM nodes_current n
1181 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1182   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1183
1184 -- STMT_SELECT_CURRENT_PROPS_RECURSIVE
1185 /* ### Ugly OR to make sqlite use the proper optimizations */
1186 SELECT IFNULL((SELECT properties FROM actual_node a
1187                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1188               properties),
1189        local_relpath
1190 FROM nodes_current n
1191 WHERE (wc_id = ?1 AND local_relpath = ?2)
1192    OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1193
1194 -- STMT_PRAGMA_LOCKING_MODE
1195 PRAGMA locking_mode = exclusive
1196
1197 /* ------------------------------------------------------------------------- */
1198
1199 /* these are used in entries.c  */
1200
1201 -- STMT_INSERT_ACTUAL_NODE
1202 INSERT OR REPLACE INTO actual_node (
1203   wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data)
1204 VALUES (?1, ?2, ?3, ?4, ?5, ?6)
1205
1206 /* ------------------------------------------------------------------------- */
1207
1208 /* these are used in upgrade.c  */
1209
1210 -- STMT_UPDATE_ACTUAL_CONFLICT_DATA
1211 UPDATE actual_node SET conflict_data = ?3
1212 WHERE wc_id = ?1 AND local_relpath = ?2
1213
1214 -- STMT_INSERT_ACTUAL_CONFLICT_DATA
1215 INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
1216 VALUES (?1, ?2, ?3, ?4)
1217
1218 -- STMT_SELECT_ALL_FILES
1219 SELECT local_relpath FROM nodes_current
1220 WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
1221
1222 -- STMT_UPDATE_NODE_PROPS
1223 UPDATE nodes SET properties = ?4
1224 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1225
1226 -- STMT_PRAGMA_TABLE_INFO_NODES
1227 PRAGMA table_info("NODES")
1228
1229 /* --------------------------------------------------------------------------
1230  * Complex queries for callback walks, caching results in a temporary table.
1231  *
1232  * These target table are then used for joins against NODES, or for reporting
1233  */
1234
1235 -- STMT_CREATE_TARGET_PROP_CACHE
1236 DROP TABLE IF EXISTS target_prop_cache;
1237 CREATE TEMPORARY TABLE target_prop_cache (
1238   local_relpath TEXT NOT NULL PRIMARY KEY,
1239   kind TEXT NOT NULL,
1240   properties BLOB
1241 );
1242 /* ###  Need index?
1243 CREATE UNIQUE INDEX temp__node_props_cache_unique
1244   ON temp__node_props_cache (local_relpath) */
1245
1246 -- STMT_CACHE_TARGET_PROPS
1247 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1248  SELECT n.local_relpath, n.kind,
1249         IFNULL((SELECT properties FROM actual_node AS a
1250                  WHERE a.wc_id = n.wc_id
1251                    AND a.local_relpath = n.local_relpath),
1252                n.properties)
1253    FROM targets_list AS t
1254    JOIN nodes AS n
1255      ON n.wc_id = ?1
1256     AND n.local_relpath = t.local_relpath
1257     AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1258                       WHERE n3.wc_id = ?1
1259                         AND n3.local_relpath = t.local_relpath)
1260   WHERE t.wc_id = ?1
1261     AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1262   ORDER BY t.local_relpath
1263
1264 -- STMT_CACHE_TARGET_PRISTINE_PROPS
1265 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1266  SELECT n.local_relpath, n.kind,
1267         CASE n.presence
1268           WHEN MAP_BASE_DELETED
1269           THEN (SELECT properties FROM nodes AS p
1270                  WHERE p.wc_id = n.wc_id
1271                    AND p.local_relpath = n.local_relpath
1272                    AND p.op_depth < n.op_depth
1273                  ORDER BY p.op_depth DESC /* LIMIT 1 */)
1274           ELSE properties END
1275   FROM targets_list AS t
1276   JOIN nodes AS n
1277     ON n.wc_id = ?1
1278    AND n.local_relpath = t.local_relpath
1279    AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1280                      WHERE n3.wc_id = ?1
1281                        AND n3.local_relpath = t.local_relpath)
1282   WHERE t.wc_id = ?1
1283     AND (presence = MAP_NORMAL
1284          OR presence = MAP_INCOMPLETE
1285          OR presence = MAP_BASE_DELETED)
1286   ORDER BY t.local_relpath
1287
1288 -- STMT_SELECT_ALL_TARGET_PROP_CACHE
1289 SELECT local_relpath, properties FROM target_prop_cache
1290 ORDER BY local_relpath
1291
1292 -- STMT_DROP_TARGET_PROP_CACHE
1293 DROP TABLE target_prop_cache;
1294
1295 -- STMT_CREATE_REVERT_LIST
1296 DROP TABLE IF EXISTS revert_list;
1297 CREATE TEMPORARY TABLE revert_list (
1298    /* need wc_id if/when revert spans multiple working copies */
1299    local_relpath TEXT NOT NULL,
1300    actual INTEGER NOT NULL,         /* 1 if an actual row, 0 if a nodes row */
1301    conflict_data BLOB,
1302    notify INTEGER,         /* 1 if an actual row had props or tree conflict */
1303    op_depth INTEGER,
1304    repos_id INTEGER,
1305    kind TEXT,
1306    PRIMARY KEY (local_relpath, actual)
1307    );
1308 DROP TRIGGER IF EXISTS   trigger_revert_list_nodes;
1309 CREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1310 BEFORE DELETE ON nodes
1311 BEGIN
1312    INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1313                                       repos_id, kind)
1314    SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
1315 END;
1316 DROP TRIGGER IF EXISTS   trigger_revert_list_actual_delete;
1317 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
1318 BEFORE DELETE ON actual_node
1319 BEGIN
1320    INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1321                                       notify)
1322    SELECT OLD.local_relpath, 1, OLD.conflict_data,
1323           CASE
1324             WHEN OLD.properties IS NOT NULL
1325             THEN 1
1326             WHEN NOT EXISTS(SELECT 1 FROM NODES n
1327                             WHERE n.wc_id = OLD.wc_id
1328                               AND n.local_relpath = OLD.local_relpath)
1329             THEN 1
1330             ELSE NULL
1331           END;
1332 END;
1333 DROP TRIGGER IF EXISTS   trigger_revert_list_actual_update;
1334 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
1335 BEFORE UPDATE ON actual_node
1336 BEGIN
1337    INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1338                                       notify)
1339    SELECT OLD.local_relpath, 1, OLD.conflict_data,
1340           CASE
1341             WHEN OLD.properties IS NOT NULL
1342             THEN 1
1343             WHEN NOT EXISTS(SELECT 1 FROM NODES n
1344                             WHERE n.wc_id = OLD.wc_id
1345                               AND n.local_relpath = OLD.local_relpath)
1346             THEN 1
1347             ELSE NULL
1348           END;
1349 END
1350
1351 -- STMT_DROP_REVERT_LIST_TRIGGERS
1352 DROP TRIGGER trigger_revert_list_nodes;
1353 DROP TRIGGER trigger_revert_list_actual_delete;
1354 DROP TRIGGER trigger_revert_list_actual_update
1355
1356 -- STMT_SELECT_REVERT_LIST
1357 SELECT actual, notify, kind, op_depth, repos_id, conflict_data
1358 FROM revert_list
1359 WHERE local_relpath = ?1
1360 ORDER BY actual DESC
1361
1362 -- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1363 SELECT local_relpath, kind
1364 FROM revert_list
1365 WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1366   AND op_depth >= ?2
1367   AND repos_id IS NOT NULL
1368 ORDER BY local_relpath
1369
1370 -- STMT_DELETE_REVERT_LIST
1371 DELETE FROM revert_list WHERE local_relpath = ?1
1372
1373 -- STMT_SELECT_REVERT_LIST_RECURSIVE
1374 SELECT DISTINCT local_relpath
1375 FROM revert_list
1376 WHERE (local_relpath = ?1
1377        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1378   AND (notify OR actual = 0)
1379 ORDER BY local_relpath
1380
1381 -- STMT_DELETE_REVERT_LIST_RECURSIVE
1382 DELETE FROM revert_list
1383 WHERE (local_relpath = ?1
1384        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1385
1386 -- STMT_DROP_REVERT_LIST
1387 DROP TABLE IF EXISTS revert_list
1388
1389 -- STMT_CREATE_DELETE_LIST
1390 DROP TABLE IF EXISTS delete_list;
1391 CREATE TEMPORARY TABLE delete_list (
1392 /* ### we should put the wc_id in here in case a delete spans multiple
1393    ### working copies. queries, etc will need to be adjusted.  */
1394    local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE
1395    )
1396
1397 /* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE.
1398    A subquery is used instead of nodes_current to avoid a table scan */
1399 -- STMT_INSERT_DELETE_LIST
1400 INSERT INTO delete_list(local_relpath)
1401 SELECT local_relpath FROM nodes AS n
1402 WHERE wc_id = ?1
1403   AND (local_relpath = ?2
1404        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1405   AND op_depth >= ?3
1406   AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
1407                   WHERE s.wc_id = ?1
1408                     AND s.local_relpath = n.local_relpath)
1409   AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1410   AND file_external IS NULL
1411
1412 -- STMT_SELECT_DELETE_LIST
1413 SELECT local_relpath FROM delete_list
1414 ORDER BY local_relpath
1415
1416 -- STMT_FINALIZE_DELETE
1417 DROP TABLE IF EXISTS delete_list
1418
1419 -- STMT_CREATE_UPDATE_MOVE_LIST
1420 DROP TABLE IF EXISTS update_move_list;
1421 CREATE TEMPORARY TABLE update_move_list (
1422 /* ### we should put the wc_id in here in case a move update spans multiple
1423    ### working copies. queries, etc will need to be adjusted.  */
1424   local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
1425   action INTEGER NOT NULL,
1426   kind  INTEGER NOT NULL,
1427   content_state INTEGER NOT NULL,
1428   prop_state  INTEGER NOT NULL
1429   )
1430
1431 -- STMT_INSERT_UPDATE_MOVE_LIST
1432 INSERT INTO update_move_list(local_relpath, action, kind, content_state,
1433   prop_state)
1434 VALUES (?1, ?2, ?3, ?4, ?5)
1435
1436 -- STMT_SELECT_UPDATE_MOVE_LIST
1437 SELECT local_relpath, action, kind, content_state, prop_state
1438 FROM update_move_list
1439 ORDER BY local_relpath
1440
1441 -- STMT_FINALIZE_UPDATE_MOVE
1442 DROP TABLE IF EXISTS update_move_list
1443
1444 /* ------------------------------------------------------------------------- */
1445
1446 /* Queries for revision status. */
1447
1448 -- STMT_SELECT_MIN_MAX_REVISIONS
1449 SELECT MIN(revision), MAX(revision),
1450        MIN(changed_revision), MAX(changed_revision) FROM nodes
1451   WHERE wc_id = ?1
1452     AND (local_relpath = ?2
1453          OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1454     AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1455     AND file_external IS NULL
1456     AND op_depth = 0
1457
1458 -- STMT_HAS_SPARSE_NODES
1459 SELECT 1 FROM nodes
1460 WHERE wc_id = ?1
1461   AND (local_relpath = ?2
1462        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1463   AND op_depth = 0
1464   AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED)
1465         OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN))
1466   AND file_external IS NULL
1467 LIMIT 1
1468
1469 -- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1470 SELECT 1 FROM nodes
1471 WHERE wc_id = ?1
1472   AND (local_relpath = ?2
1473        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1474   AND op_depth > 0
1475 LIMIT 1
1476
1477 -- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1478 SELECT 1 FROM actual_node
1479 WHERE wc_id = ?1
1480   AND (local_relpath = ?2
1481        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1482   AND properties IS NOT NULL
1483 LIMIT 1
1484
1485 -- STMT_HAS_SWITCHED
1486 SELECT 1
1487 FROM nodes
1488 WHERE wc_id = ?1
1489   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1490   AND op_depth = 0
1491   AND file_external IS NULL
1492   AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1493   AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
1494 LIMIT 1
1495
1496 -- STMT_SELECT_BASE_FILES_RECURSIVE
1497 SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n
1498 WHERE wc_id = ?1
1499   AND (local_relpath = ?2
1500        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1501   AND op_depth = 0
1502   AND kind=MAP_FILE
1503   AND presence=MAP_NORMAL
1504   AND file_external IS NULL
1505
1506 /* ### FIXME: op-depth?  What about multiple moves? */
1507 -- STMT_SELECT_MOVED_FROM_RELPATH
1508 SELECT local_relpath, op_depth FROM nodes
1509 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1510
1511 -- STMT_UPDATE_MOVED_TO_RELPATH
1512 UPDATE nodes SET moved_to = ?4
1513 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1514
1515 -- STMT_CLEAR_MOVED_TO_RELPATH
1516 UPDATE nodes SET moved_to = NULL
1517 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1518
1519 -- STMT_CLEAR_MOVED_HERE_RECURSIVE
1520 UPDATE nodes SET moved_here = NULL
1521 WHERE wc_id = ?1
1522  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1523  AND op_depth = ?3
1524
1525 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1.
1526  * Each row returns a moved-here path (always a child of ?2) in the first
1527  * column, and its matching moved-away (deleted) path in the second column. */
1528 -- STMT_SELECT_MOVED_HERE_CHILDREN
1529 SELECT moved_to, local_relpath FROM nodes
1530 WHERE wc_id = ?1 AND op_depth > 0
1531   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1532
1533 -- STMT_SELECT_MOVED_FOR_DELETE
1534 SELECT local_relpath, moved_to, op_depth FROM nodes
1535 WHERE wc_id = ?1
1536   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1537   AND moved_to IS NOT NULL
1538   AND op_depth >= (SELECT MAX(op_depth) FROM nodes o
1539                     WHERE o.wc_id = ?1
1540                       AND o.local_relpath = ?2)
1541
1542 -- STMT_UPDATE_MOVED_TO_DESCENDANTS
1543 UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1544  WHERE wc_id = ?1
1545    AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1546
1547 -- STMT_CLEAR_MOVED_TO_DESCENDANTS
1548 UPDATE nodes SET moved_to = NULL
1549  WHERE wc_id = ?1
1550    AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1551
1552
1553 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1,
1554  * where the source of the move is within the subtree rooted at path ?2, and
1555  * the destination of the move is outside the subtree rooted at path ?2. */
1556 -- STMT_SELECT_MOVED_PAIR2
1557 SELECT local_relpath, moved_to, op_depth FROM nodes
1558 WHERE wc_id = ?1
1559   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1560   AND moved_to IS NOT NULL
1561   AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1562   AND op_depth >= (SELECT MAX(op_depth) FROM nodes o
1563                     WHERE o.wc_id = ?1
1564                       AND o.local_relpath = ?2)
1565
1566 -- STMT_SELECT_MOVED_PAIR3
1567 SELECT local_relpath, moved_to, op_depth, kind FROM nodes
1568 WHERE wc_id = ?1
1569   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1570   AND op_depth > ?3
1571   AND moved_to IS NOT NULL
1572
1573 -- STMT_SELECT_MOVED_OUTSIDE
1574 SELECT local_relpath, moved_to FROM nodes
1575 WHERE wc_id = ?1
1576   AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1577   AND op_depth >= ?3
1578   AND moved_to IS NOT NULL
1579   AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1580
1581 -- STMT_SELECT_OP_DEPTH_MOVED_PAIR
1582 SELECT n.local_relpath, n.moved_to,
1583        (SELECT o.repos_path FROM nodes AS o
1584         WHERE o.wc_id = n.wc_id
1585           AND o.local_relpath = n.local_relpath
1586           AND o.op_depth < ?3 ORDER BY o.op_depth DESC LIMIT 1)
1587 FROM nodes AS n
1588 WHERE n.wc_id = ?1
1589   AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1590   AND n.op_depth = ?3
1591   AND n.moved_to IS NOT NULL
1592
1593 -- STMT_SELECT_MOVED_DESCENDANTS
1594 SELECT n.local_relpath, h.moved_to
1595 FROM nodes n, nodes h
1596 WHERE n.wc_id = ?1
1597   AND h.wc_id = ?1
1598   AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1599   AND h.local_relpath = n.local_relpath
1600   AND n.op_depth = ?3
1601   AND h.op_depth = (SELECT MIN(o.op_depth)
1602                     FROM nodes o
1603                     WHERE o.wc_id = ?1
1604                       AND o.local_relpath = n.local_relpath
1605                       AND o.op_depth > ?3)
1606   AND h.moved_to IS NOT NULL
1607
1608 -- STMT_COMMIT_UPDATE_ORIGIN
1609 /* Note that the only reason this SUBSTR() trick is valid is that you
1610    can move neither the working copy nor the repository root.
1611
1612    SUBSTR(local_relpath, LENGTH(?2)+1) includes the '/' of the path */
1613 UPDATE nodes SET repos_id = ?4,
1614                  repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
1615                  revision = ?6
1616 WHERE wc_id = ?1
1617   AND (local_relpath = ?2
1618        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1619   AND op_depth = ?3
1620
1621 -- STMT_HAS_LAYER_BETWEEN
1622 SELECT 1 FROM NODES
1623 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1624
1625 -- STMT_SELECT_REPOS_PATH_REVISION
1626 SELECT local_relpath, repos_path, revision FROM nodes
1627 WHERE wc_id = ?1
1628   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1629   AND op_depth = 0
1630 ORDER BY local_relpath
1631
1632 -- STMT_SELECT_HAS_NON_FILE_CHILDREN
1633 SELECT 1 FROM nodes
1634 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != MAP_FILE
1635
1636 -- STMT_SELECT_HAS_GRANDCHILDREN
1637 SELECT 1 FROM nodes
1638 WHERE wc_id = ?1
1639   AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1640   AND op_depth = 0
1641   AND file_external IS NULL
1642
1643 /* ------------------------------------------------------------------------- */
1644
1645 /* Queries for verification. */
1646
1647 -- STMT_SELECT_ALL_NODES
1648 SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1649 WHERE wc_id = ?1
1650
1651 /* ------------------------------------------------------------------------- */
1652
1653 /* Queries for cached inherited properties. */
1654
1655 /* Select the inherited properties of a single base node. */
1656 -- STMT_SELECT_IPROPS
1657 SELECT inherited_props FROM nodes
1658 WHERE wc_id = ?1
1659   AND local_relpath = ?2
1660   AND op_depth = 0
1661
1662 /* Update the inherited properties of a single base node. */
1663 -- STMT_UPDATE_IPROP
1664 UPDATE nodes
1665 SET inherited_props = ?3
1666 WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
1667
1668 /* Select a single path if its base node has cached inherited properties. */
1669 -- STMT_SELECT_IPROPS_NODE
1670 SELECT local_relpath, repos_path FROM nodes
1671 WHERE wc_id = ?1
1672   AND local_relpath = ?2
1673   AND op_depth = 0
1674   AND (inherited_props not null)
1675
1676 /* Select all paths whose base nodes are below a given path, which
1677    have cached inherited properties. */
1678 -- STMT_SELECT_IPROPS_RECURSIVE
1679 SELECT local_relpath, repos_path FROM nodes
1680 WHERE wc_id = ?1
1681   AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1682   AND op_depth = 0
1683   AND (inherited_props not null)
1684
1685 -- STMT_SELECT_IPROPS_CHILDREN
1686 SELECT local_relpath, repos_path FROM nodes
1687 WHERE wc_id = ?1
1688   AND parent_relpath = ?2
1689   AND op_depth = 0
1690   AND (inherited_props not null)
1691
1692 /* ------------------------------------------------------------------------- */
1693
1694 /* Grab all the statements related to the schema.  */
1695
1696 -- include: wc-metadata
1697 -- include: wc-checks