diff options
author | dan <Dan Kennedy> | 2022-07-05 17:49:04 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2022-07-05 17:49:04 +0000 |
commit | c578e4f0eb6a99b52c710d21afbe722c746a821a (patch) | |
tree | 2a7cf8f616673eab539d802fcc07094519705ca5 | |
parent | 48cae1320b49473787284ace2c543d1fd9332787 (diff) | |
download | sqlite-c578e4f0eb6a99b52c710d21afbe722c746a821a.tar.gz sqlite-c578e4f0eb6a99b52c710d21afbe722c746a821a.zip |
Fix a problem in the csv extension that was triggered when the very first field in the csv file is zero bytes in size.
FossilOrigin-Name: b12ddabf07b5e06bcee8dda3f990af3a131ab52b8fa969ba061b26d38458f31d
-rw-r--r-- | ext/misc/csv.c | 7 | ||||
-rw-r--r-- | manifest | 16 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-rw-r--r-- | test/csv01.test | 22 |
4 files changed, 38 insertions, 9 deletions
diff --git a/ext/misc/csv.c b/ext/misc/csv.c index b51fbad30..915c1cef8 100644 --- a/ext/misc/csv.c +++ b/ext/misc/csv.c @@ -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 ); @@ -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. diff --git a/manifest.uuid b/manifest.uuid index c0e86076d..8e715685d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4774938134d0105423720bdc1b4e82164a1e28d993c5cd81c1b03f1f0878427e
\ No newline at end of file +b12ddabf07b5e06bcee8dda3f990af3a131ab52b8fa969ba061b26d38458f31d
\ No newline at end of file diff --git a/test/csv01.test b/test/csv01.test index 9ba04206b..288260661 100644 --- a/test/csv01.test +++ b/test/csv01.test @@ -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 |