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