]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge updates from trunk.
authormistachkin <mistachkin@noemail.net>
Thu, 24 Jul 2014 22:13:12 +0000 (22:13 +0000)
committermistachkin <mistachkin@noemail.net>
Thu, 24 Jul 2014 22:13:12 +0000 (22:13 +0000)
FossilOrigin-Name: 8dc0cdf652f099d464d3de416dffd83efb895009

1  2 
manifest
manifest.uuid
src/shell.c
test/shell1.test
test/shell5.test

diff --cc manifest
index 2bcc380e41418260eb6050653218cd1b97b28b15,c9c66de972c22693a9b618eedcf7b6383473fb60..0a878d2dde7bfb3a41825a514ad5f18c344822fc
+++ 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 7ba436b0177cd57ae0aad331ef4bc593605cdbbc,c704a64b44925d6691f5df80ab4d249f103166c9..3cf998f636680814a04a9de43429bb0dccf38ace
@@@ -1,1 -1,1 +1,1 @@@
- 7fe601ead0d0ae26cb09d0dbc7d6367785376567
 -fb1048cb2b613a0dbfe625a5df05e9dcd736a433
++8dc0cdf652f099d464d3de416dffd83efb895009
diff --cc src/shell.c
index bae22d56a692ae5af3060f38d27ac83141da9769,371efa024e0cfbb2d457385daf55075b770fb7d5..55b41662eaa4338d35cc384302d294214d0c5d6a
@@@ -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.
 +/*
- #define SEP_Line      "\n"
- #define SEP_Column    "\x1F"
- #define SEP_Row       "\x1E"
++** These are the column/row/line separators used by the various
++** import/export modes.
 +*/
++#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; i<nArg; i++){
            output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
          }
-         fprintf(p->out, "%s", p->rowSeparator);
 -        fprintf(p->out,"%s",p->newline);
++        fprintf(p->out, "%s", p->newline);
        }
-       if( azArg==0 ) break;
-       for(i=0; i<nArg; i++){
-         output_csv(p, azArg[i], i<nArg-1);
+       if( azArg>0 ){
+         for(i=0; i<nArg; i++){
+           output_csv(p, azArg[i], i<nArg-1);
+         }
 -        fprintf(p->out,"%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");
-       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
-       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 +    }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
 +      p->mode = MODE_Ascii;
++      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
    }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
  
        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));
index 9c7190e007502714d23289e0c3d40222c772152f,ab382e74cbe052807a24606e67291781e2a36f97..0a0d0e3a16c546f2cdccf6c038ea46152bf66f20
@@@ -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 {}}
index 4e11e8798b0d9f174385877fbd724d53967a0371,8d740cb980efaf3a2e6e5b6d15d579ff8f190a72..7c28d0bcd853691ebcbedff6f6f151305acba838
@@@ -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.