You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2014/01/18 16:08:44 UTC

svn commit: r1559352 - in /subversion/trunk/subversion: include/private/svn_sqlite.h libsvn_subr/sqlite.c libsvn_wc/wc_db_util.c tests/libsvn_subr/sqlite-test.c

Author: rhuijben
Date: Sat Jan 18 15:08:44 2014
New Revision: 1559352

URL: http://svn.apache.org/r1559352
Log:
In our internal sqlite api provide sqlite with the knowledge if certain
defined functions are deterministic (as defined by sqlite). This allows Sqlite
to optimize their usage in very recent Sqlite versions.

* subversion/include/private/svn_sqlite.h
  (svn_sqlite__create_scalar_function): Add argument.

* subversion/libsvn_subr/sqlite.c
  (SQLITE_DETERMINISTIC): Define as 0 for older Sqlite versions.
  (svn_sqlite__open): Declare utf functions as deterministic.
  (svn_sqlite__create_scalar_function): Allow declaring deterministic.

* subversion/libsvn_wc/wc_db_util.c
  (svn_wc__db_util_open_db): Update caller.

* subversion/tests/libsvn_subr/sqlite-test.c
  (test_sqlite_reset): Update caller.

Modified:
    subversion/trunk/subversion/include/private/svn_sqlite.h
    subversion/trunk/subversion/libsvn_subr/sqlite.c
    subversion/trunk/subversion/libsvn_wc/wc_db_util.c
    subversion/trunk/subversion/tests/libsvn_subr/sqlite-test.c

Modified: subversion/trunk/subversion/include/private/svn_sqlite.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_sqlite.h?rev=1559352&r1=1559351&r2=1559352&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_sqlite.h (original)
+++ subversion/trunk/subversion/include/private/svn_sqlite.h Sat Jan 18 15:08:44 2014
@@ -130,11 +130,16 @@ svn_error_t *
 svn_sqlite__close(svn_sqlite__db_t *db);
 
 /* Add a custom function to be used with this database connection.  The data
-   in BATON should live at least as long as the connection in DB. */
+   in BATON should live at least as long as the connection in DB.
+
+   Pass TRUE if the result of the function is constant within a statement with
+   a specific set of argument values and FALSE if not (or when in doubt). When
+   TRUE newer Sqlite versions use this knowledge for query optimizations. */
 svn_error_t *
 svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
                                    const char *func_name,
                                    int argc,
+                                   svn_boolean_t deterministic,
                                    svn_sqlite__func_t func,
                                    void *baton);
 

Modified: subversion/trunk/subversion/libsvn_subr/sqlite.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sqlite.c?rev=1559352&r1=1559351&r2=1559352&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sqlite.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sqlite.c Sat Jan 18 15:08:44 2014
@@ -65,6 +65,10 @@ extern int (*const svn_sqlite3__api_conf
 #error SQLite is too old -- version 3.7.12 is the minimum required version
 #endif
 
+#ifndef SQLITE_DETERMINISTIC
+#define SQLITE_DETERMINISTIC 0
+#endif
+
 #ifdef SVN_UNICODE_NORMALIZATION_FIXES
 /* Limit the length of a GLOB or LIKE pattern. */
 #ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
@@ -1056,16 +1060,20 @@ svn_sqlite__open(svn_sqlite__db_t **db, 
 
   /* Register collation and LIKE and GLOB operator replacements. */
   SQLITE_ERR(sqlite3_create_collation((*db)->db3,
-                                      "svn-ucs-nfd", SQLITE_UTF8,
+                                      "svn-ucs-nfd",
+                                      SQLITE_UTF8 | SQLITE_DETERMINISTIC,
                                       *db, collate_ucs_nfd),
              *db);
-  SQLITE_ERR(sqlite3_create_function((*db)->db3, "glob", 2, SQLITE_UTF8,
+  SQLITE_ERR(sqlite3_create_function((*db)->db3, "glob", 2,
+                                     SQLITE_UTF8 | SQLITE_DETERMINISTIC,
                                      *db, glob_ucs_nfd, NULL, NULL),
              *db);
-  SQLITE_ERR(sqlite3_create_function((*db)->db3, "like", 2, SQLITE_UTF8,
+  SQLITE_ERR(sqlite3_create_function((*db)->db3, "like", 2,
+                                     SQLITE_UTF8 | SQLITE_DETERMINISTIC,
                                      *db, like_ucs_nfd, NULL, NULL),
              *db);
-  SQLITE_ERR(sqlite3_create_function((*db)->db3, "like", 3, SQLITE_UTF8,
+  SQLITE_ERR(sqlite3_create_function((*db)->db3, "like", 3,
+                                     SQLITE_UTF8 | SQLITE_DETERMINISTIC,
                                      *db, like_ucs_nfd, NULL, NULL),
              *db);
 #endif /* SVN_UNICODE_NORMALIZATION_FIXES */
@@ -1437,9 +1445,11 @@ svn_error_t *
 svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
                                    const char *func_name,
                                    int argc,
+                                   svn_boolean_t deterministic,
                                    svn_sqlite__func_t func,
                                    void *baton)
 {
+  int eTextRep;
   struct function_wrapper_baton_t *fwb = apr_pcalloc(db->state_pool,
                                                      sizeof(*fwb));
 
@@ -1447,7 +1457,11 @@ svn_sqlite__create_scalar_function(svn_s
   fwb->func = func;
   fwb->baton = baton;
 
-  SQLITE_ERR(sqlite3_create_function(db->db3, func_name, argc, SQLITE_ANY,
+  eTextRep = SQLITE_ANY;
+  if (deterministic)
+    eTextRep |= SQLITE_DETERMINISTIC;
+
+  SQLITE_ERR(sqlite3_create_function(db->db3, func_name, argc, eTextRep,
                                      fwb, wrapped_func, NULL, NULL),
              db);
 

Modified: subversion/trunk/subversion/libsvn_wc/wc_db_util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_util.c?rev=1559352&r1=1559351&r2=1559352&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_util.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_util.c Sat Jan 18 15:08:44 2014
@@ -145,6 +145,7 @@ svn_wc__db_util_open_db(svn_sqlite__db_t
     SVN_ERR(svn_sqlite__exec_statements(*sdb, STMT_PRAGMA_LOCKING_MODE));
 
   SVN_ERR(svn_sqlite__create_scalar_function(*sdb, "relpath_depth", 1,
+                                             TRUE /* deterministic */,
                                              relpath_depth_sqlite, NULL));
 
   return SVN_NO_ERROR;

Modified: subversion/trunk/subversion/tests/libsvn_subr/sqlite-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_subr/sqlite-test.c?rev=1559352&r1=1559351&r2=1559352&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/sqlite-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/sqlite-test.c Sat Jan 18 15:08:44 2014
@@ -83,7 +83,8 @@ test_sqlite_reset(apr_pool_t *pool)
   };
 
   SVN_ERR(open_db(&sdb, "reset", statements, pool));
-  SVN_ERR(svn_sqlite__create_scalar_function(sdb, "error_second", 1,
+  SVN_ERR(svn_sqlite__create_scalar_function(sdb, "error_second",
+                                             1, FALSE /* deterministic */,
                                              error_second, NULL));
   SVN_ERR(svn_sqlite__exec_statements(sdb, 0));
   SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 1));