]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add JNI binding for sqlite3_normalized_sql().
authorstephan <stephan@noemail.net>
Sun, 1 Oct 2023 12:15:38 +0000 (12:15 +0000)
committerstephan <stephan@noemail.net>
Sun, 1 Oct 2023 12:15:38 +0000 (12:15 +0000)
FossilOrigin-Name: 2532e5662a2bbb3e6b4c4be3fad035734b684bdf59b178cb64b444ca6d8b956b

ext/jni/GNUmakefile
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
manifest
manifest.uuid

index bd1dc6f47ace40effdbcfe9892e32ca8d68db4ca..77b0c3061be16c3f006f6054fa0c8c9d2ce1b0fa 100644 (file)
@@ -214,6 +214,7 @@ SQLITE_OPT += -DSQLITE_ENABLE_RTREE \
   -DSQLITE_ENABLE_BYTECODE_VTAB \
   -DSQLITE_ENABLE_OFFSET_SQL_FUNC \
   -DSQLITE_ENABLE_PREUPDATE_HOOK \
+  -DSQLITE_ENABLE_NORMALIZE \
   -DSQLITE_ENABLE_SQLLOG
 endif
 
index 2159e8979ee7162b5ff02f1952953e3eaa410189..1a9c3bc35670d6e7e9ceea6274e72e1e4c82d9d0 100644 (file)
@@ -3386,22 +3386,53 @@ S3JniApi(sqlite3_errstr(),jstring,1errstr)(
   return rv;
 }
 
