1 /* wc-queries.sql -- queries used to interact with the wc-metadata
3 * This is intended for use with SQLite 3
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
14 * http://www.apache.org/licenses/LICENSE-2.0
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
22 * ====================================================================
25 /* ------------------------------------------------------------------------- */
27 /* these are used in wc_db.c */
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,
35 WHERE wc_id = ?1 AND local_relpath = ?2
36 ORDER BY op_depth DESC
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,
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
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
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
58 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
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
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
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
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
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
88 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0
89 ORDER BY op_depth DESC
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
97 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
99 -- STMT_SELECT_LOWEST_WORKING_NODE
100 SELECT op_depth, presence, kind, moved_to
102 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
106 -- STMT_SELECT_HIGHEST_WORKING_NODE
109 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3
110 ORDER BY op_depth DESC
113 -- STMT_SELECT_ACTUAL_NODE
114 SELECT changelist, properties, conflict_data
116 WHERE wc_id = ?1 AND local_relpath = ?2
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
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
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
132 -- STMT_SELECT_NODE_CHILDREN_WALKER_INFO
133 SELECT local_relpath, op_depth, presence, kind
135 WHERE wc_id = ?1 AND parent_relpath = ?2
137 -- STMT_SELECT_ACTUAL_CHILDREN_INFO
138 SELECT local_relpath, changelist, properties, conflict_data
140 WHERE wc_id = ?1 AND parent_relpath = ?2
142 -- STMT_SELECT_REPOSITORY_BY_ID
143 SELECT root, uuid FROM repository WHERE id = ?1
145 -- STMT_SELECT_WCROOT_NULL
146 SELECT id FROM wcroot WHERE local_abspath IS NULL
148 -- STMT_SELECT_REPOSITORY
149 SELECT id FROM repository WHERE root = ?1
151 -- STMT_INSERT_REPOSITORY
152 INSERT INTO repository (root, uuid) VALUES (?1, ?2)
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,
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)
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)
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
172 ORDER BY local_relpath DESC
174 -- STMT_SELECT_WORKING_PRESENT
175 SELECT local_relpath, kind, checksum, translated_size, last_mod_time
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)
183 AND w.local_relpath = n.local_relpath)
184 ORDER BY local_relpath DESC
186 -- STMT_DELETE_NODE_RECURSIVE
189 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
194 WHERE wc_id = ?1 AND local_relpath = ?2
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
203 AND b.local_relpath = actual_node.local_relpath
205 AND NOT EXISTS(SELECT 1 FROM NODES w
207 AND w.local_relpath = actual_node.local_relpath
209 AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT))
211 -- STMT_DELETE_WORKING_BASE_DELETE
213 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
214 AND presence = MAP_BASE_DELETED
216 AND op_depth = (SELECT MIN(op_depth) FROM nodes n
218 AND n.local_relpath = nodes.local_relpath
221 -- STMT_DELETE_WORKING_RECURSIVE
223 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
226 -- STMT_DELETE_BASE_RECURSIVE
228 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
231 -- STMT_DELETE_WORKING_OP_DEPTH
234 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
237 -- STMT_DELETE_WORKING_OP_DEPTH_ABOVE
240 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
243 -- STMT_SELECT_LOCAL_RELPATH_OP_DEPTH
247 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
250 -- STMT_SELECT_CHILDREN_OP_DEPTH
251 SELECT local_relpath, kind
254 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
256 ORDER BY local_relpath DESC
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 )
265 wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
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
272 AND dst.local_relpath = ?4
273 AND dst.op_depth = ?5)
275 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
277 -- STMT_SELECT_OP_DEPTH_CHILDREN
278 SELECT local_relpath, kind FROM nodes
280 AND parent_relpath = ?2
282 AND presence != MAP_BASE_DELETED
283 AND file_external is NULL
285 /* Used by non-recursive revert to detect higher level children, and
286 actual-only rows that would be left orphans, if the revert
288 -- STMT_SELECT_GE_OP_DEPTH_CHILDREN
290 WHERE wc_id = ?1 AND parent_relpath = ?2
291 AND (op_depth > ?3 OR (op_depth = ?3 AND presence != MAP_BASE_DELETED))
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)
298 /* Delete the nodes shadowed by local_relpath. Not valid for the wc-root */
299 -- STMT_DELETE_SHADOWED_RECURSIVE
302 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
304 OR (op_depth = ?3 AND presence = MAP_BASE_DELETED))
306 -- STMT_CLEAR_MOVED_TO_FROM_DEST
307 UPDATE NODES SET moved_to = NULL
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
318 -- STMT_COMMIT_DESCENDANTS_TO_BASE
319 UPDATE NODES SET op_depth = 0,
321 repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
325 presence = CASE presence
326 WHEN MAP_NORMAL THEN MAP_NORMAL
327 WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
331 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
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
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)
350 (op_depth = (SELECT MAX(op_depth) FROM nodes
351 WHERE wc_id = ?1 AND local_relpath = ?2)
352 AND presence != MAP_BASE_DELETED))
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
359 -- STMT_SELECT_ACTUAL_PROPS
360 SELECT properties FROM actual_node
361 WHERE wc_id = ?1 AND local_relpath = ?2
363 -- STMT_UPDATE_ACTUAL_PROPS
364 UPDATE actual_node SET properties = ?3
365 WHERE wc_id = ?1 AND local_relpath = ?2
367 -- STMT_INSERT_ACTUAL_PROPS
368 INSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties)
369 VALUES (?1, ?2, ?3, ?4)
372 INSERT OR REPLACE INTO lock
373 (repos_id, repos_relpath, lock_token, lock_owner, lock_comment,
375 VALUES (?1, ?2, ?3, ?4, ?5, ?6)
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
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)
386 -- STMT_INSERT_WCROOT
387 INSERT INTO wcroot (local_abspath)
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
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
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
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
420 -- STMT_SELECT_OP_DEPTH_MOVED_TO
421 SELECT op_depth, moved_to, repos_path, revision
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
428 -- STMT_SELECT_MOVED_TO
431 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
433 -- STMT_SELECT_MOVED_HERE
434 SELECT moved_here, presence, repos_path, revision
436 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3
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
445 LEFT OUTER JOIN nodes l ON l.wc_id = ?1
446 AND l.local_relpath = u.local_relpath
449 AND u.local_relpath = ?2
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,
457 LEFT OUTER JOIN nodes l ON l.wc_id=?1
458 AND l.local_relpath=u.local_relpath
461 AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
464 -- STMT_DELETE_MOVED_BACK
467 AND (local_relpath = ?2
468 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
473 WHERE repos_id = ?1 AND repos_relpath = ?2
475 -- STMT_DELETE_LOCK_RECURSIVELY
477 WHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2))
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))
485 -- STMT_RECURSIVE_UPDATE_NODE_REPO
486 UPDATE nodes SET repos_id = ?4, dav_cache = NULL
487 /* ### The Sqlite optimizer needs help here ###
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)
497 -- STMT_UPDATE_LOCK_REPOS_ID
498 UPDATE lock SET repos_id = ?2
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)
507 -- STMT_INSERT_ACTUAL_CONFLICT
508 INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
509 VALUES (?1, ?2, ?3, ?4)
511 -- STMT_UPDATE_ACTUAL_CONFLICT
512 UPDATE actual_node SET conflict_data = ?3
513 WHERE wc_id = ?1 AND local_relpath = ?2
515 -- STMT_UPDATE_ACTUAL_CHANGELISTS
516 UPDATE actual_node SET changelist = ?3
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
521 AND t.local_relpath = actual_node.local_relpath
524 -- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST
525 UPDATE actual_node SET changelist = NULL
526 WHERE wc_id = ?1 AND local_relpath = ?2
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
534 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
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)
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)
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.
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
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;
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;
574 -- STMT_FINALIZE_CHANGELIST
575 DROP TRIGGER trigger_changelist_list_change;
576 DROP TABLE changelist_list;
577 DROP TABLE targets_list
579 -- STMT_SELECT_CHANGELIST_LIST
580 SELECT wc_id, local_relpath, notify, changelist
582 ORDER BY wc_id, local_relpath ASC, notify DESC
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,
591 PRIMARY KEY (wc_id, local_relpath)
593 /* need more indicies? */
595 -- STMT_DROP_TARGETS_LIST
596 DROP TABLE targets_list
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
603 AND local_relpath = ?2
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
610 AND parent_relpath = ?2
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
618 AND parent_relpath = ?2
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
625 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
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
633 AND N.local_relpath = ?2
634 AND A.changelist = ?3
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
642 AND N.parent_relpath = ?2
644 AND A.changelist = ?3
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
652 AND N.parent_relpath = ?2
653 AND A.changelist = ?3
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
661 AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
662 AND A.changelist = ?3
664 /* Only used by commented dump_targets() in wc_db.c */
665 /*-- STMT_SELECT_TARGETS
666 SELECT local_relpath, parent_relpath from targets_list*/
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
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
681 AND older_checksum IS NULL
682 AND right_checksum IS NULL
683 AND left_checksum IS NULL
685 -- STMT_DELETE_ACTUAL_EMPTIES
686 DELETE FROM actual_node
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
693 AND older_checksum IS NULL
694 AND right_checksum IS NULL
695 AND left_checksum IS NULL
697 -- STMT_DELETE_BASE_NODE
699 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
701 -- STMT_DELETE_WORKING_NODE
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)
707 -- STMT_DELETE_LOWEST_WORKING_NODE
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
714 -- STMT_DELETE_ALL_LAYERS
716 WHERE wc_id = ?1 AND local_relpath = ?2
718 -- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE
721 AND (local_relpath = ?2
722 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
725 -- STMT_DELETE_ACTUAL_NODE
726 DELETE FROM actual_node
727 WHERE wc_id = ?1 AND local_relpath = ?2
729 /* Will not delete recursive when run on the wcroot */
730 -- STMT_DELETE_ACTUAL_NODE_RECURSIVE
731 DELETE FROM actual_node
733 AND (local_relpath = ?2
734 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
736 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST
737 DELETE FROM actual_node
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))
745 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
746 DELETE FROM actual_node
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
753 AND c.local_relpath = actual_node.local_relpath
754 AND c.kind = MAP_FILE))
756 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST
758 SET properties = 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
767 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
769 SET properties = NULL,
771 conflict_data = NULL,
772 tree_conflict_data = NULL,
773 older_checksum = NULL,
774 left_checksum = NULL,
775 right_checksum = NULL
777 AND (local_relpath = ?2
778 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
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
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
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
793 -- STMT_LOOK_FOR_WORK
794 SELECT id FROM work_queue LIMIT 1
796 -- STMT_INSERT_WORK_ITEM
797 INSERT INTO work_queue (work) VALUES (?1)
799 -- STMT_SELECT_WORK_ITEM
800 SELECT id, work FROM work_queue ORDER BY id LIMIT 1
802 -- STMT_DELETE_WORK_ITEM
803 DELETE FROM work_queue WHERE id = ?1
805 -- STMT_INSERT_OR_IGNORE_PRISTINE
806 INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
807 VALUES (?1, ?2, ?3, 0)
809 -- STMT_INSERT_PRISTINE
810 INSERT INTO pristine (checksum, md5_checksum, size, refcount)
811 VALUES (?1, ?2, ?3, 0)
813 -- STMT_SELECT_PRISTINE
818 -- STMT_SELECT_PRISTINE_SIZE
821 WHERE checksum = ?1 LIMIT 1
823 -- STMT_SELECT_PRISTINE_BY_MD5
826 WHERE md5_checksum = ?1
828 -- STMT_SELECT_UNREFERENCED_PRISTINES
833 -- STMT_DELETE_PRISTINE_IF_UNREFERENCED
835 WHERE checksum = ?1 AND refcount = 0
837 -- STMT_SELECT_COPY_PRISTINES
838 /* For the root itself */
839 SELECT n.checksum, md5_checksum, size
841 LEFT JOIN pristine p ON n.checksum = p.checksum
843 AND n.local_relpath = ?2
844 AND n.checksum IS NOT NULL
846 /* And all descendants */
847 SELECT n.checksum, md5_checksum, size
849 LEFT JOIN pristine p ON n.checksum = p.checksum
851 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
853 (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
854 AND n.checksum IS NOT NULL
859 -- STMT_SELECT_CONFLICT_VICTIMS
860 SELECT local_relpath, conflict_data
862 WHERE wc_id = ?1 AND parent_relpath = ?2 AND
863 NOT (conflict_data IS NULL)
865 -- STMT_INSERT_WC_LOCK
866 INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels)
869 -- STMT_SELECT_WC_LOCK
870 SELECT locked_levels FROM wc_lock
871 WHERE wc_id = ?1 AND local_dir_relpath = ?2
873 -- STMT_SELECT_ANCESTOR_WCLOCKS
874 SELECT local_dir_relpath, locked_levels FROM wc_lock
876 AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2)
877 OR local_dir_relpath = '')
879 -- STMT_DELETE_WC_LOCK
881 WHERE wc_id = ?1 AND local_dir_relpath = ?2
884 SELECT local_dir_relpath FROM wc_lock
886 AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
888 -- STMT_DELETE_WC_LOCK_ORPHAN
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)
895 -- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE
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)
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 )
914 ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17,
915 (SELECT file_external FROM nodes
917 AND local_relpath = ?2
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)
926 -- STMT_DELETE_NO_LOWER_LAYER
929 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
931 AND NOT EXISTS (SELECT 1 FROM nodes n
933 AND n.local_relpath = nodes.local_relpath
935 AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE))
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
944 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
947 /* If this query is updated, STMT_INSERT_DELETE_LIST should too. */
948 -- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
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,
955 AND (local_relpath = ?2
956 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
958 AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
959 AND file_external IS NULL
961 -- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
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,
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
972 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
974 -- STMT_INSERT_DELETE_FROM_BASE
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
980 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
982 /* Not valid on the wc-root */
983 -- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE
984 UPDATE nodes SET op_depth = ?3 + 1
986 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
989 -- STMT_UPDATE_OP_DEPTH_RECURSIVE
990 UPDATE nodes SET op_depth = ?4, moved_here = NULL
992 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
995 -- STMT_DOES_NODE_EXIST
996 SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
999 -- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS
1000 SELECT local_relpath FROM nodes
1002 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1003 AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED
1006 /* Select all excluded nodes. Not valid on the WC-root */
1007 -- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS
1008 SELECT local_relpath FROM nodes
1010 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1012 AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED)
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)
1031 WHERE wc_id = ?1 AND local_relpath = ?2
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)
1049 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7
1051 -- STMT_UPDATE_BASE_REVISION
1052 UPDATE nodes SET revision = ?3
1053 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
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
1059 -- STMT_ACTUAL_HAS_CHILDREN
1060 SELECT 1 FROM actual_node
1061 WHERE wc_id = ?1 AND parent_relpath = ?2
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)
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
1076 -- STMT_DELETE_FILE_EXTERNALS
1079 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1081 AND file_external IS NOT NULL
1083 -- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS
1084 DELETE FROM externals
1086 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1089 -- STMT_DELETE_EXTERNAL_REGISTATIONS
1090 DELETE FROM externals
1092 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
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.
1101 * ?2: the target path, local relpath inside ?1.
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)
1111 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1112 AND def_revision IS NULL
1113 AND repos_id = (SELECT repos_id
1116 AND n.local_relpath = ''
1119 OR EXISTS (SELECT 1 FROM nodes
1120 WHERE nodes.wc_id = e.wc_id
1121 AND nodes.local_relpath = e.parent_relpath))
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)
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
1134 AND n.local_relpath = ''
1137 OR EXISTS (SELECT 1 FROM nodes
1138 WHERE nodes.wc_id = e.wc_id
1139 AND nodes.local_relpath = e.parent_relpath))
1141 -- STMT_SELECT_EXTERNALS_DEFINED
1142 SELECT local_relpath, def_local_relpath
1144 /* ### The Sqlite optimizer needs help here ###
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))
1151 -- STMT_DELETE_EXTERNAL
1152 DELETE FROM externals
1153 WHERE wc_id = ?1 AND local_relpath = ?2
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),
1160 * local_relpath, depth
1161 * FROM nodes_current n
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),
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)
1176 SELECT IFNULL((SELECT properties FROM actual_node a
1177 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
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)
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),
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))
1194 -- STMT_PRAGMA_LOCKING_MODE
1195 PRAGMA locking_mode = exclusive
1197 /* ------------------------------------------------------------------------- */
1199 /* these are used in entries.c */
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)
1206 /* ------------------------------------------------------------------------- */
1208 /* these are used in upgrade.c */
1210 -- STMT_UPDATE_ACTUAL_CONFLICT_DATA
1211 UPDATE actual_node SET conflict_data = ?3
1212 WHERE wc_id = ?1 AND local_relpath = ?2
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)
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
1222 -- STMT_UPDATE_NODE_PROPS
1223 UPDATE nodes SET properties = ?4
1224 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1226 -- STMT_PRAGMA_TABLE_INFO_NODES
1227 PRAGMA table_info("NODES")
1229 /* --------------------------------------------------------------------------
1230 * Complex queries for callback walks, caching results in a temporary table.
1232 * These target table are then used for joins against NODES, or for reporting
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,
1243 CREATE UNIQUE INDEX temp__node_props_cache_unique
1244 ON temp__node_props_cache (local_relpath) */
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),
1253 FROM targets_list AS t
1256 AND n.local_relpath = t.local_relpath
1257 AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1259 AND n3.local_relpath = t.local_relpath)
1261 AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1262 ORDER BY t.local_relpath
1264 -- STMT_CACHE_TARGET_PRISTINE_PROPS
1265 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1266 SELECT n.local_relpath, n.kind,
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 */)
1275 FROM targets_list AS t
1278 AND n.local_relpath = t.local_relpath
1279 AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1281 AND n3.local_relpath = t.local_relpath)
1283 AND (presence = MAP_NORMAL
1284 OR presence = MAP_INCOMPLETE
1285 OR presence = MAP_BASE_DELETED)
1286 ORDER BY t.local_relpath
1288 -- STMT_SELECT_ALL_TARGET_PROP_CACHE
1289 SELECT local_relpath, properties FROM target_prop_cache
1290 ORDER BY local_relpath
1292 -- STMT_DROP_TARGET_PROP_CACHE
1293 DROP TABLE target_prop_cache;
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 */
1302 notify INTEGER, /* 1 if an actual row had props or tree conflict */
1306 PRIMARY KEY (local_relpath, actual)
1308 DROP TRIGGER IF EXISTS trigger_revert_list_nodes;
1309 CREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1310 BEFORE DELETE ON nodes
1312 INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1314 SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
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
1320 INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1322 SELECT OLD.local_relpath, 1, OLD.conflict_data,
1324 WHEN OLD.properties IS NOT NULL
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)
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
1337 INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1339 SELECT OLD.local_relpath, 1, OLD.conflict_data,
1341 WHEN OLD.properties IS NOT NULL
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)
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
1356 -- STMT_SELECT_REVERT_LIST
1357 SELECT actual, notify, kind, op_depth, repos_id, conflict_data
1359 WHERE local_relpath = ?1
1360 ORDER BY actual DESC
1362 -- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1363 SELECT local_relpath, kind
1365 WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1367 AND repos_id IS NOT NULL
1368 ORDER BY local_relpath
1370 -- STMT_DELETE_REVERT_LIST
1371 DELETE FROM revert_list WHERE local_relpath = ?1
1373 -- STMT_SELECT_REVERT_LIST_RECURSIVE
1374 SELECT DISTINCT local_relpath
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
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))
1386 -- STMT_DROP_REVERT_LIST
1387 DROP TABLE IF EXISTS revert_list
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
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
1403 AND (local_relpath = ?2
1404 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1406 AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
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
1412 -- STMT_SELECT_DELETE_LIST
1413 SELECT local_relpath FROM delete_list
1414 ORDER BY local_relpath
1416 -- STMT_FINALIZE_DELETE
1417 DROP TABLE IF EXISTS delete_list
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
1431 -- STMT_INSERT_UPDATE_MOVE_LIST
1432 INSERT INTO update_move_list(local_relpath, action, kind, content_state,
1434 VALUES (?1, ?2, ?3, ?4, ?5)
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
1441 -- STMT_FINALIZE_UPDATE_MOVE
1442 DROP TABLE IF EXISTS update_move_list
1444 /* ------------------------------------------------------------------------- */
1446 /* Queries for revision status. */
1448 -- STMT_SELECT_MIN_MAX_REVISIONS
1449 SELECT MIN(revision), MAX(revision),
1450 MIN(changed_revision), MAX(changed_revision) FROM nodes
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
1458 -- STMT_HAS_SPARSE_NODES
1461 AND (local_relpath = ?2
1462 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
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
1469 -- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1472 AND (local_relpath = ?2
1473 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1477 -- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1478 SELECT 1 FROM actual_node
1480 AND (local_relpath = ?2
1481 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1482 AND properties IS NOT NULL
1485 -- STMT_HAS_SWITCHED
1489 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
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)
1496 -- STMT_SELECT_BASE_FILES_RECURSIVE
1497 SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n
1499 AND (local_relpath = ?2
1500 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1503 AND presence=MAP_NORMAL
1504 AND file_external IS NULL
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
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
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
1519 -- STMT_CLEAR_MOVED_HERE_RECURSIVE
1520 UPDATE nodes SET moved_here = NULL
1522 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
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)
1533 -- STMT_SELECT_MOVED_FOR_DELETE
1534 SELECT local_relpath, moved_to, op_depth FROM nodes
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
1540 AND o.local_relpath = ?2)
1542 -- STMT_UPDATE_MOVED_TO_DESCENDANTS
1543 UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1545 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1547 -- STMT_CLEAR_MOVED_TO_DESCENDANTS
1548 UPDATE nodes SET moved_to = NULL
1550 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
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
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
1564 AND o.local_relpath = ?2)
1566 -- STMT_SELECT_MOVED_PAIR3
1567 SELECT local_relpath, moved_to, op_depth, kind FROM nodes
1569 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1571 AND moved_to IS NOT NULL
1573 -- STMT_SELECT_MOVED_OUTSIDE
1574 SELECT local_relpath, moved_to FROM nodes
1576 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1578 AND moved_to IS NOT NULL
1579 AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
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)
1589 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1591 AND n.moved_to IS NOT NULL
1593 -- STMT_SELECT_MOVED_DESCENDANTS
1594 SELECT n.local_relpath, h.moved_to
1595 FROM nodes n, nodes h
1598 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1599 AND h.local_relpath = n.local_relpath
1601 AND h.op_depth = (SELECT MIN(o.op_depth)
1604 AND o.local_relpath = n.local_relpath
1605 AND o.op_depth > ?3)
1606 AND h.moved_to IS NOT NULL
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.
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),
1617 AND (local_relpath = ?2
1618 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1621 -- STMT_HAS_LAYER_BETWEEN
1623 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1625 -- STMT_SELECT_REPOS_PATH_REVISION
1626 SELECT local_relpath, repos_path, revision FROM nodes
1628 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1630 ORDER BY local_relpath
1632 -- STMT_SELECT_HAS_NON_FILE_CHILDREN
1634 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != MAP_FILE
1636 -- STMT_SELECT_HAS_GRANDCHILDREN
1639 AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1641 AND file_external IS NULL
1643 /* ------------------------------------------------------------------------- */
1645 /* Queries for verification. */
1647 -- STMT_SELECT_ALL_NODES
1648 SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1651 /* ------------------------------------------------------------------------- */
1653 /* Queries for cached inherited properties. */
1655 /* Select the inherited properties of a single base node. */
1656 -- STMT_SELECT_IPROPS
1657 SELECT inherited_props FROM nodes
1659 AND local_relpath = ?2
1662 /* Update the inherited properties of a single base node. */
1663 -- STMT_UPDATE_IPROP
1665 SET inherited_props = ?3
1666 WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
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
1672 AND local_relpath = ?2
1674 AND (inherited_props not null)
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
1681 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1683 AND (inherited_props not null)
1685 -- STMT_SELECT_IPROPS_CHILDREN
1686 SELECT local_relpath, repos_path FROM nodes
1688 AND parent_relpath = ?2
1690 AND (inherited_props not null)
1692 /* ------------------------------------------------------------------------- */
1694 /* Grab all the statements related to the schema. */
1696 -- include: wc-metadata
1697 -- include: wc-checks