1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-01 06:27:03 +03:00

Add the %z format to the sqlite_mprintf() and related functions. (CVS 1028)

FossilOrigin-Name: eca1398eaac67d772aff2676a470d9a6d96a93ca
This commit is contained in:
drh
2003-06-16 03:08:18 +00:00
parent 3fc673e622
commit d93d8a812e
5 changed files with 53 additions and 13 deletions

View File

@ -1,5 +1,5 @@
C Do\snot\sflatten\sa\ssubquery\swhich\sis\sthe\sright\sterm\sof\sa\sLEFT\sOUTER\sJOIN\nif\sthe\ssubquery\scontains\sa\sWHERE\sclause.\s\sTicket\s#350.\s(CVS\s1027) C Add\sthe\s%z\sformat\sto\sthe\ssqlite_mprintf()\sand\srelated\sfunctions.\s(CVS\s1028)
D 2003-06-16T00:40:35 D 2003-06-16T03:08:19
F Makefile.in 9ad23ed4ca97f9670c4496432e3fbd4b3760ebde F Makefile.in 9ad23ed4ca97f9670c4496432e3fbd4b3760ebde
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@ -41,7 +41,7 @@ F src/pager.c 6c50e8dc861bb08f8c52b1fe9aabef6554d61c95
F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31 F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31
F src/parse.y 917250e5d86bdee752355e6617ea2e8ee12438bf F src/parse.y 917250e5d86bdee752355e6617ea2e8ee12438bf
F src/pragma.c 3b4f5a800e7a2145bc1930f323232e297d4eb782 F src/pragma.c 3b4f5a800e7a2145bc1930f323232e297d4eb782
F src/printf.c 12ab57e638c8201033c96717df7af59e06933314 F src/printf.c 12e45d482ac8abcc6f786fc99e5bed7dd9a51af0
F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
F src/select.c 29c53228a4e66bfcebd797b7539678fcd0e2cf64 F src/select.c 29c53228a4e66bfcebd797b7539678fcd0e2cf64
F src/shell.c 3ed268908fd69c8fd4b28dbe415075cbf0e3991a F src/shell.c 3ed268908fd69c8fd4b28dbe415075cbf0e3991a
@ -50,7 +50,7 @@ F src/sqlite.h.in 54619fa5df4c83b22def66bb3d24808fd03dcbae
F src/sqliteInt.h d1d883d9116dadf63ffe1bafe17ba6455b7db59e F src/sqliteInt.h d1d883d9116dadf63ffe1bafe17ba6455b7db59e
F src/table.c 4301926464d88d2c2c7cd21c3360aa75bf068b95 F src/table.c 4301926464d88d2c2c7cd21c3360aa75bf068b95
F src/tclsqlite.c d6860dcd56348b9521726280b72c412d2a33ae97 F src/tclsqlite.c d6860dcd56348b9521726280b72c412d2a33ae97
F src/test1.c 4596acd9d9f2a49fda0160a8a6dee5bfc7c6c325 F src/test1.c b9cfee0bd97d0ade63a3ce76e910b444fb32dce2
F src/test2.c 5014337d8576b731cce5b5a14bec4f0daf432700 F src/test2.c 5014337d8576b731cce5b5a14bec4f0daf432700
F src/test3.c 30985ebdfaf3ee1462a9b0652d3efbdc8d9798f5 F src/test3.c 30985ebdfaf3ee1462a9b0652d3efbdc8d9798f5
F src/threadtest.c d641a5219e718e18a1a80a50eb9bb549f451f42e F src/threadtest.c d641a5219e718e18a1a80a50eb9bb549f451f42e
@ -101,7 +101,7 @@ F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
F test/null.test 5c2b57307e4b6178aae825eb65ddbee01e76b0fd F test/null.test 5c2b57307e4b6178aae825eb65ddbee01e76b0fd
F test/pager.test dd31da9bee94a82e2e87e58cf286cfe809f8fc5f F test/pager.test dd31da9bee94a82e2e87e58cf286cfe809f8fc5f
F test/pragma.test 4c707a6f7d3cbf72d46ed9d9eb0e1ea6e42dc3e4 F test/pragma.test 4c707a6f7d3cbf72d46ed9d9eb0e1ea6e42dc3e4
F test/printf.test a29b8afa24edb4411adfe473b12ac32c84098fce F test/printf.test 3ed02f1361402c0767492cd5cef4650e61df8308
F test/quick.test c527bdb899b12a8cd8ceecce45f72922099f4095 F test/quick.test c527bdb899b12a8cd8ceecce45f72922099f4095
F test/quote.test 08f23385c685d3dc7914ec760d492cacea7f6e3d F test/quote.test 08f23385c685d3dc7914ec760d492cacea7f6e3d
F test/rowid.test e4d6d619d8699a1fa5a48f3f78db39985bd47ebb F test/rowid.test e4d6d619d8699a1fa5a48f3f78db39985bd47ebb
@ -165,7 +165,7 @@ F www/speed.tcl 296cc5632d069b56d3ef5409ca0df90f486c10fb
F www/sqlite.tcl 4bd1729e320f5fa9125f0022b281fbe839192125 F www/sqlite.tcl 4bd1729e320f5fa9125f0022b281fbe839192125
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
F www/vdbe.tcl 14fdcc7fe8a60a6ba8584903636db8dc37eef26a F www/vdbe.tcl 14fdcc7fe8a60a6ba8584903636db8dc37eef26a
P bcf5eeecdfd9897bc7c257119d7515fd34d222c1 P dd8943e8583cf7ed3b662570a5607856fd246dac
R ffe0cc5608b1ae6c3500625d1dc9cf93 R 284605941d0d05dd0b8d73646e11aab9
U drh U drh
Z d81db5180d17921ff4a8ae510148f465 Z 92bf3faa2c4ab75022c55b293d1689d3

