Modified: subversion/branches/verify-keep-going/subversion/libsvn_wc/upgrade.c URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_wc/upgrade.c?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/libsvn_wc/upgrade.c (original) +++ subversion/branches/verify-keep-going/subversion/libsvn_wc/upgrade.c Wed Nov 27 11:52:35 2013 @@ -23,6 +23,7 @@ #include <apr_pools.h> +#include "svn_private_config.h" #include "svn_types.h" #include "svn_pools.h" #include "svn_dirent_uri.h" @@ -38,7 +39,6 @@ #include "wc-queries.h" /* for STMT_* */ #include "workqueue.h" -#include "svn_private_config.h" #include "private/svn_wc_private.h" #include "private/svn_sqlite.h" #include "private/svn_token.h" @@ -400,7 +400,7 @@ build_lockfile_path(const char *local_di local_dir_abspath, svn_wc_get_adm_dir(result_pool), ADM_LOCK, - NULL); + SVN_VA_NULL); } @@ -755,13 +755,13 @@ migrate_single_tree_conflict_data(svn_sq { /* There is an existing ACTUAL row, so just update it. */ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, - STMT_UPDATE_ACTUAL_CONFLICT_DATA)); + STMT_UPDATE_ACTUAL_CONFLICT)); } else { /* We need to insert an ACTUAL row with the tree conflict data. */ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, - STMT_INSERT_ACTUAL_CONFLICT_DATA)); + STMT_INSERT_ACTUAL_CONFLICT)); } SVN_ERR(svn_sqlite__bindf(stmt, "iss", wc_id, conflict_relpath, @@ -875,21 +875,21 @@ migrate_node_props(const char *dir_abspa apr_pstrcat(scratch_pool, name, SVN_WC__BASE_EXT, - (char *)NULL), + SVN_VA_NULL), scratch_pool); revert_abspath = svn_dirent_join(basedir_abspath, apr_pstrcat(scratch_pool, name, SVN_WC__REVERT_EXT, - (char *)NULL), + SVN_VA_NULL), scratch_pool); working_abspath = svn_dirent_join(propsdir_abspath, apr_pstrcat(scratch_pool, name, SVN_WC__WORK_EXT, - (char *)NULL), + SVN_VA_NULL), scratch_pool); } @@ -1248,7 +1248,7 @@ rename_pristine_file(void *baton, == PRISTINE_BASENAME_OLD_LEN)) { const char *new_abspath - = apr_pstrcat(pool, abspath, PRISTINE_STORAGE_EXT, (char *)NULL); + = apr_pstrcat(pool, abspath, PRISTINE_STORAGE_EXT, SVN_VA_NULL); SVN_ERR(svn_io_file_rename(abspath, new_abspath, pool)); } @@ -1349,7 +1349,8 @@ bump_to_29(void *baton, svn_sqlite__db_t /* Rename all pristine files, adding a ".svn-base" suffix. */ pristine_dir_abspath = svn_dirent_join_many(scratch_pool, wcroot_abspath, svn_wc_get_adm_dir(scratch_pool), - PRISTINE_STORAGE_RELPATH, NULL); + PRISTINE_STORAGE_RELPATH, + SVN_VA_NULL); SVN_ERR(svn_io_dir_walk2(pristine_dir_abspath, APR_FINFO_MIN, rename_pristine_file, NULL, scratch_pool)); @@ -1958,6 +1959,10 @@ svn_wc__upgrade_sdb(int *result_format, case SVN_WC__VERSION: /* already upgraded */ *result_format = SVN_WC__VERSION; + + SVN_SQLITE__WITH_LOCK( + svn_wc__db_install_schema_statistics(sdb, scratch_pool), + sdb); } #ifdef SVN_DEBUG
Modified: subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-metadata.sql URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-metadata.sql?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-metadata.sql (original) +++ subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-metadata.sql Wed Nov 27 11:52:35 2013 @@ -573,6 +573,54 @@ CREATE UNIQUE INDEX I_EXTERNALS_DEFINED local_relpath); /* ------------------------------------------------------------------------- */ +/* This statement provides SQLite with the necessary information about our + indexes to make better decisions in the query planner. + + For every interesting index this contains a number of rows where the + statistics ar calculated for and then for every column in the index the + average number of rows with the same value in all columns left of this + column including the column itself. + + See http://www.sqlite.org/fileformat2.html#stat1tab for more details. + + The important thing here is that this tells Sqlite that the wc_id column + of the NODES and ACTUAL_NODE table is usually a single value, so queries + should use more than one column for index usage. + + The current hints describe NODES+ACTUAL_NODE as a working copy with + 8000 nodes in 1 a single working copy(=wc_id), 10 nodes per directory + and an average of 2 op-depth layers per node. + + The number of integers must be number of index columns + 1, which is + verified via the test_schema_statistics() test. + */ +-- STMT_INSTALL_SCHEMA_STATISTICS +ANALYZE sqlite_master; /* Creates empty sqlite_stat1 if necessary */ + +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('NODES', 'sqlite_autoindex_NODES_1', '8000 8000 2 1'); +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('NODES', 'I_NODES_PARENT', '8000 8000 10 2 1'); +/* Tell a lie: We ignore that 99.9% of all moved_to values are NULL */ +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('NODES', 'I_NODES_MOVED', '8000 8000 1 1'); + +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('ACTUAL_NODE', 'sqlite_autoindex_ACTUAL_NODE_1', '8000 8000 1'); +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('ACTUAL_NODE', 'I_ACTUAL_PARENT', '8000 8000 10 1'); + +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('LOCK', 'sqlite_autoindex_LOCK_1', '100 100 1'); + +INSERT OR REPLACE INTO sqlite_stat1(tbl, idx, stat) VALUES + ('WC_LOCK', 'sqlite_autoindex_WC_LOCK_1', '100 100 1'); + +/* sqlite_autoindex_WORK_QUEUE_1 doesn't exist because WORK_QUEUE is + a INTEGER PRIMARY KEY AUTOINCREMENT table */ + +ANALYZE sqlite_master; /* Loads sqlite_stat1 data for query optimizer */ +/* ------------------------------------------------------------------------- */ /* Format 20 introduces NODES and removes BASE_NODE and WORKING_NODE */ Modified: subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-queries.sql URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-queries.sql?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-queries.sql (original) +++ subversion/branches/verify-keep-going/subversion/libsvn_wc/wc-queries.sql Wed Nov 27 11:52:35 2013 @@ -72,6 +72,12 @@ WHERE wc_id = ?1 AND local_relpath = ?2 -- 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 = 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, @@ -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,6 +136,7 @@ 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_NODE_CHILDREN_WALKER_INFO SELECT local_relpath, op_depth, presence, kind @@ -191,7 +200,7 @@ WHERE wc_id = ?1 -- STMT_DELETE_NODE DELETE FROM NODES -WHERE wc_id = ?1 AND local_relpath = ?2 +WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 -- STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE /* The ACTUAL_NODE applies to BASE, unless there is in at least one op_depth @@ -318,7 +327,7 @@ 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, @@ -417,25 +426,30 @@ LEFT OUTER JOIN nodes AS moved 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 +-- STMT_SELECT_MOVED_TO_NODE +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) +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 n.op_depth, n.moved_to, p.repos_path, p.revision +FROM nodes p +LEFT JOIN nodes n + ON p.wc_id=n.wc_id AND p.local_relpath = n.local_relpath + AND n.op_depth = (SELECT MIN(d.op_depth) + FROM nodes d + WHERE d.wc_id = ?1 + AND d.local_relpath = n.local_relpath + AND d.op_depth > ?3) +WHERE p.wc_id = ?1 AND p.local_relpath = ?2 AND p.op_depth = ?3 +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, @@ -461,13 +475,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 @@ -711,7 +718,7 @@ WHERE wc_id = ?1 AND local_relpath = ?2 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3) AND presence = MAP_BASE_DELETED --- STMT_DELETE_ALL_LAYERS +-- STMT_DELETE_NODE_ALL_LAYERS DELETE FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 @@ -918,7 +925,7 @@ 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) @@ -1207,14 +1214,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 @@ -1503,7 +1502,6 @@ WHERE wc_id = ?1 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 @@ -1530,8 +1528,17 @@ SELECT moved_to, local_relpath FROM node WHERE wc_id = ?1 AND op_depth > 0 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) +/* If the node is moved here (r.moved_here = 1) we are really interested in + where the node was moved from. To obtain that we need the op_depth, but + this form of select only allows a single return value */ -- STMT_SELECT_MOVED_FOR_DELETE -SELECT local_relpath, moved_to, op_depth FROM nodes +SELECT local_relpath, moved_to, op_depth, + (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r + WHERE r.wc_id = ?1 + AND r.local_relpath = n.local_relpath + AND r.op_depth < n.op_depth + ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth + FROM nodes n WHERE wc_id = ?1 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) AND moved_to IS NOT NULL @@ -1539,6 +1546,16 @@ WHERE wc_id = ?1 WHERE o.wc_id = ?1 AND o.local_relpath = ?2) +-- STMT_SELECT_MOVED_FROM_FOR_DELETE +SELECT local_relpath, op_depth, + (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r + WHERE r.wc_id = ?1 + AND r.local_relpath = n.local_relpath + AND r.op_depth < n.op_depth + ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth + FROM nodes n +WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 + -- STMT_UPDATE_MOVED_TO_DESCENDANTS UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to) WHERE wc_id = ?1 @@ -1549,20 +1566,6 @@ 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 @@ -1571,7 +1574,7 @@ WHERE wc_id = ?1 AND moved_to IS NOT NULL -- STMT_SELECT_MOVED_OUTSIDE -SELECT local_relpath, moved_to FROM nodes +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 op_depth >= ?3 @@ -1579,12 +1582,17 @@ WHERE wc_id = ?1 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) +SELECT n.local_relpath, p.kind, n.moved_to, p.repos_path FROM nodes AS n +JOIN (SELECT local_relpath, kind, repos_path + FROM nodes AS o + WHERE o.wc_id = ?1 + AND o.op_depth=(SELECT MAX(d.op_depth) + FROM nodes AS d + WHERE d.wc_id = ?1 + AND d.local_relpath = o.local_relpath + AND d.op_depth < ?3)) AS p + ON n.local_relpath = p.local_relpath WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2) AND n.op_depth = ?3 @@ -1606,12 +1614,8 @@ WHERE n.wc_id = ?1 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), + repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath), revision = ?6 WHERE wc_id = ?1 AND (local_relpath = ?2 @@ -1631,14 +1635,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 /* ------------------------------------------------------------------------- */ Modified: subversion/branches/verify-keep-going/subversion/libsvn_wc/wc.h URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_wc/wc.h?rev=1546002&r1=1546001&r2=1546002&view=diff ============================================================================== --- subversion/branches/verify-keep-going/subversion/libsvn_wc/wc.h (original) +++ subversion/branches/verify-keep-going/subversion/libsvn_wc/wc.h Wed Nov 27 11:52:35 2013 @@ -157,6 +157,8 @@ extern "C" { * The bump to 31 added the inherited_props column in the NODES table. * Bumped in r1395109. * + * == 1.8.x shipped with format 31 + * * Please document any further format changes here. */
