]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Bind sqlite3_sql() and sqlite3_expanded_sql() to JNI. Start marking C-side functions...
authorstephan <stephan@noemail.net>
Fri, 11 Aug 2023 18:04:53 +0000 (18:04 +0000)
committerstephan <stephan@noemail.net>
Fri, 11 Aug 2023 18:04:53 +0000 (18:04 +0000)
FossilOrigin-Name: c7fb32d1ef30d34449c3289c384ce33317c770927534af20d4b96fa385da40bc

ext/jni/src/c/sqlite3-jni.c
ext/jni/src/c/sqlite3-jni.h
ext/jni/src/org/sqlite/jni/SQLite3Jni.java
ext/jni/src/org/sqlite/jni/Tester1.java
ext/jni/src/org/sqlite/jni/tester/SQLTester.java
manifest
manifest.uuid

index 860d4a4dad9bed2990c586bae933a2abc138ed22..f8461abfa19925f9f0726c5158c9f2e434b6e83a 100644 (file)
@@ -311,7 +311,7 @@ static const struct {
 #define JBA_RELEASE(ARG,VAR) if(VAR) (*env)->ReleaseByteArrayElements(env, ARG, VAR, JNI_ABORT)
 
 /* Marker for code which needs(?) to be made thread-safe. */
-#define FIXME_THREADING
+#define FIXME_THREADING(REASON)
 
 enum {
   /**
@@ -557,7 +557,7 @@ static void * s3jni_malloc(JNIEnv * const env, size_t n){
    insofar as possible. Calls (*env)->FatalError() if allocation of
    an entry fails. That's hypothetically possible but "shouldn't happen."
 */
-FIXME_THREADING
+FIXME_THREADING(S3JniEnvCache)
 static S3JniEnvCache * S3JniGlobal_env_cache(JNIEnv * const env){
   struct S3JniEnvCache * row = S3JniGlobal.envCache.aHead;
   for( ; row; row = row->pNext ){
@@ -763,6 +763,7 @@ static jstring s3jni_text16_to_jstring(JNIEnv * const env, const void * const p,
     System.out.println(e.getMessage()); // Hi
   }
 */
+FIXME_THREADING(S3JniEnvCache)
 static char * s3jni_exception_error_msg(JNIEnv * const env, jthrowable jx ){
   S3JniEnvCache * const jc = S3JniGlobal_env_cache(env);
   jmethodID mid;
@@ -862,7 +863,7 @@ static void S3JniHook_unref(JNIEnv * const env, S3JniHook * const s, int doXDest
 /**
    Clears s's state and moves it to the free-list.
 */
-FIXME_THREADING
+FIXME_THREADING(perDb)
 static void S3JniDb_set_aside(S3JniDb * const s){
   if(s){
     JNIEnv * const env = s->env;
@@ -930,7 +931,7 @@ static void S3JniEnvCache_clear(S3JniEnvCache * const p){
    Results are undefined if a Java-side db uses the API
    from the given JNIEnv after this call.
 */
-FIXME_THREADING
+FIXME_THREADING(perDb)
 static void S3JniDb_free_for_env(JNIEnv *env){
   S3JniDb * ps = S3JniGlobal.perDb.aUsed;
   S3JniDb * pNext = 0;
@@ -999,7 +1000,7 @@ static void S3JniGlobal_S3JniEnvCache_clear(void){
    This simple cache catches >99% of searches in the current
    (2023-07-31) tests.
 */
-FIXME_THREADING
+FIXME_THREADING(S3JniEnvCache)
 static S3JniNphCache * S3JniGlobal_nph_cache(JNIEnv * const env, const char *zClassName){
   /**
      According to:
@@ -1196,7 +1197,8 @@ static void S3JniDb_dump(S3JniDb *s){
    required for functions, like sqlite3_context_db_handle(), which
    return a (sqlite3*) but do not take one as an argument.
 */
-FIXME_THREADING
+FIXME_THREADING(S3JniEnvCache)
+FIXME_THREADING(perDb)
 static S3JniDb * S3JniDb_for_db(JNIEnv * const env, jobject jDb,
                                 sqlite3 *pDb, int allocIfNeeded){
   S3JniDb * s = S3JniGlobal.perDb.aUsed;
@@ -1227,7 +1229,7 @@ static S3JniDb * S3JniDb_for_db(JNIEnv * const env, jobject jDb,
    called from the context of a separate JNIEnv than the one mapped
    to in the returned object. Returns 0 if no match is found.
 */
-FIXME_THREADING
+FIXME_THREADING(perDb)
 static S3JniDb * S3JniDb_for_db2(sqlite3 *pDb){
   S3JniDb * s = S3JniGlobal.perDb.aUsed;
   for( ; pDb && s; s = s->pNext){
@@ -1877,7 +1879,7 @@ WRAP_INT_SVALUE(1value_1type,          sqlite3_value_type)
 
 #if S3JNI_ENABLE_AUTOEXT
 /* Central auto-extension handler. */
-FIXME_THREADING
+FIXME_THREADING(autoExt)
 static int s3jni_auto_extension(sqlite3 *pDb, const char **pzErr,
                                 const struct sqlite3_api_routines *ignored){
   S3JniAutoExtension const * pAX = S3JniGlobal.autoExt.pHead;
@@ -1929,6 +1931,7 @@ static int s3jni_auto_extension(sqlite3 *pDb, const char **pzErr,
   return rc;
 }
 
+FIXME_THREADING(autoExt)
 JDECL(jint,1auto_1extension)(JENV_OSELF, jobject jAutoExt){
   static int once = 0;
   S3JniAutoExtension * ax;
@@ -1947,6 +1950,7 @@ JDECL(jint,1auto_1extension)(JENV_OSELF, jobject jAutoExt){
 }
 #endif /* S3JNI_ENABLE_AUTOEXT */
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1blob)(JENV_CSELF, jobject jpStmt,
                         jint ndx, jbyteArray baData, jint nMax){
   int rc;
@@ -1961,26 +1965,31 @@ JDECL(jint,1bind_1blob)(JENV_CSELF, jobject jpStmt,
   return (jint)rc;
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1double)(JENV_CSELF, jobject jpStmt,
                          jint ndx, jdouble val){
   return (jint)sqlite3_bind_double(PtrGet_sqlite3_stmt(jpStmt), (int)ndx, (double)val);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1int)(JENV_CSELF, jobject jpStmt,
                       jint ndx, jint val){
   return (jint)sqlite3_bind_int(PtrGet_sqlite3_stmt(jpStmt), (int)ndx, (int)val);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1int64)(JENV_CSELF, jobject jpStmt,
                         jint ndx, jlong val){
   return (jint)sqlite3_bind_int64(PtrGet_sqlite3_stmt(jpStmt), (int)ndx, (sqlite3_int64)val);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1null)(JENV_CSELF, jobject jpStmt,
                        jint ndx){
   return (jint)sqlite3_bind_null(PtrGet_sqlite3_stmt(jpStmt), (int)ndx);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1parameter_1index)(JENV_CSELF, jobject jpStmt, jbyteArray jName){
   int rc = 0;
   jbyte * const pBuf = JBA_TOC(jName);
@@ -1992,6 +2001,7 @@ JDECL(jint,1bind_1parameter_1index)(JENV_CSELF, jobject jpStmt, jbyteArray jName
   return rc;
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1text)(JENV_CSELF, jobject jpStmt,
                        jint ndx, jbyteArray baData, jint nMax){
   if(baData){
@@ -2005,11 +2015,13 @@ JDECL(jint,1bind_1text)(JENV_CSELF, jobject jpStmt,
   }
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1zeroblob)(JENV_CSELF, jobject jpStmt,
                            jint ndx, jint n){
   return (jint)sqlite3_bind_zeroblob(PtrGet_sqlite3_stmt(jpStmt), (int)ndx, (int)n);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1bind_1zeroblob64)(JENV_CSELF, jobject jpStmt,
                            jint ndx, jlong n){
   return (jint)sqlite3_bind_zeroblob(PtrGet_sqlite3_stmt(jpStmt), (int)ndx, (sqlite3_uint64)n);
@@ -2031,6 +2043,7 @@ static int s3jni_busy_handler(void* pState, int n){
   return rc;
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1busy_1handler)(JENV_CSELF, jobject jDb, jobject jBusy){
   S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0, 0);
   int rc = 0;
@@ -2060,6 +2073,8 @@ JDECL(jint,1busy_1handler)(JENV_CSELF, jobject jDb, jobject jBusy){
     : sqlite3_busy_handler(ps->pDb, 0, 0);
 }
 
+FIXME_THREADING(S3JniEnvCache)
+FIXME_THREADING(perDb)
 JDECL(jint,1busy_1timeout)(JENV_CSELF, jobject jDb, jint ms){
   S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0, 0);
   if( ps ){
@@ -2070,7 +2085,8 @@ JDECL(jint,1busy_1timeout)(JENV_CSELF, jobject jDb, jint ms){
 }
 
 #if S3JNI_ENABLE_AUTOEXT
-JDECL(jboolean,1cancel_1auto_1extension)(JENV_OSELF, jobject jAutoExt){
+FIXME_THREADING(autoExt)
+JDECL(jboolean,1cancel_1auto_1extension)(JENV_CSELF, jobject jAutoExt){
   S3JniAutoExtension * ax;;
   if( S3JniGlobal.autoExt.isRunning ) return JNI_FALSE;
   for( ax = S3JniGlobal.autoExt.pHead; ax; ax = ax->pNext ){
@@ -2102,10 +2118,14 @@ static jint s3jni_close_db(JNIEnv * const env, jobject jDb, int version){
   return (jint)rc;
 }
 
+FIXME_THREADING(S3JniEnvCache)
+FIXME_THREADING(perDb)
 JDECL(jint,1close_1v2)(JENV_CSELF, jobject pDb){
   return s3jni_close_db(env, pDb, 2);
 }
 
+FIXME_THREADING(S3JniEnvCache)
+FIXME_THREADING(perDb)
 JDECL(jint,1close)(JENV_CSELF, jobject pDb){
   return s3jni_close_db(env, pDb, 1);
 }
@@ -2144,6 +2164,8 @@ static void s3jni_collation_needed_impl16(void *pState, sqlite3 *pDb,
   UNREF_L(jName);
 }
 
+FIXME_THREADING(S3JniEnvCache)
+FIXME_THREADING(perDb)
 JDECL(jint,1collation_1needed)(JENV_CSELF, jobject jDb, jobject jHook){
   S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0, 0);
   jclass klazz;
@@ -2180,6 +2202,7 @@ JDECL(jint,1collation_1needed)(JENV_CSELF, jobject jDb, jobject jHook){
   return rc;
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jbyteArray,1column_1blob)(JENV_CSELF, jobject jpStmt,
                                 jint ndx){
   sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
@@ -2193,21 +2216,25 @@ JDECL(jbyteArray,1column_1blob)(JENV_CSELF, jobject jpStmt,
   }
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jdouble,1column_1double)(JENV_CSELF, jobject jpStmt,
                                jint ndx){
   return (jdouble)sqlite3_column_double(PtrGet_sqlite3_stmt(jpStmt), (int)ndx);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jint,1column_1int)(JENV_CSELF, jobject jpStmt,
                             jint ndx){
   return (jint)sqlite3_column_int(PtrGet_sqlite3_stmt(jpStmt), (int)ndx);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jlong,1column_1int64)(JENV_CSELF, jobject jpStmt,
                             jint ndx){
   return (jlong)sqlite3_column_int64(PtrGet_sqlite3_stmt(jpStmt), (int)ndx);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jbyteArray,1column_1text)(JENV_CSELF, jobject jpStmt,
                                       jint ndx){
   sqlite3_stmt * const stmt = PtrGet_sqlite3_stmt(jpStmt);
@@ -2216,6 +2243,7 @@ JDECL(jbyteArray,1column_1text)(JENV_CSELF, jobject jpStmt,
   return s3jni_new_jbyteArray(env, p, n);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jstring,1column_1text16)(JENV_CSELF, jobject jpStmt,
                                jint ndx){
   sqlite3_stmt * const stmt = PtrGet_sqlite3_stmt(jpStmt);
@@ -2224,6 +2252,7 @@ JDECL(jstring,1column_1text16)(JENV_CSELF, jobject jpStmt,
   return s3jni_text16_to_jstring(env, p, n);
 }
 
+FIXME_THREADING(S3JniEnvCache)
 JDECL(jobject,1column_1value)(JENV_CSELF, jobject jpStmt,
                               jint ndx){
   sqlite3_value * const sv = sqlite3_column_value(PtrGet_sqlite3_stmt(jpStmt), (int)ndx);
@@ -2253,6 +2282,7 @@ static void s3jni_rollback_hook_impl(void *pP){
   (void)s3jni_commit_rollback_hook_impl(0, pP);
 }
 
+FIXME_THREADING(perDb)
 static jobject s3jni_commit_rollback_hook(int isCommit, JNIEnv * const env,jobject jDb,
                                           jobject jHook){
   S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0, 0);
@@ -2350,6 +2380,7 @@ JDECL(int,1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2)(
   return rc;
 }
 
+FIXME_THREADING(perDb)
 /* sqlite3_db_config() for (int,int*) */
 /* ACHTUNG: openjdk v19 creates a different mangled name for this
    function than openjdk v8 does. */
@@ -2404,6 +2435,7 @@ JDECL(jint,1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPointer
   );
 }
 
+FIXME_THREADING(perDb)
 JDECL(jobject,1context_1db_1handle)(JENV_CSELF, jobject jpCx){
   sqlite3 * const pDb = sqlite3_context_db_handle(PtrGet_sqlite3_context(jpCx));
   S3JniDb * const ps = pDb ? S3JniDb_for_db(env, 0, pDb, 0) : 0;
@@ -2540,6 +2572,21 @@ JDECL(jstring,1errstr)(JENV_CSELF, jint rcCode){
        MUTF-8 incompatibility */;
 }
 
+JDECL(jstring,1expanded_1sql)(JENV_CSELF, jobject jpStmt){
+  sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
+  jstring rv = 0;
+  if( pStmt ){
+    S3JniEnvCache * const jc = S3JniGlobal_env_cache(env);
+    char * zSql = sqlite3_expanded_sql(pStmt);
+    OOM_CHECK(zSql);
+    if( zSql ){
+      rv = s3jni_utf8_to_jstring(jc, zSql, -1);
+      sqlite3_free(zSql);
+    }
+  }
+  return rv;
+}
+
 JDECL(jboolean,1extended_1result_1codes)(JENV_CSELF, jobject jpDb,
                                          jboolean onoff){
   int const rc = sqlite3_extended_result_codes(PtrGet_sqlite3(jpDb), onoff ? 1 : 0);
@@ -3099,6 +3146,19 @@ JDECL(jint,1shutdown)(JENV_CSELF){
   return sqlite3_shutdown();
 }
 
+JDECL(jstring,1sql)(JENV_CSELF, jobject jpStmt){
+  sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
+  jstring rv = 0;
+  if( pStmt ){
+    const char * zSql = 0;
+    S3JniEnvCache * const jc = S3JniGlobal_env_cache(env);
+    zSql = sqlite3_sql(pStmt);
+    rv = s3jni_utf8_to_jstring(jc, zSql, -1);
+    OOM_CHECK(rv);
+  }
+  return rv;
+}
+
 JDECL(jint,1step)(JENV_CSELF,jobject jStmt){
   int rc = SQLITE_MISUSE;
   sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jStmt);
@@ -3384,7 +3444,7 @@ JDECL(void,1do_1something_1for_1developer)(JENV_CSELF){
   printf("\tJNIEnv cache               %u misses, %u hits\n",
          S3JniGlobal.metrics.envCacheMisses,
          S3JniGlobal.metrics.envCacheHits);
-  puts("UDF calls:");
+  puts("Java-side UDF calls:");
 #define UDF(T) printf("\t%-8s = %u\n", "x" #T, S3JniGlobal.metrics.udf.n##T)
   UDF(Func); UDF(Step); UDF(Final); UDF(Value); UDF(Inverse);
 #undef UDF
index af8c0662e1b70c974cd7e598b65ea0a3b572d2d7..d8e75cd7ba1f37cc9e1595296c16a91e7600ffe8 100644 (file)
@@ -1139,6 +1139,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1db_1config__Lorg_
 JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1errcode
   (JNIEnv *, jclass, jobject);
 
+/*
+ * Class:     org_sqlite_jni_SQLite3Jni
+ * Method:    sqlite3_expanded_sql
+ * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1expanded_1sql
+  (JNIEnv *, jclass, jobject);
+
 /*
  * Class:     org_sqlite_jni_SQLite3Jni
  * Method:    sqlite3_extended_errcode
@@ -1451,6 +1459,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1sleep
 JNIEXPORT jstring JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1sourceid
   (JNIEnv *, jclass);
 
+/*
+ * Class:     org_sqlite_jni_SQLite3Jni
+ * Method:    sqlite3_sql
+ * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1sql
+  (JNIEnv *, jclass, jobject);
+
 /*
  * Class:     org_sqlite_jni_SQLite3Jni
  * Method:    sqlite3_step
index b6f07927ccb2e8ee25b02f6ad6a78483dbcc2057..46488a40a94c6b189c3549a2a45b2fde737d1333 100644 (file)
@@ -472,11 +472,11 @@ public final class SQLite3Jni {
     @NotNull sqlite3 db, @Nullable CommitHook hook
   );
 
-  public static synchronized native String sqlite3_compileoption_get(
+  public static native String sqlite3_compileoption_get(
     int n
   );
 
-  public static synchronized native boolean sqlite3_compileoption_used(
+  public static native boolean sqlite3_compileoption_used(
     @NotNull String optName
   );
 
@@ -528,6 +528,8 @@ public final class SQLite3Jni {
 
   public static synchronized native int sqlite3_errcode(@NotNull sqlite3 db);
 
+  public static synchronized native String sqlite3_expanded_sql(@NotNull sqlite3_stmt stmt);
+
   public static synchronized native int sqlite3_extended_errcode(@NotNull sqlite3 db);
 
   public static synchronized native boolean sqlite3_extended_result_codes(
@@ -934,6 +936,16 @@ public final class SQLite3Jni {
     long maxLength, int encoding
   );
 
+
+  // public static synchronized native int sqlite3_status(
+  //   int op, OutputPointer.Int32 pCurrent, OutputPointer.Int32 pHighwater,
+  //   boolean reset
+  // );
+  // public static synchronized native int sqlite3_status64(
+  //   int op, OutputPointer.Int64 pCurrent, OutputPointer.Int64 pHighwater,
+  //   boolean reset
+  // );
+
   /**
      Sets the current UDF result to the given bytes, which are assumed
      be encoded in UTF-16 using the platform's byte order.
@@ -1002,6 +1014,8 @@ public final class SQLite3Jni {
 
   public static synchronized native String sqlite3_sourceid();
 
+  public static synchronized native String sqlite3_sql(@NotNull sqlite3_stmt stmt);
+
   public static synchronized native int sqlite3_step(@NotNull sqlite3_stmt stmt);
 
   /**
@@ -1144,8 +1158,8 @@ public final class SQLite3Jni {
      This is NOT part of the public API. It exists solely as a place
      to hook in arbitrary C-side code during development and testing
      of this library.
-   */
-  static synchronized native void sqlite3_do_something_for_developer();
+  */
+  public static synchronized native void sqlite3_do_something_for_developer();
 
   //////////////////////////////////////////////////////////////////////
   // SQLITE_... constants follow...
index 33f0fbbb4389f06fa4b13ee94717b69f6aa58bd1..0ae424d53ac3866c60bc0de68535765c4629cfc8 100644 (file)
@@ -390,6 +390,17 @@ public class Tester1 {
     sqlite3_close_v2(db);
   }
 
+  private static void testSql(){
+    sqlite3 db = createNewDb();
+    sqlite3_stmt stmt = prepare(db, "SELECT 1");
+    affirm( "SELECT 1".equals(sqlite3_sql(stmt)) );
+    sqlite3_finalize(stmt);
+    stmt = prepare(db, "SELECT ?");
+    sqlite3_bind_text(stmt, 1, "hello");
+    affirm( "SELECT 'hello'".equals(sqlite3_expanded_sql(stmt)) );
+    sqlite3_finalize(stmt);
+  }
+
   private static void testCollation(){
     final sqlite3 db = createNewDb();
     execSql(db, "CREATE TABLE t(a); INSERT INTO t(a) VALUES('a'),('b'),('c')");
@@ -1069,6 +1080,7 @@ public class Tester1 {
     testBindFetchDouble();
     testBindFetchText();
     testBindFetchBlob();
+    testSql();
     testCollation();
     testToUtf8();
     testUdf1();
index 44c1c305bc6810093bade7cefa4ac5cec28e018d..15ac6c6a25636638e54c88ba2818b595b1f49ed0 100644 (file)
@@ -260,7 +260,7 @@ public class SQLTester {
         ts.run(this);
       }catch(SQLTesterException e){
         threw = true;
-        outln("EXCEPTION: ",e.getClass().getSimpleName(),": ",e.getMessage());
+        outln("🔥EXCEPTION: ",e.getClass().getSimpleName(),": ",e.getMessage());
         ++nAbortedScript;
         if( keepGoing ) outln("Continuing anyway becaure of the keep-going option.");
         else if( e.isFatal() ) throw e;
@@ -583,6 +583,7 @@ public class SQLTester {
 
   public static void main(String[] argv) throws Exception{
     installCustomExtensions();
+    boolean dumpInternals = false;
     final SQLTester t = new SQLTester();
     for(String a : argv){
       if(a.startsWith("-")){
@@ -592,6 +593,8 @@ public class SQLTester {
           t.setVerbosity(t.getVerbosity() + 1);
         }else if( flag.equals("keep-going") ){
           t.keepGoing = true;
+        }else if( flag.equals("internals") ){
+          dumpInternals = true;
         }else{
           throw new IllegalArgumentException("Unhandled flag: "+flag);
         }
@@ -618,6 +621,9 @@ public class SQLTester {
       if( t.nAbortedScript > 0 ){
         t.outln("Aborted ",t.nAbortedScript," script(s).");
       }
+      if( dumpInternals ){
+        sqlite3_do_something_for_developer();
+      }
     }
   }
 
index 4016d956874100c9f2250940d01771b0847ea897..8eaa3c853306a3bfc0bfe499d8772c9e4c52f102 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Mark\s_all_\sJNI\sbinding\sfuncs\sas\ssynchronized\sso\sthat\sJava\scan\slock\sthem\sand\sprotect\sour\sglobal-state\saccess.\sThe\salternative\sis\swriting\sa\smountain\sof\sC-side\scode\sto\sdo\sthe\ssame\sthing.
-D 2023-08-10T21:50:52.042
+C Bind\ssqlite3_sql()\sand\ssqlite3_expanded_sql()\sto\sJNI.\sStart\smarking\sC-side\sfunctions\swhich\swould\sneed\sexplicit\smutex\ssupport\sif\swe\sremove\s'synchronized'\sfrom\stheir\sJava\sentry\spoints\s(but\sthere\sare\smany\smore\sleft\sto\smark).
+D 2023-08-11T18:04:53.620
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -234,8 +234,8 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
 F ext/jni/GNUmakefile d228f18de85e7f2f80e05edce3cc4f32da3c45a308e4e921807ca88279010871
 F ext/jni/README.md 7a614a2fa6c561205f7a53fd8626cf93a7b5711ff454fc1814517f796df398eb
 F ext/jni/jar-dist.make f90a553203a57934bf275bed86479485135a52f48ac5c1cfe6499ae07b0b35a4
-F ext/jni/src/c/sqlite3-jni.c 709205926615161bcd9f657a7ee29f7348da1811ed2d64fc45d7ae62aa3ab8c9
-F ext/jni/src/c/sqlite3-jni.h 471da2a2ded8425a38a01111ea04a800e9035ae87450045fc7a945be78210d7b
+F ext/jni/src/c/sqlite3-jni.c 478c168346b6ee0b600433c8d1b1c59b357fdd7418a1dd18498ce9e73742d685
+F ext/jni/src/c/sqlite3-jni.h 8f9e03016fea584627219eb4a14c6b1a6ba9fffbd7bc0df9e14220a6af8cfe18
 F ext/jni/src/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
 F ext/jni/src/org/sqlite/jni/AutoExtension.java 18e83f6f463e306df60b2dceb65247d32af1f78af4bbbae9155411a8c6cdb093
 F ext/jni/src/org/sqlite/jni/BusyHandler.java 1b1d3e5c86cd796a0580c81b6af6550ad943baa25e47ada0dcca3aff3ebe978c
@@ -254,8 +254,8 @@ F ext/jni/src/org/sqlite/jni/ProgressHandler.java 6f62053a828a572de809828b1ee495
 F ext/jni/src/org/sqlite/jni/ResultCode.java 7cdf993f2037ab7bd244c9a34dbaef2ace3beb5da5d7e7fda5c6f67634ceb647
 F ext/jni/src/org/sqlite/jni/RollbackHook.java b04c8abcc6ade44a8a57129e33765793f69df0ba909e49ba18d73f4268d92564
 F ext/jni/src/org/sqlite/jni/SQLFunction.java 09ce81c1c637e31c3a830d4c859cce95d65f5e02ff45f8bd1985b3479381bc46
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 836822ecf2f346d2218609fa68ddb3b595361663890493271635726e776cb57b
-F ext/jni/src/org/sqlite/jni/Tester1.java c45ab1895774851dec30824157d4c390f49e17729588c02cd88172854ee97e74
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 23dec2c267ef1882bb0bfc12a2c771e13e091885942344abbde90861f7b795fa
+F ext/jni/src/org/sqlite/jni/Tester1.java 7716949ae434308e698da505549e751478a03f40f2775d6b5486b754ded37a79
 F ext/jni/src/org/sqlite/jni/TesterFts5.java cf2d687baafffdeba219b77cf611fd47a0556248820ea794ae3e8259bfbdc5ee
 F ext/jni/src/org/sqlite/jni/Tracer.java a5cece9f947b0af27669b8baec300b6dd7ff859c3e6a6e4a1bd8b50f9714775d
 F ext/jni/src/org/sqlite/jni/UpdateHook.java e58645a1727f8a9bbe72dc072ec5b40d9f9362cb0aa24acfe93f49ff56a9016d
@@ -267,7 +267,7 @@ F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c38
 F ext/jni/src/org/sqlite/jni/sqlite3_context.java d26573fc7b309228cb49786e9078597d96232257defa955a3425d10897bca810
 F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
 F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
-F ext/jni/src/org/sqlite/jni/tester/SQLTester.java ecb989115a421088e2772d6125cd872cd345d0c422c50aa1ce1221c61fcd1f88
+F ext/jni/src/org/sqlite/jni/tester/SQLTester.java 5aa16634120dea614ebe3c127c69da87ba207cb658b09f600a8e8f9d2dc91e15
 F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
 F ext/jni/src/tests/000-000-sanity.test cfe6dc1b950751d6096e3f5695becaadcdaa048bfe9567209d6eb676e693366d
 F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
@@ -2090,8 +2090,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 746894c3c043c47f8b4c231de8921df81c5d0634260d299359bea73132dc7867
-R e1ccd8a6a6627664a18e71218906f2ad
+P afe190a940441de9bef8835c2dc6d278f861a772c3b7c7a2d399b2eabd4872e3
+R 2143ed5f6ccc929f2efe052657302ea3
 U stephan
-Z 898733fffb725ecf1391b4a8e291674e
+Z 2327e5c9841d1baf8b0f3e308e996b38
 # Remove this line to create a well-formed Fossil manifest.
index 8bcfadfae99e778710178cf12b300ddb84493348..3b128b9a84a156812e8599d4e2a9a8df6c130432 100644 (file)
@@ -1 +1 @@
-afe190a940441de9bef8835c2dc6d278f861a772c3b7c7a2d399b2eabd4872e3
\ No newline at end of file
+c7fb32d1ef30d34449c3289c384ce33317c770927534af20d4b96fa385da40bc
\ No newline at end of file