mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Enhance the %q, %Q, and %w printf conversions so that the precisions
specifies the length of the input. FossilOrigin-Name: 3ba773132d3baeb87acaee538b8fb0b0f4293673
This commit is contained in:
20
manifest
20
manifest
@ -1,8 +1,8 @@
|
|||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
Hash: SHA1
|
Hash: SHA1
|
||||||
|
|
||||||
C Fix\sa\stracing\smacro\sin\sthe\sVDBE\sin\sthe\sVColumn\sopcode.
|
C Enhance\sthe\s%q,\s%Q,\sand\s%w\sprintf\sconversions\sso\sthat\sthe\sprecisions\s\nspecifies\sthe\slength\sof\sthe\sinput.
|
||||||
D 2009-11-24T16:26:17
|
D 2009-11-25T16:53:38
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in 7f6c6aa7feeeb5e26e01b344161d9aa1b5d64177
|
F Makefile.in 7f6c6aa7feeeb5e26e01b344161d9aa1b5d64177
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@ -161,7 +161,7 @@ F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
|
|||||||
F src/pcache1.c 2bb2261190b42a348038f5b1c285c8cef415fcc8
|
F src/pcache1.c 2bb2261190b42a348038f5b1c285c8cef415fcc8
|
||||||
F src/pragma.c 6936d7df5e04b9f996f8f320d15e65b6944b2caa
|
F src/pragma.c 6936d7df5e04b9f996f8f320d15e65b6944b2caa
|
||||||
F src/prepare.c ad90970bba3aead154266d8bb6faf9fbb5233b94
|
F src/prepare.c ad90970bba3aead154266d8bb6faf9fbb5233b94
|
||||||
F src/printf.c 03fabdd6112a0e23f78f8ac9a1396947ade0273b
|
F src/printf.c 51c3b010c6f1bd8bb07d7ea84147eb8f63ce1238
|
||||||
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
|
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
|
||||||
F src/resolve.c c52d9e52e11058f4113f6644adc20d3f85141b1d
|
F src/resolve.c c52d9e52e11058f4113f6644adc20d3f85141b1d
|
||||||
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
||||||
@ -520,7 +520,7 @@ F test/pcache2.test 0d85f2ab6963aee28c671d4c71bec038c00a1d16
|
|||||||
F test/permutations.test 1ce2874df8fec876d0b963c7a3ef61c4e9df8827
|
F test/permutations.test 1ce2874df8fec876d0b963c7a3ef61c4e9df8827
|
||||||
F test/pragma.test 5aeb48a442dba3c3e8e38773b121371814ab3b17
|
F test/pragma.test 5aeb48a442dba3c3e8e38773b121371814ab3b17
|
||||||
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
|
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
|
||||||
F test/printf.test 47e9e5bbec8509023479d54ceb71c9d05a95308a
|
F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
|
||||||
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
|
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
|
||||||
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
||||||
F test/quick.test 12fdc7656b4d20a537a686fb223eb99b5fe54483
|
F test/quick.test 12fdc7656b4d20a537a686fb223eb99b5fe54483
|
||||||
@ -776,14 +776,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 02ef972a56aab1e61786000283193165d3968842
|
P cb74b81bb0322efdd66146d7de466c14564b18fd
|
||||||
R 906efa28fc9f004f544fa83f98fdcd2f
|
R d2fd7cc9116d60ea3bf83caab579713e
|
||||||
U drh
|
U drh
|
||||||
Z 2d2b583acdac8f54f65dc7650540653b
|
Z bb155b9f1ed8f5cc73b48ffe4ac5abca
|
||||||
-----BEGIN PGP SIGNATURE-----
|
-----BEGIN PGP SIGNATURE-----
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||||
|
|
||||||
iD8DBQFLDAksoxKgR168RlERAhoZAJ4s2MG81bz6MXkHnY2NUGswNrmvawCfdWH6
|
iD8DBQFLDWEVoxKgR168RlERAjrAAKCB/VKRKhYLK3n+HL8zd1duNxwkxQCfbc2N
|
||||||
NQdetJi/ySSQPEc42bDGVps=
|
c9b72fb+mD/lcn1IAqU+NZQ=
|
||||||
=OmlQ
|
=Av30
|
||||||
-----END PGP SIGNATURE-----
|
-----END PGP SIGNATURE-----
|
||||||
|
@ -1 +1 @@
|
|||||||
cb74b81bb0322efdd66146d7de466c14564b18fd
|
3ba773132d3baeb87acaee538b8fb0b0f4293673
|
15
src/printf.c
15
src/printf.c
@ -645,14 +645,15 @@ void sqlite3VXPrintf(
|
|||||||
case etSQLESCAPE:
|
case etSQLESCAPE:
|
||||||
case etSQLESCAPE2:
|
case etSQLESCAPE2:
|
||||||
case etSQLESCAPE3: {
|
case etSQLESCAPE3: {
|
||||||
int i, j, n, isnull;
|
int i, j, k, n, isnull;
|
||||||
int needQuote;
|
int needQuote;
|
||||||
char ch;
|
char ch;
|
||||||
char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */
|
char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */
|
||||||
char *escarg = va_arg(ap,char*);
|
char *escarg = va_arg(ap,char*);
|
||||||
isnull = escarg==0;
|
isnull = escarg==0;
|
||||||
if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
|
if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
|
||||||
for(i=n=0; (ch=escarg[i])!=0; i++){
|
k = precision;
|
||||||
|
for(i=n=0; (ch=escarg[i])!=0 && k!=0; i++, k--){
|
||||||
if( ch==q ) n++;
|
if( ch==q ) n++;
|
||||||
}
|
}
|
||||||
needQuote = !isnull && xtype==etSQLESCAPE2;
|
needQuote = !isnull && xtype==etSQLESCAPE2;
|
||||||
@ -668,15 +669,17 @@ void sqlite3VXPrintf(
|
|||||||
}
|
}
|
||||||
j = 0;
|
j = 0;
|
||||||
if( needQuote ) bufpt[j++] = q;
|
if( needQuote ) bufpt[j++] = q;
|
||||||
for(i=0; (ch=escarg[i])!=0; i++){
|
k = i;
|
||||||
bufpt[j++] = ch;
|
for(i=0; i<k; i++){
|
||||||
|
bufpt[j++] = ch = escarg[i];
|
||||||
if( ch==q ) bufpt[j++] = ch;
|
if( ch==q ) bufpt[j++] = ch;
|
||||||
}
|
}
|
||||||
if( needQuote ) bufpt[j++] = q;
|
if( needQuote ) bufpt[j++] = q;
|
||||||
bufpt[j] = 0;
|
bufpt[j] = 0;
|
||||||
length = j;
|
length = j;
|
||||||
/* The precision is ignored on %q and %Q */
|
/* The precision in %q and %Q means how many input characters to
|
||||||
/* if( precision>=0 && precision<length ) length = precision; */
|
** consume, not the length of the output...
|
||||||
|
** if( precision>=0 && precision<length ) length = precision; */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case etTOKEN: {
|
case etTOKEN: {
|
||||||
|
@ -3506,6 +3506,43 @@ do_test printf-4.3 {
|
|||||||
do_test printf-4.4 {
|
do_test printf-4.4 {
|
||||||
sqlite3_mprintf_str {%d %d A NULL pointer in %%Q: %Q} 1 2
|
sqlite3_mprintf_str {%d %d A NULL pointer in %%Q: %Q} 1 2
|
||||||
} {1 2 A NULL pointer in %Q: NULL}
|
} {1 2 A NULL pointer in %Q: NULL}
|
||||||
|
do_test printf-4.5 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.10q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y''all'}
|
||||||
|
do_test printf-4.6 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.9q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y''all'}
|
||||||
|
do_test printf-4.7 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.8q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y''all'}
|
||||||
|
do_test printf-4.8 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.7q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y''al'}
|
||||||
|
do_test printf-4.9 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.6q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y''a'}
|
||||||
|
do_test printf-4.10 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.5q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y'''}
|
||||||
|
do_test printf-4.11 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.4q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi Y'}
|
||||||
|
do_test printf-4.12 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.3q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi '}
|
||||||
|
do_test printf-4.13 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.2q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'Hi'}
|
||||||
|
do_test printf-4.14 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.1q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: 'H'}
|
||||||
|
do_test printf-4.15 {
|
||||||
|
sqlite3_mprintf_str {%d %d A quoted string: '%.0q'} 1 2 {Hi Y'all}
|
||||||
|
} {1 2 A quoted string: ''}
|
||||||
|
do_test printf-4.16 {
|
||||||
|
sqlite3_mprintf_str {%d A quoted string: '%.*q'} 1 6 {Hi Y'all}
|
||||||
|
} {1 A quoted string: 'Hi Y''a'}
|
||||||
|
|
||||||
|
|
||||||
do_test printf-5.1 {
|
do_test printf-5.1 {
|
||||||
set x [sqlite3_mprintf_str {%d %d %100000s} 0 0 {Hello}]
|
set x [sqlite3_mprintf_str {%d %d %100000s} 0 0 {Hello}]
|
||||||
|
Reference in New Issue
Block a user