From: mistachkin Date: Thu, 24 Jul 2014 22:13:12 +0000 (+0000) Subject: Merge updates from trunk. X-Git-Tag: version-3.8.8~17^2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fad4208f2f09afc67802917a3c41066586d91d3d;p=thirdparty%2Fsqlite.git Merge updates from trunk. FossilOrigin-Name: 8dc0cdf652f099d464d3de416dffd83efb895009 --- fad4208f2f09afc67802917a3c41066586d91d3d diff --cc manifest index 2bcc380e41,c9c66de972..0a878d2dde --- a/manifest +++ b/manifest @@@ -1,5 -1,5 +1,5 @@@ - C Add\snew\sASCII\smode\sto\sthe\sshell\scapable\sof\simporting\sand\sexporting\susing\sthe\sofficial\sunit\sand\srecord\sseparators\s(i.e.\s0x1F\sand\s0x1E,\srespectively). - D 2014-07-19T20:15:16.631 -C Add\sthe\sreadfile(FILENAME)\sand\swritefile(FILENAME,CONTENT)\sSQL\sfunctions\sto\nthe\scommand-line\sshell. -D 2014-07-24T12:39:59.049 ++C Merge\supdates\sfrom\strunk. ++D 2014-07-24T22:13:12.489 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@@ -223,11 -223,11 +223,11 @@@ F src/random.c d10c1f85b6709ca97278428f F src/resolve.c 5fc110baeacf120a73fe34e103f052632ff11a02 F src/rowset.c a9c9aae3234b44a6d7c6f5a3cadf90dce1e627be F src/select.c 6762c62e11b504aa014edceab8886495165e3a77 - F src/shell.c f1524cdcf12af7eeff98c7846518ce5424d38d60 - F src/sqlite.h.in fd8e3a36b0aded082dc93a4b89c1e85324b4cf75 -F src/shell.c 191129c3f7a9cf241aea90ff6a6be3e74d3767f0 ++F src/shell.c 3af679cad9c2e7caf7f8b997fb543afbc76d7c13 + F src/sqlite.h.in ac4451c9da2771d2f4d702ef89722407242906d9 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc - F src/sqliteInt.h e88614d7371b80ff69dbbb5e4b9813ee93dfd890 + F src/sqliteInt.h 152134c6223369e2e1acb7b9cc2c0db052dae28a F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@@ -818,11 -820,11 +820,11 @@@ F test/shared9.test 5f2a8f79b4d6c7d107a F test/sharedA.test 0cdf1a76dfa00e6beee66af5b534b1e8df2720f5 F test/shared_err.test 0079c05c97d88cfa03989b7c20a8b266983087aa F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 - F test/shell1.test 4e4f8e6be18384f0bde93acc01947d7217e81774 -F test/shell1.test d60946b5fde4d85fe06db7331dfe89011f564350 ++F test/shell1.test d13ff516e3fcd4061bd072f56fd1551f2bf7fe52 F test/shell2.test c57da3a381c099b02c813ba156298d5c2f5c93a3 F test/shell3.test 5e8545ec72c4413a0e8d4c6be56496e3c257ca29 F test/shell4.test 8a9c08976291e6c6c808b4d718f4a8b299f339f5 - F test/shell5.test 3c9264ddf171d778d7d93bda5eea0bafe8a65069 -F test/shell5.test 15a419cc1df21c892ed64f5596ae7a501f2816f2 ++F test/shell5.test 7dbc03751ceda1e5ce75553dff735a7ef0dea15c F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868 @@@ -1182,10 -1184,7 +1184,7 @@@ F tool/vdbe_profile.tcl 67746953071a9f8 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f - P 61cee3c0678f5abd9131a29ab946a5e71f55643e - R 2620c0e44150895c6e6dda7db94cda7b - T *branch * asciiMode - T *sym-asciiMode * - T -sym-trunk * -P f8f79f28785db716b10c3bc9d6652b98253fd125 -R 3cb7c1591be4171f813333f040f9142c -U drh -Z d6bf09c8f21a2381ecdf6b5a91f85057 ++P 7fe601ead0d0ae26cb09d0dbc7d6367785376567 fb1048cb2b613a0dbfe625a5df05e9dcd736a433 ++R 551b1710cff332eae579e1d24ac340a5 +U mistachkin - Z 0122ab3028becc4213d4d02208439f07 ++Z 5a827010d4d8351c000cbf9e79de9417 diff --cc manifest.uuid index 7ba436b017,c704a64b44..3cf998f636 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - 7fe601ead0d0ae26cb09d0dbc7d6367785376567 -fb1048cb2b613a0dbfe625a5df05e9dcd736a433 ++8dc0cdf652f099d464d3de416dffd83efb895009 diff --cc src/shell.c index bae22d56a6,371efa024e..55b41662ea --- a/src/shell.c +++ b/src/shell.c @@@ -457,8 -458,8 +458,9 @@@ struct callback_data int writableSchema; /* True if PRAGMA writable_schema=ON */ int showHeader; /* True to show column names in List or Column mode */ char *zDestTable; /* Name of destination table when MODE_Insert */ - char separator[20]; /* Separator character for MODE_List */ + char colSeparator[20]; /* Column separator character for several modes */ + char rowSeparator[20]; /* Row separator character for MODE_Ascii */ + char newline[20]; /* Record separator in MODE_Csv */ int colWidth[100]; /* Requested width of each column when in column mode*/ int actualWidth[100]; /* Actual width of each column */ char nullvalue[20]; /* The text to print when a NULL comes back from @@@ -501,16 -501,8 +503,22 @@@ static const char *modeDescr[] = "tcl", "csv", "explain", + "ascii", }; +/* - ** These are the column/row separators used by the ASCII mode. ++** These are the column/row/line separators used by the various ++** import/export modes. +*/ - #define SEP_Line "\n" - #define SEP_Column "\x1F" - #define SEP_Row "\x1E" ++#define SEP_Column "|" ++#define SEP_Row "\n" ++#define SEP_Tab "\t" ++#define SEP_Space " " ++#define SEP_Comma "," ++#define SEP_CrLf "\r\n" ++#define SEP_Unit "\x1F" ++#define SEP_Record "\x1E" + /* ** Number of elements in an array */ @@@ -874,13 -866,18 +887,18 @@@ static int shell_callback(void *pArg, i for(i=0; iout, "%s", p->rowSeparator); - fprintf(p->out,"%s",p->newline); ++ fprintf(p->out, "%s", p->newline); } - if( azArg==0 ) break; - for(i=0; i0 ){ + for(i=0; iout,"%s",p->newline); ++ fprintf(p->out, "%s", p->newline); } - fprintf(p->out, "%s", p->rowSeparator); + #if defined(WIN32) || defined(_WIN32) + fflush(p->out); + _setmode(_fileno(p->out), _O_TEXT); + #endif break; } case MODE_Insert: { @@@ -1653,7 -1631,8 +1671,8 @@@ static char zHelp[] ".schema ?TABLE? Show the CREATE statements\n" " If TABLE specified, only show tables matching\n" " LIKE pattern TABLE.\n" - ".separator STRING Change column separator for output mode and .import\n" - ".separator STRING ?NL? Change separator used by output mode and .import\n" ++ ".separator STRING ?NL? Change column separator for output mode and .import\n" + " NL is the end-of-line mark for CSV\n" ".shell CMD ARGS... Run CMD ARGS... in a system shell\n" ".show Show the current values for various settings\n" ".stats on|off Turn stats on or off\n" @@@ -2846,26 -2827,20 +2932,27 @@@ static int do_meta_command(char *zLine p->mode = MODE_Html; }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ p->mode = MODE_Tcl; - sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, " "); - sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Line); - sqlite3_snprintf(sizeof(p->separator), p->separator, " "); ++ sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); ++ sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ p->mode = MODE_Csv; - sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, ","); - sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Line); - sqlite3_snprintf(sizeof(p->separator), p->separator, ","); - sqlite3_snprintf(sizeof(p->newline), p->newline, "\r\n"); ++ sqlite3_snprintf(sizeof(p->newline), p->newline, SEP_CrLf); ++ sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); ++ sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ p->mode = MODE_List; - sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, "\t"); - sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Line); - sqlite3_snprintf(sizeof(p->separator), p->separator, "\t"); ++ sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); ++ sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ p->mode = MODE_Insert; set_table_name(p, nArg>=3 ? azArg[2] : "table"); + }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ + p->mode = MODE_Ascii; - sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); - sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); ++ sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); ++ sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); }else { fprintf(stderr,"Error: mode should be one of: " - "column csv html insert line list tabs tcl\n"); + "ascii column csv html insert line list tabs tcl\n"); rc = 1; } }else @@@ -3134,33 -3109,16 +3221,38 @@@ }else #endif + if( c=='r' && strncmp(azArg[0], "rowseparator", n)==0 ){ + if( nArg==2 ){ + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, + "%.*s", (int)sizeof(p->rowSeparator)-1, azArg[1]); + }else{ + fprintf(stderr, "Usage: .rowseparator STRING\n"); + rc = 1; + } + }else + + if( c=='c' && strncmp(azArg[0], "colseparator", n)==0 ){ + if( nArg==2 ){ + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, + "%.*s", (int)sizeof(p->colSeparator)-1, azArg[1]); + }else{ + fprintf(stderr, "Usage: .colseparator STRING\n"); + rc = 1; + } + }else + if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ - if( nArg==2 ){ + if( nArg<2 || nArg>3 ){ + fprintf(stderr, "Usage: .separator SEPARATOR ?NEWLINE?\n"); + rc = 1; + } + if( nArg>=2 ){ - sqlite3_snprintf(sizeof(p->separator), p->separator, azArg[1]); + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, + "%.*s", (int)sizeof(p->colSeparator)-1, azArg[1]); - }else{ - fprintf(stderr, "Usage: .separator STRING\n"); - rc = 1; + } + if( nArg>=3 ){ - sqlite3_snprintf(sizeof(p->newline), p->newline, azArg[2]); ++ sqlite3_snprintf(sizeof(p->newline), p->newline, ++ "%.*s", (int)sizeof(p->newline)-1, azArg[2]); } }else @@@ -3190,24 -3148,23 +3282,27 @@@ rc = 1; goto meta_command_exit; } - fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); - fprintf(p->out,"%9.9s: %s\n","eqp", p->autoEQP ? "on" : "off"); - fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); - fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); - fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); - fprintf(p->out,"%9.9s: ", "nullvalue"); + fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off"); + fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off"); + fprintf(p->out,"%12.12s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); + fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off"); + fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]); + fprintf(p->out,"%12.12s: ", "nullvalue"); output_c_string(p->out, p->nullvalue); fprintf(p->out, "\n"); - fprintf(p->out,"%9.9s: %s\n","output", + fprintf(p->out,"%12.12s: %s\n","output", strlen30(p->outfile) ? p->outfile : "stdout"); - fprintf(p->out,"%9.9s: ", "separator"); - output_c_string(p->out, p->separator); - fprintf(p->out," "); + fprintf(p->out,"%12.12s: ", "colseparator"); + output_c_string(p->out, p->colSeparator); + fprintf(p->out, "\n"); + fprintf(p->out,"%12.12s: ", "rowseparator"); + output_c_string(p->out, p->rowSeparator); + fprintf(p->out, "\n"); ++ fprintf(p->out,"%12.12s: ", "newline"); + output_c_string(p->out, p->newline); + fprintf(p->out, "\n"); - fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off"); - fprintf(p->out,"%9.9s: ","width"); + fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off"); + fprintf(p->out,"%12.12s: ","width"); for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { fprintf(p->out,"%d ",p->colWidth[i]); } @@@ -3823,8 -3778,8 +3918,9 @@@ static const char zOptions[] #ifdef SQLITE_ENABLE_MULTIPLEX " -multiplex enable the multiplexor VFS\n" #endif + " -newline SEP set newline character(s) for CSV\n" " -nullvalue TEXT set text string for NULL values. Default ''\n" + " -rowseparator SEP set output line separator. Default: '\\n'\n" " -separator SEP set output field separator. Default: '|'\n" " -stats print memory stats before each finalize\n" " -version show SQLite version\n" @@@ -3852,8 -3807,8 +3948,9 @@@ static void usage(int showDetail) static void main_init(struct callback_data *data) { memset(data, 0, sizeof(*data)); data->mode = MODE_List; - memcpy(data->colSeparator,"|", 2); - memcpy(data->rowSeparator,"\n", 2); - memcpy(data->separator,"|", 2); - memcpy(data->newline,"\r\n", 3); ++ memcpy(data->colSeparator,SEP_Column, 2); ++ memcpy(data->rowSeparator,SEP_Row, 2); ++ memcpy(data->newline,SEP_CrLf, 3); data->showHeader = 0; sqlite3_config(SQLITE_CONFIG_URI, 1); sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); @@@ -4051,19 -4007,13 +4149,22 @@@ int main(int argc, char **argv) data.mode = MODE_Column; }else if( strcmp(z,"-csv")==0 ){ data.mode = MODE_Csv; - memcpy(data.separator,",",2); - }else if( strcmp(z,"-separator")==0 ){ - sqlite3_snprintf(sizeof(data.separator), data.separator, + memcpy(data.colSeparator,",",2); + }else if( strcmp(z,"-ascii")==0 ){ + data.mode = MODE_Ascii; + sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, - SEP_Column); ++ SEP_Unit); + sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, - SEP_Row); ++ SEP_Record); + }else if( strcmp(z,"-separator")==0 || strcmp(z,"-colseparator")==0 ){ + sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, + "%s",cmdline_option_value(argc,argv,++i)); + }else if( strcmp(z,"-rowseparator")==0 ){ + sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, "%s",cmdline_option_value(argc,argv,++i)); + }else if( strcmp(z,"-newline")==0 ){ + sqlite3_snprintf(sizeof(data.newline), data.newline, + "%s",cmdline_option_value(argc,argv,++i)); }else if( strcmp(z,"-nullvalue")==0 ){ sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue, "%s",cmdline_option_value(argc,argv,++i)); diff --cc test/shell1.test index 9c7190e007,ab382e74cb..0a0d0e3a16 --- a/test/shell1.test +++ b/test/shell1.test @@@ -586,10 -585,10 +586,10 @@@ CREATE VIEW v2 AS SELECT x+1 AS y FROM CREATE VIEW v1 AS SELECT y+1 FROM v2;}} db eval {DROP VIEW v1; DROP VIEW v2; DROP TABLE t1;} -# .separator STRING Change separator used by output mode and .import +# .separator STRING Change column separator used by output and .import do_test shell1-3.22.1 { catchcmd "test.db" ".separator" - } {1 {Usage: .separator STRING}} + } {1 {Usage: .separator SEPARATOR ?NEWLINE?}} do_test shell1-3.22.2 { catchcmd "test.db" ".separator FOO" } {0 {}} diff --cc test/shell5.test index 4e11e8798b,8d740cb980..7c28d0bcd8 --- a/test/shell5.test +++ b/test/shell5.test @@@ -55,25 -55,22 +55,28 @@@ do_test shell5-1.1.3 # .separator STRING Change separator used by output mode and .import do_test shell5-1.2.1 { catchcmd "test.db" ".separator" - } {1 {Usage: .separator STRING}} + } {1 {Usage: .separator SEPARATOR ?NEWLINE?}} do_test shell5-1.2.2 { - catchcmd "test.db" ".separator FOO" + catchcmd "test.db" ".separator ONE" } {0 {}} do_test shell5-1.2.3 { + catchcmd "test.db" ".separator ONE TWO" + } {0 {}} + do_test shell5-1.2.4 { # too many arguments - catchcmd "test.db" ".separator FOO BAD" - } {1 {Usage: .separator STRING}} + catchcmd "test.db" ".separator ONE TWO THREE" + } {1 {Usage: .separator SEPARATOR ?NEWLINE?}} -# separator should default to "|" -do_test shell5-1.3.1 { +# column separator should default to "|" +do_test shell5-1.3.1.1 { set res [catchcmd "test.db" ".show"] - list [regexp {separator: \"\|\"} $res] + list [regexp {colseparator: \"\|\"} $res] +} {1} + +# row separator should default to "\n" +do_test shell5-1.3.1.2 { + set res [catchcmd "test.db" ".show"] + list [regexp {rowseparator: \"\\n\"} $res] } {1} # set separator to different value.