/* wc-queries.sql -- queries used to interact with the wc-metadata * SQLite database * This is intended for use with SQLite 3 * * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * ==================================================================== */ /* ------------------------------------------------------------------------- */ /* these are used in wc_db.c */ -- STMT_SELECT_NODE_INFO SELECT op_depth, repos_id, repos_path, presence, kind, revision, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, last_mod_time, properties, moved_here, inherited_props, moved_to FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 ORDER BY op_depth DESC -- STMT_SELECT_NODE_INFO_WITH_LOCK SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, last_mod_time, properties, moved_here, inherited_props, /* All the columns until now must match those returned by STMT_SELECT_NODE_INFO. The implementation of svn_wc__db_read_info() assumes that these columns are followed by the lock information) */ lock_token, lock_owner, lock_comment, lock_date FROM nodes LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id AND nodes.repos_path = lock.repos_relpath WHERE wc_id = ?1 AND local_relpath = ?2 ORDER BY op_depth DESC -- STMT_SELECT_BASE_NODE SELECT repos_id, repos_path, presence, kind, revision, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, last_mod_time, properties, file_external FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_SELECT_BASE_NODE_WITH_LOCK SELECT nodes.repos_id, nodes.repos_path, presence, kind, revision, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, last_mod_time, properties, file_external, /* All the columns until now must match those returned by STMT_SELECT_BASE_NODE. The implementation of svn_wc__db_base_get_info() assumes that these columns are followed by the lock information) */ lock_token, lock_owner, lock_comment, lock_date FROM nodes LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id AND nodes.repos_path = lock.repos_relpath WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_SELECT_BASE_CHILDREN_INFO SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, revision, depth, file_external, lock_token, lock_owner, lock_comment, lock_date FROM nodes LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id AND nodes.repos_path = lock.repos_relpath WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 -- STMT_SELECT_WORKING_NODE SELECT op_depth, presence, kind, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, repos_id, repos_path, revision, moved_here, moved_to, last_mod_time, properties FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0 ORDER BY op_depth DESC LIMIT 1 -- STMT_SELECT_DEPTH_NODE SELECT repos_id, repos_path, presence, kind, revision, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, last_mod_time, properties FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_SELECT_LOWEST_WORKING_NODE SELECT op_depth, presence, kind, moved_to FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 ORDER BY op_depth LIMIT 1 -- STMT_SELECT_HIGHEST_WORKING_NODE SELECT op_depth FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3 ORDER BY op_depth DESC LIMIT 1 -- STMT_SELECT_ACTUAL_NODE SELECT changelist, properties, conflict_data FROM actual_node WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_SELECT_NODE_CHILDREN_INFO /* Getting rows in an advantageous order using ORDER BY local_relpath, op_depth DESC turns out to be slower than getting rows in a random order and making the C code handle it. */ SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, checksum, translated_size, changed_revision, changed_date, changed_author, depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external FROM nodes LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id AND nodes.repos_path = lock.repos_relpath AND op_depth = 0 WHERE wc_id = ?1 AND parent_relpath = ?2 -- STMT_SELECT_NODE_CHILDREN_WALKER_INFO SELECT local_relpath, op_depth, presence, kind FROM nodes_current WHERE wc_id = ?1 AND parent_relpath = ?2 -- STMT_SELECT_ACTUAL_CHILDREN_INFO SELECT local_relpath, changelist, properties, conflict_data FROM actual_node WHERE wc_id = ?1 AND parent_relpath = ?2 -- STMT_SELECT_REPOSITORY_BY_ID SELECT root, uuid FROM repository WHERE id = ?1 -- STMT_SELECT_WCROOT_NULL SELECT id FROM wcroot WHERE local_abspath IS NULL -- STMT_SELECT_REPOSITORY SELECT id FROM repository WHERE root = ?1 -- STMT_INSERT_REPOSITORY INSERT INTO repository (root, uuid) VALUES (?1, ?2) -- STMT_INSERT_NODE INSERT OR REPLACE INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, revision, presence, depth, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, dav_cache, symlink_target, file_external, moved_to, moved_here, inherited_props) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23) -- STMT_SELECT_BASE_PRESENT SELECT local_relpath, kind FROM nodes n WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 AND presence in (MAP_NORMAL, MAP_INCOMPLETE) AND NOT EXISTS(SELECT 1 FROM NODES w WHERE w.wc_id = ?1 AND w.local_relpath = n.local_relpath AND op_depth > 0) ORDER BY local_relpath DESC -- STMT_SELECT_WORKING_PRESENT SELECT local_relpath, kind, checksum, translated_size, last_mod_time FROM nodes n WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND presence in (MAP_NORMAL, MAP_INCOMPLETE) AND op_depth = (SELECT MAX(op_depth) FROM NODES w WHERE w.wc_id = ?1 AND w.local_relpath = n.local_relpath) ORDER BY local_relpath DESC -- STMT_DELETE_NODE_RECURSIVE DELETE FROM NODES WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) -- STMT_DELETE_NODE DELETE FROM NODES WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE /* The ACTUAL_NODE applies to BASE, unless there is in at least one op_depth a WORKING node that could have a conflict */ DELETE FROM actual_node WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND EXISTS(SELECT 1 FROM NODES b WHERE b.wc_id = ?1 AND b.local_relpath = actual_node.local_relpath AND op_depth = 0) AND NOT EXISTS(SELECT 1 FROM NODES w WHERE w.wc_id = ?1 AND w.local_relpath = actual_node.local_relpath AND op_depth > 0 AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT)) -- STMT_DELETE_WORKING_BASE_DELETE DELETE FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND presence = MAP_BASE_DELETED AND op_depth > 0 AND op_depth = (SELECT MIN(op_depth) FROM nodes n WHERE n.wc_id = ?1 AND n.local_relpath = nodes.local_relpath AND op_depth > 0) -- STMT_DELETE_WORKING_RECURSIVE DELETE FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth > 0 -- STMT_DELETE_BASE_RECURSIVE DELETE FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 -- STMT_DELETE_WORKING_OP_DEPTH DELETE FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 -- STMT_DELETE_WORKING_OP_DEPTH_ABOVE DELETE FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth > ?3 -- STMT_SELECT_LOCAL_RELPATH_OP_DEPTH SELECT local_relpath FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 -- STMT_SELECT_CHILDREN_OP_DEPTH SELECT local_relpath, kind FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = ?3 ORDER BY local_relpath DESC -- STMT_COPY_NODE_MOVE INSERT OR REPLACE INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, revision, presence, depth, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target, moved_here, moved_to ) SELECT wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */, repos_id, repos_path, revision, presence, depth, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target, 1, (SELECT dst.moved_to FROM nodes AS dst WHERE dst.wc_id = ?1 AND dst.local_relpath = ?4 AND dst.op_depth = ?5) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_SELECT_OP_DEPTH_CHILDREN SELECT local_relpath, kind FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND presence != MAP_BASE_DELETED AND file_external is NULL /* Used by non-recursive revert to detect higher level children, and actual-only rows that would be left orphans, if the revert proceeded. */ -- STMT_SELECT_GE_OP_DEPTH_CHILDREN SELECT 1 FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 AND (op_depth > ?3 OR (op_depth = ?3 AND presence != MAP_BASE_DELETED)) UNION ALL SELECT 1 FROM ACTUAL_NODE a WHERE wc_id = ?1 AND parent_relpath = ?2 AND NOT EXISTS (SELECT 1 FROM nodes n WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath) /* Delete the nodes shadowed by local_relpath. Not valid for the wc-root */ -- STMT_DELETE_SHADOWED_RECURSIVE DELETE FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND (op_depth < ?3 OR (op_depth = ?3 AND presence = MAP_BASE_DELETED)) -- STMT_CLEAR_MOVED_TO_FROM_DEST UPDATE NODES SET moved_to = NULL WHERE wc_id = ?1 AND moved_to = ?2 /* Get not-present descendants of a copied node. Not valid for the wc-root */ -- STMT_SELECT_NOT_PRESENT_DESCENDANTS SELECT local_relpath FROM nodes WHERE wc_id = ?1 AND op_depth = ?3 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND presence = MAP_NOT_PRESENT -- STMT_COMMIT_DESCENDANTS_TO_BASE UPDATE NODES SET op_depth = 0, repos_id = ?4, repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1), revision = ?6, dav_cache = NULL, moved_here = NULL, presence = CASE presence WHEN MAP_NORMAL THEN MAP_NORMAL WHEN MAP_EXCLUDED THEN MAP_EXCLUDED ELSE MAP_NOT_PRESENT END WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = ?3 -- STMT_SELECT_NODE_CHILDREN /* Return all paths that are children of the directory (?1, ?2) in any op-depth, including children of any underlying, replaced directories. */ SELECT local_relpath FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 -- STMT_SELECT_WORKING_CHILDREN /* Return all paths that are children of the working version of the directory (?1, ?2). A given path is not included just because it is a child of an underlying (replaced) directory, it has to be in the working version of the directory. */ SELECT local_relpath FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 AND (op_depth > (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2) OR (op_depth = (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2) AND presence != MAP_BASE_DELETED)) -- STMT_SELECT_NODE_PROPS SELECT properties, presence FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 ORDER BY op_depth DESC -- STMT_SELECT_ACTUAL_PROPS SELECT properties FROM actual_node WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_UPDATE_ACTUAL_PROPS UPDATE actual_node SET properties = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_INSERT_ACTUAL_PROPS INSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties) VALUES (?1, ?2, ?3, ?4) -- STMT_INSERT_LOCK INSERT OR REPLACE INTO lock (repos_id, repos_relpath, lock_token, lock_owner, lock_comment, lock_date) VALUES (?1, ?2, ?3, ?4, ?5, ?6) /* Not valid for the working copy root */ -- STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE SELECT nodes.repos_id, nodes.repos_path, lock_token FROM nodes LEFT JOIN lock ON nodes.repos_id = lock.repos_id AND nodes.repos_path = lock.repos_relpath WHERE wc_id = ?1 AND op_depth = 0 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) -- STMT_INSERT_WCROOT INSERT INTO wcroot (local_abspath) VALUES (?1) -- STMT_UPDATE_BASE_NODE_DAV_CACHE UPDATE nodes SET dav_cache = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_SELECT_BASE_DAV_CACHE SELECT dav_cache FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_SELECT_DELETION_INFO SELECT (SELECT b.presence FROM nodes AS b WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0), work.presence, work.op_depth FROM nodes_current AS work WHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0 LIMIT 1 -- STMT_SELECT_DELETION_INFO_SCAN /* ### FIXME. moved.moved_to IS NOT NULL works when there is only one move but we need something else when there are several. */ SELECT (SELECT b.presence FROM nodes AS b WHERE b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0), work.presence, work.op_depth, moved.moved_to FROM nodes_current AS work LEFT OUTER JOIN nodes AS moved ON moved.wc_id = work.wc_id AND moved.local_relpath = work.local_relpath AND moved.moved_to IS NOT NULL WHERE work.wc_id = ?1 AND work.local_relpath = ?2 AND work.op_depth > 0 LIMIT 1 -- STMT_SELECT_OP_DEPTH_MOVED_TO SELECT op_depth, moved_to, repos_path, revision FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth <= (SELECT MIN(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3) ORDER BY op_depth DESC -- STMT_SELECT_MOVED_TO SELECT moved_to FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_SELECT_MOVED_HERE SELECT moved_here, presence, repos_path, revision FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth >= ?3 ORDER BY op_depth -- STMT_SELECT_MOVED_BACK SELECT u.local_relpath, u.presence, u.repos_id, u.repos_path, u.revision, l.presence, l.repos_id, l.repos_path, l.revision, u.moved_here, u.moved_to FROM nodes u LEFT OUTER JOIN nodes l ON l.wc_id = ?1 AND l.local_relpath = u.local_relpath AND l.op_depth = ?3 WHERE u.wc_id = ?1 AND u.local_relpath = ?2 AND u.op_depth = ?4 UNION ALL SELECT u.local_relpath, u.presence, u.repos_id, u.repos_path, u.revision, l.presence, l.repos_id, l.repos_path, l.revision, u.moved_here, NULL FROM nodes u LEFT OUTER JOIN nodes l ON l.wc_id=?1 AND l.local_relpath=u.local_relpath AND l.op_depth=?3 WHERE u.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2) AND u.op_depth = ?4 -- STMT_DELETE_MOVED_BACK DELETE FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 -- STMT_DELETE_LOCK DELETE FROM lock WHERE repos_id = ?1 AND repos_relpath = ?2 -- STMT_DELETE_LOCK_RECURSIVELY DELETE FROM lock WHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2)) -- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE UPDATE nodes SET dav_cache = NULL WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) -- STMT_RECURSIVE_UPDATE_NODE_REPO UPDATE nodes SET repos_id = ?4, dav_cache = NULL /* ### The Sqlite optimizer needs help here ### * WHERE wc_id = ?1 * AND repos_id = ?3 * AND (local_relpath = ?2 * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/ WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3) OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND repos_id = ?3) -- STMT_UPDATE_LOCK_REPOS_ID UPDATE lock SET repos_id = ?2 WHERE repos_id = ?1 -- STMT_UPDATE_NODE_FILEINFO UPDATE nodes SET translated_size = ?3, last_mod_time = ?4 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2) -- STMT_INSERT_ACTUAL_CONFLICT INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath) VALUES (?1, ?2, ?3, ?4) -- STMT_UPDATE_ACTUAL_CONFLICT UPDATE actual_node SET conflict_data = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_UPDATE_ACTUAL_CHANGELISTS UPDATE actual_node SET changelist = ?3 WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND local_relpath = (SELECT local_relpath FROM targets_list AS t WHERE wc_id = ?1 AND t.local_relpath = actual_node.local_relpath AND kind = MAP_FILE) -- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST UPDATE actual_node SET changelist = NULL WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_MARK_SKIPPED_CHANGELIST_DIRS /* 7 corresponds to svn_wc_notify_skip */ INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist) SELECT wc_id, local_relpath, 7, ?3 FROM targets_list WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND kind = MAP_DIR -- STMT_RESET_ACTUAL_WITH_CHANGELIST REPLACE INTO actual_node ( wc_id, local_relpath, parent_relpath, changelist) VALUES (?1, ?2, ?3, ?4) -- STMT_CREATE_CHANGELIST_LIST DROP TABLE IF EXISTS changelist_list; CREATE TEMPORARY TABLE changelist_list ( wc_id INTEGER NOT NULL, local_relpath TEXT NOT NULL, notify INTEGER NOT NULL, changelist TEXT NOT NULL, /* Order NOTIFY descending to make us show clears (27) before adds (26) */ PRIMARY KEY (wc_id, local_relpath, notify DESC) ) /* Create notify items for when a node is removed from a changelist and when a node is added to a changelist. Make sure nothing is notified if there were no changes. */ -- STMT_CREATE_CHANGELIST_TRIGGER DROP TRIGGER IF EXISTS trigger_changelist_list_change; CREATE TEMPORARY TRIGGER trigger_changelist_list_change BEFORE UPDATE ON actual_node WHEN old.changelist IS NOT new.changelist BEGIN /* 27 corresponds to svn_wc_notify_changelist_clear */ INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist) SELECT old.wc_id, old.local_relpath, 27, old.changelist WHERE old.changelist is NOT NULL; /* 26 corresponds to svn_wc_notify_changelist_set */ INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist) SELECT new.wc_id, new.local_relpath, 26, new.changelist WHERE new.changelist IS NOT NULL; END -- STMT_FINALIZE_CHANGELIST DROP TRIGGER trigger_changelist_list_change; DROP TABLE changelist_list; DROP TABLE targets_list -- STMT_SELECT_CHANGELIST_LIST SELECT wc_id, local_relpath, notify, changelist FROM changelist_list ORDER BY wc_id, local_relpath ASC, notify DESC -- STMT_CREATE_TARGETS_LIST DROP TABLE IF EXISTS targets_list; CREATE TEMPORARY TABLE targets_list ( wc_id INTEGER NOT NULL, local_relpath TEXT NOT NULL, parent_relpath TEXT, kind TEXT NOT NULL, PRIMARY KEY (wc_id, local_relpath) ); /* need more indicies? */ -- STMT_DROP_TARGETS_LIST DROP TABLE targets_list -- STMT_INSERT_TARGET INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT wc_id, local_relpath, parent_relpath, kind FROM nodes_current WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_INSERT_TARGET_DEPTH_FILES INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT wc_id, local_relpath, parent_relpath, kind FROM nodes_current WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE -- STMT_INSERT_TARGET_DEPTH_IMMEDIATES INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT wc_id, local_relpath, parent_relpath, kind FROM nodes_current WHERE wc_id = ?1 AND parent_relpath = ?2 -- STMT_INSERT_TARGET_DEPTH_INFINITY INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT wc_id, local_relpath, parent_relpath, kind FROM nodes_current WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) -- STMT_INSERT_TARGET_WITH_CHANGELIST INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind FROM actual_node AS A JOIN nodes_current AS N ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath WHERE N.wc_id = ?1 AND N.local_relpath = ?2 AND A.changelist = ?3 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind FROM actual_node AS A JOIN nodes_current AS N ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath WHERE N.wc_id = ?1 AND N.parent_relpath = ?2 AND kind = MAP_FILE AND A.changelist = ?3 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind FROM actual_node AS A JOIN nodes_current AS N ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath WHERE N.wc_id = ?1 AND N.parent_relpath = ?2 AND A.changelist = ?3 -- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind FROM actual_node AS A JOIN nodes_current AS N ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath WHERE N.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2) AND A.changelist = ?3 /* Only used by commented dump_targets() in wc_db.c */ /*-- STMT_SELECT_TARGETS SELECT local_relpath, parent_relpath from targets_list*/ -- STMT_INSERT_ACTUAL_EMPTIES INSERT OR IGNORE INTO actual_node ( wc_id, local_relpath, parent_relpath) SELECT wc_id, local_relpath, parent_relpath FROM targets_list -- STMT_DELETE_ACTUAL_EMPTY DELETE FROM actual_node WHERE wc_id = ?1 AND local_relpath = ?2 AND properties IS NULL AND conflict_data IS NULL AND changelist IS NULL AND text_mod IS NULL AND older_checksum IS NULL AND right_checksum IS NULL AND left_checksum IS NULL -- STMT_DELETE_ACTUAL_EMPTIES DELETE FROM actual_node WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND properties IS NULL AND conflict_data IS NULL AND changelist IS NULL AND text_mod IS NULL AND older_checksum IS NULL AND right_checksum IS NULL AND left_checksum IS NULL -- STMT_DELETE_BASE_NODE DELETE FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_DELETE_WORKING_NODE DELETE FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0) -- STMT_DELETE_LOWEST_WORKING_NODE DELETE FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = (SELECT MIN(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3) AND presence = MAP_BASE_DELETED -- STMT_DELETE_ALL_LAYERS DELETE FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE DELETE FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth >= ?3 -- STMT_DELETE_ACTUAL_NODE DELETE FROM actual_node WHERE wc_id = ?1 AND local_relpath = ?2 /* Will not delete recursive when run on the wcroot */ -- STMT_DELETE_ACTUAL_NODE_RECURSIVE DELETE FROM actual_node WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST DELETE FROM actual_node WHERE wc_id = ?1 AND local_relpath = ?2 AND (changelist IS NULL OR NOT EXISTS (SELECT 1 FROM nodes_current c WHERE c.wc_id = ?1 AND c.local_relpath = ?2 AND c.kind = MAP_FILE)) -- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE DELETE FROM actual_node WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND (changelist IS NULL OR NOT EXISTS (SELECT 1 FROM nodes_current c WHERE c.wc_id = ?1 AND c.local_relpath = actual_node.local_relpath AND c.kind = MAP_FILE)) -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST UPDATE actual_node SET properties = NULL, text_mod = NULL, conflict_data = NULL, tree_conflict_data = NULL, older_checksum = NULL, left_checksum = NULL, right_checksum = NULL WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE UPDATE actual_node SET properties = NULL, text_mod = NULL, conflict_data = NULL, tree_conflict_data = NULL, older_checksum = NULL, left_checksum = NULL, right_checksum = NULL WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) -- STMT_UPDATE_NODE_BASE_DEPTH UPDATE nodes SET depth = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 AND kind=MAP_DIR -- STMT_UPDATE_NODE_BASE_PRESENCE UPDATE nodes SET presence = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_LOOK_FOR_WORK SELECT id FROM work_queue LIMIT 1 -- STMT_INSERT_WORK_ITEM INSERT INTO work_queue (work) VALUES (?1) -- STMT_SELECT_WORK_ITEM SELECT id, work FROM work_queue ORDER BY id LIMIT 1 -- STMT_DELETE_WORK_ITEM DELETE FROM work_queue WHERE id = ?1 -- STMT_INSERT_OR_IGNORE_PRISTINE INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount) VALUES (?1, ?2, ?3, 0) -- STMT_INSERT_PRISTINE INSERT INTO pristine (checksum, md5_checksum, size, refcount) VALUES (?1, ?2, ?3, 0) -- STMT_SELECT_PRISTINE SELECT md5_checksum FROM pristine WHERE checksum = ?1 -- STMT_SELECT_PRISTINE_SIZE SELECT size FROM pristine WHERE checksum = ?1 LIMIT 1 -- STMT_SELECT_PRISTINE_BY_MD5 SELECT checksum FROM pristine WHERE md5_checksum = ?1 -- STMT_SELECT_UNREFERENCED_PRISTINES SELECT checksum FROM pristine WHERE refcount = 0 -- STMT_DELETE_PRISTINE_IF_UNREFERENCED DELETE FROM pristine WHERE checksum = ?1 AND refcount = 0 -- STMT_SELECT_COPY_PRISTINES /* For the root itself */ SELECT n.checksum, md5_checksum, size FROM nodes_current n LEFT JOIN pristine p ON n.checksum = p.checksum WHERE wc_id = ?1 AND n.local_relpath = ?2 AND n.checksum IS NOT NULL UNION ALL /* And all descendants */ SELECT n.checksum, md5_checksum, size FROM nodes n LEFT JOIN pristine p ON n.checksum = p.checksum WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2) AND op_depth >= (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2) AND n.checksum IS NOT NULL -- STMT_VACUUM VACUUM -- STMT_SELECT_CONFLICT_VICTIMS SELECT local_relpath, conflict_data FROM actual_node WHERE wc_id = ?1 AND parent_relpath = ?2 AND NOT (conflict_data IS NULL) -- STMT_INSERT_WC_LOCK INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels) VALUES (?1, ?2, ?3) -- STMT_SELECT_WC_LOCK SELECT locked_levels FROM wc_lock WHERE wc_id = ?1 AND local_dir_relpath = ?2 -- STMT_SELECT_ANCESTOR_WCLOCKS SELECT local_dir_relpath, locked_levels FROM wc_lock WHERE wc_id = ?1 AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2) OR local_dir_relpath = '') -- STMT_DELETE_WC_LOCK DELETE FROM wc_lock WHERE wc_id = ?1 AND local_dir_relpath = ?2 -- STMT_FIND_WC_LOCK SELECT local_dir_relpath FROM wc_lock WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2) -- STMT_DELETE_WC_LOCK_ORPHAN DELETE FROM wc_lock WHERE wc_id = ?1 AND local_dir_relpath = ?2 AND NOT EXISTS (SELECT 1 FROM nodes WHERE nodes.wc_id = ?1 AND nodes.local_relpath = wc_lock.local_dir_relpath) -- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE DELETE FROM wc_lock WHERE wc_id = ?1 AND (local_dir_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)) AND NOT EXISTS (SELECT 1 FROM nodes WHERE nodes.wc_id = ?1 AND nodes.local_relpath = wc_lock.local_dir_relpath) -- STMT_APPLY_CHANGES_TO_BASE_NODE /* translated_size and last_mod_time are not mentioned here because they will be tweaked after the working-file is installed. When we replace an existing BASE node (read: bump), preserve its file_external status. */ INSERT OR REPLACE INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, revision, presence, depth, kind, changed_revision, changed_date, changed_author, checksum, properties, dav_cache, symlink_target, inherited_props, file_external ) VALUES (?1, ?2, 0, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, (SELECT file_external FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0)) -- STMT_INSTALL_WORKING_NODE_FOR_DELETE INSERT OR REPLACE INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, presence, kind) VALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5) -- STMT_DELETE_NO_LOWER_LAYER DELETE FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 AND NOT EXISTS (SELECT 1 FROM nodes n WHERE n.wc_id = ?1 AND n.local_relpath = nodes.local_relpath AND n.op_depth = ?4 AND n.presence IN (MAP_NORMAL, MAP_INCOMPLETE)) -- STMT_REPLACE_WITH_BASE_DELETED INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath, kind, moved_to, presence) SELECT wc_id, local_relpath, op_depth, parent_relpath, kind, moved_to, MAP_BASE_DELETED FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 /* If this query is updated, STMT_INSERT_DELETE_LIST should too. */ -- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE INSERT INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, presence, kind) SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED, kind FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED) AND file_external IS NULL -- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY INSERT INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, revision, presence, depth, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target ) SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id, repos_path, revision, presence, depth, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_INSERT_DELETE_FROM_BASE INSERT INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, presence, kind) SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, MAP_BASE_DELETED, kind FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 /* Not valid on the wc-root */ -- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE UPDATE nodes SET op_depth = ?3 + 1 WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = ?3 -- STMT_UPDATE_OP_DEPTH_RECURSIVE UPDATE nodes SET op_depth = ?4, moved_here = NULL WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 -- STMT_DOES_NODE_EXIST SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 LIMIT 1 -- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS SELECT local_relpath FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED LIMIT 1 /* Select all excluded nodes. Not valid on the WC-root */ -- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS SELECT local_relpath FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED) /* Creates a copy from one top level NODE to a different location */ -- STMT_INSERT_WORKING_NODE_COPY_FROM INSERT OR REPLACE INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, revision, presence, depth, moved_here, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target, moved_to ) SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/, repos_id, repos_path, revision, ?6 /*presence*/, depth, ?7/*moved_here*/, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target, (SELECT dst.moved_to FROM nodes AS dst WHERE dst.wc_id = ?1 AND dst.local_relpath = ?3 AND dst.op_depth = ?4) FROM nodes_current WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH INSERT OR REPLACE INTO nodes ( wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, revision, presence, depth, moved_here, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target, moved_to ) SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/, repos_id, repos_path, revision, ?6 /*presence*/, depth, ?8 /*moved_here*/, kind, changed_revision, changed_date, changed_author, checksum, properties, translated_size, last_mod_time, symlink_target, (SELECT dst.moved_to FROM nodes AS dst WHERE dst.wc_id = ?1 AND dst.local_relpath = ?3 AND dst.op_depth = ?4) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7 -- STMT_UPDATE_BASE_REVISION UPDATE nodes SET revision = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_UPDATE_BASE_REPOS UPDATE nodes SET repos_id = ?3, repos_path = ?4 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 -- STMT_ACTUAL_HAS_CHILDREN SELECT 1 FROM actual_node WHERE wc_id = ?1 AND parent_relpath = ?2 LIMIT 1 -- STMT_INSERT_EXTERNAL INSERT OR REPLACE INTO externals ( wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath, repos_id, def_repos_relpath, def_operational_revision, def_revision) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10) -- STMT_SELECT_EXTERNAL_INFO SELECT presence, kind, def_local_relpath, repos_id, def_repos_relpath, def_operational_revision, def_revision FROM externals WHERE wc_id = ?1 AND local_relpath = ?2 LIMIT 1 -- STMT_DELETE_FILE_EXTERNALS DELETE FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 AND file_external IS NOT NULL -- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS DELETE FROM externals WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND kind != MAP_DIR -- STMT_DELETE_EXTERNAL_REGISTATIONS DELETE FROM externals WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) /* Select all committable externals, i.e. only unpegged ones on the same * repository as the target path ?2, that are defined by WC ?1 to * live below the target path. It does not matter which ancestor has the * svn:externals definition, only the local path at which the external is * supposed to be checked out is queried. * Arguments: * ?1: wc_id. * ?2: the target path, local relpath inside ?1. * * ### NOTE: This statement deliberately removes file externals that live * inside an unversioned dir, because commit still breaks on those. * Once that's been fixed, the conditions below "--->8---" become obsolete. */ -- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW SELECT local_relpath, kind, def_repos_relpath, (SELECT root FROM repository AS r WHERE r.id = e.repos_id) FROM externals e WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND def_revision IS NULL AND repos_id = (SELECT repos_id FROM nodes AS n WHERE n.wc_id = ?1 AND n.local_relpath = '' AND n.op_depth = 0) AND ((kind='dir') OR EXISTS (SELECT 1 FROM nodes WHERE nodes.wc_id = e.wc_id AND nodes.local_relpath = e.parent_relpath)) -- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW SELECT local_relpath, kind, def_repos_relpath, (SELECT root FROM repository AS r WHERE r.id = e.repos_id) FROM externals e WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2) AND parent_relpath = ?2 AND def_revision IS NULL AND repos_id = (SELECT repos_id FROM nodes AS n WHERE n.wc_id = ?1 AND n.local_relpath = '' AND n.op_depth = 0) AND ((kind='dir') OR EXISTS (SELECT 1 FROM nodes WHERE nodes.wc_id = e.wc_id AND nodes.local_relpath = e.parent_relpath)) -- STMT_SELECT_EXTERNALS_DEFINED SELECT local_relpath, def_local_relpath FROM externals /* ### The Sqlite optimizer needs help here ### * WHERE wc_id = ?1 * AND (def_local_relpath = ?2 * OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */ WHERE (wc_id = ?1 AND def_local_relpath = ?2) OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) -- STMT_DELETE_EXTERNAL DELETE FROM externals WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_SELECT_EXTERNAL_PROPERTIES /* ### It would be nice if Sqlite would handle * SELECT IFNULL((SELECT properties FROM actual_node a * WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), * properties), * local_relpath, depth * FROM nodes_current n * WHERE wc_id = ?1 * AND (local_relpath = ?2 * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) * AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) * ### But it would take a double table scan execution plan for it. * ### Maybe there is something else going on? */ SELECT IFNULL((SELECT properties FROM actual_node a WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), properties), local_relpath, depth FROM nodes_current n WHERE wc_id = ?1 AND local_relpath = ?2 AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) UNION ALL SELECT IFNULL((SELECT properties FROM actual_node a WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), properties), local_relpath, depth FROM nodes_current n WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) -- STMT_SELECT_CURRENT_PROPS_RECURSIVE /* ### Ugly OR to make sqlite use the proper optimizations */ SELECT IFNULL((SELECT properties FROM actual_node a WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), properties), local_relpath FROM nodes_current n WHERE (wc_id = ?1 AND local_relpath = ?2) OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) -- STMT_PRAGMA_LOCKING_MODE PRAGMA locking_mode = exclusive /* ------------------------------------------------------------------------- */ /* these are used in entries.c */ -- STMT_INSERT_ACTUAL_NODE INSERT OR REPLACE INTO actual_node ( wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data) VALUES (?1, ?2, ?3, ?4, ?5, ?6) /* ------------------------------------------------------------------------- */ /* these are used in upgrade.c */ -- STMT_UPDATE_ACTUAL_CONFLICT_DATA UPDATE actual_node SET conflict_data = ?3 WHERE wc_id = ?1 AND local_relpath = ?2 -- STMT_INSERT_ACTUAL_CONFLICT_DATA INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath) VALUES (?1, ?2, ?3, ?4) -- STMT_SELECT_ALL_FILES SELECT local_relpath FROM nodes_current WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE -- STMT_UPDATE_NODE_PROPS UPDATE nodes SET properties = ?4 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_PRAGMA_TABLE_INFO_NODES PRAGMA table_info("NODES") /* -------------------------------------------------------------------------- * Complex queries for callback walks, caching results in a temporary table. * * These target table are then used for joins against NODES, or for reporting */ -- STMT_CREATE_TARGET_PROP_CACHE DROP TABLE IF EXISTS target_prop_cache; CREATE TEMPORARY TABLE target_prop_cache ( local_relpath TEXT NOT NULL PRIMARY KEY, kind TEXT NOT NULL, properties BLOB ); /* ### Need index? CREATE UNIQUE INDEX temp__node_props_cache_unique ON temp__node_props_cache (local_relpath) */ -- STMT_CACHE_TARGET_PROPS INSERT INTO target_prop_cache(local_relpath, kind, properties) SELECT n.local_relpath, n.kind, IFNULL((SELECT properties FROM actual_node AS a WHERE a.wc_id = n.wc_id AND a.local_relpath = n.local_relpath), n.properties) FROM targets_list AS t JOIN nodes AS n ON n.wc_id = ?1 AND n.local_relpath = t.local_relpath AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3 WHERE n3.wc_id = ?1 AND n3.local_relpath = t.local_relpath) WHERE t.wc_id = ?1 AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE) ORDER BY t.local_relpath -- STMT_CACHE_TARGET_PRISTINE_PROPS INSERT INTO target_prop_cache(local_relpath, kind, properties) SELECT n.local_relpath, n.kind, CASE n.presence WHEN MAP_BASE_DELETED THEN (SELECT properties FROM nodes AS p WHERE p.wc_id = n.wc_id AND p.local_relpath = n.local_relpath AND p.op_depth < n.op_depth ORDER BY p.op_depth DESC /* LIMIT 1 */) ELSE properties END FROM targets_list AS t JOIN nodes AS n ON n.wc_id = ?1 AND n.local_relpath = t.local_relpath AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3 WHERE n3.wc_id = ?1 AND n3.local_relpath = t.local_relpath) WHERE t.wc_id = ?1 AND (presence = MAP_NORMAL OR presence = MAP_INCOMPLETE OR presence = MAP_BASE_DELETED) ORDER BY t.local_relpath -- STMT_SELECT_ALL_TARGET_PROP_CACHE SELECT local_relpath, properties FROM target_prop_cache ORDER BY local_relpath -- STMT_DROP_TARGET_PROP_CACHE DROP TABLE target_prop_cache; -- STMT_CREATE_REVERT_LIST DROP TABLE IF EXISTS revert_list; CREATE TEMPORARY TABLE revert_list ( /* need wc_id if/when revert spans multiple working copies */ local_relpath TEXT NOT NULL, actual INTEGER NOT NULL, /* 1 if an actual row, 0 if a nodes row */ conflict_data BLOB, notify INTEGER, /* 1 if an actual row had props or tree conflict */ op_depth INTEGER, repos_id INTEGER, kind TEXT, PRIMARY KEY (local_relpath, actual) ); DROP TRIGGER IF EXISTS trigger_revert_list_nodes; CREATE TEMPORARY TRIGGER trigger_revert_list_nodes BEFORE DELETE ON nodes BEGIN INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth, repos_id, kind) SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind; END; DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete; CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete BEFORE DELETE ON actual_node BEGIN INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data, notify) SELECT OLD.local_relpath, 1, OLD.conflict_data, CASE WHEN OLD.properties IS NOT NULL THEN 1 WHEN NOT EXISTS(SELECT 1 FROM NODES n WHERE n.wc_id = OLD.wc_id AND n.local_relpath = OLD.local_relpath) THEN 1 ELSE NULL END; END; DROP TRIGGER IF EXISTS trigger_revert_list_actual_update; CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update BEFORE UPDATE ON actual_node BEGIN INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data, notify) SELECT OLD.local_relpath, 1, OLD.conflict_data, CASE WHEN OLD.properties IS NOT NULL THEN 1 WHEN NOT EXISTS(SELECT 1 FROM NODES n WHERE n.wc_id = OLD.wc_id AND n.local_relpath = OLD.local_relpath) THEN 1 ELSE NULL END; END -- STMT_DROP_REVERT_LIST_TRIGGERS DROP TRIGGER trigger_revert_list_nodes; DROP TRIGGER trigger_revert_list_actual_delete; DROP TRIGGER trigger_revert_list_actual_update -- STMT_SELECT_REVERT_LIST SELECT actual, notify, kind, op_depth, repos_id, conflict_data FROM revert_list WHERE local_relpath = ?1 ORDER BY actual DESC -- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN SELECT local_relpath, kind FROM revert_list WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1) AND op_depth >= ?2 AND repos_id IS NOT NULL ORDER BY local_relpath -- STMT_DELETE_REVERT_LIST DELETE FROM revert_list WHERE local_relpath = ?1 -- STMT_SELECT_REVERT_LIST_RECURSIVE SELECT DISTINCT local_relpath FROM revert_list WHERE (local_relpath = ?1 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1)) AND (notify OR actual = 0) ORDER BY local_relpath -- STMT_DELETE_REVERT_LIST_RECURSIVE DELETE FROM revert_list WHERE (local_relpath = ?1 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1)) -- STMT_DROP_REVERT_LIST DROP TABLE IF EXISTS revert_list -- STMT_CREATE_DELETE_LIST DROP TABLE IF EXISTS delete_list; CREATE TEMPORARY TABLE delete_list ( /* ### we should put the wc_id in here in case a delete spans multiple ### working copies. queries, etc will need to be adjusted. */ local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE ) /* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE. A subquery is used instead of nodes_current to avoid a table scan */ -- STMT_INSERT_DELETE_LIST INSERT INTO delete_list(local_relpath) SELECT local_relpath FROM nodes AS n WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth >= ?3 AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s WHERE s.wc_id = ?1 AND s.local_relpath = n.local_relpath) AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED) AND file_external IS NULL -- STMT_SELECT_DELETE_LIST SELECT local_relpath FROM delete_list ORDER BY local_relpath -- STMT_FINALIZE_DELETE DROP TABLE IF EXISTS delete_list -- STMT_CREATE_UPDATE_MOVE_LIST DROP TABLE IF EXISTS update_move_list; CREATE TEMPORARY TABLE update_move_list ( /* ### we should put the wc_id in here in case a move update spans multiple ### working copies. queries, etc will need to be adjusted. */ local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE, action INTEGER NOT NULL, kind INTEGER NOT NULL, content_state INTEGER NOT NULL, prop_state INTEGER NOT NULL ) -- STMT_INSERT_UPDATE_MOVE_LIST INSERT INTO update_move_list(local_relpath, action, kind, content_state, prop_state) VALUES (?1, ?2, ?3, ?4, ?5) -- STMT_SELECT_UPDATE_MOVE_LIST SELECT local_relpath, action, kind, content_state, prop_state FROM update_move_list ORDER BY local_relpath -- STMT_FINALIZE_UPDATE_MOVE DROP TABLE IF EXISTS update_move_list /* ------------------------------------------------------------------------- */ /* Queries for revision status. */ -- STMT_SELECT_MIN_MAX_REVISIONS SELECT MIN(revision), MAX(revision), MIN(changed_revision), MAX(changed_revision) FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) AND file_external IS NULL AND op_depth = 0 -- STMT_HAS_SPARSE_NODES SELECT 1 FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = 0 AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED) OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN)) AND file_external IS NULL LIMIT 1 -- STMT_SUBTREE_HAS_TREE_MODIFICATIONS SELECT 1 FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth > 0 LIMIT 1 -- STMT_SUBTREE_HAS_PROP_MODIFICATIONS SELECT 1 FROM actual_node WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND properties IS NOT NULL LIMIT 1 -- STMT_HAS_SWITCHED SELECT 1 FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 AND file_external IS NULL AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath) LIMIT 1 -- STMT_SELECT_BASE_FILES_RECURSIVE SELECT local_relpath, translated_size, last_mod_time FROM nodes AS n WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = 0 AND kind=MAP_FILE AND presence=MAP_NORMAL AND file_external IS NULL /* ### FIXME: op-depth? What about multiple moves? */ -- STMT_SELECT_MOVED_FROM_RELPATH SELECT local_relpath, op_depth FROM nodes WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 -- STMT_UPDATE_MOVED_TO_RELPATH UPDATE nodes SET moved_to = ?4 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_CLEAR_MOVED_TO_RELPATH UPDATE nodes SET moved_to = NULL WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_CLEAR_MOVED_HERE_RECURSIVE UPDATE nodes SET moved_here = NULL WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1. * Each row returns a moved-here path (always a child of ?2) in the first * column, and its matching moved-away (deleted) path in the second column. */ -- STMT_SELECT_MOVED_HERE_CHILDREN SELECT moved_to, local_relpath FROM nodes WHERE wc_id = ?1 AND op_depth > 0 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) -- STMT_SELECT_MOVED_FOR_DELETE SELECT local_relpath, moved_to, op_depth FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND moved_to IS NOT NULL AND op_depth >= (SELECT MAX(op_depth) FROM nodes o WHERE o.wc_id = ?1 AND o.local_relpath = ?2) -- STMT_UPDATE_MOVED_TO_DESCENDANTS UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to) WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) -- STMT_CLEAR_MOVED_TO_DESCENDANTS UPDATE nodes SET moved_to = NULL WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) /* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1, * where the source of the move is within the subtree rooted at path ?2, and * the destination of the move is outside the subtree rooted at path ?2. */ -- STMT_SELECT_MOVED_PAIR2 SELECT local_relpath, moved_to, op_depth FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND moved_to IS NOT NULL AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2) AND op_depth >= (SELECT MAX(op_depth) FROM nodes o WHERE o.wc_id = ?1 AND o.local_relpath = ?2) -- STMT_SELECT_MOVED_PAIR3 SELECT local_relpath, moved_to, op_depth, kind FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth > ?3 AND moved_to IS NOT NULL -- STMT_SELECT_MOVED_OUTSIDE SELECT local_relpath, moved_to FROM nodes WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth >= ?3 AND moved_to IS NOT NULL AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2) -- STMT_SELECT_OP_DEPTH_MOVED_PAIR SELECT n.local_relpath, n.moved_to, (SELECT o.repos_path FROM nodes AS o WHERE o.wc_id = n.wc_id AND o.local_relpath = n.local_relpath AND o.op_depth < ?3 ORDER BY o.op_depth DESC LIMIT 1) FROM nodes AS n WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2) AND n.op_depth = ?3 AND n.moved_to IS NOT NULL -- STMT_SELECT_MOVED_DESCENDANTS SELECT n.local_relpath, h.moved_to FROM nodes n, nodes h WHERE n.wc_id = ?1 AND h.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2) AND h.local_relpath = n.local_relpath AND n.op_depth = ?3 AND h.op_depth = (SELECT MIN(o.op_depth) FROM nodes o WHERE o.wc_id = ?1 AND o.local_relpath = n.local_relpath AND o.op_depth > ?3) AND h.moved_to IS NOT NULL -- STMT_COMMIT_UPDATE_ORIGIN /* Note that the only reason this SUBSTR() trick is valid is that you can move neither the working copy nor the repository root. SUBSTR(local_relpath, LENGTH(?2)+1) includes the '/' of the path */ UPDATE nodes SET repos_id = ?4, repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1), revision = ?6 WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND op_depth = ?3 -- STMT_HAS_LAYER_BETWEEN SELECT 1 FROM NODES WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4 -- STMT_SELECT_REPOS_PATH_REVISION SELECT local_relpath, repos_path, revision FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 ORDER BY local_relpath -- STMT_SELECT_HAS_NON_FILE_CHILDREN SELECT 1 FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND kind != MAP_FILE -- STMT_SELECT_HAS_GRANDCHILDREN SELECT 1 FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2) AND op_depth = 0 AND file_external IS NULL /* ------------------------------------------------------------------------- */ /* Queries for verification. */ -- STMT_SELECT_ALL_NODES SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes WHERE wc_id = ?1 /* ------------------------------------------------------------------------- */ /* Queries for cached inherited properties. */ /* Select the inherited properties of a single base node. */ -- STMT_SELECT_IPROPS SELECT inherited_props FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 /* Update the inherited properties of a single base node. */ -- STMT_UPDATE_IPROP UPDATE nodes SET inherited_props = ?3 WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0) /* Select a single path if its base node has cached inherited properties. */ -- STMT_SELECT_IPROPS_NODE SELECT local_relpath, repos_path FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 AND (inherited_props not null) /* Select all paths whose base nodes are below a given path, which have cached inherited properties. */ -- STMT_SELECT_IPROPS_RECURSIVE SELECT local_relpath, repos_path FROM nodes WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth = 0 AND (inherited_props not null) -- STMT_SELECT_IPROPS_CHILDREN SELECT local_relpath, repos_path FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 AND (inherited_props not null) /* ------------------------------------------------------------------------- */ /* Grab all the statements related to the schema. */ -- include: wc-metadata -- include: wc-checks