From a1a523a5bb3628a833065d43d8035cfa8249fc16 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 26 Dec 2016 00:18:36 +0000 Subject: [PATCH 1/2] Add the built-in affinity() SQL function. FossilOrigin-Name: 57e40e1cb1bcd3dd8473d2fdeecc9c7ff3d6192b --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/expr.c | 14 ++++++++++++++ src/func.c | 1 + src/sqliteInt.h | 1 + 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2e7abd7f9e..7d07fb38d6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sfuzztest\sutility\swith\sthe\s--prng-seed\soption.\s\sAlways\sreseed\sthe\nPRNG\sprior\sto\seach\stest. -D 2016-12-26T00:15:56.766 +C Add\sthe\sbuilt-in\saffinity()\sSQL\sfunction. +D 2016-12-26T00:18:36.252 F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da @@ -341,10 +341,10 @@ F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a F src/date.c b48378aeac68fa20c811404955a9b62108df47d8 F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d F src/delete.c c8bc10d145c9666a34ae906250326fdaa8d58fa5 -F src/expr.c a90e37bc542abe33890cafccacbf8a7db9cb5401 +F src/expr.c dfde7bf6d3293c34b975aef24a7b9e4f6dbe89da F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae -F src/func.c 43916c1d8e6da5d107d91d2b212577d4f69a876a +F src/func.c 18193418066b4a46df0678167a61e2ecb532449e F src/global.c dcdb89f30b7aa531c5660030af106bc5bc48ef2e F src/hash.c 63d0ee752a3b92d4695b2b1f5259c4621b2cfebd F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -393,7 +393,7 @@ F src/shell.c 48ab675e5526903d2b7bea8c9736cafa345544e1 F src/sqlite.h.in e8e2d108d82647f0a812fdb74accf91c1ec08ddc F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae -F src/sqliteInt.h 2075e22d50833ca2d9956d0b7a6bfb845ad05dd2 +F src/sqliteInt.h 5a4ac95a34d9d323b2276ae1ed2b3eaafce6c97e F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247 F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 @@ -1539,7 +1539,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P def29333655691c7d54451193be13445a2857d29 -R e04e5338dd0157c18f4661e2b40e485c +P 8c5187f69d719b69aa6eaf2dc8f89243e5979222 +R b3d06bee0b628897cfc6aea60fc78deb +T *branch * affinity-sql-func +T *sym-affinity-sql-func * +T -sym-trunk * U drh -Z 34d4889fdc22385ba735ec50d68d537d +Z 89d8ee615380053a8bde91353136b95e diff --git a/manifest.uuid b/manifest.uuid index ab702bb52d..aa72dce7c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c5187f69d719b69aa6eaf2dc8f89243e5979222 \ No newline at end of file +57e40e1cb1bcd3dd8473d2fdeecc9c7ff3d6192b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ecc6c7928b..883273b3bc 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3621,6 +3621,20 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); } + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + if( pDef->funcFlags & SQLITE_FUNC_AFFINITY ){ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + aff ? azAff[aff-SQLITE_AFF_BLOB] : "none"); + return target; + } + for(i=0; ia[i].pExpr) ){ testcase( i==31 ); diff --git a/src/func.c b/src/func.c index 5b8ed6dd2b..ec50d97af0 100644 --- a/src/func.c +++ b/src/func.c @@ -1772,6 +1772,7 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY), FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), FUNCTION(rtrim, 1, 2, 0, trimFunc ), diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d78d2072de..c4aaf39244 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1561,6 +1561,7 @@ struct FuncDestructor { #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ +#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are From 542407513770711e5dfc1c0194c3269df25b0f5c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 3 Jan 2017 14:39:30 +0000 Subject: [PATCH 2/2] Put the affinity() function implementation inside of #ifdef SQLITE_DEBUG. FossilOrigin-Name: f778f58ae4ea3e16f51b94591a2c1e563dcb0cde --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 ++ src/func.c | 2 ++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4333aa5ff1..cfdb40bc31 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\sthe\slatest\schanges\sfrom\strunk. -D 2017-01-03T14:30:28.465 +C Put\sthe\saffinity()\sfunction\simplementation\sinside\sof\s#ifdef\sSQLITE_DEBUG. +D 2017-01-03T14:39:30.860 F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da @@ -341,10 +341,10 @@ F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a F src/date.c dc3f1391d9297f8c748132813aaffcb117090d6e F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d F src/delete.c c8bc10d145c9666a34ae906250326fdaa8d58fa5 -F src/expr.c 3cf3bb3b5de2494d0f7b30c999984fd2918b4ef5 +F src/expr.c 449cbb8b9857ff8eb685b72555086818a178858c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae -F src/func.c 04350956b6e45800f71e02e0ffeae2a35aff2634 +F src/func.c c67273e1ec08abbdcc14c189892a3ff6eeece86b F src/global.c 4a34512d82fc5aa13c802db06bcfff5e1d3de955 F src/hash.c 63d0ee752a3b92d4695b2b1f5259c4621b2cfebd F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -1541,7 +1541,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 57e40e1cb1bcd3dd8473d2fdeecc9c7ff3d6192b 36944be6be5c42096f5da84187ff203af26b08ae -R e122a5b19a6af1a9b03b2065c0a3a3fe +P c27cd8a8127b81d3176f6a5b9915c9b3c69574fb +R 4de702ec2e06c17a2db8893398d4255a U drh -Z 5f2d809963b79f73c941be08881302f0 +Z f4b6e6ab3f6bbd45ad65d1c563858923 diff --git a/manifest.uuid b/manifest.uuid index 34459e334c..917453ab54 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c27cd8a8127b81d3176f6a5b9915c9b3c69574fb \ No newline at end of file +f778f58ae4ea3e16f51b94591a2c1e563dcb0cde \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6497d39cf9..3bb0ca03f1 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3660,6 +3660,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); } +#ifdef SQLITE_DEBUG /* The AFFINITY() function evaluates to a string that describes ** the type affinity of the argument. This is used for testing of ** the SQLite type logic. @@ -3673,6 +3674,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ aff ? azAff[aff-SQLITE_AFF_BLOB] : "none"); return target; } +#endif for(i=0; ia[i].pExpr) ){ diff --git a/src/func.c b/src/func.c index e156e2c9d3..885725bc6b 100644 --- a/src/func.c +++ b/src/func.c @@ -1775,7 +1775,9 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), +#ifdef SQLITE_DEBUG FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY), +#endif FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), FUNCTION(rtrim, 1, 2, 0, trimFunc ),