diff options
author | stephan <stephan@noemail.net> | 2022-07-20 10:09:19 +0000 |
---|---|---|
committer | stephan <stephan@noemail.net> | 2022-07-20 10:09:19 +0000 |
commit | 4b5919e2ced99d8df9d0795ca741408cfee6c993 (patch) | |
tree | e624334835b255a5a13ac89ddc576b9347b1e760 /ext/misc/csv.c | |
parent | bc7180cdb362b0069fed60b0c207533122cc5ec2 (diff) | |
parent | a5cc692422afa7fad710a4459139d7ba00346b21 (diff) | |
download | sqlite-4b5919e2ced99d8df9d0795ca741408cfee6c993.tar.gz sqlite-4b5919e2ced99d8df9d0795ca741408cfee6c993.zip |
Merged in trunk.
FossilOrigin-Name: d662796c658997be13fdc3b77ad97101b9513da53fd0b824d7a4050cac3f7eba
Diffstat (limited to 'ext/misc/csv.c')
-rw-r--r-- | ext/misc/csv.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/ext/misc/csv.c b/ext/misc/csv.c index b51fbad30..870a0cf60 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; @@ -750,7 +751,7 @@ static int csvtabNext(sqlite3_vtab_cursor *cur){ i++; } }while( pCur->rdr.cTerm==',' ); - if( z==0 || (pCur->rdr.cTerm==EOF && i<pTab->nCol) ){ + if( z==0 && i==0 ){ pCur->iRowid = -1; }else{ pCur->iRowid++; @@ -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 ); |