1251881Speter/* wc-queries.sql -- queries used to interact with the wc-metadata
2251881Speter *                   SQLite database
3251881Speter *     This is intended for use with SQLite 3
4251881Speter *
5251881Speter * ====================================================================
6251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
7251881Speter *    or more contributor license agreements.  See the NOTICE file
8251881Speter *    distributed with this work for additional information
9251881Speter *    regarding copyright ownership.  The ASF licenses this file
10251881Speter *    to you under the Apache License, Version 2.0 (the
11251881Speter *    "License"); you may not use this file except in compliance
12251881Speter *    with the License.  You may obtain a copy of the License at
13251881Speter *
14251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
15251881Speter *
16251881Speter *    Unless required by applicable law or agreed to in writing,
17251881Speter *    software distributed under the License is distributed on an
18251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19251881Speter *    KIND, either express or implied.  See the License for the
20251881Speter *    specific language governing permissions and limitations
21251881Speter *    under the License.
22251881Speter * ====================================================================
23251881Speter */
24251881Speter
25251881Speter/* ------------------------------------------------------------------------- */
26251881Speter
27251881Speter/* these are used in wc_db.c  */
28251881Speter
29251881Speter-- STMT_SELECT_NODE_INFO
30251881SpeterSELECT op_depth, repos_id, repos_path, presence, kind, revision, checksum,
31251881Speter  translated_size, changed_revision, changed_date, changed_author, depth,
32251881Speter  symlink_target, last_mod_time, properties, moved_here, inherited_props,
33251881Speter  moved_to
34251881SpeterFROM nodes
35251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
36251881SpeterORDER BY op_depth DESC
37251881Speter
38251881Speter-- STMT_SELECT_NODE_INFO_WITH_LOCK
39251881SpeterSELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
40251881Speter  checksum, translated_size, changed_revision, changed_date, changed_author,
41251881Speter  depth, symlink_target, last_mod_time, properties, moved_here,
42251881Speter  inherited_props,
43251881Speter  /* All the columns until now must match those returned by
44251881Speter     STMT_SELECT_NODE_INFO. The implementation of svn_wc__db_read_info()
45251881Speter     assumes that these columns are followed by the lock information) */
46251881Speter  lock_token, lock_owner, lock_comment, lock_date
47251881SpeterFROM nodes
48251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
49251881Speter  AND nodes.repos_path = lock.repos_relpath
50251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
51251881SpeterORDER BY op_depth DESC
52251881Speter
53251881Speter-- STMT_SELECT_BASE_NODE
54251881SpeterSELECT repos_id, repos_path, presence, kind, revision, checksum,
55251881Speter  translated_size, changed_revision, changed_date, changed_author, depth,
56251881Speter  symlink_target, last_mod_time, properties, file_external
57251881SpeterFROM nodes
58251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
59251881Speter
60251881Speter-- STMT_SELECT_BASE_NODE_WITH_LOCK
61251881SpeterSELECT nodes.repos_id, nodes.repos_path, presence, kind, revision,
62251881Speter  checksum, translated_size, changed_revision, changed_date, changed_author,
63251881Speter  depth, symlink_target, last_mod_time, properties, file_external,
64251881Speter  /* All the columns until now must match those returned by
65251881Speter     STMT_SELECT_BASE_NODE. The implementation of svn_wc__db_base_get_info()
66251881Speter     assumes that these columns are followed by the lock information) */
67251881Speter  lock_token, lock_owner, lock_comment, lock_date
68251881SpeterFROM nodes
69251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
70251881Speter  AND nodes.repos_path = lock.repos_relpath
71251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
72251881Speter
73251881Speter-- STMT_SELECT_BASE_CHILDREN_INFO
74251881SpeterSELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
75299742Sdim  revision, depth, file_external
76299742SdimFROM nodes
77299742SdimWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
78299742Sdim
79299742Sdim-- STMT_SELECT_BASE_CHILDREN_INFO_LOCK
80299742SdimSELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind,
81251881Speter  revision, depth, file_external,
82251881Speter  lock_token, lock_owner, lock_comment, lock_date
83251881SpeterFROM nodes
84251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
85251881Speter  AND nodes.repos_path = lock.repos_relpath
86251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
87251881Speter
88299742Sdim
89251881Speter-- STMT_SELECT_WORKING_NODE
90251881SpeterSELECT op_depth, presence, kind, checksum, translated_size,
91251881Speter  changed_revision, changed_date, changed_author, depth, symlink_target,
92251881Speter  repos_id, repos_path, revision,
93251881Speter  moved_here, moved_to, last_mod_time, properties
94251881SpeterFROM nodes
95251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0
96251881SpeterORDER BY op_depth DESC
97251881SpeterLIMIT 1
98251881Speter
99251881Speter-- STMT_SELECT_DEPTH_NODE
100251881SpeterSELECT repos_id, repos_path, presence, kind, revision, checksum,
101251881Speter  translated_size, changed_revision, changed_date, changed_author, depth,
102299742Sdim  symlink_target, properties, moved_to, moved_here
103251881SpeterFROM nodes
104251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
105251881Speter
106251881Speter-- STMT_SELECT_LOWEST_WORKING_NODE
107251881SpeterSELECT op_depth, presence, kind, moved_to
108251881SpeterFROM nodes
109251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
110251881SpeterORDER BY op_depth
111251881SpeterLIMIT 1
112251881Speter
113251881Speter-- STMT_SELECT_HIGHEST_WORKING_NODE
114251881SpeterSELECT op_depth
115251881SpeterFROM nodes
116251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3
117251881SpeterORDER BY op_depth DESC
118251881SpeterLIMIT 1
119251881Speter
120251881Speter-- STMT_SELECT_ACTUAL_NODE
121251881SpeterSELECT changelist, properties, conflict_data
122251881SpeterFROM actual_node
123251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
124251881Speter
125251881Speter-- STMT_SELECT_NODE_CHILDREN_INFO
126251881Speter/* Getting rows in an advantageous order using
127251881Speter     ORDER BY local_relpath, op_depth DESC
128299742Sdim   doesn't work as the index is created without the DESC keyword.
129299742Sdim   Using both local_relpath and op_depth descending does work without any
130299742Sdim   performance penalty. */
131251881SpeterSELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
132251881Speter  checksum, translated_size, changed_revision, changed_date, changed_author,
133251881Speter  depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
134251881Speter  lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external
135251881SpeterFROM nodes
136251881SpeterLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
137251881Speter  AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
138251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
139299742SdimORDER BY local_relpath DESC, op_depth DESC
140251881Speter
141299742Sdim-- STMT_SELECT_BASE_NODE_CHILDREN_INFO
142299742Sdim/* See above re: result ordering. The results of this query must be in
143299742Sdimthe same order as returned by STMT_SELECT_NODE_CHILDREN_INFO, because
144299742Sdimread_children_info expects them to be. */
145299742SdimSELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision,
146299742Sdim  checksum, translated_size, changed_revision, changed_date, changed_author,
147299742Sdim  depth, symlink_target, last_mod_time, properties, lock_token, lock_owner,
148299742Sdim  lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external
149299742SdimFROM nodes
150299742SdimLEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id
151299742Sdim  AND nodes.repos_path = lock.repos_relpath AND op_depth = 0
152299742SdimWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
153299742SdimORDER BY local_relpath DESC
154299742Sdim
155251881Speter-- STMT_SELECT_NODE_CHILDREN_WALKER_INFO
156251881SpeterSELECT local_relpath, op_depth, presence, kind
157251881SpeterFROM nodes_current
158251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
159299742SdimORDER BY local_relpath
160251881Speter
161251881Speter-- STMT_SELECT_ACTUAL_CHILDREN_INFO
162251881SpeterSELECT local_relpath, changelist, properties, conflict_data
163251881SpeterFROM actual_node
164251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
165251881Speter
166251881Speter-- STMT_SELECT_REPOSITORY_BY_ID
167251881SpeterSELECT root, uuid FROM repository WHERE id = ?1
168251881Speter
169251881Speter-- STMT_SELECT_WCROOT_NULL
170251881SpeterSELECT id FROM wcroot WHERE local_abspath IS NULL
171251881Speter
172251881Speter-- STMT_SELECT_REPOSITORY
173251881SpeterSELECT id FROM repository WHERE root = ?1
174251881Speter
175251881Speter-- STMT_INSERT_REPOSITORY
176251881SpeterINSERT INTO repository (root, uuid) VALUES (?1, ?2)
177251881Speter
178251881Speter-- STMT_INSERT_NODE
179251881SpeterINSERT OR REPLACE INTO nodes (
180251881Speter  wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
181251881Speter  revision, presence, depth, kind, changed_revision, changed_date,
182251881Speter  changed_author, checksum, properties, translated_size, last_mod_time,
183251881Speter  dav_cache, symlink_target, file_external, moved_to, moved_here,
184251881Speter  inherited_props)
185251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14,
186251881Speter        ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23)
187251881Speter
188251881Speter-- STMT_SELECT_WORKING_PRESENT
189251881SpeterSELECT local_relpath, kind, checksum, translated_size, last_mod_time
190251881SpeterFROM nodes n
191251881SpeterWHERE wc_id = ?1
192251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
193251881Speter  AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
194251881Speter  AND op_depth = (SELECT MAX(op_depth)
195251881Speter                  FROM NODES w
196251881Speter                  WHERE w.wc_id = ?1
197251881Speter                    AND w.local_relpath = n.local_relpath)
198251881SpeterORDER BY local_relpath DESC
199251881Speter
200251881Speter-- STMT_DELETE_NODE_RECURSIVE
201251881SpeterDELETE FROM NODES
202251881SpeterWHERE wc_id = ?1
203251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
204251881Speter
205251881Speter-- STMT_DELETE_NODE
206251881SpeterDELETE
207251881SpeterFROM NODES
208269847SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
209251881Speter
210251881Speter-- STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE
211251881Speter/* The ACTUAL_NODE applies to BASE, unless there is in at least one op_depth
212251881Speter   a WORKING node that could have a conflict */
213251881SpeterDELETE FROM actual_node
214251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
215251881Speter  AND EXISTS(SELECT 1 FROM NODES b
216251881Speter             WHERE b.wc_id = ?1
217251881Speter               AND b.local_relpath = actual_node.local_relpath
218251881Speter               AND op_depth = 0)
219251881Speter  AND NOT EXISTS(SELECT 1 FROM NODES w
220251881Speter                 WHERE w.wc_id = ?1
221251881Speter                   AND w.local_relpath = actual_node.local_relpath
222251881Speter                   AND op_depth > 0
223251881Speter                   AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT))
224251881Speter
225251881Speter-- STMT_DELETE_WORKING_BASE_DELETE
226251881SpeterDELETE FROM nodes
227299742SdimWHERE wc_id = ?1 AND local_relpath = ?2
228299742Sdim  AND presence = MAP_BASE_DELETED
229299742Sdim  AND op_depth > ?3
230299742Sdim  AND op_depth = (SELECT MIN(op_depth) FROM nodes n
231299742Sdim                    WHERE n.wc_id = ?1
232299742Sdim                      AND n.local_relpath = nodes.local_relpath
233299742Sdim                      AND op_depth > ?3)
234299742Sdim
235299742Sdim-- STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE
236299742SdimDELETE FROM nodes
237251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
238251881Speter  AND presence = MAP_BASE_DELETED
239299742Sdim  AND op_depth > ?3
240251881Speter  AND op_depth = (SELECT MIN(op_depth) FROM nodes n
241251881Speter                    WHERE n.wc_id = ?1
242251881Speter                      AND n.local_relpath = nodes.local_relpath
243299742Sdim                      AND op_depth > ?3)
244251881Speter
245251881Speter-- STMT_DELETE_WORKING_RECURSIVE
246251881SpeterDELETE FROM nodes
247251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
248251881Speter  AND op_depth > 0
249251881Speter
250251881Speter-- STMT_DELETE_BASE_RECURSIVE
251251881SpeterDELETE FROM nodes
252299742SdimWHERE wc_id = ?1 AND (local_relpath = ?2 
253299742Sdim                      OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
254251881Speter  AND op_depth = 0
255251881Speter
256251881Speter-- STMT_DELETE_WORKING_OP_DEPTH
257251881SpeterDELETE FROM nodes
258299742SdimWHERE wc_id = ?1
259251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
260251881Speter  AND op_depth = ?3
261251881Speter
262299742Sdim/* Full layer replacement check code for handling moves
263299742SdimThe op_root must exist (or there is no layer to replace) and an op-root
264299742Sdim   always has presence 'normal' */
265299742Sdim-- STMT_SELECT_LAYER_FOR_REPLACE
266299742SdimSELECT s.local_relpath, s.kind,
267299742Sdim  RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, 'normal'
268299742SdimFROM nodes s
269299742SdimWHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
270299742SdimUNION ALL
271299742SdimSELECT s.local_relpath, s.kind,
272299742Sdim  RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, d.presence
273299742SdimFROM nodes s
274299742SdimLEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5
275299742Sdim     AND d.local_relpath = drp
276299742SdimWHERE s.wc_id = ?1
277299742Sdim  AND IS_STRICT_DESCENDANT_OF(s.local_relpath, ?2)
278299742Sdim  AND s.op_depth = ?3
279299742SdimORDER BY s.local_relpath
280251881Speter
281299742Sdim-- STMT_SELECT_DESCENDANTS_OP_DEPTH_RV
282251881SpeterSELECT local_relpath, kind
283251881SpeterFROM nodes
284251881SpeterWHERE wc_id = ?1
285251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
286251881Speter  AND op_depth = ?3
287299742Sdim  AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
288251881SpeterORDER BY local_relpath DESC
289251881Speter
290251881Speter-- STMT_COPY_NODE_MOVE
291251881SpeterINSERT OR REPLACE INTO nodes (
292251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
293251881Speter    revision, presence, depth, kind, changed_revision, changed_date,
294251881Speter    changed_author, checksum, properties, translated_size, last_mod_time,
295251881Speter    symlink_target, moved_here, moved_to )
296251881SpeterSELECT
297299742Sdim    s.wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
298299742Sdim    s.repos_id,
299299742Sdim    s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision,
300299742Sdim    s.changed_date, s.changed_author, s.checksum, s.properties,
301299742Sdim    CASE WHEN d.checksum=s.checksum THEN d.translated_size END,
302299742Sdim    CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END,
303299742Sdim    s.symlink_target, 1, d.moved_to
304299742SdimFROM nodes s
305299742SdimLEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5
306299742SdimWHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
307251881Speter
308299742Sdim-- STMT_SELECT_NO_LONGER_MOVED_RV
309299742SdimSELECT d.local_relpath, RELPATH_SKIP_JOIN(?2, ?4, d.local_relpath) srp,
310299742Sdim       b.presence, b.op_depth
311299742SdimFROM nodes d
312299742SdimLEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath
313299742Sdim            AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x
314299742Sdim                              WHERE x.wc_id = ?1
315299742Sdim                                AND x.local_relpath = b.local_relpath
316299742Sdim                                AND x.op_depth < ?3)
317299742SdimWHERE d.wc_id = ?1
318299742Sdim  AND IS_STRICT_DESCENDANT_OF(d.local_relpath, ?2)
319299742Sdim  AND d.op_depth = ?3
320299742Sdim  AND NOT EXISTS(SELECT * FROM nodes s
321299742Sdim                 WHERE s.wc_id = ?1
322299742Sdim                   AND s.local_relpath = srp
323299742Sdim                   AND s.op_depth = ?5)
324299742SdimORDER BY d.local_relpath DESC
325299742Sdim
326251881Speter-- STMT_SELECT_OP_DEPTH_CHILDREN
327251881SpeterSELECT local_relpath, kind FROM nodes
328299742SdimWHERE wc_id = ?1
329251881Speter  AND parent_relpath = ?2
330251881Speter  AND op_depth = ?3
331251881Speter  AND presence != MAP_BASE_DELETED
332251881Speter  AND file_external is NULL
333299742SdimORDER BY local_relpath
334251881Speter
335299742Sdim-- STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS
336299742SdimSELECT local_relpath, kind FROM nodes
337299742SdimWHERE wc_id = ?1
338299742Sdim  AND parent_relpath = ?2
339299742Sdim  AND op_depth = ?3
340299742Sdim  AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
341299742SdimORDER BY local_relpath
342299742Sdim
343251881Speter/* Used by non-recursive revert to detect higher level children, and
344251881Speter   actual-only rows that would be left orphans, if the revert
345251881Speter   proceeded. */
346251881Speter-- STMT_SELECT_GE_OP_DEPTH_CHILDREN
347251881SpeterSELECT 1 FROM nodes
348251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
349299742Sdim  AND (op_depth > ?3 OR (op_depth = ?3
350299742Sdim                         AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
351251881SpeterUNION ALL
352251881SpeterSELECT 1 FROM ACTUAL_NODE a
353251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
354251881Speter  AND NOT EXISTS (SELECT 1 FROM nodes n
355251881Speter                   WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath)
356251881Speter
357251881Speter/* Delete the nodes shadowed by local_relpath. Not valid for the wc-root */
358251881Speter-- STMT_DELETE_SHADOWED_RECURSIVE
359251881SpeterDELETE FROM nodes
360251881SpeterWHERE wc_id = ?1
361251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
362251881Speter  AND (op_depth < ?3
363251881Speter       OR (op_depth = ?3 AND presence = MAP_BASE_DELETED))
364251881Speter
365251881Speter-- STMT_CLEAR_MOVED_TO_FROM_DEST
366251881SpeterUPDATE NODES SET moved_to = NULL
367251881SpeterWHERE wc_id = ?1
368251881Speter  AND moved_to = ?2
369251881Speter
370251881Speter/* Get not-present descendants of a copied node. Not valid for the wc-root */
371251881Speter-- STMT_SELECT_NOT_PRESENT_DESCENDANTS
372251881SpeterSELECT local_relpath FROM nodes
373251881SpeterWHERE wc_id = ?1 AND op_depth = ?3
374251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
375251881Speter  AND presence = MAP_NOT_PRESENT
376251881Speter
377251881Speter-- STMT_COMMIT_DESCENDANTS_TO_BASE
378251881SpeterUPDATE NODES SET op_depth = 0,
379251881Speter                 repos_id = ?4,
380299742Sdim                 repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
381251881Speter                 revision = ?6,
382251881Speter                 dav_cache = NULL,
383251881Speter                 moved_here = NULL,
384299742Sdim                 moved_to = NULL,
385251881Speter                 presence = CASE presence
386251881Speter                              WHEN MAP_NORMAL THEN MAP_NORMAL
387251881Speter                              WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
388251881Speter                              ELSE MAP_NOT_PRESENT
389251881Speter                            END
390251881SpeterWHERE wc_id = ?1
391251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
392251881Speter  AND op_depth = ?3
393251881Speter
394251881Speter-- STMT_SELECT_NODE_CHILDREN
395251881Speter/* Return all paths that are children of the directory (?1, ?2) in any
396251881Speter   op-depth, including children of any underlying, replaced directories. */
397299742SdimSELECT DISTINCT local_relpath FROM nodes
398251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
399299742SdimORDER BY local_relpath
400251881Speter
401251881Speter-- STMT_SELECT_WORKING_CHILDREN
402251881Speter/* Return all paths that are children of the working version of the
403251881Speter   directory (?1, ?2).  A given path is not included just because it is a
404251881Speter   child of an underlying (replaced) directory, it has to be in the
405251881Speter   working version of the directory. */
406299742SdimSELECT DISTINCT local_relpath FROM nodes
407251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
408251881Speter  AND (op_depth > (SELECT MAX(op_depth) FROM nodes
409251881Speter                   WHERE wc_id = ?1 AND local_relpath = ?2)
410251881Speter       OR
411251881Speter       (op_depth = (SELECT MAX(op_depth) FROM nodes
412251881Speter                    WHERE wc_id = ?1 AND local_relpath = ?2)
413299742Sdim        AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
414299742SdimORDER BY local_relpath
415251881Speter
416299742Sdim-- STMT_SELECT_BASE_NOT_PRESENT_CHILDREN
417299742SdimSELECT local_relpath FROM nodes
418299742SdimWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
419299742Sdim  AND presence = MAP_NOT_PRESENT
420299742SdimORDER BY local_relpath
421299742Sdim
422251881Speter-- STMT_SELECT_NODE_PROPS
423251881SpeterSELECT properties, presence FROM nodes
424251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
425251881SpeterORDER BY op_depth DESC
426251881Speter
427251881Speter-- STMT_SELECT_ACTUAL_PROPS
428251881SpeterSELECT properties FROM actual_node
429251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
430251881Speter
431251881Speter-- STMT_UPDATE_ACTUAL_PROPS
432251881SpeterUPDATE actual_node SET properties = ?3
433251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
434251881Speter
435251881Speter-- STMT_INSERT_ACTUAL_PROPS
436251881SpeterINSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties)
437251881SpeterVALUES (?1, ?2, ?3, ?4)
438251881Speter
439251881Speter-- STMT_INSERT_LOCK
440251881SpeterINSERT OR REPLACE INTO lock
441251881Speter(repos_id, repos_relpath, lock_token, lock_owner, lock_comment,
442251881Speter lock_date)
443251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6)
444251881Speter
445251881Speter/* Not valid for the working copy root */
446251881Speter-- STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE
447251881SpeterSELECT nodes.repos_id, nodes.repos_path, lock_token
448251881SpeterFROM nodes
449251881SpeterLEFT JOIN lock ON nodes.repos_id = lock.repos_id
450251881Speter  AND nodes.repos_path = lock.repos_relpath
451251881SpeterWHERE wc_id = ?1 AND op_depth = 0
452251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
453251881Speter
454251881Speter-- STMT_INSERT_WCROOT
455251881SpeterINSERT INTO wcroot (local_abspath)
456251881SpeterVALUES (?1)
457251881Speter
458251881Speter-- STMT_UPDATE_BASE_NODE_DAV_CACHE
459251881SpeterUPDATE nodes SET dav_cache = ?3
460251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
461251881Speter
462251881Speter-- STMT_SELECT_BASE_DAV_CACHE
463251881SpeterSELECT dav_cache FROM nodes
464251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
465251881Speter
466251881Speter-- STMT_SELECT_DELETION_INFO
467299742SdimSELECT b.presence, w.presence, w.op_depth, w.moved_to
468299742SdimFROM nodes w
469299742SdimLEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0
470299742SdimWHERE w.wc_id = ?1 AND w.local_relpath = ?2
471299742Sdim  AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d
472299742Sdim                    WHERE d.wc_id = ?1 AND d.local_relpath = ?2
473299742Sdim                      AND d.op_depth > 0)
474251881SpeterLIMIT 1
475251881Speter
476269847Speter-- STMT_SELECT_MOVED_TO_NODE
477269847SpeterSELECT op_depth, moved_to
478269847SpeterFROM nodes
479269847SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL
480269847SpeterORDER BY op_depth DESC
481269847Speter
482251881Speter-- STMT_SELECT_OP_DEPTH_MOVED_TO
483299742SdimSELECT op_depth, moved_to
484251881SpeterFROM nodes
485299742SdimWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
486299742Sdim  AND EXISTS(SELECT * from nodes
487299742Sdim             WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
488299742Sdim             AND presence IN (MAP_NORMAL, MAP_INCOMPLETE))
489299742SdimORDER BY op_depth ASC
490299742SdimLIMIT 1
491251881Speter
492251881Speter-- STMT_SELECT_MOVED_TO
493251881SpeterSELECT moved_to
494251881SpeterFROM nodes
495251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
496251881Speter
497251881Speter-- STMT_SELECT_MOVED_BACK
498251881SpeterSELECT u.local_relpath,
499251881Speter       u.presence, u.repos_id, u.repos_path, u.revision,
500251881Speter       l.presence, l.repos_id, l.repos_path, l.revision,
501251881Speter       u.moved_here, u.moved_to
502251881SpeterFROM nodes u
503251881SpeterLEFT OUTER JOIN nodes l ON l.wc_id = ?1
504251881Speter                       AND l.local_relpath = u.local_relpath
505251881Speter                       AND l.op_depth = ?3
506251881SpeterWHERE u.wc_id = ?1
507251881Speter  AND u.local_relpath = ?2
508251881Speter  AND u.op_depth = ?4
509251881SpeterUNION ALL
510251881SpeterSELECT u.local_relpath,
511251881Speter       u.presence, u.repos_id, u.repos_path, u.revision,
512251881Speter       l.presence, l.repos_id, l.repos_path, l.revision,
513251881Speter       u.moved_here, NULL
514251881SpeterFROM nodes u
515251881SpeterLEFT OUTER JOIN nodes l ON l.wc_id=?1
516251881Speter                       AND l.local_relpath=u.local_relpath
517251881Speter                       AND l.op_depth=?3
518251881SpeterWHERE u.wc_id = ?1
519251881Speter  AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2)
520251881Speter  AND u.op_depth = ?4
521251881Speter
522251881Speter-- STMT_DELETE_LOCK
523251881SpeterDELETE FROM lock
524251881SpeterWHERE repos_id = ?1 AND repos_relpath = ?2
525251881Speter
526253734Speter-- STMT_DELETE_LOCK_RECURSIVELY
527253734SpeterDELETE FROM lock
528253734SpeterWHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2))
529253734Speter
530251881Speter-- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE
531251881SpeterUPDATE nodes SET dav_cache = NULL
532251881SpeterWHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0
533251881Speter  AND (local_relpath = ?2
534251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
535251881Speter
536251881Speter-- STMT_RECURSIVE_UPDATE_NODE_REPO
537251881SpeterUPDATE nodes SET repos_id = ?4, dav_cache = NULL
538251881Speter/* ### The Sqlite optimizer needs help here ###
539251881Speter * WHERE wc_id = ?1
540251881Speter *   AND repos_id = ?3
541251881Speter *   AND (local_relpath = ?2
542251881Speter *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/
543251881SpeterWHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3)
544251881Speter   OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
545251881Speter       AND repos_id = ?3)
546251881Speter
547299742Sdim
548251881Speter-- STMT_UPDATE_LOCK_REPOS_ID
549251881SpeterUPDATE lock SET repos_id = ?2
550251881SpeterWHERE repos_id = ?1
551251881Speter
552251881Speter-- STMT_UPDATE_NODE_FILEINFO
553251881SpeterUPDATE nodes SET translated_size = ?3, last_mod_time = ?4
554251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
555251881Speter  AND op_depth = (SELECT MAX(op_depth) FROM nodes
556251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2)
557251881Speter
558251881Speter-- STMT_INSERT_ACTUAL_CONFLICT
559251881SpeterINSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath)
560251881SpeterVALUES (?1, ?2, ?3, ?4)
561251881Speter
562251881Speter-- STMT_UPDATE_ACTUAL_CONFLICT
563251881SpeterUPDATE actual_node SET conflict_data = ?3
564251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
565251881Speter
566251881Speter-- STMT_UPDATE_ACTUAL_CHANGELISTS
567251881SpeterUPDATE actual_node SET changelist = ?3
568251881SpeterWHERE wc_id = ?1
569251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
570251881Speter  AND local_relpath = (SELECT local_relpath FROM targets_list AS t
571251881Speter                       WHERE wc_id = ?1
572251881Speter                         AND t.local_relpath = actual_node.local_relpath
573251881Speter                         AND kind = MAP_FILE)
574251881Speter
575251881Speter-- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST
576251881SpeterUPDATE actual_node SET changelist = NULL
577251881Speter WHERE wc_id = ?1 AND local_relpath = ?2
578251881Speter
579251881Speter-- STMT_MARK_SKIPPED_CHANGELIST_DIRS
580251881Speter/* 7 corresponds to svn_wc_notify_skip */
581251881SpeterINSERT INTO changelist_list (wc_id, local_relpath, notify, changelist)
582251881SpeterSELECT wc_id, local_relpath, 7, ?3
583251881SpeterFROM targets_list
584251881SpeterWHERE wc_id = ?1
585251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
586251881Speter  AND kind = MAP_DIR
587251881Speter
588251881Speter-- STMT_RESET_ACTUAL_WITH_CHANGELIST
589251881SpeterREPLACE INTO actual_node (
590251881Speter  wc_id, local_relpath, parent_relpath, changelist)
591251881SpeterVALUES (?1, ?2, ?3, ?4)
592251881Speter
593251881Speter-- STMT_CREATE_CHANGELIST_LIST
594251881SpeterDROP TABLE IF EXISTS changelist_list;
595251881SpeterCREATE TEMPORARY TABLE changelist_list (
596251881Speter  wc_id  INTEGER NOT NULL,
597251881Speter  local_relpath TEXT NOT NULL,
598251881Speter  notify INTEGER NOT NULL,
599251881Speter  changelist TEXT NOT NULL,
600251881Speter  /* Order NOTIFY descending to make us show clears (27) before adds (26) */
601251881Speter  PRIMARY KEY (wc_id, local_relpath, notify DESC)
602251881Speter)
603251881Speter
604251881Speter/* Create notify items for when a node is removed from a changelist and
605251881Speter   when a node is added to a changelist. Make sure nothing is notified
606251881Speter   if there were no changes.
607251881Speter*/
608251881Speter-- STMT_CREATE_CHANGELIST_TRIGGER
609251881SpeterDROP TRIGGER IF EXISTS   trigger_changelist_list_change;
610251881SpeterCREATE TEMPORARY TRIGGER trigger_changelist_list_change
611251881SpeterBEFORE UPDATE ON actual_node
612251881SpeterWHEN old.changelist IS NOT new.changelist
613251881SpeterBEGIN
614251881Speter  /* 27 corresponds to svn_wc_notify_changelist_clear */
615251881Speter  INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
616251881Speter  SELECT old.wc_id, old.local_relpath, 27, old.changelist
617251881Speter   WHERE old.changelist is NOT NULL;
618251881Speter
619251881Speter  /* 26 corresponds to svn_wc_notify_changelist_set */
620251881Speter  INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
621251881Speter  SELECT new.wc_id, new.local_relpath, 26, new.changelist
622251881Speter   WHERE new.changelist IS NOT NULL;
623251881SpeterEND
624251881Speter
625251881Speter-- STMT_FINALIZE_CHANGELIST
626251881SpeterDROP TRIGGER trigger_changelist_list_change;
627251881SpeterDROP TABLE changelist_list;
628251881SpeterDROP TABLE targets_list
629251881Speter
630251881Speter-- STMT_SELECT_CHANGELIST_LIST
631251881SpeterSELECT wc_id, local_relpath, notify, changelist
632251881SpeterFROM changelist_list
633251881SpeterORDER BY wc_id, local_relpath ASC, notify DESC
634251881Speter
635251881Speter-- STMT_CREATE_TARGETS_LIST
636251881SpeterDROP TABLE IF EXISTS targets_list;
637251881SpeterCREATE TEMPORARY TABLE targets_list (
638251881Speter  wc_id  INTEGER NOT NULL,
639251881Speter  local_relpath TEXT NOT NULL,
640251881Speter  parent_relpath TEXT,
641251881Speter  kind TEXT NOT NULL,
642251881Speter  PRIMARY KEY (wc_id, local_relpath)
643251881Speter  );
644251881Speter/* need more indicies? */
645251881Speter
646251881Speter-- STMT_DROP_TARGETS_LIST
647251881SpeterDROP TABLE targets_list
648251881Speter
649251881Speter-- STMT_INSERT_TARGET
650251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
651251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
652251881SpeterFROM nodes_current
653251881SpeterWHERE wc_id = ?1
654251881Speter  AND local_relpath = ?2
655251881Speter
656251881Speter-- STMT_INSERT_TARGET_DEPTH_FILES
657251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
658251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
659251881SpeterFROM nodes_current
660251881SpeterWHERE wc_id = ?1
661251881Speter  AND parent_relpath = ?2
662251881Speter  AND kind = MAP_FILE
663251881Speter
664251881Speter-- STMT_INSERT_TARGET_DEPTH_IMMEDIATES
665251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
666251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
667251881SpeterFROM nodes_current
668251881SpeterWHERE wc_id = ?1
669251881Speter  AND parent_relpath = ?2
670251881Speter
671251881Speter-- STMT_INSERT_TARGET_DEPTH_INFINITY
672251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
673251881SpeterSELECT wc_id, local_relpath, parent_relpath, kind
674251881SpeterFROM nodes_current
675251881SpeterWHERE wc_id = ?1
676251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
677251881Speter
678251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST
679251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
680251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
681251881Speter  FROM actual_node AS A JOIN nodes_current AS N
682251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
683251881Speter WHERE N.wc_id = ?1
684251881Speter   AND N.local_relpath = ?2
685251881Speter   AND A.changelist = ?3
686251881Speter
687251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES
688251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
689251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
690251881Speter  FROM actual_node AS A JOIN nodes_current AS N
691251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
692251881Speter WHERE N.wc_id = ?1
693251881Speter   AND N.parent_relpath = ?2
694251881Speter   AND kind = MAP_FILE
695251881Speter   AND A.changelist = ?3
696251881Speter
697251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES
698251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
699251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
700251881Speter  FROM actual_node AS A JOIN nodes_current AS N
701251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
702251881Speter WHERE N.wc_id = ?1
703251881Speter   AND N.parent_relpath = ?2
704251881Speter  AND A.changelist = ?3
705251881Speter
706251881Speter-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY
707251881SpeterINSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind)
708251881SpeterSELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind
709251881Speter  FROM actual_node AS A JOIN nodes_current AS N
710251881Speter    ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath
711251881Speter WHERE N.wc_id = ?1
712251881Speter   AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2)
713251881Speter   AND A.changelist = ?3
714251881Speter
715251881Speter/* Only used by commented dump_targets() in wc_db.c */
716251881Speter/*-- STMT_SELECT_TARGETS
717251881SpeterSELECT local_relpath, parent_relpath from targets_list*/
718251881Speter
719251881Speter-- STMT_INSERT_ACTUAL_EMPTIES
720251881SpeterINSERT OR IGNORE INTO actual_node (
721251881Speter     wc_id, local_relpath, parent_relpath)
722251881SpeterSELECT wc_id, local_relpath, parent_relpath
723251881SpeterFROM targets_list
724251881Speter
725299742Sdim-- STMT_INSERT_ACTUAL_EMPTIES_FILES
726299742SdimINSERT OR IGNORE INTO actual_node (
727299742Sdim     wc_id, local_relpath, parent_relpath)
728299742SdimSELECT wc_id, local_relpath, parent_relpath
729299742SdimFROM targets_list
730299742SdimWHERE kind=MAP_FILE
731299742Sdim
732251881Speter-- STMT_DELETE_ACTUAL_EMPTY
733251881SpeterDELETE FROM actual_node
734251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
735251881Speter  AND properties IS NULL
736251881Speter  AND conflict_data IS NULL
737251881Speter  AND changelist IS NULL
738251881Speter  AND text_mod IS NULL
739251881Speter  AND older_checksum IS NULL
740251881Speter  AND right_checksum IS NULL
741251881Speter  AND left_checksum IS NULL
742251881Speter
743251881Speter-- STMT_DELETE_ACTUAL_EMPTIES
744251881SpeterDELETE FROM actual_node
745251881SpeterWHERE wc_id = ?1
746299742Sdim  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
747251881Speter  AND properties IS NULL
748251881Speter  AND conflict_data IS NULL
749251881Speter  AND changelist IS NULL
750251881Speter  AND text_mod IS NULL
751251881Speter  AND older_checksum IS NULL
752251881Speter  AND right_checksum IS NULL
753251881Speter  AND left_checksum IS NULL
754251881Speter
755251881Speter-- STMT_DELETE_BASE_NODE
756251881SpeterDELETE FROM nodes
757251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
758251881Speter
759251881Speter-- STMT_DELETE_WORKING_NODE
760251881SpeterDELETE FROM nodes
761251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
762251881Speter  AND op_depth = (SELECT MAX(op_depth) FROM nodes
763251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0)
764251881Speter
765251881Speter-- STMT_DELETE_LOWEST_WORKING_NODE
766251881SpeterDELETE FROM nodes
767251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
768251881Speter  AND op_depth = (SELECT MIN(op_depth) FROM nodes
769251881Speter                  WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3)
770251881Speter  AND presence = MAP_BASE_DELETED
771251881Speter
772269847Speter-- STMT_DELETE_NODE_ALL_LAYERS
773251881SpeterDELETE FROM nodes
774251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
775251881Speter
776251881Speter-- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE
777251881SpeterDELETE FROM nodes
778251881SpeterWHERE wc_id = ?1
779251881Speter  AND (local_relpath = ?2
780251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
781251881Speter  AND op_depth >= ?3
782251881Speter
783251881Speter-- STMT_DELETE_ACTUAL_NODE
784251881SpeterDELETE FROM actual_node
785251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
786251881Speter
787251881Speter/* Will not delete recursive when run on the wcroot */
788251881Speter-- STMT_DELETE_ACTUAL_NODE_RECURSIVE
789251881SpeterDELETE FROM actual_node
790251881SpeterWHERE wc_id = ?1
791251881Speter  AND (local_relpath = ?2
792251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
793251881Speter
794251881Speter-- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST
795251881SpeterDELETE FROM actual_node
796251881SpeterWHERE wc_id = ?1
797251881Speter  AND local_relpath = ?2
798251881Speter  AND (changelist IS NULL
799251881Speter       OR NOT EXISTS (SELECT 1 FROM nodes_current c
800251881Speter                      WHERE c.wc_id = ?1 AND c.local_relpath = ?2
801251881Speter                        AND c.kind = MAP_FILE))
802251881Speter
803251881Speter-- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
804251881SpeterDELETE FROM actual_node
805251881SpeterWHERE wc_id = ?1
806251881Speter  AND (local_relpath = ?2
807251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
808251881Speter  AND (changelist IS NULL
809251881Speter       OR NOT EXISTS (SELECT 1 FROM nodes_current c
810299742Sdim                      WHERE c.wc_id = ?1
811251881Speter                        AND c.local_relpath = actual_node.local_relpath
812251881Speter                        AND c.kind = MAP_FILE))
813251881Speter
814251881Speter-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST
815251881SpeterUPDATE actual_node
816251881SpeterSET properties = NULL,
817251881Speter    text_mod = NULL,
818251881Speter    conflict_data = NULL,
819251881Speter    tree_conflict_data = NULL,
820251881Speter    older_checksum = NULL,
821251881Speter    left_checksum = NULL,
822251881Speter    right_checksum = NULL
823251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
824251881Speter
825299742Sdim-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT
826299742SdimUPDATE actual_node
827299742SdimSET properties = NULL,
828299742Sdim    text_mod = NULL,
829299742Sdim    tree_conflict_data = NULL,
830299742Sdim    older_checksum = NULL,
831299742Sdim    left_checksum = NULL,
832299742Sdim    right_checksum = NULL,
833299742Sdim    changelist = NULL
834299742SdimWHERE wc_id = ?1 AND local_relpath = ?2
835299742Sdim
836251881Speter-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
837251881SpeterUPDATE actual_node
838251881SpeterSET properties = NULL,
839251881Speter    text_mod = NULL,
840251881Speter    conflict_data = NULL,
841251881Speter    tree_conflict_data = NULL,
842251881Speter    older_checksum = NULL,
843251881Speter    left_checksum = NULL,
844251881Speter    right_checksum = NULL
845251881SpeterWHERE wc_id = ?1
846251881Speter  AND (local_relpath = ?2
847251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
848251881Speter
849251881Speter-- STMT_UPDATE_NODE_BASE_DEPTH
850251881SpeterUPDATE nodes SET depth = ?3
851251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
852251881Speter  AND kind=MAP_DIR
853299742Sdim  AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
854251881Speter
855251881Speter-- STMT_UPDATE_NODE_BASE_PRESENCE
856251881SpeterUPDATE nodes SET presence = ?3
857251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
858251881Speter
859251881Speter-- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH
860251881SpeterUPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5
861251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
862251881Speter
863251881Speter-- STMT_LOOK_FOR_WORK
864251881SpeterSELECT id FROM work_queue LIMIT 1
865251881Speter
866251881Speter-- STMT_INSERT_WORK_ITEM
867251881SpeterINSERT INTO work_queue (work) VALUES (?1)
868251881Speter
869251881Speter-- STMT_SELECT_WORK_ITEM
870251881SpeterSELECT id, work FROM work_queue ORDER BY id LIMIT 1
871251881Speter
872251881Speter-- STMT_DELETE_WORK_ITEM
873251881SpeterDELETE FROM work_queue WHERE id = ?1
874251881Speter
875251881Speter-- STMT_INSERT_OR_IGNORE_PRISTINE
876251881SpeterINSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount)
877251881SpeterVALUES (?1, ?2, ?3, 0)
878251881Speter
879251881Speter-- STMT_INSERT_PRISTINE
880251881SpeterINSERT INTO pristine (checksum, md5_checksum, size, refcount)
881251881SpeterVALUES (?1, ?2, ?3, 0)
882251881Speter
883251881Speter-- STMT_SELECT_PRISTINE
884251881SpeterSELECT md5_checksum
885251881SpeterFROM pristine
886251881SpeterWHERE checksum = ?1
887251881Speter
888251881Speter-- STMT_SELECT_PRISTINE_SIZE
889251881SpeterSELECT size
890251881SpeterFROM pristine
891251881SpeterWHERE checksum = ?1 LIMIT 1
892251881Speter
893251881Speter-- STMT_SELECT_PRISTINE_BY_MD5
894251881SpeterSELECT checksum
895251881SpeterFROM pristine
896251881SpeterWHERE md5_checksum = ?1
897251881Speter
898251881Speter-- STMT_SELECT_UNREFERENCED_PRISTINES
899251881SpeterSELECT checksum
900251881SpeterFROM pristine
901251881SpeterWHERE refcount = 0
902251881Speter
903251881Speter-- STMT_DELETE_PRISTINE_IF_UNREFERENCED
904251881SpeterDELETE FROM pristine
905251881SpeterWHERE checksum = ?1 AND refcount = 0
906251881Speter
907251881Speter-- STMT_SELECT_COPY_PRISTINES
908251881Speter/* For the root itself */
909251881SpeterSELECT n.checksum, md5_checksum, size
910251881SpeterFROM nodes_current n
911251881SpeterLEFT JOIN pristine p ON n.checksum = p.checksum
912251881SpeterWHERE wc_id = ?1
913251881Speter  AND n.local_relpath = ?2
914251881Speter  AND n.checksum IS NOT NULL
915251881SpeterUNION ALL
916251881Speter/* And all descendants */
917251881SpeterSELECT n.checksum, md5_checksum, size
918251881SpeterFROM nodes n
919251881SpeterLEFT JOIN pristine p ON n.checksum = p.checksum
920251881SpeterWHERE wc_id = ?1
921251881Speter  AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
922251881Speter  AND op_depth >=
923251881Speter      (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
924251881Speter  AND n.checksum IS NOT NULL
925251881Speter
926251881Speter-- STMT_VACUUM
927251881SpeterVACUUM
928251881Speter
929251881Speter-- STMT_SELECT_CONFLICT_VICTIMS
930251881SpeterSELECT local_relpath, conflict_data
931251881SpeterFROM actual_node
932251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND
933251881Speter  NOT (conflict_data IS NULL)
934251881Speter
935251881Speter-- STMT_INSERT_WC_LOCK
936251881SpeterINSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels)
937251881SpeterVALUES (?1, ?2, ?3)
938251881Speter
939251881Speter-- STMT_SELECT_WC_LOCK
940251881SpeterSELECT locked_levels FROM wc_lock
941251881SpeterWHERE wc_id = ?1 AND local_dir_relpath = ?2
942251881Speter
943251881Speter-- STMT_SELECT_ANCESTOR_WCLOCKS
944251881SpeterSELECT local_dir_relpath, locked_levels FROM wc_lock
945251881SpeterWHERE wc_id = ?1
946251881Speter  AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2)
947251881Speter       OR local_dir_relpath = '')
948251881Speter
949251881Speter-- STMT_DELETE_WC_LOCK
950251881SpeterDELETE FROM wc_lock
951251881SpeterWHERE wc_id = ?1 AND local_dir_relpath = ?2
952251881Speter
953251881Speter-- STMT_FIND_WC_LOCK
954251881SpeterSELECT local_dir_relpath FROM wc_lock
955251881SpeterWHERE wc_id = ?1
956251881Speter  AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
957251881Speter
958299742Sdim-- STMT_FIND_CONFLICT_DESCENDANT
959299742SdimSELECT 1 FROM actual_node
960299742SdimWHERE wc_id = ?1
961299742Sdim  AND local_relpath > (?2 || '/')
962299742Sdim  AND local_relpath < (?2 || '0') /* '0' = ascii('/') +1 */
963299742Sdim  AND conflict_data IS NOT NULL
964299742SdimLIMIT 1
965299742Sdim
966251881Speter-- STMT_DELETE_WC_LOCK_ORPHAN
967251881SpeterDELETE FROM wc_lock
968251881SpeterWHERE wc_id = ?1 AND local_dir_relpath = ?2
969251881SpeterAND NOT EXISTS (SELECT 1 FROM nodes
970251881Speter                 WHERE nodes.wc_id = ?1
971251881Speter                   AND nodes.local_relpath = wc_lock.local_dir_relpath)
972251881Speter
973251881Speter-- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE
974251881SpeterDELETE FROM wc_lock
975251881SpeterWHERE wc_id = ?1
976251881Speter  AND (local_dir_relpath = ?2
977251881Speter       OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2))
978251881Speter  AND NOT EXISTS (SELECT 1 FROM nodes
979251881Speter                   WHERE nodes.wc_id = ?1
980251881Speter                     AND nodes.local_relpath = wc_lock.local_dir_relpath)
981251881Speter
982251881Speter-- STMT_APPLY_CHANGES_TO_BASE_NODE
983251881Speter/* translated_size and last_mod_time are not mentioned here because they will
984251881Speter   be tweaked after the working-file is installed. When we replace an existing
985251881Speter   BASE node (read: bump), preserve its file_external status. */
986251881SpeterINSERT OR REPLACE INTO nodes (
987251881Speter  wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
988251881Speter  revision, presence, depth, kind, changed_revision, changed_date,
989251881Speter  changed_author, checksum, properties, dav_cache, symlink_target,
990251881Speter  inherited_props, file_external )
991251881SpeterVALUES (?1, ?2, 0,
992251881Speter        ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17,
993251881Speter        (SELECT file_external FROM nodes
994251881Speter          WHERE wc_id = ?1
995251881Speter            AND local_relpath = ?2
996251881Speter            AND op_depth = 0))
997251881Speter
998251881Speter-- STMT_INSTALL_WORKING_NODE_FOR_DELETE
999299742SdimINSERT INTO nodes (
1000251881Speter    wc_id, local_relpath, op_depth,
1001251881Speter    parent_relpath, presence, kind)
1002251881SpeterVALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5)
1003251881Speter
1004251881Speter-- STMT_REPLACE_WITH_BASE_DELETED
1005251881SpeterINSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath,
1006251881Speter                              kind, moved_to, presence)
1007251881SpeterSELECT wc_id, local_relpath, op_depth, parent_relpath,
1008251881Speter       kind, moved_to, MAP_BASE_DELETED
1009251881Speter  FROM nodes
1010251881Speter WHERE wc_id = ?1
1011299742Sdim   AND local_relpath = ?2
1012251881Speter   AND op_depth = ?3
1013251881Speter
1014299742Sdim/* If this query is updated, STMT_INSERT_DELETE_LIST should too.
1015299742Sdim   Use UNION ALL instead of a simple 'OR' to avoid creating a temp table */
1016251881Speter-- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE
1017251881SpeterINSERT INTO nodes (
1018251881Speter    wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
1019251881SpeterSELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
1020251881Speter       kind
1021251881SpeterFROM nodes
1022299742SdimWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1023299742SdimUNION ALL
1024299742SdimSELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED,
1025299742Sdim       kind
1026299742SdimFROM nodes
1027251881SpeterWHERE wc_id = ?1
1028299742Sdim  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1029251881Speter  AND op_depth = ?3
1030251881Speter  AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1031251881Speter  AND file_external IS NULL
1032299742SdimORDER BY local_relpath
1033251881Speter
1034251881Speter-- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
1035299742SdimINSERT OR REPLACE INTO nodes (
1036251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
1037251881Speter    revision, presence, depth, kind, changed_revision, changed_date,
1038251881Speter    changed_author, checksum, properties, translated_size, last_mod_time,
1039299742Sdim    symlink_target, moved_to )
1040251881SpeterSELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id,
1041251881Speter    repos_path, revision, presence, depth, kind, changed_revision,
1042251881Speter    changed_date, changed_author, checksum, properties, translated_size,
1043299742Sdim    last_mod_time, symlink_target,
1044299742Sdim    (SELECT moved_to FROM nodes
1045299742Sdim     WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to
1046251881SpeterFROM nodes
1047251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1048251881Speter
1049251881Speter-- STMT_INSERT_DELETE_FROM_BASE
1050251881SpeterINSERT INTO nodes (
1051251881Speter    wc_id, local_relpath, op_depth, parent_relpath, presence, kind)
1052251881SpeterSELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath,
1053251881Speter    MAP_BASE_DELETED, kind
1054251881SpeterFROM nodes
1055251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1056251881Speter
1057251881Speter/* Not valid on the wc-root */
1058251881Speter-- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE
1059251881SpeterUPDATE nodes SET op_depth = ?3 + 1
1060251881SpeterWHERE wc_id = ?1
1061251881Speter AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1062251881Speter AND op_depth = ?3
1063251881Speter
1064299742Sdim/* Duplicated SELECT body to avoid creating temporary table */
1065299742Sdim-- STMT_COPY_OP_DEPTH_RECURSIVE
1066299742SdimINSERT INTO nodes (
1067299742Sdim    wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
1068299742Sdim    revision, presence, depth, kind, changed_revision, changed_date,
1069299742Sdim    changed_author, checksum, properties, translated_size, last_mod_time,
1070299742Sdim    symlink_target, moved_here, moved_to )
1071299742SdimSELECT
1072299742Sdim    wc_id, local_relpath, ?4, parent_relpath, repos_id,
1073299742Sdim    repos_path, revision, presence, depth, kind, changed_revision,
1074299742Sdim    changed_date, changed_author, checksum, properties, translated_size,
1075299742Sdim    last_mod_time, symlink_target, NULL, NULL
1076299742SdimFROM nodes
1077299742SdimWHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2
1078299742SdimUNION ALL
1079299742SdimSELECT
1080299742Sdim    wc_id, local_relpath, ?4, parent_relpath, repos_id,
1081299742Sdim    repos_path, revision, presence, depth, kind, changed_revision,
1082299742Sdim    changed_date, changed_author, checksum, properties, translated_size,
1083299742Sdim    last_mod_time, symlink_target, NULL, NULL
1084299742SdimFROM nodes
1085299742SdimWHERE wc_id = ?1 AND op_depth = ?3
1086299742Sdim  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1087299742SdimORDER BY local_relpath
1088251881Speter
1089251881Speter-- STMT_DOES_NODE_EXIST
1090251881SpeterSELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
1091251881SpeterLIMIT 1
1092251881Speter
1093251881Speter-- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS
1094251881SpeterSELECT local_relpath FROM nodes
1095251881SpeterWHERE wc_id = ?1
1096251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1097251881Speter  AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED
1098251881SpeterLIMIT 1
1099251881Speter
1100251881Speter/* Select all excluded nodes. Not valid on the WC-root */
1101251881Speter-- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS
1102251881SpeterSELECT local_relpath FROM nodes
1103251881SpeterWHERE wc_id = ?1
1104251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1105251881Speter  AND op_depth = 0
1106251881Speter  AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED)
1107251881Speter
1108251881Speter/* Creates a copy from one top level NODE to a different location */
1109251881Speter-- STMT_INSERT_WORKING_NODE_COPY_FROM
1110251881SpeterINSERT OR REPLACE INTO nodes (
1111251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1112251881Speter    repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1113251881Speter    changed_date, changed_author, checksum, properties, translated_size,
1114251881Speter    last_mod_time, symlink_target, moved_to )
1115251881SpeterSELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1116251881Speter    repos_id, repos_path, revision, ?6 /*presence*/, depth,
1117251881Speter    ?7/*moved_here*/, kind, changed_revision, changed_date,
1118251881Speter    changed_author, checksum, properties, translated_size,
1119251881Speter    last_mod_time, symlink_target,
1120251881Speter    (SELECT dst.moved_to FROM nodes AS dst
1121251881Speter                         WHERE dst.wc_id = ?1
1122251881Speter                         AND dst.local_relpath = ?3
1123251881Speter                         AND dst.op_depth = ?4)
1124251881SpeterFROM nodes_current
1125251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1126251881Speter
1127251881Speter-- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH
1128251881SpeterINSERT OR REPLACE INTO nodes (
1129251881Speter    wc_id, local_relpath, op_depth, parent_relpath, repos_id,
1130251881Speter    repos_path, revision, presence, depth, moved_here, kind, changed_revision,
1131251881Speter    changed_date, changed_author, checksum, properties, translated_size,
1132251881Speter    last_mod_time, symlink_target, moved_to )
1133251881SpeterSELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/,
1134251881Speter    repos_id, repos_path, revision, ?6 /*presence*/, depth,
1135251881Speter    ?8 /*moved_here*/, kind, changed_revision, changed_date,
1136251881Speter    changed_author, checksum, properties, translated_size,
1137251881Speter    last_mod_time, symlink_target,
1138251881Speter    (SELECT dst.moved_to FROM nodes AS dst
1139251881Speter                         WHERE dst.wc_id = ?1
1140251881Speter                         AND dst.local_relpath = ?3
1141251881Speter                         AND dst.op_depth = ?4)
1142251881SpeterFROM nodes
1143251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7
1144251881Speter
1145251881Speter-- STMT_UPDATE_BASE_REVISION
1146251881SpeterUPDATE nodes SET revision = ?3
1147251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1148251881Speter
1149251881Speter-- STMT_UPDATE_BASE_REPOS
1150251881SpeterUPDATE nodes SET repos_id = ?3, repos_path = ?4
1151251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
1152251881Speter
1153251881Speter-- STMT_ACTUAL_HAS_CHILDREN
1154251881SpeterSELECT 1 FROM actual_node
1155251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2
1156251881SpeterLIMIT 1
1157251881Speter
1158251881Speter-- STMT_INSERT_EXTERNAL
1159251881SpeterINSERT OR REPLACE INTO externals (
1160251881Speter    wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath,
1161251881Speter    repos_id, def_repos_relpath, def_operational_revision, def_revision)
1162251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
1163251881Speter
1164251881Speter-- STMT_SELECT_EXTERNAL_INFO
1165251881SpeterSELECT presence, kind, def_local_relpath, repos_id,
1166251881Speter    def_repos_relpath, def_operational_revision, def_revision
1167251881SpeterFROM externals WHERE wc_id = ?1 AND local_relpath = ?2
1168251881SpeterLIMIT 1
1169251881Speter
1170251881Speter-- STMT_DELETE_FILE_EXTERNALS
1171251881SpeterDELETE FROM nodes
1172251881SpeterWHERE wc_id = ?1
1173251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1174251881Speter  AND op_depth = 0
1175251881Speter  AND file_external IS NOT NULL
1176251881Speter
1177251881Speter-- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS
1178251881SpeterDELETE FROM externals
1179251881SpeterWHERE wc_id = ?1
1180251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1181251881Speter  AND kind != MAP_DIR
1182251881Speter
1183251881Speter-- STMT_DELETE_EXTERNAL_REGISTATIONS
1184251881SpeterDELETE FROM externals
1185251881SpeterWHERE wc_id = ?1
1186251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1187251881Speter
1188251881Speter/* Select all committable externals, i.e. only unpegged ones on the same
1189251881Speter * repository as the target path ?2, that are defined by WC ?1 to
1190251881Speter * live below the target path. It does not matter which ancestor has the
1191251881Speter * svn:externals definition, only the local path at which the external is
1192251881Speter * supposed to be checked out is queried.
1193251881Speter * Arguments:
1194251881Speter *  ?1: wc_id.
1195251881Speter *  ?2: the target path, local relpath inside ?1.
1196251881Speter *
1197251881Speter * ### NOTE: This statement deliberately removes file externals that live
1198251881Speter * inside an unversioned dir, because commit still breaks on those.
1199251881Speter * Once that's been fixed, the conditions below "--->8---" become obsolete. */
1200251881Speter-- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW
1201251881SpeterSELECT local_relpath, kind, def_repos_relpath,
1202251881Speter  (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1203251881SpeterFROM externals e
1204251881SpeterWHERE wc_id = ?1
1205251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1206251881Speter  AND def_revision IS NULL
1207251881Speter  AND repos_id = (SELECT repos_id
1208251881Speter                  FROM nodes AS n
1209251881Speter                  WHERE n.wc_id = ?1
1210251881Speter                    AND n.local_relpath = ''
1211251881Speter                    AND n.op_depth = 0)
1212251881Speter  AND ((kind='dir')
1213251881Speter       OR EXISTS (SELECT 1 FROM nodes
1214251881Speter                  WHERE nodes.wc_id = e.wc_id
1215251881Speter                  AND nodes.local_relpath = e.parent_relpath))
1216251881Speter
1217251881Speter-- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW
1218251881SpeterSELECT local_relpath, kind, def_repos_relpath,
1219251881Speter  (SELECT root FROM repository AS r WHERE r.id = e.repos_id)
1220251881SpeterFROM externals e
1221251881SpeterWHERE wc_id = ?1
1222251881Speter  AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2)
1223251881Speter  AND parent_relpath = ?2
1224251881Speter  AND def_revision IS NULL
1225251881Speter  AND repos_id = (SELECT repos_id
1226251881Speter                    FROM nodes AS n
1227251881Speter                    WHERE n.wc_id = ?1
1228251881Speter                      AND n.local_relpath = ''
1229251881Speter                      AND n.op_depth = 0)
1230251881Speter  AND ((kind='dir')
1231251881Speter       OR EXISTS (SELECT 1 FROM nodes
1232251881Speter                  WHERE nodes.wc_id = e.wc_id
1233251881Speter                  AND nodes.local_relpath = e.parent_relpath))
1234251881Speter
1235251881Speter-- STMT_SELECT_EXTERNALS_DEFINED
1236251881SpeterSELECT local_relpath, def_local_relpath
1237251881SpeterFROM externals
1238251881Speter/* ### The Sqlite optimizer needs help here ###
1239251881Speter * WHERE wc_id = ?1
1240251881Speter *   AND (def_local_relpath = ?2
1241251881Speter *        OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */
1242251881SpeterWHERE (wc_id = ?1 AND def_local_relpath = ?2)
1243251881Speter   OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2))
1244251881Speter
1245251881Speter-- STMT_DELETE_EXTERNAL
1246251881SpeterDELETE FROM externals
1247251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1248251881Speter
1249251881Speter-- STMT_SELECT_EXTERNAL_PROPERTIES
1250251881Speter/* ### It would be nice if Sqlite would handle
1251251881Speter * SELECT IFNULL((SELECT properties FROM actual_node a
1252251881Speter *                WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1253251881Speter *               properties),
1254251881Speter *        local_relpath, depth
1255251881Speter * FROM nodes_current n
1256251881Speter * WHERE wc_id = ?1
1257251881Speter *   AND (local_relpath = ?2
1258251881Speter *        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1259251881Speter *   AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1260251881Speter * ### But it would take a double table scan execution plan for it.
1261251881Speter * ### Maybe there is something else going on? */
1262251881SpeterSELECT IFNULL((SELECT properties FROM actual_node a
1263251881Speter               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1264251881Speter              properties),
1265251881Speter       local_relpath, depth
1266251881SpeterFROM nodes_current n
1267251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2
1268251881Speter  AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1269251881SpeterUNION ALL
1270251881SpeterSELECT IFNULL((SELECT properties FROM actual_node a
1271251881Speter               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1272251881Speter              properties),
1273251881Speter       local_relpath, depth
1274251881SpeterFROM nodes_current n
1275251881SpeterWHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1276251881Speter  AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1277251881Speter
1278251881Speter-- STMT_SELECT_CURRENT_PROPS_RECURSIVE
1279251881Speter/* ### Ugly OR to make sqlite use the proper optimizations */
1280251881SpeterSELECT IFNULL((SELECT properties FROM actual_node a
1281251881Speter               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
1282251881Speter              properties),
1283251881Speter       local_relpath
1284251881SpeterFROM nodes_current n
1285251881SpeterWHERE (wc_id = ?1 AND local_relpath = ?2)
1286251881Speter   OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1287251881Speter
1288251881Speter-- STMT_PRAGMA_LOCKING_MODE
1289299742SdimPRAGMA locking_mode = exclusive;
1290299742Sdim/* Testing shows DELETE is faster than TRUNCATE on NFS and
1291299742Sdim   exclusive-locking is mostly used on remote file systems. */
1292299742SdimPRAGMA journal_mode = DELETE
1293251881Speter
1294251881Speter/* ------------------------------------------------------------------------- */
1295251881Speter
1296251881Speter/* these are used in entries.c  */
1297251881Speter
1298251881Speter-- STMT_INSERT_ACTUAL_NODE
1299251881SpeterINSERT OR REPLACE INTO actual_node (
1300251881Speter  wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data)
1301251881SpeterVALUES (?1, ?2, ?3, ?4, ?5, ?6)
1302251881Speter
1303251881Speter/* ------------------------------------------------------------------------- */
1304251881Speter
1305251881Speter/* these are used in upgrade.c  */
1306251881Speter
1307251881Speter-- STMT_SELECT_ALL_FILES
1308251881SpeterSELECT local_relpath FROM nodes_current
1309251881SpeterWHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE
1310251881Speter
1311251881Speter-- STMT_UPDATE_NODE_PROPS
1312251881SpeterUPDATE nodes SET properties = ?4
1313251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1314251881Speter
1315251881Speter-- STMT_PRAGMA_TABLE_INFO_NODES
1316251881SpeterPRAGMA table_info("NODES")
1317251881Speter
1318251881Speter/* --------------------------------------------------------------------------
1319251881Speter * Complex queries for callback walks, caching results in a temporary table.
1320251881Speter *
1321251881Speter * These target table are then used for joins against NODES, or for reporting
1322251881Speter */
1323251881Speter
1324251881Speter-- STMT_CREATE_TARGET_PROP_CACHE
1325251881SpeterDROP TABLE IF EXISTS target_prop_cache;
1326251881SpeterCREATE TEMPORARY TABLE target_prop_cache (
1327251881Speter  local_relpath TEXT NOT NULL PRIMARY KEY,
1328251881Speter  kind TEXT NOT NULL,
1329251881Speter  properties BLOB
1330251881Speter);
1331251881Speter/* ###  Need index?
1332251881SpeterCREATE UNIQUE INDEX temp__node_props_cache_unique
1333251881Speter  ON temp__node_props_cache (local_relpath) */
1334251881Speter
1335251881Speter-- STMT_CACHE_TARGET_PROPS
1336251881SpeterINSERT INTO target_prop_cache(local_relpath, kind, properties)
1337251881Speter SELECT n.local_relpath, n.kind,
1338251881Speter        IFNULL((SELECT properties FROM actual_node AS a
1339251881Speter                 WHERE a.wc_id = n.wc_id
1340251881Speter                   AND a.local_relpath = n.local_relpath),
1341251881Speter               n.properties)
1342251881Speter   FROM targets_list AS t
1343251881Speter   JOIN nodes AS n
1344251881Speter     ON n.wc_id = ?1
1345251881Speter    AND n.local_relpath = t.local_relpath
1346251881Speter    AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1347251881Speter                      WHERE n3.wc_id = ?1
1348251881Speter                        AND n3.local_relpath = t.local_relpath)
1349251881Speter  WHERE t.wc_id = ?1
1350251881Speter    AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE)
1351251881Speter  ORDER BY t.local_relpath
1352251881Speter
1353251881Speter-- STMT_CACHE_TARGET_PRISTINE_PROPS
1354251881SpeterINSERT INTO target_prop_cache(local_relpath, kind, properties)
1355251881Speter SELECT n.local_relpath, n.kind,
1356251881Speter        CASE n.presence
1357251881Speter          WHEN MAP_BASE_DELETED
1358251881Speter          THEN (SELECT properties FROM nodes AS p
1359251881Speter                 WHERE p.wc_id = n.wc_id
1360251881Speter                   AND p.local_relpath = n.local_relpath
1361251881Speter                   AND p.op_depth < n.op_depth
1362251881Speter                 ORDER BY p.op_depth DESC /* LIMIT 1 */)
1363251881Speter          ELSE properties END
1364251881Speter  FROM targets_list AS t
1365251881Speter  JOIN nodes AS n
1366251881Speter    ON n.wc_id = ?1
1367251881Speter   AND n.local_relpath = t.local_relpath
1368251881Speter   AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3
1369251881Speter                     WHERE n3.wc_id = ?1
1370251881Speter                       AND n3.local_relpath = t.local_relpath)
1371251881Speter  WHERE t.wc_id = ?1
1372251881Speter    AND (presence = MAP_NORMAL
1373251881Speter         OR presence = MAP_INCOMPLETE
1374251881Speter         OR presence = MAP_BASE_DELETED)
1375251881Speter  ORDER BY t.local_relpath
1376251881Speter
1377251881Speter-- STMT_SELECT_ALL_TARGET_PROP_CACHE
1378251881SpeterSELECT local_relpath, properties FROM target_prop_cache
1379251881SpeterORDER BY local_relpath
1380251881Speter
1381251881Speter-- STMT_DROP_TARGET_PROP_CACHE
1382251881SpeterDROP TABLE target_prop_cache;
1383251881Speter
1384251881Speter-- STMT_CREATE_REVERT_LIST
1385251881SpeterDROP TABLE IF EXISTS revert_list;
1386251881SpeterCREATE TEMPORARY TABLE revert_list (
1387251881Speter   /* need wc_id if/when revert spans multiple working copies */
1388251881Speter   local_relpath TEXT NOT NULL,
1389251881Speter   actual INTEGER NOT NULL,         /* 1 if an actual row, 0 if a nodes row */
1390251881Speter   conflict_data BLOB,
1391251881Speter   notify INTEGER,         /* 1 if an actual row had props or tree conflict */
1392251881Speter   op_depth INTEGER,
1393251881Speter   repos_id INTEGER,
1394251881Speter   kind TEXT,
1395251881Speter   PRIMARY KEY (local_relpath, actual)
1396251881Speter   );
1397251881SpeterDROP TRIGGER IF EXISTS   trigger_revert_list_nodes;
1398251881SpeterCREATE TEMPORARY TRIGGER trigger_revert_list_nodes
1399251881SpeterBEFORE DELETE ON nodes
1400251881SpeterBEGIN
1401251881Speter   INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth,
1402251881Speter                                      repos_id, kind)
1403251881Speter   SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind;
1404251881SpeterEND;
1405251881SpeterDROP TRIGGER IF EXISTS   trigger_revert_list_actual_delete;
1406251881SpeterCREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
1407251881SpeterBEFORE DELETE ON actual_node
1408251881SpeterBEGIN
1409251881Speter   INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1410251881Speter                                      notify)
1411251881Speter   SELECT OLD.local_relpath, 1, OLD.conflict_data,
1412251881Speter          CASE
1413251881Speter            WHEN OLD.properties IS NOT NULL
1414251881Speter            THEN 1
1415251881Speter            WHEN NOT EXISTS(SELECT 1 FROM NODES n
1416251881Speter                            WHERE n.wc_id = OLD.wc_id
1417251881Speter                              AND n.local_relpath = OLD.local_relpath)
1418251881Speter            THEN 1
1419299742Sdim          END notify
1420299742Sdim   WHERE OLD.conflict_data IS NOT NULL
1421299742Sdim      OR notify IS NOT NULL;
1422251881SpeterEND;
1423251881SpeterDROP TRIGGER IF EXISTS   trigger_revert_list_actual_update;
1424251881SpeterCREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
1425251881SpeterBEFORE UPDATE ON actual_node
1426251881SpeterBEGIN
1427251881Speter   INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data,
1428251881Speter                                      notify)
1429251881Speter   SELECT OLD.local_relpath, 1, OLD.conflict_data,
1430251881Speter          CASE
1431251881Speter            WHEN OLD.properties IS NOT NULL
1432251881Speter            THEN 1
1433251881Speter            WHEN NOT EXISTS(SELECT 1 FROM NODES n
1434251881Speter                            WHERE n.wc_id = OLD.wc_id
1435251881Speter                              AND n.local_relpath = OLD.local_relpath)
1436251881Speter            THEN 1
1437299742Sdim          END notify
1438299742Sdim   WHERE OLD.conflict_data IS NOT NULL
1439299742Sdim      OR notify IS NOT NULL;
1440251881SpeterEND
1441251881Speter
1442251881Speter-- STMT_DROP_REVERT_LIST_TRIGGERS
1443251881SpeterDROP TRIGGER trigger_revert_list_nodes;
1444251881SpeterDROP TRIGGER trigger_revert_list_actual_delete;
1445251881SpeterDROP TRIGGER trigger_revert_list_actual_update
1446251881Speter
1447251881Speter-- STMT_SELECT_REVERT_LIST
1448251881SpeterSELECT actual, notify, kind, op_depth, repos_id, conflict_data
1449251881SpeterFROM revert_list
1450251881SpeterWHERE local_relpath = ?1
1451251881SpeterORDER BY actual DESC
1452251881Speter
1453251881Speter-- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN
1454251881SpeterSELECT local_relpath, kind
1455251881SpeterFROM revert_list
1456251881SpeterWHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1)
1457251881Speter  AND op_depth >= ?2
1458251881Speter  AND repos_id IS NOT NULL
1459251881SpeterORDER BY local_relpath
1460251881Speter
1461251881Speter-- STMT_DELETE_REVERT_LIST
1462251881SpeterDELETE FROM revert_list WHERE local_relpath = ?1
1463251881Speter
1464251881Speter-- STMT_SELECT_REVERT_LIST_RECURSIVE
1465299742SdimSELECT p.local_relpath, n.kind, a.notify, a.kind
1466299742SdimFROM (SELECT DISTINCT local_relpath
1467299742Sdim      FROM revert_list
1468299742Sdim      WHERE (local_relpath = ?1
1469299742Sdim        OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))) p
1470251881Speter
1471299742SdimLEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0
1472299742SdimLEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1
1473299742SdimORDER BY p.local_relpath
1474299742Sdim
1475251881Speter-- STMT_DELETE_REVERT_LIST_RECURSIVE
1476251881SpeterDELETE FROM revert_list
1477251881SpeterWHERE (local_relpath = ?1
1478251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))
1479251881Speter
1480251881Speter-- STMT_DROP_REVERT_LIST
1481251881SpeterDROP TABLE IF EXISTS revert_list
1482251881Speter
1483251881Speter-- STMT_CREATE_DELETE_LIST
1484251881SpeterDROP TABLE IF EXISTS delete_list;
1485251881SpeterCREATE TEMPORARY TABLE delete_list (
1486251881Speter/* ### we should put the wc_id in here in case a delete spans multiple
1487251881Speter   ### working copies. queries, etc will need to be adjusted.  */
1488251881Speter   local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE
1489251881Speter   )
1490251881Speter
1491251881Speter/* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE.
1492251881Speter   A subquery is used instead of nodes_current to avoid a table scan */
1493251881Speter-- STMT_INSERT_DELETE_LIST
1494251881SpeterINSERT INTO delete_list(local_relpath)
1495299742SdimSELECT ?2
1496299742SdimUNION ALL
1497251881SpeterSELECT local_relpath FROM nodes AS n
1498251881SpeterWHERE wc_id = ?1
1499299742Sdim  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1500251881Speter  AND op_depth >= ?3
1501251881Speter  AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s
1502251881Speter                  WHERE s.wc_id = ?1
1503251881Speter                    AND s.local_relpath = n.local_relpath)
1504251881Speter  AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED)
1505251881Speter  AND file_external IS NULL
1506299742SdimORDER by local_relpath
1507251881Speter
1508251881Speter-- STMT_SELECT_DELETE_LIST
1509251881SpeterSELECT local_relpath FROM delete_list
1510251881SpeterORDER BY local_relpath
1511251881Speter
1512251881Speter-- STMT_FINALIZE_DELETE
1513251881SpeterDROP TABLE IF EXISTS delete_list
1514251881Speter
1515251881Speter-- STMT_CREATE_UPDATE_MOVE_LIST
1516251881SpeterDROP TABLE IF EXISTS update_move_list;
1517251881SpeterCREATE TEMPORARY TABLE update_move_list (
1518251881Speter/* ### we should put the wc_id in here in case a move update spans multiple
1519251881Speter   ### working copies. queries, etc will need to be adjusted.  */
1520251881Speter  local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE,
1521251881Speter  action INTEGER NOT NULL,
1522299742Sdim  kind TEXT NOT NULL,
1523251881Speter  content_state INTEGER NOT NULL,
1524251881Speter  prop_state  INTEGER NOT NULL
1525251881Speter  )
1526251881Speter
1527251881Speter-- STMT_INSERT_UPDATE_MOVE_LIST
1528251881SpeterINSERT INTO update_move_list(local_relpath, action, kind, content_state,
1529251881Speter  prop_state)
1530251881SpeterVALUES (?1, ?2, ?3, ?4, ?5)
1531251881Speter
1532251881Speter-- STMT_SELECT_UPDATE_MOVE_LIST
1533251881SpeterSELECT local_relpath, action, kind, content_state, prop_state
1534251881SpeterFROM update_move_list
1535251881SpeterORDER BY local_relpath
1536251881Speter
1537251881Speter-- STMT_FINALIZE_UPDATE_MOVE
1538251881SpeterDROP TABLE IF EXISTS update_move_list
1539251881Speter
1540299742Sdim-- STMT_MOVE_NOTIFY_TO_REVERT
1541299742SdimINSERT INTO revert_list (local_relpath, notify, kind, actual)
1542299742Sdim       SELECT local_relpath, 2, kind, 1 FROM update_move_list;
1543299742SdimDROP TABLE update_move_list
1544299742Sdim
1545251881Speter/* ------------------------------------------------------------------------- */
1546251881Speter
1547251881Speter/* Queries for revision status. */
1548251881Speter
1549251881Speter-- STMT_SELECT_MIN_MAX_REVISIONS
1550251881SpeterSELECT MIN(revision), MAX(revision),
1551251881Speter       MIN(changed_revision), MAX(changed_revision) FROM nodes
1552251881Speter  WHERE wc_id = ?1
1553251881Speter    AND (local_relpath = ?2
1554251881Speter         OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1555251881Speter    AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1556251881Speter    AND file_external IS NULL
1557251881Speter    AND op_depth = 0
1558251881Speter
1559251881Speter-- STMT_HAS_SPARSE_NODES
1560251881SpeterSELECT 1 FROM nodes
1561251881SpeterWHERE wc_id = ?1
1562251881Speter  AND (local_relpath = ?2
1563251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1564251881Speter  AND op_depth = 0
1565251881Speter  AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED)
1566251881Speter        OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN))
1567251881Speter  AND file_external IS NULL
1568251881SpeterLIMIT 1
1569251881Speter
1570251881Speter-- STMT_SUBTREE_HAS_TREE_MODIFICATIONS
1571251881SpeterSELECT 1 FROM nodes
1572251881SpeterWHERE wc_id = ?1
1573251881Speter  AND (local_relpath = ?2
1574251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1575251881Speter  AND op_depth > 0
1576251881SpeterLIMIT 1
1577251881Speter
1578251881Speter-- STMT_SUBTREE_HAS_PROP_MODIFICATIONS
1579251881SpeterSELECT 1 FROM actual_node
1580251881SpeterWHERE wc_id = ?1
1581251881Speter  AND (local_relpath = ?2
1582251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1583251881Speter  AND properties IS NOT NULL
1584251881SpeterLIMIT 1
1585251881Speter
1586251881Speter-- STMT_HAS_SWITCHED
1587251881SpeterSELECT 1
1588251881SpeterFROM nodes
1589251881SpeterWHERE wc_id = ?1
1590251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1591251881Speter  AND op_depth = 0
1592251881Speter  AND file_external IS NULL
1593251881Speter  AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
1594251881Speter  AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath)
1595251881SpeterLIMIT 1
1596251881Speter
1597251881Speter-- STMT_SELECT_MOVED_FROM_RELPATH
1598251881SpeterSELECT local_relpath, op_depth FROM nodes
1599251881SpeterWHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1600251881Speter
1601251881Speter-- STMT_UPDATE_MOVED_TO_RELPATH
1602251881SpeterUPDATE nodes SET moved_to = ?4
1603251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1604251881Speter
1605251881Speter-- STMT_CLEAR_MOVED_TO_RELPATH
1606251881SpeterUPDATE nodes SET moved_to = NULL
1607251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
1608251881Speter
1609251881Speter-- STMT_CLEAR_MOVED_HERE_RECURSIVE
1610251881SpeterUPDATE nodes SET moved_here = NULL
1611251881SpeterWHERE wc_id = ?1
1612251881Speter AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1613251881Speter AND op_depth = ?3
1614251881Speter
1615251881Speter/* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1.
1616251881Speter * Each row returns a moved-here path (always a child of ?2) in the first
1617251881Speter * column, and its matching moved-away (deleted) path in the second column. */
1618251881Speter-- STMT_SELECT_MOVED_HERE_CHILDREN
1619251881SpeterSELECT moved_to, local_relpath FROM nodes
1620251881SpeterWHERE wc_id = ?1 AND op_depth > 0
1621251881Speter  AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1622251881Speter
1623269847Speter/* If the node is moved here (r.moved_here = 1) we are really interested in
1624269847Speter   where the node was moved from. To obtain that we need the op_depth, but
1625269847Speter   this form of select only allows a single return value */
1626251881Speter-- STMT_SELECT_MOVED_FOR_DELETE
1627269847SpeterSELECT local_relpath, moved_to, op_depth,
1628269847Speter       (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1629269847Speter        WHERE r.wc_id = ?1
1630269847Speter          AND r.local_relpath = n.local_relpath
1631269847Speter          AND r.op_depth < n.op_depth
1632269847Speter        ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1633269847Speter FROM nodes n
1634251881SpeterWHERE wc_id = ?1
1635251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1636251881Speter  AND moved_to IS NOT NULL
1637269847Speter  AND op_depth >= ?3
1638251881Speter
1639269847Speter-- STMT_SELECT_MOVED_FROM_FOR_DELETE
1640269847SpeterSELECT local_relpath, op_depth,
1641269847Speter       (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r
1642269847Speter        WHERE r.wc_id = ?1
1643269847Speter          AND r.local_relpath = n.local_relpath
1644269847Speter          AND r.op_depth < n.op_depth
1645269847Speter        ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth
1646269847Speter FROM nodes n
1647269847SpeterWHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
1648269847Speter
1649251881Speter-- STMT_UPDATE_MOVED_TO_DESCENDANTS
1650251881SpeterUPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to)
1651251881Speter WHERE wc_id = ?1
1652251881Speter   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1653251881Speter
1654251881Speter-- STMT_CLEAR_MOVED_TO_DESCENDANTS
1655251881SpeterUPDATE nodes SET moved_to = NULL
1656251881Speter WHERE wc_id = ?1
1657251881Speter   AND IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1658251881Speter
1659251881Speter-- STMT_SELECT_MOVED_PAIR3
1660299742SdimSELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
1661299742SdimFROM nodes n
1662299742SdimJOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
1663299742Sdim AND d.op_depth = (SELECT MIN(dd.op_depth)
1664299742Sdim                    FROM nodes dd
1665299742Sdim                    WHERE dd.wc_id = ?1
1666299742Sdim                      AND dd.local_relpath = d.local_relpath
1667299742Sdim                      AND dd.op_depth > ?3)
1668299742SdimWHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3
1669299742Sdim  AND d.moved_to IS NOT NULL
1670262253SpeterUNION ALL
1671299742SdimSELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
1672299742SdimFROM nodes n
1673299742SdimJOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
1674299742Sdim AND d.op_depth = (SELECT MIN(dd.op_depth)
1675299742Sdim                    FROM nodes dd
1676299742Sdim                    WHERE dd.wc_id = ?1
1677299742Sdim                      AND dd.local_relpath = d.local_relpath
1678299742Sdim                      AND dd.op_depth > ?3)
1679299742SdimWHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
1680299742Sdim  AND n.op_depth = ?3
1681299742Sdim  AND d.moved_to IS NOT NULL
1682299742SdimORDER BY n.local_relpath
1683251881Speter
1684251881Speter-- STMT_SELECT_MOVED_OUTSIDE
1685262253SpeterSELECT local_relpath, moved_to, op_depth FROM nodes
1686251881SpeterWHERE wc_id = ?1
1687251881Speter  AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1688251881Speter  AND op_depth >= ?3
1689251881Speter  AND moved_to IS NOT NULL
1690251881Speter  AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2)
1691251881Speter
1692299742Sdim-- STMT_SELECT_MOVED_DESCENDANTS_SRC
1693299742SdimSELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to
1694299742SdimFROM nodes n
1695299742SdimJOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath
1696299742Sdim AND s.op_depth = (SELECT MIN(d.op_depth)
1697299742Sdim                    FROM nodes d
1698299742Sdim                    WHERE d.wc_id = ?1
1699299742Sdim                      AND d.local_relpath = s.local_relpath
1700299742Sdim                      AND d.op_depth > ?3)
1701299742SdimWHERE n.wc_id = ?1 AND n.op_depth = ?3
1702299742Sdim  AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2))
1703299742Sdim  AND s.moved_to IS NOT NULL
1704251881Speter
1705251881Speter-- STMT_COMMIT_UPDATE_ORIGIN
1706251881SpeterUPDATE nodes SET repos_id = ?4,
1707299742Sdim                 repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
1708251881Speter                 revision = ?6
1709251881SpeterWHERE wc_id = ?1
1710251881Speter  AND (local_relpath = ?2
1711251881Speter       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
1712251881Speter  AND op_depth = ?3
1713251881Speter
1714251881Speter-- STMT_HAS_LAYER_BETWEEN
1715251881SpeterSELECT 1 FROM NODES
1716251881SpeterWHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4
1717251881Speter
1718251881Speter-- STMT_SELECT_REPOS_PATH_REVISION
1719251881SpeterSELECT local_relpath, repos_path, revision FROM nodes
1720251881SpeterWHERE wc_id = ?1
1721251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1722251881Speter  AND op_depth = 0
1723251881SpeterORDER BY local_relpath
1724251881Speter
1725251881Speter-- STMT_SELECT_HAS_NON_FILE_CHILDREN
1726251881SpeterSELECT 1 FROM nodes
1727299742SdimWHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != MAP_FILE
1728299742SdimLIMIT 1
1729251881Speter
1730251881Speter-- STMT_SELECT_HAS_GRANDCHILDREN
1731251881SpeterSELECT 1 FROM nodes
1732251881SpeterWHERE wc_id = ?1
1733251881Speter  AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2)
1734299742Sdim  AND op_depth = ?3
1735251881Speter  AND file_external IS NULL
1736299742SdimLIMIT 1
1737251881Speter
1738251881Speter/* ------------------------------------------------------------------------- */
1739251881Speter
1740251881Speter/* Queries for verification. */
1741251881Speter
1742251881Speter-- STMT_SELECT_ALL_NODES
1743251881SpeterSELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes
1744251881SpeterWHERE wc_id = ?1
1745251881Speter
1746251881Speter/* ------------------------------------------------------------------------- */
1747251881Speter
1748251881Speter/* Queries for cached inherited properties. */
1749251881Speter
1750251881Speter/* Select the inherited properties of a single base node. */
1751251881Speter-- STMT_SELECT_IPROPS
1752251881SpeterSELECT inherited_props FROM nodes
1753251881SpeterWHERE wc_id = ?1
1754251881Speter  AND local_relpath = ?2
1755251881Speter  AND op_depth = 0
1756251881Speter
1757251881Speter/* Update the inherited properties of a single base node. */
1758251881Speter-- STMT_UPDATE_IPROP
1759251881SpeterUPDATE nodes
1760251881SpeterSET inherited_props = ?3
1761251881SpeterWHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)
1762251881Speter
1763251881Speter/* Select a single path if its base node has cached inherited properties. */
1764251881Speter-- STMT_SELECT_IPROPS_NODE
1765251881SpeterSELECT local_relpath, repos_path FROM nodes
1766251881SpeterWHERE wc_id = ?1
1767251881Speter  AND local_relpath = ?2
1768251881Speter  AND op_depth = 0
1769251881Speter  AND (inherited_props not null)
1770251881Speter
1771251881Speter/* Select all paths whose base nodes are below a given path, which
1772251881Speter   have cached inherited properties. */
1773251881Speter-- STMT_SELECT_IPROPS_RECURSIVE
1774251881SpeterSELECT local_relpath, repos_path FROM nodes
1775251881SpeterWHERE wc_id = ?1
1776251881Speter  AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
1777251881Speter  AND op_depth = 0
1778251881Speter  AND (inherited_props not null)
1779251881Speter
1780251881Speter-- STMT_SELECT_IPROPS_CHILDREN
1781251881SpeterSELECT local_relpath, repos_path FROM nodes
1782251881SpeterWHERE wc_id = ?1
1783251881Speter  AND parent_relpath = ?2
1784251881Speter  AND op_depth = 0
1785251881Speter  AND (inherited_props not null)
1786251881Speter
1787289166Speter-- STMT_HAVE_STAT1_TABLE
1788289166SpeterSELECT 1 FROM sqlite_master WHERE name='sqlite_stat1' AND type='table'
1789289166SpeterLIMIT 1
1790289166Speter
1791251881Speter/* ------------------------------------------------------------------------- */
1792251881Speter
1793251881Speter/* Grab all the statements related to the schema.  */
1794251881Speter
1795251881Speter-- include: wc-metadata
1796251881Speter-- include: wc-checks
1797