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 AND op_depth = ?3
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_MOVED_TO_NODE
421 SELECT op_depth, moved_to
423 WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL
424 ORDER BY op_depth DESC
426 -- STMT_SELECT_OP_DEPTH_MOVED_TO
427 SELECT op_depth, moved_to, repos_path, revision
429 WHERE wc_id = ?1 AND local_relpath = ?2
430 AND op_depth <= (SELECT MIN(op_depth) FROM nodes
431 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
432 ORDER BY op_depth DESC
434 -- STMT_SELECT_MOVED_TO
437 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
439 -- STMT_SELECT_MOVED_HERE
440 SELECT moved_here, presence, repos_path, revision
442 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3
445 -- STMT_SELECT_MOVED_BACK
446 SELECT u.local_relpath,
447 u.presence, u.repos_id, u.repos_path, u.revision,
448 l.presence, l.repos_id, l.repos_path, l.revision,
449 u.moved_here, u.moved_to
451 LEFT OUTER JOIN nodes l ON l.wc_id = ?1
452 AND l.local_relpath = u.local_relpath
455 AND u.local_relpath = ?2
458 SELECT u.local_relpath,
459 u.presence, u.repos_id, u.repos_path, u.revision,
460 l.presence, l.repos_id, l.repos_path, l.revision,
463 LEFT OUTER JOIN nodes l ON l.wc_id=?1
464 AND l.local_relpath=u.local_relpath
467 AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
470 -- STMT_DELETE_MOVED_BACK
473 AND (local_relpath = ?2
474 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
479 WHERE repos_id = ?1 AND repos_relpath = ?2
481 -- STMT_DELETE_LOCK_RECURSIVELY
483 WHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2))
485 -- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE
486 UPDATE nodes SET dav_cache = NULL
487 WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0
488 AND (local_relpath = ?2
489 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
491 -- STMT_RECURSIVE_UPDATE_NODE_REPO
492 UPDATE nodes SET repos_id = ?4, dav_cache = NULL
493 /* ### The Sqlite optimizer needs help here ###
496 * AND (local_relpath = ?2
497 * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/
498 WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3)
499 OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
503 -- STMT_UPDATE_LOCK_REPOS_ID
504 UPDATE lock SET repos_id = ?2
507 -- STMT_UPDATE_NODE_FILEINFO
508 UPDATE nodes SET translated_size = ?3, last_mod_time = ?4
509 WHERE wc_id = ?1 AND local_relpath = ?2
510 AND op_depth = (SELECT MAX(op_depth) FROM nodes
511 WHERE wc_id = ?1 AND local_relpath = ?2)
513 -- STMT_INSERT_ACTUAL_CONFLICT
514 INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
515 VALUES (?1, ?2, ?3, ?4)
517 -- STMT_UPDATE_ACTUAL_CONFLICT
518 UPDATE actual_node SET conflict_data = ?3
519 WHERE wc_id = ?1 AND local_relpath = ?2
521 -- STMT_UPDATE_ACTUAL_CHANGELISTS
522 UPDATE actual_node SET changelist = ?3
524 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
525 AND local_relpath = (SELECT local_relpath FROM targets_list AS t
527 AND t.local_relpath = actual_node.local_relpath
530 -- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST
531 UPDATE actual_node SET changelist = NULL
532 WHERE wc_id = ?1 AND local_relpath = ?2
534 -- STMT_MARK_SKIPPED_CHANGELIST_DIRS
535 /* 7 corresponds to svn_wc_notify_skip */
536 INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist)
537 SELECT wc_id, local_relpath, 7, ?3
540 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
543 -- STMT_RESET_ACTUAL_WITH_CHANGELIST
544 REPLACE INTO actual_node (
545 wc_id, local_relpath, parent_relpath, changelist)
546 VALUES (?1, ?2, ?3, ?4)
548 -- STMT_CREATE_CHANGELIST_LIST
549 DROP TABLE IF EXISTS changelist_list;
550 CREATE TEMPORARY TABLE changelist_list (
551 wc_id INTEGER NOT NULL,
552 local_relpath TEXT NOT NULL,
553 notify INTEGER NOT NULL,
554 changelist TEXT NOT NULL,
555 /* Order NOTIFY descending to make us show clears (27) before adds (26) */
556 PRIMARY KEY (wc_id, local_relpath, notify DESC)
559 /* Create notify items for when a node is removed from a changelist and
560 when a node is added to a changelist. Make sure nothing is notified
561 if there were no changes.
563 -- STMT_CREATE_CHANGELIST_TRIGGER
564 DROP TRIGGER IF EXISTS trigger_changelist_list_change;
565 CREATE TEMPORARY TRIGGER trigger_changelist_list_change
566 BEFORE UPDATE ON actual_node
567 WHEN old.changelist IS NOT new.changelist
569 /* 27 corresponds to svn_wc_notify_changelist_clear */
570 INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
571 SELECT old.wc_id, old.local_relpath, 27, old.changelist
572 WHERE old.changelist is NOT NULL;
574 /* 26 corresponds to svn_wc_notify_changelist_set */
575 INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
576 SELECT new.wc_id, new.local_relpath, 26, new.changelist
577 WHERE new.changelist IS NOT NULL;
580 -- STMT_FINALIZE_CHANGELIST
581 DROP TRIGGER trigger_changelist_list_change;
582 DROP TABLE changelist_list;
583 DROP TABLE targets_list
585 -- STMT_SELECT_CHANGELIST_LIST
586 SELECT wc_id, local_relpath, notify, changelist
588 ORDER BY wc_id, local_relpath ASC, notify DESC
590 -- STMT_CREATE_TARGETS_LIST
591 DROP TABLE IF EXISTS targets_list;
592 CREATE TEMPORARY TABLE targets_list (
593 wc_id INTEGER NOT NULL,
594 local_relpath TEXT NOT NULL,
597 PRIMARY KEY (wc_id, local_relpath)
599 /* need more indicies? */
601 -- STMT_DROP_TARGETS_LIST
602 DROP TABLE targets_list
604 -- STMT_INSERT_TARGET
605 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
606 SELECT wc_id, local_relpath, parent_relpath, kind
609 AND local_relpath = ?2
611 -- STMT_INSERT_TARGET_DEPTH_FILES
612 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
613 SELECT wc_id, local_relpath, parent_relpath, kind
616 AND parent_relpath = ?2
619 -- STMT_INSERT_TARGET_DEPTH_IMMEDIATES
620 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
621 SELECT wc_id, local_relpath, parent_relpath, kind
624 AND parent_relpath = ?2
626 -- STMT_INSERT_TARGET_DEPTH_INFINITY
627 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
628 SELECT wc_id, local_relpath, parent_relpath, kind
631 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
633 -- STMT_INSERT_TARGET_WITH_CHANGELIST
634 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
635 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
636 FROM actual_node AS A JOIN nodes_current AS N
637 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
639 AND N.local_relpath = ?2
640 AND A.changelist = ?3
642 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES
643 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
644 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
645 FROM actual_node AS A JOIN nodes_current AS N
646 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
648 AND N.parent_relpath = ?2
650 AND A.changelist = ?3
652 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES
653 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
654 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
655 FROM actual_node AS A JOIN nodes_current AS N
656 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
658 AND N.parent_relpath = ?2
659 AND A.changelist = ?3
661 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY
662 INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
663 SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
664 FROM actual_node AS A JOIN nodes_current AS N
665 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
667 AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
668 AND A.changelist = ?3
670 /* Only used by commented dump_targets() in wc_db.c */
671 /*-- STMT_SELECT_TARGETS
672 SELECT local_relpath, parent_relpath from targets_list*/
674 -- STMT_INSERT_ACTUAL_EMPTIES
675 INSERT OR IGNORE INTO actual_node (
676 wc_id, local_relpath, parent_relpath)
677 SELECT wc_id, local_relpath, parent_relpath
680 -- STMT_DELETE_ACTUAL_EMPTY
681 DELETE FROM actual_node
682 WHERE wc_id = ?1 AND local_relpath = ?2
683 AND properties IS NULL
684 AND conflict_data IS NULL
685 AND changelist IS NULL
687 AND older_checksum IS NULL
688 AND right_checksum IS NULL
689 AND left_checksum IS NULL
691 -- STMT_DELETE_ACTUAL_EMPTIES
692 DELETE FROM actual_node
694 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
695 AND properties IS NULL
696 AND conflict_data IS NULL
697 AND changelist IS NULL
699 AND older_checksum IS NULL
700 AND right_checksum IS NULL
701 AND left_checksum IS NULL
703 -- STMT_DELETE_BASE_NODE
705 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
707 -- STMT_DELETE_WORKING_NODE
709 WHERE wc_id = ?1 AND local_relpath = ?2
710 AND op_depth = (SELECT MAX(op_depth) FROM nodes
711 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0)
713 -- STMT_DELETE_LOWEST_WORKING_NODE
715 WHERE wc_id = ?1 AND local_relpath = ?2
716 AND op_depth = (SELECT MIN(op_depth) FROM nodes
717 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
718 AND presence = MAP_BASE_DELETED
720 -- STMT_DELETE_NODE_ALL_LAYERS
722 WHERE wc_id = ?1 AND local_relpath = ?2
724 -- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE
727 AND (local_relpath = ?2
728 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
731 -- STMT_DELETE_ACTUAL_NODE
732 DELETE FROM actual_node
733 WHERE wc_id = ?1 AND local_relpath = ?2
735 /* Will not delete recursive when run on the wcroot */
736 -- STMT_DELETE_ACTUAL_NODE_RECURSIVE
737 DELETE FROM actual_node
739 AND (local_relpath = ?2
740 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
742 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST
743 DELETE FROM actual_node
745 AND local_relpath = ?2
746 AND (changelist IS NULL
747 OR NOT EXISTS (SELECT 1 FROM nodes_current c
748 WHERE c.wc_id = ?1 AND c.local_relpath = ?2
749 AND c.kind = MAP_FILE))
751 -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
752 DELETE FROM actual_node
754 AND (local_relpath = ?2
755 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
756 AND (changelist IS NULL
757 OR NOT EXISTS (SELECT 1 FROM nodes_current c
759 AND c.local_relpath = actual_node.local_relpath
760 AND c.kind = MAP_FILE))
762 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST
764 SET properties = NULL,
766 conflict_data = NULL,
767 tree_conflict_data = NULL,
768 older_checksum = NULL,
769 left_checksum = NULL,
770 right_checksum = NULL
771 WHERE wc_id = ?1 AND local_relpath = ?2
773 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
775 SET properties = NULL,
777 conflict_data = NULL,
778 tree_conflict_data = NULL,
779 older_checksum = NULL,
780 left_checksum = NULL,
781 right_checksum = NULL
783 AND (local_relpath = ?2
784 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
786 -- STMT_UPDATE_NODE_BASE_DEPTH
787 UPDATE nodes SET depth = ?3
788 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
791 -- STMT_UPDATE_NODE_BASE_PRESENCE
792 UPDATE nodes SET presence = ?3
793 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
795 -- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH
796 UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5
797 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
799 -- STMT_LOOK_FOR_WORK
800 SELECT id FROM work_queue LIMIT 1
802 -- STMT_INSERT_WORK_ITEM
803 INSERT INTO work_queue (work) VALUES (?1)
805 -- STMT_SELECT_WORK_ITEM
806 SELECT id, work FROM work_queue ORDER BY id LIMIT 1
808 -- STMT_DELETE_WORK_ITEM
809 DELETE FROM work_queue WHERE id = ?1
811 -- STMT_INSERT_OR_IGNORE_PRISTINE
812 INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
813 VALUES (?1, ?2, ?3, 0)
815 -- STMT_INSERT_PRISTINE
816 INSERT INTO pristine (checksum, md5_checksum, size, refcount)
817 VALUES (?1, ?2, ?3, 0)
819 -- STMT_SELECT_PRISTINE
824 -- STMT_SELECT_PRISTINE_SIZE
827 WHERE checksum = ?1 LIMIT 1
829 -- STMT_SELECT_PRISTINE_BY_MD5
832 WHERE md5_checksum = ?1
834 -- STMT_SELECT_UNREFERENCED_PRISTINES
839 -- STMT_DELETE_PRISTINE_IF_UNREFERENCED
841 WHERE checksum = ?1 AND refcount = 0
843 -- STMT_SELECT_COPY_PRISTINES
844 /* For the root itself */
845 SELECT n.checksum, md5_checksum, size
847 LEFT JOIN pristine p ON n.checksum = p.checksum
849 AND n.local_relpath = ?2
850 AND n.checksum IS NOT NULL
852 /* And all descendants */
853 SELECT n.checksum, md5_checksum, size
855 LEFT JOIN pristine p ON n.checksum = p.checksum
857 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
859 (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
860 AND n.checksum IS NOT NULL
865 -- STMT_SELECT_CONFLICT_VICTIMS
866 SELECT local_relpath, conflict_data
868 WHERE wc_id = ?1 AND parent_relpath = ?2 AND
869 NOT (conflict_data IS NULL)
871 -- STMT_INSERT_WC_LOCK
872 INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels)
875 -- STMT_SELECT_WC_LOCK
876 SELECT locked_levels FROM wc_lock
877 WHERE wc_id = ?1 AND local_dir_relpath = ?2
879 -- STMT_SELECT_ANCESTOR_WCLOCKS
880 SELECT local_dir_relpath, locked_levels FROM wc_lock
882 AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2)
883 OR local_dir_relpath = '')
885 -- STMT_DELETE_WC_LOCK
887 WHERE wc_id = ?1 AND local_dir_relpath = ?2
890 SELECT local_dir_relpath FROM wc_lock
892 AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
894 -- STMT_DELETE_WC_LOCK_ORPHAN
896 WHERE wc_id = ?1 AND local_dir_relpath = ?2
897 AND NOT EXISTS (SELECT 1 FROM nodes
898 WHERE nodes.wc_id = ?1
899 AND nodes.local_relpath = wc_lock.local_dir_relpath)
901 -- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE
904 AND (local_dir_relpath = ?2
905 OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2))
906 AND NOT EXISTS (SELECT 1 FROM nodes
907 WHERE nodes.wc_id = ?1
908 AND nodes.local_relpath = wc_lock.local_dir_relpath)
910 -- STMT_APPLY_CHANGES_TO_BASE_NODE
911 /* translated_size and last_mod_time are not mentioned here because they will
912 be tweaked after the working-file is installed. When we replace an existing
913 BASE node (read: bump), preserve its file_external status. */
914 INSERT OR REPLACE INTO nodes (
915 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
916 revision, presence, depth, kind, changed_revision, changed_date,
917 changed_author, checksum, properties, dav_cache, symlink_target,
918 inherited_props, file_external )
920 ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17,
921 (SELECT file_external FROM nodes
923 AND local_relpath = ?2
926 -- STMT_INSTALL_WORKING_NODE_FOR_DELETE
927 INSERT OR REPLACE INTO nodes (
928 wc_id, local_relpath, op_depth,
929 parent_relpath, presence, kind)
930 VALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5)
932 -- STMT_DELETE_NO_LOWER_LAYER
935 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
937 AND NOT EXISTS (SELECT 1 FROM nodes n
939 AND n.local_relpath = nodes.local_relpath
941 AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE))
943 -- STMT_REPLACE_WITH_BASE_DELETED
944 INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath,
945 kind, moved_to, presence)
946 SELECT wc_id, local_relpath, op_depth, parent_relpath,
947 kind, moved_to, MAP_BASE_DELETED
950 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
953 /* If this query is updated, STMT_INSERT_DELETE_LIST should too. */
954 -- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
956 wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
957 SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
961 AND (local_relpath = ?2
962 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
964 AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
965 AND file_external IS NULL
967 -- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
969 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
970 revision, presence, depth, kind, changed_revision, changed_date,
971 changed_author, checksum, properties, translated_size, last_mod_time,
973 SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id,
974 repos_path, revision, presence, depth, kind, changed_revision,
975 changed_date, changed_author, checksum, properties, translated_size,
976 last_mod_time, symlink_target
978 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
980 -- STMT_INSERT_DELETE_FROM_BASE
982 wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
983 SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath,
984 MAP_BASE_DELETED, kind
986 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
988 /* Not valid on the wc-root */
989 -- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE
990 UPDATE nodes SET op_depth = ?3 + 1
992 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
995 -- STMT_UPDATE_OP_DEPTH_RECURSIVE
996 UPDATE nodes SET op_depth = ?4, moved_here = NULL
998 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1001 -- STMT_DOES_NODE_EXIST
1002 SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
1005 -- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS
1006 SELECT local_relpath FROM nodes
1008 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1009 AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED
1012 /* Select all excluded nodes. Not valid on the WC-root */
1013 -- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS
1014 SELECT local_relpath FROM nodes
1016 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1018 AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED)
1020 /* Creates a copy from one top level NODE to a different location */
1021 -- STMT_INSERT_WORKING_NODE_COPY_FROM
1022 INSERT OR REPLACE INTO nodes (
1023 wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1024 repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1025 changed_date, changed_author, checksum, properties, translated_size,
1026 last_mod_time, symlink_target, moved_to )
1027 SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1028 repos_id, repos_path, revision, ?6 /*presence*/, depth,
1029 ?7/*moved_here*/, kind, changed_revision, changed_date,
1030 changed_author, checksum, properties, translated_size,
1031 last_mod_time, symlink_target,
1032 (SELECT dst.moved_to FROM nodes AS dst
1033 WHERE dst.wc_id = ?1
1034 AND dst.local_relpath = ?3
1035 AND dst.op_depth = ?4)
1037 WHERE wc_id = ?1 AND local_relpath = ?2
1039 -- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH
1040 INSERT OR REPLACE INTO nodes (
1041 wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1042 repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1043 changed_date, changed_author, checksum, properties, translated_size,
1044 last_mod_time, symlink_target, moved_to )
1045 SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1046 repos_id, repos_path, revision, ?6 /*presence*/, depth,
1047 ?8 /*moved_here*/, kind, changed_revision, changed_date,
1048 changed_author, checksum, properties, translated_size,
1049 last_mod_time, symlink_target,
1050 (SELECT dst.moved_to FROM nodes AS dst
1051 WHERE dst.wc_id = ?1
1052 AND dst.local_relpath = ?3
1053 AND dst.op_depth = ?4)
1055 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7
1057 -- STMT_UPDATE_BASE_REVISION
1058 UPDATE nodes SET revision = ?3
1059 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1061 -- STMT_UPDATE_BASE_REPOS
1062 UPDATE nodes SET repos_id = ?3, repos_path = ?4
1063 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1065 -- STMT_ACTUAL_HAS_CHILDREN
1066 SELECT 1 FROM actual_node
1067 WHERE wc_id = ?1 AND parent_relpath = ?2
1070 -- STMT_INSERT_EXTERNAL
1071 INSERT OR REPLACE INTO externals (
1072 wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath,
1073 repos_id, def_repos_relpath, def_operational_revision, def_revision)
1074 VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
1076 -- STMT_SELECT_EXTERNAL_INFO
1077 SELECT presence, kind, def_local_relpath, repos_id,
1078 def_repos_relpath, def_operational_revision, def_revision
1079 FROM externals WHERE wc_id = ?1 AND local_relpath = ?2
1082 -- STMT_DELETE_FILE_EXTERNALS
1085 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1087 AND file_external IS NOT NULL
1089 -- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS
1090 DELETE FROM externals
1092 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1095 -- STMT_DELETE_EXTERNAL_REGISTATIONS
1096 DELETE FROM externals
1098 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1100 /* Select all committable externals, i.e. only unpegged ones on the same
1101 * repository as the target path ?2, that are defined by WC ?1 to
1102 * live below the target path. It does not matter which ancestor has the
1103 * svn:externals definition, only the local path at which the external is
1104 * supposed to be checked out is queried.
1107 * ?2: the target path, local relpath inside ?1.
1109 * ### NOTE: This statement deliberately removes file externals that live
1110 * inside an unversioned dir, because commit still breaks on those.
1111 * Once that's been fixed, the conditions below "--->8---" become obsolete. */
1112 -- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW
1113 SELECT local_relpath, kind, def_repos_relpath,
1114 (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1117 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1118 AND def_revision IS NULL
1119 AND repos_id = (SELECT repos_id
1122 AND n.local_relpath = ''
1125 OR EXISTS (SELECT 1 FROM nodes
1126 WHERE nodes.wc_id = e.wc_id
1127 AND nodes.local_relpath = e.parent_relpath))
1129 -- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW
1130 SELECT local_relpath, kind, def_repos_relpath,
1131 (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1134 AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2)
1135 AND parent_relpath = ?2
1136 AND def_revision IS NULL
1137 AND repos_id = (SELECT repos_id
1140 AND n.local_relpath = ''
1143 OR EXISTS (SELECT 1 FROM nodes
1144 WHERE nodes.wc_id = e.wc_id
1145 AND nodes.local_relpath = e.parent_relpath))
1147 -- STMT_SELECT_EXTERNALS_DEFINED
1148 SELECT local_relpath, def_local_relpath
1150 /* ### The Sqlite optimizer needs help here ###
1152 * AND (def_local_relpath = ?2
1153 * OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */
1154 WHERE (wc_id = ?1 AND def_local_relpath = ?2)
1155 OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2))
1157 -- STMT_DELETE_EXTERNAL
1158 DELETE FROM externals
1159 WHERE wc_id = ?1 AND local_relpath = ?2
1161 -- STMT_SELECT_EXTERNAL_PROPERTIES
1162 /* ### It would be nice if Sqlite would handle
1163 * SELECT IFNULL((SELECT properties FROM actual_node a
1164 * WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1166 * local_relpath, depth
1167 * FROM nodes_current n
1169 * AND (local_relpath = ?2
1170 * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1171 * AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1172 * ### But it would take a double table scan execution plan for it.
1173 * ### Maybe there is something else going on? */
1174 SELECT IFNULL((SELECT properties FROM actual_node a
1175 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1177 local_relpath, depth
1178 FROM nodes_current n
1179 WHERE wc_id = ?1 AND local_relpath = ?2
1180 AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1182 SELECT IFNULL((SELECT properties FROM actual_node a
1183 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1185 local_relpath, depth
1186 FROM nodes_current n
1187 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1188 AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1190 -- STMT_SELECT_CURRENT_PROPS_RECURSIVE
1191 /* ### Ugly OR to make sqlite use the proper optimizations */
1192 SELECT IFNULL((SELECT properties FROM actual_node a
1193 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1196 FROM nodes_current n
1197 WHERE (wc_id = ?1 AND local_relpath = ?2)
1198 OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1200 -- STMT_PRAGMA_LOCKING_MODE
1201 PRAGMA locking_mode = exclusive
1203 /* ------------------------------------------------------------------------- */
1205 /* these are used in entries.c */
1207 -- STMT_INSERT_ACTUAL_NODE
1208 INSERT OR REPLACE INTO actual_node (
1209 wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data)
1210 VALUES (?1, ?2, ?3, ?4, ?5, ?6)
1212 /* ------------------------------------------------------------------------- */
1214 /* these are used in upgrade.c */
1216 -- STMT_UPDATE_ACTUAL_CONFLICT_DATA
1217 UPDATE actual_node SET conflict_data = ?3
1218 WHERE wc_id = ?1 AND local_relpath = ?2
1220 -- STMT_INSERT_ACTUAL_CONFLICT_DATA
1221 INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
1222 VALUES (?1, ?2, ?3, ?4)
1224 -- STMT_SELECT_ALL_FILES
1225 SELECT local_relpath FROM nodes_current
1226 WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
1228 -- STMT_UPDATE_NODE_PROPS
1229 UPDATE nodes SET properties = ?4
1230 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1232 -- STMT_PRAGMA_TABLE_INFO_NODES
1233 PRAGMA table_info("NODES")
1235 /* --------------------------------------------------------------------------
1236 * Complex queries for callback walks, caching results in a temporary table.
1238 * These target table are then used for joins against NODES, or for reporting
1241 -- STMT_CREATE_TARGET_PROP_CACHE
1242 DROP TABLE IF EXISTS target_prop_cache;
1243 CREATE TEMPORARY TABLE target_prop_cache (
1244 local_relpath TEXT NOT NULL PRIMARY KEY,
1249 CREATE UNIQUE INDEX temp__node_props_cache_unique
1250 ON temp__node_props_cache (local_relpath) */
1252 -- STMT_CACHE_TARGET_PROPS
1253 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1254 SELECT n.local_relpath, n.kind,
1255 IFNULL((SELECT properties FROM actual_node AS a
1256 WHERE a.wc_id = n.wc_id
1257 AND a.local_relpath = n.local_relpath),
1259 FROM targets_list AS t
1262 AND n.local_relpath = t.local_relpath
1263 AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1265 AND n3.local_relpath = t.local_relpath)
1267 AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1268 ORDER BY t.local_relpath
1270 -- STMT_CACHE_TARGET_PRISTINE_PROPS
1271 INSERT INTO target_prop_cache(local_relpath, kind, properties)
1272 SELECT n.local_relpath, n.kind,
1274 WHEN MAP_BASE_DELETED
1275 THEN (SELECT properties FROM nodes AS p
1276 WHERE p.wc_id = n.wc_id
1277 AND p.local_relpath = n.local_relpath
1278 AND p.op_depth < n.op_depth
1279 ORDER BY p.op_depth DESC /* LIMIT 1 */)
1281 FROM targets_list AS t
1284 AND n.local_relpath = t.local_relpath
1285 AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1287 AND n3.local_relpath = t.local_relpath)
1289 AND (presence = MAP_NORMAL
1290 OR presence = MAP_INCOMPLETE
1291 OR presence = MAP_BASE_DELETED)
1292 ORDER BY t.local_relpath
1294 -- STMT_SELECT_ALL_TARGET_PROP_CACHE
1295 SELECT local_relpath, properties FROM target_prop_cache
1296 ORDER BY local_relpath
1298 -- STMT_DROP_TARGET_PROP_CACHE
1299 DROP TABLE target_prop_cache;
1301 -- STMT_CREATE_REVERT_LIST
1302 DROP TABLE IF EXISTS revert_list;
1303 CREATE TEMPORARY TABLE revert_list (
1304 /* need wc_id if/when revert spans multiple working copies */
1305 local_relpath TEXT NOT NULL,
1306 actual INTEGER NOT NULL, /* 1 if an actual row, 0 if a nodes row */
1308 notify INTEGER, /* 1 if an actual row had props or tree conflict */
1312 PRIMARY KEY (local_relpath, actual)
1314 DROP TRIGGER IF EXISTS trigger_revert_list_nodes;
1315 CREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1316 BEFORE DELETE ON nodes
1318 INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1320 SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
1322 DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete;
1323 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
1324 BEFORE DELETE ON actual_node
1326 INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1328 SELECT OLD.local_relpath, 1, OLD.conflict_data,
1330 WHEN OLD.properties IS NOT NULL
1332 WHEN NOT EXISTS(SELECT 1 FROM NODES n
1333 WHERE n.wc_id = OLD.wc_id
1334 AND n.local_relpath = OLD.local_relpath)
1339 DROP TRIGGER IF EXISTS trigger_revert_list_actual_update;
1340 CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
1341 BEFORE UPDATE ON actual_node
1343 INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1345 SELECT OLD.local_relpath, 1, OLD.conflict_data,
1347 WHEN OLD.properties IS NOT NULL
1349 WHEN NOT EXISTS(SELECT 1 FROM NODES n
1350 WHERE n.wc_id = OLD.wc_id
1351 AND n.local_relpath = OLD.local_relpath)
1357 -- STMT_DROP_REVERT_LIST_TRIGGERS
1358 DROP TRIGGER trigger_revert_list_nodes;
1359 DROP TRIGGER trigger_revert_list_actual_delete;
1360 DROP TRIGGER trigger_revert_list_actual_update
1362 -- STMT_SELECT_REVERT_LIST
1363 SELECT actual, notify, kind, op_depth, repos_id, conflict_data
1365 WHERE local_relpath = ?1
1366 ORDER BY actual DESC
1368 -- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1369 SELECT local_relpath, kind
1371 WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1373 AND repos_id IS NOT NULL
1374 ORDER BY local_relpath
1376 -- STMT_DELETE_REVERT_LIST
1377 DELETE FROM revert_list WHERE local_relpath = ?1
1379 -- STMT_SELECT_REVERT_LIST_RECURSIVE
1380 SELECT DISTINCT local_relpath
1382 WHERE (local_relpath = ?1
1383 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1384 AND (notify OR actual = 0)
1385 ORDER BY local_relpath
1387 -- STMT_DELETE_REVERT_LIST_RECURSIVE
1388 DELETE FROM revert_list
1389 WHERE (local_relpath = ?1
1390 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1392 -- STMT_DROP_REVERT_LIST
1393 DROP TABLE IF EXISTS revert_list
1395 -- STMT_CREATE_DELETE_LIST
1396 DROP TABLE IF EXISTS delete_list;
1397 CREATE TEMPORARY TABLE delete_list (
1398 /* ### we should put the wc_id in here in case a delete spans multiple
1399 ### working copies. queries, etc will need to be adjusted. */
1400 local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE
1403 /* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE.
1404 A subquery is used instead of nodes_current to avoid a table scan */
1405 -- STMT_INSERT_DELETE_LIST
1406 INSERT INTO delete_list(local_relpath)
1407 SELECT local_relpath FROM nodes AS n
1409 AND (local_relpath = ?2
1410 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1412 AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
1414 AND s.local_relpath = n.local_relpath)
1415 AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1416 AND file_external IS NULL
1418 -- STMT_SELECT_DELETE_LIST
1419 SELECT local_relpath FROM delete_list
1420 ORDER BY local_relpath
1422 -- STMT_FINALIZE_DELETE
1423 DROP TABLE IF EXISTS delete_list
1425 -- STMT_CREATE_UPDATE_MOVE_LIST
1426 DROP TABLE IF EXISTS update_move_list;
1427 CREATE TEMPORARY TABLE update_move_list (
1428 /* ### we should put the wc_id in here in case a move update spans multiple
1429 ### working copies. queries, etc will need to be adjusted. */
1430 local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
1431 action INTEGER NOT NULL,
1432 kind INTEGER NOT NULL,
1433 content_state INTEGER NOT NULL,
1434 prop_state INTEGER NOT NULL
1437 -- STMT_INSERT_UPDATE_MOVE_LIST
1438 INSERT INTO update_move_list(local_relpath, action, kind, content_state,
1440 VALUES (?1, ?2, ?3, ?4, ?5)
1442 -- STMT_SELECT_UPDATE_MOVE_LIST
1443 SELECT local_relpath, action, kind, content_state, prop_state
1444 FROM update_move_list
1445 ORDER BY local_relpath
1447 -- STMT_FINALIZE_UPDATE_MOVE
1448 DROP TABLE IF EXISTS update_move_list
1450 /* ------------------------------------------------------------------------- */
1452 /* Queries for revision status. */
1454 -- STMT_SELECT_MIN_MAX_REVISIONS
1455 SELECT MIN(revision), MAX(revision),
1456 MIN(changed_revision), MAX(changed_revision) FROM nodes
1458 AND (local_relpath = ?2
1459 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1460 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1461 AND file_external IS NULL
1464 -- STMT_HAS_SPARSE_NODES
1467 AND (local_relpath = ?2
1468 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1470 AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED)
1471 OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN))
1472 AND file_external IS NULL
1475 -- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1478 AND (local_relpath = ?2
1479 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1483 -- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1484 SELECT 1 FROM actual_node
1486 AND (local_relpath = ?2
1487 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1488 AND properties IS NOT NULL
1491 -- STMT_HAS_SWITCHED
1495 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1497 AND file_external IS NULL
1498 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1499 AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
1502 -- STMT_SELECT_BASE_FILES_RECURSIVE
1503 SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n
1505 AND (local_relpath = ?2
1506 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1509 AND presence=MAP_NORMAL
1510 AND file_external IS NULL
1512 -- STMT_SELECT_MOVED_FROM_RELPATH
1513 SELECT local_relpath, op_depth FROM nodes
1514 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1516 -- STMT_UPDATE_MOVED_TO_RELPATH
1517 UPDATE nodes SET moved_to = ?4
1518 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1520 -- STMT_CLEAR_MOVED_TO_RELPATH
1521 UPDATE nodes SET moved_to = NULL
1522 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1524 -- STMT_CLEAR_MOVED_HERE_RECURSIVE
1525 UPDATE nodes SET moved_here = NULL
1527 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1530 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1.
1531 * Each row returns a moved-here path (always a child of ?2) in the first
1532 * column, and its matching moved-away (deleted) path in the second column. */
1533 -- STMT_SELECT_MOVED_HERE_CHILDREN
1534 SELECT moved_to, local_relpath FROM nodes
1535 WHERE wc_id = ?1 AND op_depth > 0
1536 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1538 /* If the node is moved here (r.moved_here = 1) we are really interested in
1539 where the node was moved from. To obtain that we need the op_depth, but
1540 this form of select only allows a single return value */
1541 -- STMT_SELECT_MOVED_FOR_DELETE
1542 SELECT local_relpath, moved_to, op_depth,
1543 (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1545 AND r.local_relpath = n.local_relpath
1546 AND r.op_depth < n.op_depth
1547 ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1550 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1551 AND moved_to IS NOT NULL
1554 -- STMT_SELECT_MOVED_FROM_FOR_DELETE
1555 SELECT local_relpath, op_depth,
1556 (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1558 AND r.local_relpath = n.local_relpath
1559 AND r.op_depth < n.op_depth
1560 ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1562 WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1564 -- STMT_UPDATE_MOVED_TO_DESCENDANTS
1565 UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1567 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1569 -- STMT_CLEAR_MOVED_TO_DESCENDANTS
1570 UPDATE nodes SET moved_to = NULL
1572 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1575 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1,
1576 * where the source of the move is within the subtree rooted at path ?2, and
1577 * the destination of the move is outside the subtree rooted at path ?2. */
1578 -- STMT_SELECT_MOVED_PAIR2
1579 SELECT local_relpath, moved_to, op_depth FROM nodes
1581 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1582 AND moved_to IS NOT NULL
1583 AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1584 AND op_depth >= (SELECT MAX(op_depth) FROM nodes o
1586 AND o.local_relpath = ?2)
1588 -- STMT_SELECT_MOVED_PAIR3
1589 SELECT local_relpath, moved_to, op_depth, kind FROM nodes
1590 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
1591 AND moved_to IS NOT NULL
1593 SELECT local_relpath, moved_to, op_depth, kind FROM nodes
1595 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1597 AND moved_to IS NOT NULL
1598 ORDER BY local_relpath, op_depth
1600 -- STMT_SELECT_MOVED_OUTSIDE
1601 SELECT local_relpath, moved_to, op_depth FROM nodes
1603 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1605 AND moved_to IS NOT NULL
1606 AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1608 -- STMT_SELECT_OP_DEPTH_MOVED_PAIR
1609 SELECT n.local_relpath, n.moved_to,
1610 (SELECT o.repos_path FROM nodes AS o
1611 WHERE o.wc_id = n.wc_id
1612 AND o.local_relpath = n.local_relpath
1613 AND o.op_depth < ?3 ORDER BY o.op_depth DESC LIMIT 1)
1616 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1618 AND n.moved_to IS NOT NULL
1620 -- STMT_SELECT_MOVED_DESCENDANTS
1621 SELECT n.local_relpath, h.moved_to
1622 FROM nodes n, nodes h
1625 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1626 AND h.local_relpath = n.local_relpath
1628 AND h.op_depth = (SELECT MIN(o.op_depth)
1631 AND o.local_relpath = n.local_relpath
1632 AND o.op_depth > ?3)
1633 AND h.moved_to IS NOT NULL
1635 -- STMT_COMMIT_UPDATE_ORIGIN
1636 /* Note that the only reason this SUBSTR() trick is valid is that you
1637 can move neither the working copy nor the repository root.
1639 SUBSTR(local_relpath, LENGTH(?2)+1) includes the '/' of the path */
1640 UPDATE nodes SET repos_id = ?4,
1641 repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
1644 AND (local_relpath = ?2
1645 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1648 -- STMT_HAS_LAYER_BETWEEN
1650 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1652 -- STMT_SELECT_REPOS_PATH_REVISION
1653 SELECT local_relpath, repos_path, revision FROM nodes
1655 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1657 ORDER BY local_relpath
1659 -- STMT_SELECT_HAS_NON_FILE_CHILDREN
1661 WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != MAP_FILE
1663 -- STMT_SELECT_HAS_GRANDCHILDREN
1666 AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1668 AND file_external IS NULL
1670 /* ------------------------------------------------------------------------- */
1672 /* Queries for verification. */
1674 -- STMT_SELECT_ALL_NODES
1675 SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1678 /* ------------------------------------------------------------------------- */
1680 /* Queries for cached inherited properties. */
1682 /* Select the inherited properties of a single base node. */
1683 -- STMT_SELECT_IPROPS
1684 SELECT inherited_props FROM nodes
1686 AND local_relpath = ?2
1689 /* Update the inherited properties of a single base node. */
1690 -- STMT_UPDATE_IPROP
1692 SET inherited_props = ?3
1693 WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
1695 /* Select a single path if its base node has cached inherited properties. */
1696 -- STMT_SELECT_IPROPS_NODE
1697 SELECT local_relpath, repos_path FROM nodes
1699 AND local_relpath = ?2
1701 AND (inherited_props not null)
1703 /* Select all paths whose base nodes are below a given path, which
1704 have cached inherited properties. */
1705 -- STMT_SELECT_IPROPS_RECURSIVE
1706 SELECT local_relpath, repos_path FROM nodes
1708 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1710 AND (inherited_props not null)
1712 -- STMT_SELECT_IPROPS_CHILDREN
1713 SELECT local_relpath, repos_path FROM nodes
1715 AND parent_relpath = ?2
1717 AND (inherited_props not null)
1719 /* ------------------------------------------------------------------------- */
1721 /* Grab all the statements related to the schema. */
1723 -- include: wc-metadata
1724 -- include: wc-checks