Author: rhuijben
Date: Sat Jun 2 01:00:55 2012
New Revision: 1345412
URL: http://svn.apache.org/viewvc?rev=1345412&view=rev
Log:
When using svn_wc__db_scan_deletion without retrieving moved_to information
use a cheaper variant of the deletion query to avoid an additional table join.
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_DELETION_INFO): Duplicated and simplified. Renumbered the last
two columns. Add LIMIT and subquery instead of join for single result
query.
(STMT_SELECT_DELETION_INFO_SCAN): New query based on the original
STMT_SELECT_DELETION_INFO.
* subversion/libsvn_wc/wc_db.c
(get_moved_to): Update column number.
(scan_deletion_txn): Fetch statement once and just reuse it after resetting.
Choose the most efficient statement and update column references.
Modified:
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc_db.c
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1345412&r1=1345411&r2=1345412&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Sat Jun 2 01:00:55
2012
@@ -279,22 +279,27 @@ WHERE wc_id = ?1 AND local_relpath = ?2
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. modes_move.moved_to IS NOT NULL works when there is
only one move but we need something else when there are several. */
--- STMT_SELECT_DELETION_INFO
-SELECT nodes_base.presence, nodes_work.presence, nodes_move.moved_to,
- nodes_work.op_depth
-FROM nodes AS nodes_work
-LEFT OUTER JOIN nodes nodes_move ON nodes_move.wc_id = nodes_work.wc_id
- AND nodes_move.local_relpath = nodes_work.local_relpath
- AND nodes_move.moved_to IS NOT NULL
-LEFT OUTER JOIN nodes nodes_base ON nodes_base.wc_id = nodes_work.wc_id
- AND nodes_base.local_relpath = nodes_work.local_relpath
- AND nodes_base.op_depth = 0
-WHERE nodes_work.wc_id = ?1 AND nodes_work.local_relpath = ?2
- AND nodes_work.op_depth = (SELECT MAX(op_depth) FROM nodes
- WHERE wc_id = ?1 AND local_relpath = ?2
- AND op_depth > 0)
+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
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1345412&r1=1345411&r2=1345412&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Sat Jun 2 01:00:55 2012
@@ -10480,7 +10480,7 @@ get_moved_to(struct scan_deletion_baton_
const char *local_relpath,
apr_pool_t *scratch_pool)
{
- const char *moved_to_relpath = svn_sqlite__column_text(stmt, 2, NULL);
+ const char *moved_to_relpath = svn_sqlite__column_text(stmt, 3, NULL);
if (moved_to_relpath)
{
@@ -10546,8 +10546,11 @@ scan_deletion_txn(void *baton,
check op-roots and parents of op-roots. */
scan = (sd_baton->moved_to_op_root_relpath || sd_baton->moved_to_relpath);
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_DELETION_INFO));
+ SVN_ERR(svn_sqlite__get_statement(
+ &stmt, wcroot->sdb,
+ scan ? STMT_SELECT_DELETION_INFO_SCAN
+ : STMT_SELECT_DELETION_INFO));
+
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, current_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
if (!have_row)
@@ -10566,7 +10569,7 @@ scan_deletion_txn(void *baton,
path_for_error_message(wcroot, local_relpath,
scratch_pool));
- op_depth = svn_sqlite__column_int(stmt, 3);
+ op_depth = svn_sqlite__column_int(stmt, 2);
/* Special case: LOCAL_RELPATH not-present within a WORKING tree, we
treat this as an op-root. At commit time we need to explicitly
@@ -10620,8 +10623,6 @@ scan_deletion_txn(void *baton,
if (scan || current_depth == op_depth)
{
SVN_ERR(svn_sqlite__reset(stmt));
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_DELETION_INFO));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id,
current_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
@@ -10635,8 +10636,6 @@ scan_deletion_txn(void *baton,
SVN_ERR_ASSERT(current_relpath[0] != '\0'); /* Catch invalid data */
parent_relpath = svn_relpath_dirname(current_relpath, scratch_pool);
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_DELETION_INFO));
SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, parent_relpath));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
if (!have_row)
@@ -10662,7 +10661,7 @@ scan_deletion_txn(void *baton,
}
current_relpath = parent_relpath;
- op_depth = svn_sqlite__column_int(stmt, 3);
+ op_depth = svn_sqlite__column_int(stmt, 2);
have_base = !svn_sqlite__column_is_null(stmt, 0);
}