]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem in the csv extension that was triggered when the very first field in...
authordan <Dan Kennedy>
Tue, 5 Jul 2022 17:49:04 +0000 (17:49 +0000)
committerdan <Dan Kennedy>
Tue, 5 Jul 2022 17:49:04 +0000 (17:49 +0000)
FossilOrigin-Name: b12ddabf07b5e06bcee8dda3f990af3a131ab52b8fa969ba061b26d38458f31d

ext/misc/csv.c
manifest
manifest.uuid
test/csv01.test

index b51fbad30e66296c5855c4f4d37a2abb3169cc1b..915c1cef8c31bf19b274d16257295f264d474239 100644 (file)
@@ -280,6 +280,7 @@ static char *csv_read_one_field(CsvReader *p){
     }
     p->cTerm = (char)c;
   }
+  assert( p->z==0 || p->n<p->nAlloc );
   if( p->z ) p->z[p->n] = 0;
   p->bNotFirst = 1;
   return p->z;
@@ -811,6 +812,12 @@ static int csvtabFilter(
   CsvCursor *pCur = (CsvCursor*)pVtabCursor;
   CsvTable *pTab = (CsvTable*)pVtabCursor->pVtab;
   pCur->iRowid = 0;
+
+  /* Ensure the field buffer is always allocated. Otherwise, if the
+  ** first field is zero bytes in size, this may be mistaken for an OOM
+  ** error in csvtabNext(). */
+  if( csv_append(&pCur->rdr, 0) ) return SQLITE_NOMEM;
+
   if( pCur->rdr.in==0 ){
     assert( pCur->rdr.zIn==pTab->zData );
     assert( pTab->iStart>=0 );
index ba0bd535d621f16d41492f7c5eb2e07336ee3142..b55c72b9242c4dacda3194ccd28610af2ee41ae2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sassert()\sin\sbtree\sto\sbe\smore\sprecise,\sas\sthe\sprevious\sform\sof\sthat\nasser\smight\sfail\sdue\sto\srecent\sperformance\soptimizations.
-D 2022-07-05T10:40:30.126
+C Fix\sa\sproblem\sin\sthe\scsv\sextension\sthat\swas\striggered\swhen\sthe\svery\sfirst\sfield\sin\sthe\scsv\sfile\sis\szero\sbytes\sin\ssize.
+D 2022-07-05T17:49:04.076
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -314,7 +314,7 @@ F ext/misc/cksumvfs.c b42ef52eaaa510d54ec320c87bea149e934a3b06cd232be2093562bf66
 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243
 F ext/misc/completion.c 6dafd7f4348eecc7be9e920d4b419d1fb2af75d938cd9c59a20cfe8beb2f22b9
 F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9
-F ext/misc/csv.c d14709096280dc0e20c533f184568952bf4b8022ea80afc4aa9fec5ab3637bb3
+F ext/misc/csv.c ed30e56908a42499e3f167bbc0a2366a2226d020e2f6ef84d0cf8c191686ebd6
 F ext/misc/dbdata.c e316fba936571584e55abd5b974a32a191727a6b746053a0c9d439bd2cf93940
 F ext/misc/dbdump.c b8592f6f2da292c62991a13864a60d6c573c47a9cc58362131b9e6a64f823e01
 F ext/misc/decimal.c 09f967dcf4a1ee35a76309829308ec278d3648168733f4a1147820e11ebefd12
@@ -853,7 +853,7 @@ F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d
 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2
 F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f54140699f5165
 F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c
-F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd
+F test/csv01.test f3c76474e8e4aed7a0008065e4da4ab9fb7967712eb2037c13b478def0227c72
 F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c4773
 F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201
 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f
@@ -1978,8 +1978,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 1a8c2e54375ee2cf73773b798fed0ae07b42f5e068fddc513c093de5c1f46615
-R 2757a3df013fcba9ceda084162d54bbf
-U drh
-Z 1c5dbf09a49cb9834da7c27397ce6fb7
+P 4774938134d0105423720bdc1b4e82164a1e28d993c5cd81c1b03f1f0878427e
+R dfc0f75d3f385da37032208862505139
+U dan
+Z c4ecb4b4b9fc154ab5d210ccd69309f6
 # Remove this line to create a well-formed Fossil manifest.
index c0e86076d8c6290367973b61619f7b7b53ef701e..8e715685d66f67d8acab502b8567cb9b0461a991 100644 (file)
@@ -1 +1 @@
-4774938134d0105423720bdc1b4e82164a1e28d993c5cd81c1b03f1f0878427e
\ No newline at end of file
+b12ddabf07b5e06bcee8dda3f990af3a131ab52b8fa969ba061b26d38458f31d
\ No newline at end of file
index 9ba04206b8bf5fad21ae7dcdaa6d1c2535975dc0..288260661a3073fc57c42b52dd2b6f81f448e221 100644 (file)
@@ -237,4 +237,26 @@ do_execsql_test 5.4 {
   SELECT *, '|' FROM t5_1;
 } {1 2 3 4 | one two three four | 5 6 7 8 |}
 
+#-------------------------------------------------------------------------
+
+proc randomtext {n} {
+  string range [db one {SELECT hex(randomblob($n))}] 1 $n
+}
+
+for {set ii 0} {$ii < 200} {incr ii} {
+  reset_db
+  load_static_extension db csv
+  set fd [open csv.data w]
+  puts $fd "a,b"
+  puts $fd "[randomtext $ii],abcd"
+  close $fd
+  do_execsql_test 6.$ii.1 {
+    CREATE VIRTUAL TABLE abc USING csv(filename='csv.data', header=true);
+  }
+
+  do_execsql_test 6.$ii.2 {
+    SELECT count(*) FROM abc
+  } 1
+}
+
 finish_test