View File

@ -1 +1 @@
dd8943e8583cf7ed3b662570a5607856fd246dac eca1398eaac67d772aff2676a470d9a6d96a93ca

View File

@ -66,6 +66,7 @@ enum et_type { /* The type of the format field */
etGENERIC, /* Floating or exponential, depending on exponent. %g */ etGENERIC, /* Floating or exponential, depending on exponent. %g */
etSIZE, /* Return number of characters processed so far. %n */ etSIZE, /* Return number of characters processed so far. %n */
etSTRING, /* Strings. %s */ etSTRING, /* Strings. %s */
etDYNSTRING, /* Dynamically allocated strings. %z */
etPERCENT, /* Percent symbol. %% */ etPERCENT, /* Percent symbol. %% */
etCHARX, /* Characters. %c */ etCHARX, /* Characters. %c */
etERROR, /* Used to indicate no such conversion type */ etERROR, /* Used to indicate no such conversion type */
@ -97,6 +98,7 @@ typedef struct et_info { /* Information about each format field */
static et_info fmtinfo[] = { static et_info fmtinfo[] = {
{ 'd', 10, "0123456789", 1, 0, etRADIX, }, { 'd', 10, "0123456789", 1, 0, etRADIX, },
{ 's', 0, 0, 0, 0, etSTRING, }, { 's', 0, 0, 0, 0, etSTRING, },
{ 'z', 0, 0, 0, 0, etDYNSTRING, },
{ 'q', 0, 0, 0, 0, etSQLESCAPE, }, { 'q', 0, 0, 0, 0, etSQLESCAPE, },
{ 'Q', 0, 0, 0, 0, etSQLESCAPE2, }, { 'Q', 0, 0, 0, 0, etSQLESCAPE2, },
{ 'c', 0, 0, 0, 0, etCHARX, }, { 'c', 0, 0, 0, 0, etCHARX, },
@ -549,8 +551,13 @@ static int vxprintf(
bufpt = buf; bufpt = buf;
break; break;
case etSTRING: case etSTRING:
case etDYNSTRING:
bufpt = va_arg(ap,char*); bufpt = va_arg(ap,char*);
if( bufpt==0 ) bufpt = "(null)"; if( bufpt==0 ){
bufpt = "";
}else if( xtype==etDYNSTRING ){
zExtra = bufpt;
}
length = strlen(bufpt); length = strlen(bufpt);
if( precision>=0 && precision<length ) length = precision; if( precision>=0 && precision<length ) length = precision;
break; break;
@ -632,7 +639,11 @@ static int vxprintf(
} }
} }
if( zExtra ){ if( zExtra ){
sqliteFree(zExtra); if( xtype==etDYNSTRING ){
free(zExtra);
}else{
sqliteFree(zExtra);
}
} }
}/* End for loop over the format string */ }/* End for loop over the format string */
return errorflag ? -1 : count; return errorflag ? -1 : count;