-S3JniApi(sqlite3_expanded_sql(),jstring,1expanded_1sql)(
-  JniArgsEnvClass, jobject jpStmt
-){
+#ifndef SQLITE_ENABLE_NORMALIZE
+/* Dummy stub for sqlite3_normalized_sql(). Never called. */
+static const char * sqlite3_normalized_sql(sqlite3_stmt *s){
+  S3JniDeclLocal_env;
+  (*env)->FatalError(env, "dummy sqlite3_normalized_sql() was "
+                     "impossibly called.") /* does not return */;
+  return 0;
+}
+#endif
+
+/*
+** Impl for sqlite3_expanded_sql() (if isExpanded is true) and
+** sqlite3_normalized_sql().
+*/
+static jstring s3jni_xn_sql(int isExpanded, JNIEnv *env, jobject jpStmt){
   jstring rv = 0;
   sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
+
   if( pStmt ){
-    char * zSql = sqlite3_expanded_sql(pStmt);
+    char * zSql = isExpanded
+      ? sqlite3_expanded_sql(pStmt)
+      : (char*)sqlite3_normalized_sql(pStmt);
     s3jni_oom_fatal(zSql);
     if( zSql ){
-      rv = s3jni_utf8_to_jstring( zSql, -1);
-      sqlite3_free(zSql);
+      rv = s3jni_utf8_to_jstring(zSql, -1);
+      if( isExpanded ) sqlite3_free(zSql);
     }
   }
   return rv;
 }
 
+S3JniApi(sqlite3_expanded_sql(),jstring,1expanded_1sql)(
+  JniArgsEnvClass, jobject jpStmt
+){
+  return s3jni_xn_sql(1, env, jpStmt);
+}
+
+S3JniApi(sqlite3_normalized_sql(),jstring,1normalized_1sql)(
+  JniArgsEnvClass, jobject jpStmt
+){
+#ifdef SQLITE_ENABLE_NORMALIZE
+  return s3jni_xn_sql(0, env, jpStmt);
+#else
+  return 0;
+#endif
+}
+
 S3JniApi(sqlite3_extended_result_codes(),jboolean,1extended_1result_1codes)(
   JniArgsEnvClass, jobject jpDb, jboolean onoff
 ){
index f8aa61beecced4e4d0858918f0840de4092d8fbc..3bcbf2d01e8bd45132665b36a0ee6c81734a8cf0 100644 (file)
@@ -1499,6 +1499,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1libversion_1numbe
 JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1limit
   (JNIEnv *, jclass, jobject, jint, jint);
 
+/*
+ * Class:     org_sqlite_jni_SQLite3Jni
+ * Method:    sqlite3_normalized_sql
+ * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_SQLite3Jni_sqlite3_1normalized_1sql
+  (JNIEnv *, jclass, jobject);
+
 /*
  * Class:     org_sqlite_jni_SQLite3Jni
  * Method:    sqlite3_open
index 5433cf4a60a5d7fba25fba90b1c5990489cb3b17..866c9b9615663a4278f14b6e32c6534c2e787991 100644 (file)
@@ -1025,6 +1025,13 @@ final class SQLite3Jni {
   @Canonical
   public static native int sqlite3_limit(@NotNull sqlite3 db, int id, int newVal);
 
+  /**
+     Only available if built with SQLITE_ENABLE_NORMALIZE. If not, it always
+     returns null.
+  */
+  @Canonical
+  public static native String sqlite3_normalized_sql(@NotNull sqlite3_stmt stmt);
+
   /**
      Works like its C counterpart and makes the native pointer of the
      underling (sqlite3*) object available via
index 04d91921f35e0b2320bd9f5c33d4406009256f24..722ff0e3a725ab14020ba700a04aa59c7b81c38d 100644 (file)
@@ -560,7 +560,10 @@ public class Tester1 implements Runnable {
     sqlite3_finalize(stmt);
     stmt = prepare(db, "SELECT ?");
     sqlite3_bind_text(stmt, 1, "hell😃");
-    affirm( "SELECT 'hell😃'".equals(sqlite3_expanded_sql(stmt)) );
+    final String expect = "SELECT 'hell😃'";
+    affirm( expect.equals(sqlite3_expanded_sql(stmt)) );
+    String n = sqlite3_normalized_sql(stmt);
+    affirm( null==n || expect.equals(n) );
     sqlite3_finalize(stmt);
     sqlite3_close(db);
   }
index 93e3f3162c505f2255e4aac6f169092d168d2810..fa128f906f39835ba935fbbaf8bc5c09a3546739 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sJNI\sbinding\sof\ssqlite3_value_frombind()\sreturn\sboolean\sinstead\sof\sint\sand\sadd\stests\sfor\sit.
-D 2023-10-01T11:53:40.043
+C Add\sJNI\sbinding\sfor\ssqlite3_normalized_sql().
+D 2023-10-01T12:15:38.078
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,11 +235,11 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
 F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
 F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile b4e80da3c66edaf48e90158bbc0034dcd6a52c4828cc795f43780d0fa9a6ae5b
+F ext/jni/GNUmakefile 795caa6318c9ddbe6d3677b63e43dcdf3d20bc517b124819e6ba480e6e1c33b1
 F ext/jni/README.md 9fceaeb17cecdc5d699dfc83c0cbc3a03fdb3b86bf676381894166c73375ee75
 F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c c771fe717d38718d45a64e220f0a7e4d4b0482cc2ded3d5590bad6041a405e64
-F ext/jni/src/c/sqlite3-jni.h a9435695bbf5ed4c8f0c802b963948d7698563f81c15e2fa8a1d9b85a4a1b719
+F ext/jni/src/c/sqlite3-jni.c f308c04cc96e3aca5e58655a796ecbd688dac5ab778b702238ebd4f4a72cee0d
+F ext/jni/src/c/sqlite3-jni.h 74e3da791f748f02d0d684562126cf6bfdd2a85cbb6a5d1354b14fcd46e187bc
 F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
 F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
 F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java e6135be32f12bf140bffa39be7fd1a45ad83b2661ed49c08dbde04c8485feb38
@@ -260,10 +260,10 @@ F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7c
 F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java d12352c0e22840de484ffa9b11ed5058bb0daca2e9f218055d3c54c947a273c4
 F ext/jni/src/org/sqlite/jni/SQLFunction.java 544a875d33fd160467d82e2397ac33157b29971d715a821a4fad3c899113ee8c
 F ext/jni/src/org/sqlite/jni/SQLTester.java da42be06a2d644e0b915b40508934c1f32391e5308ab8767c1e2e65a281a198f
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java ad8a595954915aefaf66c9d17583f7a1109cc45747fe382f234a686b0028a593
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 9860c1cebd8a38041306f2ee7563f2898fcbdf77e4bfa393fba25b4924edcb5d
 F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c
 F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
-F ext/jni/src/org/sqlite/jni/Tester1.java 6373e551a89a68bbf2c79c5b62ef88b4001f8ea65a2ecdf693c4041047408bec
+F ext/jni/src/org/sqlite/jni/Tester1.java b5f68ff18f701ca7d1f6fe8bd0642de9289ed7aee422aabcaf92d03937ab097c
 F ext/jni/src/org/sqlite/jni/TesterFts5.java 854c737bb5c9463ee92a8ee230013e924236dd4b74d4688dd62c17f38d5837db
 F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0
 F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c
@@ -2122,8 +2122,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 c04022b7407f77eaf0175e831ebcd6bbdc0af1cef0d42c5c11102aa8484f24ca
-R c37e2ce6bc01474a856ea1d8e3c3b24a
+P 906e2ed3e9647f5c2355e9fea2beee141767cae7016da9fa1fe88283726b9369
+R 9775e917ddc66cb5e22618dc202f56cc
 U stephan
-Z c76d81a205c13235420ccf1380b4458a
+Z 848b571ca2c05c3bd6bf9bbe466709a2
 # Remove this line to create a well-formed Fossil manifest.
index b1236c49b607831cf5dc2cf891bfa400aabbe396..475068361acb4e5f09e297de0747035d008f1473 100644 (file)
@@ -1 +1 @@
-906e2ed3e9647f5c2355e9fea2beee141767cae7016da9fa1fe88283726b9369
\ No newline at end of file
+2532e5662a2bbb3e6b4c4be3fad035734b684bdf59b178cb64b444ca6d8b956b
\ No newline at end of file