diff options
| author | Peter Wemm <peter@FreeBSD.org> | 2015-10-12 08:54:49 +0000 | 
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 2015-10-12 08:54:49 +0000 | 
| commit | dc5d469d6574e9fb03bdd793658bb371315b306a (patch) | |
| tree | 013c2e6845398e5a9ca4901dcc077769c7520e1d /subversion/libsvn_wc/wc-queries.sql | |
| parent | 58218291fa73a17020ef0447398e9e8a78f9e8c7 (diff) | |
Notes
Diffstat (limited to 'subversion/libsvn_wc/wc-queries.sql')
| -rw-r--r-- | subversion/libsvn_wc/wc-queries.sql | 461 | 
1 files changed, 263 insertions, 198 deletions
diff --git a/subversion/libsvn_wc/wc-queries.sql b/subversion/libsvn_wc/wc-queries.sql index 7cdb46cc0252..5d8dbe375c74 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 @@ -1213,14 +1301,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 +1413,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 +1431,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 +1459,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 +1489,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 +1516,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 +1534,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 +1591,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 +1653,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 +1686,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 +1721,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  /* ------------------------------------------------------------------------- */  | 
