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