summaryrefslogtreecommitdiff
path: root/subversion/libsvn_wc/wc-queries.sql
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_wc/wc-queries.sql')
-rw-r--r--subversion/libsvn_wc/wc-queries.sql466
1 files changed, 267 insertions, 199 deletions
diff --git a/subversion/libsvn_wc/wc-queries.sql b/subversion/libsvn_wc/wc-queries.sql
index 7cdb46c..3a8bf92 100644
--- a/subversion/libsvn_wc/wc-queries.sql
+++ b/subversion/libsvn_wc/wc-queries.sql
@@ -72,6 +72,12 @@ 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
+FROM nodes
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
+
+-- STMT_SELECT_BASE_CHILDREN_INFO_LOCK
+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
@@ -79,6 +85,7 @@ 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,
@@ -92,7 +99,7 @@ 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
+ symlink_target, properties, moved_to, moved_here
FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
@@ -118,8 +125,9 @@ 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. */
+ doesn't work as the index is created without the DESC keyword.
+ Using both local_relpath and op_depth descending does work without any
+ performance penalty. */
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,
@@ -128,11 +136,27 @@ 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
+ORDER BY local_relpath DESC, op_depth DESC
+
+-- STMT_SELECT_BASE_NODE_CHILDREN_INFO
+/* See above re: result ordering. The results of this query must be in
+the same order as returned by STMT_SELECT_NODE_CHILDREN_INFO, because
+read_children_info expects them to be. */
+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 AND op_depth = 0
+ORDER BY local_relpath DESC
-- STMT_SELECT_NODE_CHILDREN_WALKER_INFO
SELECT local_relpath, op_depth, presence, kind
FROM nodes_current
WHERE wc_id = ?1 AND parent_relpath = ?2
+ORDER BY local_relpath
-- STMT_SELECT_ACTUAL_CHILDREN_INFO
SELECT local_relpath, changelist, properties, conflict_data
@@ -161,16 +185,6 @@ INSERT OR REPLACE INTO nodes (
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
@@ -210,13 +224,23 @@ WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
-- STMT_DELETE_WORKING_BASE_DELETE
DELETE FROM nodes
+WHERE wc_id = ?1 AND local_relpath = ?2
+ AND presence = MAP_BASE_DELETED
+ AND op_depth > ?3
+ 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 > ?3)
+
+-- STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE
+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 > ?3
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)
+ AND op_depth > ?3)
-- STMT_DELETE_WORKING_RECURSIVE
DELETE FROM nodes
@@ -225,34 +249,42 @@ WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
-- STMT_DELETE_BASE_RECURSIVE
DELETE FROM nodes
-WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+WHERE wc_id = ?1 AND (local_relpath = ?2
+ OR 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
+/* Full layer replacement check code for handling moves
+The op_root must exist (or there is no layer to replace) and an op-root
+ always has presence 'normal' */
+-- STMT_SELECT_LAYER_FOR_REPLACE
+SELECT s.local_relpath, s.kind,
+ RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, 'normal'
+FROM nodes s
+WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
+UNION ALL
+SELECT s.local_relpath, s.kind,
+ RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, d.presence
+FROM nodes s
+LEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5
+ AND d.local_relpath = drp
+WHERE s.wc_id = ?1
+ AND IS_STRICT_DESCENDANT_OF(s.local_relpath, ?2)
+ AND s.op_depth = ?3
+ORDER BY s.local_relpath
+
+-- STMT_SELECT_DESCENDANTS_OP_DEPTH_RV
SELECT local_relpath, kind
FROM nodes
WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND op_depth = ?3
+ AND presence in (MAP_NORMAL, MAP_INCOMPLETE)
ORDER BY local_relpath DESC
-- STMT_COPY_NODE_MOVE
@@ -262,25 +294,51 @@ INSERT OR REPLACE INTO nodes (
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
+ s.wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */,
+ s.repos_id,
+ s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision,
+ s.changed_date, s.changed_author, s.checksum, s.properties,
+ CASE WHEN d.checksum=s.checksum THEN d.translated_size END,
+ CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END,
+ s.symlink_target, 1, d.moved_to
+FROM nodes s
+LEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5
+WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3
+
+-- STMT_SELECT_NO_LONGER_MOVED_RV
+SELECT d.local_relpath, RELPATH_SKIP_JOIN(?2, ?4, d.local_relpath) srp,
+ b.presence, b.op_depth
+FROM nodes d
+LEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath
+ AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x
+ WHERE x.wc_id = ?1
+ AND x.local_relpath = b.local_relpath
+ AND x.op_depth < ?3)
+WHERE d.wc_id = ?1
+ AND IS_STRICT_DESCENDANT_OF(d.local_relpath, ?2)
+ AND d.op_depth = ?3
+ AND NOT EXISTS(SELECT * FROM nodes s
+ WHERE s.wc_id = ?1
+ AND s.local_relpath = srp
+ AND s.op_depth = ?5)
+ORDER BY d.local_relpath DESC
-- STMT_SELECT_OP_DEPTH_CHILDREN
SELECT local_relpath, kind FROM nodes
-WHERE wc_id = ?1
+WHERE wc_id = ?1
AND parent_relpath = ?2
AND op_depth = ?3
AND presence != MAP_BASE_DELETED
AND file_external is NULL
+ORDER BY local_relpath
+
+-- STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS
+SELECT local_relpath, kind FROM nodes
+WHERE wc_id = ?1
+ AND parent_relpath = ?2
+ AND op_depth = ?3
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
+ORDER BY local_relpath
/* Used by non-recursive revert to detect higher level children, and
actual-only rows that would be left orphans, if the revert
@@ -288,7 +346,8 @@ WHERE wc_id = ?1
-- 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))
+ AND (op_depth > ?3 OR (op_depth = ?3
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
UNION ALL
SELECT 1 FROM ACTUAL_NODE a
WHERE wc_id = ?1 AND parent_relpath = ?2
@@ -318,10 +377,11 @@ WHERE wc_id = ?1 AND op_depth = ?3
-- STMT_COMMIT_DESCENDANTS_TO_BASE
UPDATE NODES SET op_depth = 0,
repos_id = ?4,
- repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
+ repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
revision = ?6,
dav_cache = NULL,
moved_here = NULL,
+ moved_to = NULL,
presence = CASE presence
WHEN MAP_NORMAL THEN MAP_NORMAL
WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
@@ -334,22 +394,30 @@ WHERE wc_id = ?1
-- 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
+SELECT DISTINCT local_relpath FROM nodes
WHERE wc_id = ?1 AND parent_relpath = ?2
+ORDER BY local_relpath
-- 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
+SELECT DISTINCT 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))
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)))
+ORDER BY local_relpath
+
+-- STMT_SELECT_BASE_NOT_PRESENT_CHILDREN
+SELECT local_relpath FROM nodes
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0
+ AND presence = MAP_NOT_PRESENT
+ORDER BY local_relpath
-- STMT_SELECT_NODE_PROPS
SELECT properties, presence FROM nodes
@@ -396,25 +464,13 @@ 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
+SELECT b.presence, w.presence, w.op_depth, w.moved_to
+FROM nodes w
+LEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0
+WHERE w.wc_id = ?1 AND w.local_relpath = ?2
+ AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d
+ WHERE d.wc_id = ?1 AND d.local_relpath = ?2
+ AND d.op_depth > 0)
LIMIT 1
-- STMT_SELECT_MOVED_TO_NODE
@@ -424,24 +480,20 @@ WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL
ORDER BY op_depth DESC
-- STMT_SELECT_OP_DEPTH_MOVED_TO
-SELECT op_depth, moved_to, repos_path, revision
+SELECT op_depth, moved_to
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
+WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3
+ AND EXISTS(SELECT * from nodes
+ WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE))
+ORDER BY op_depth ASC
+LIMIT 1
-- 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,
@@ -467,13 +519,6 @@ 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
@@ -498,7 +543,7 @@ UPDATE nodes SET repos_id = ?4, dav_cache = NULL
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
@@ -677,6 +722,13 @@ INSERT OR IGNORE INTO actual_node (
SELECT wc_id, local_relpath, parent_relpath
FROM targets_list
+-- STMT_INSERT_ACTUAL_EMPTIES_FILES
+INSERT OR IGNORE INTO actual_node (
+ wc_id, local_relpath, parent_relpath)
+SELECT wc_id, local_relpath, parent_relpath
+FROM targets_list
+WHERE kind=MAP_FILE
+
-- STMT_DELETE_ACTUAL_EMPTY
DELETE FROM actual_node
WHERE wc_id = ?1 AND local_relpath = ?2
@@ -691,7 +743,7 @@ WHERE wc_id = ?1 AND local_relpath = ?2
-- STMT_DELETE_ACTUAL_EMPTIES
DELETE FROM actual_node
WHERE wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+ AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
AND properties IS NULL
AND conflict_data IS NULL
AND changelist IS NULL
@@ -755,7 +807,7 @@ WHERE wc_id = ?1
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
+ WHERE c.wc_id = ?1
AND c.local_relpath = actual_node.local_relpath
AND c.kind = MAP_FILE))
@@ -770,6 +822,17 @@ SET properties = NULL,
right_checksum = NULL
WHERE wc_id = ?1 AND local_relpath = ?2
+-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT
+UPDATE actual_node
+SET properties = NULL,
+ text_mod = NULL,
+ tree_conflict_data = NULL,
+ older_checksum = NULL,
+ left_checksum = NULL,
+ right_checksum = NULL,
+ changelist = NULL
+WHERE wc_id = ?1 AND local_relpath = ?2
+
-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE
UPDATE actual_node
SET properties = NULL,
@@ -787,6 +850,7 @@ WHERE wc_id = ?1
UPDATE nodes SET depth = ?3
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
AND kind=MAP_DIR
+ AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)
-- STMT_UPDATE_NODE_BASE_PRESENCE
UPDATE nodes SET presence = ?3
@@ -891,6 +955,14 @@ SELECT local_dir_relpath FROM wc_lock
WHERE wc_id = ?1
AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)
+-- STMT_FIND_CONFLICT_DESCENDANT
+SELECT 1 FROM actual_node
+WHERE wc_id = ?1
+ AND local_relpath > (?2 || '/')
+ AND local_relpath < (?2 || '0') /* '0' = ascii('/') +1 */
+ AND conflict_data IS NOT NULL
+LIMIT 1
+
-- STMT_DELETE_WC_LOCK_ORPHAN
DELETE FROM wc_lock
WHERE wc_id = ?1 AND local_dir_relpath = ?2
@@ -924,22 +996,11 @@ VALUES (?1, ?2, 0,
AND op_depth = 0))
-- STMT_INSTALL_WORKING_NODE_FOR_DELETE
-INSERT OR REPLACE INTO nodes (
+INSERT 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)
@@ -947,33 +1008,41 @@ 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 local_relpath = ?2
AND op_depth = ?3
-/* If this query is updated, STMT_INSERT_DELETE_LIST should too. */
+/* If this query is updated, STMT_INSERT_DELETE_LIST should too.
+ Use UNION ALL instead of a simple 'OR' to avoid creating a temp table */
-- 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 AND op_depth = ?3
+UNION ALL
+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 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
+ORDER BY local_relpath
-- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY
-INSERT INTO nodes (
+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 )
+ symlink_target, moved_to )
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
+ last_mod_time, symlink_target,
+ (SELECT moved_to FROM nodes
+ WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to
FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
@@ -992,11 +1061,30 @@ 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
+/* Duplicated SELECT body to avoid creating temporary table */
+-- STMT_COPY_OP_DEPTH_RECURSIVE
+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, moved_here, moved_to )
+SELECT
+ wc_id, local_relpath, ?4, 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, NULL, NULL
+FROM nodes
+WHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2
+UNION ALL
+SELECT
+ wc_id, local_relpath, ?4, 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, NULL, NULL
+FROM nodes
+WHERE wc_id = ?1 AND op_depth = ?3
+ AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+ORDER BY local_relpath
-- STMT_DOES_NODE_EXIST
SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2
@@ -1198,7 +1286,10 @@ 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
+PRAGMA locking_mode = exclusive;
+/* Testing shows DELETE is faster than TRUNCATE on NFS and
+ exclusive-locking is mostly used on remote file systems. */
+PRAGMA journal_mode = DELETE
/* ------------------------------------------------------------------------- */
@@ -1213,14 +1304,6 @@ 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
@@ -1333,8 +1416,9 @@ BEGIN
WHERE n.wc_id = OLD.wc_id
AND n.local_relpath = OLD.local_relpath)
THEN 1
- ELSE NULL
- END;
+ END notify
+ WHERE OLD.conflict_data IS NOT NULL
+ OR notify IS NOT NULL;
END;
DROP TRIGGER IF EXISTS trigger_revert_list_actual_update;
CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
@@ -1350,8 +1434,9 @@ BEGIN
WHERE n.wc_id = OLD.wc_id
AND n.local_relpath = OLD.local_relpath)
THEN 1
- ELSE NULL
- END;
+ END notify
+ WHERE OLD.conflict_data IS NOT NULL
+ OR notify IS NOT NULL;
END
-- STMT_DROP_REVERT_LIST_TRIGGERS
@@ -1377,12 +1462,15 @@ ORDER BY local_relpath
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
+SELECT p.local_relpath, n.kind, a.notify, a.kind
+FROM (SELECT DISTINCT local_relpath
+ FROM revert_list
+ WHERE (local_relpath = ?1
+ OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))) p
+
+LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0
+LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1
+ORDER BY p.local_relpath
-- STMT_DELETE_REVERT_LIST_RECURSIVE
DELETE FROM revert_list
@@ -1404,16 +1492,18 @@ CREATE TEMPORARY TABLE delete_list (
A subquery is used instead of nodes_current to avoid a table scan */
-- STMT_INSERT_DELETE_LIST
INSERT INTO delete_list(local_relpath)
+SELECT ?2
+UNION ALL
SELECT local_relpath FROM nodes AS n
WHERE wc_id = ?1
- AND (local_relpath = ?2
- OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
+ AND 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
+ORDER by local_relpath
-- STMT_SELECT_DELETE_LIST
SELECT local_relpath FROM delete_list
@@ -1429,7 +1519,7 @@ CREATE TEMPORARY TABLE update_move_list (
### 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,
+ kind TEXT NOT NULL,
content_state INTEGER NOT NULL,
prop_state INTEGER NOT NULL
)
@@ -1447,6 +1537,11 @@ ORDER BY local_relpath
-- STMT_FINALIZE_UPDATE_MOVE
DROP TABLE IF EXISTS update_move_list
+-- STMT_MOVE_NOTIFY_TO_REVERT
+INSERT INTO revert_list (local_relpath, notify, kind, actual)
+ SELECT local_relpath, 2, kind, 1 FROM update_move_list;
+DROP TABLE update_move_list
+
/* ------------------------------------------------------------------------- */
/* Queries for revision status. */
@@ -1499,16 +1594,6 @@ WHERE wc_id = ?1
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
-
-- STMT_SELECT_MOVED_FROM_RELPATH
SELECT local_relpath, op_depth FROM nodes
WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0
@@ -1571,31 +1656,30 @@ 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 AND op_depth > ?3
- AND moved_to IS NOT NULL
+SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
+FROM nodes n
+JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
+ AND d.op_depth = (SELECT MIN(dd.op_depth)
+ FROM nodes dd
+ WHERE dd.wc_id = ?1
+ AND dd.local_relpath = d.local_relpath
+ AND dd.op_depth > ?3)
+WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3
+ AND d.moved_to IS NOT NULL
UNION ALL
-SELECT local_relpath, moved_to, op_depth, kind FROM nodes
-WHERE wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
- AND op_depth > ?3
- AND moved_to IS NOT NULL
-ORDER BY local_relpath, op_depth
+SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind
+FROM nodes n
+JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath
+ AND d.op_depth = (SELECT MIN(dd.op_depth)
+ FROM nodes dd
+ WHERE dd.wc_id = ?1
+ AND dd.local_relpath = d.local_relpath
+ AND dd.op_depth > ?3)
+WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
+ AND n.op_depth = ?3
+ AND d.moved_to IS NOT NULL
+ORDER BY n.local_relpath
-- STMT_SELECT_MOVED_OUTSIDE
SELECT local_relpath, moved_to, op_depth FROM nodes
@@ -1605,40 +1689,22 @@ WHERE wc_id = ?1
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_SELECT_MOVED_DESCENDANTS_SRC
+SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to
+FROM nodes n
+JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath
+ AND s.op_depth = (SELECT MIN(d.op_depth)
+ FROM nodes d
+ WHERE d.wc_id = ?1
+ AND d.local_relpath = s.local_relpath
+ AND d.op_depth > ?3)
+WHERE n.wc_id = ?1 AND n.op_depth = ?3
+ AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2))
+ AND s.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),
+ repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath),
revision = ?6
WHERE wc_id = ?1
AND (local_relpath = ?2
@@ -1658,14 +1724,16 @@ 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
+WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != MAP_FILE
+LIMIT 1
-- 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 op_depth = ?3
AND file_external IS NULL
+LIMIT 1
/* ------------------------------------------------------------------------- */