View File

@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated ** is not included in the SQLite library. It is used for automated
** testing of the SQLite library. ** testing of the SQLite library.
** **
** $Id: test1.c,v 1.24 2003/04/26 13:19:39 drh Exp $ ** $Id: test1.c,v 1.25 2003/06/16 03:08:19 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include "tcl.h" #include "tcl.h"
@ -161,6 +161,30 @@ static int test_exec_printf(
return TCL_OK; return TCL_OK;
} }
/*
** Usage: sqlite_mprintf_z_test SEPARATOR ARG0 ARG1 ...
**
** Test the %z format of mprintf(). Use multiple mprintf() calls to
** concatenate arg0 through argn using separator as the separator.
** Return the result.
*/
static int test_mprintf_z(
void *NotUsed,
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
int argc, /* Number of arguments */
char **argv /* Text of each argument */
){
char *zResult = 0;
int i;
for(i=2; i<argc; i++){
zResult = sqlite_mprintf("%z%s%s", zResult, argv[1], argv[i]);
}
Tcl_AppendResult(interp, zResult, 0);
sqlite_freemem(zResult);
return TCL_OK;
}
/* /*
** Usage: sqlite_get_table_printf DB FORMAT STRING ** Usage: sqlite_get_table_printf DB FORMAT STRING
** **
@ -779,6 +803,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite_mprintf_int", (Tcl_CmdProc*)sqlite_mprintf_int }, { "sqlite_mprintf_int", (Tcl_CmdProc*)sqlite_mprintf_int },
{ "sqlite_mprintf_str", (Tcl_CmdProc*)sqlite_mprintf_str }, { "sqlite_mprintf_str", (Tcl_CmdProc*)sqlite_mprintf_str },
{ "sqlite_mprintf_double", (Tcl_CmdProc*)sqlite_mprintf_double }, { "sqlite_mprintf_double", (Tcl_CmdProc*)sqlite_mprintf_double },
{ "sqlite_mprintf_z_test", (Tcl_CmdProc*)test_mprintf_z },
{ "sqlite_open", (Tcl_CmdProc*)sqlite_test_open }, { "sqlite_open", (Tcl_CmdProc*)sqlite_test_open },
{ "sqlite_last_insert_rowid", (Tcl_CmdProc*)test_last_rowid }, { "sqlite_last_insert_rowid", (Tcl_CmdProc*)test_last_rowid },
{ "sqlite_exec_printf", (Tcl_CmdProc*)test_exec_printf }, { "sqlite_exec_printf", (Tcl_CmdProc*)test_exec_printf },

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing the sqlite_*_printf() interface. # focus of this file is testing the sqlite_*_printf() interface.
# #
# $Id: printf.test,v 1.5 2002/06/16 04:56:37 chw Exp $ # $Id: printf.test,v 1.6 2003/06/16 03:08:19 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@ -111,4 +111,8 @@ do_test printf-5.3 {
sqlite_mprintf_str {%% %d %d (%=10s)} 5 6 Hello sqlite_mprintf_str {%% %d %d (%=10s)} 5 6 Hello
} {% 5 6 ( Hello )} } {% 5 6 ( Hello )}
do_test printf-6.1 {
sqlite_mprintf_z_test , one two three four five six
} {,one,two,three,four,five,six}
finish_test finish_test