Fossil SCM
For the BUILTIN virtual table, map one-based rowids to zero-based array indices, to fix access to the first entry.
Commit
cf563c721773e652b5108e5e059b82cc15a2a6ed9409fcbae6751e608579de0b
Parent
3b719a961452437…
1 file changed
+2
-2
+2
-2
| --- src/builtin.c | ||
| +++ src/builtin.c | ||
| @@ -484,11 +484,11 @@ | ||
| 484 | 484 | sqlite3_vtab_cursor *cur, /* The cursor */ |
| 485 | 485 | sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ |
| 486 | 486 | int i /* Which column to return */ |
| 487 | 487 | ){ |
| 488 | 488 | builtinVtab_cursor *pCur = (builtinVtab_cursor*)cur; |
| 489 | - const struct BuiltinFileTable *pFile = aBuiltinFiles + pCur->iRowid; | |
| 489 | + const struct BuiltinFileTable *pFile = aBuiltinFiles + pCur->iRowid - 1; | |
| 490 | 490 | switch( i ){ |
| 491 | 491 | case 0: /* name */ |
| 492 | 492 | sqlite3_result_text(ctx, pFile->zName, -1, SQLITE_STATIC); |
| 493 | 493 | break; |
| 494 | 494 | case 1: /* size */ |
| @@ -515,11 +515,11 @@ | ||
| 515 | 515 | ** Return TRUE if the cursor has been moved off of the last |
| 516 | 516 | ** row of output. |
| 517 | 517 | */ |
| 518 | 518 | static int builtinVtabEof(sqlite3_vtab_cursor *cur){ |
| 519 | 519 | builtinVtab_cursor *pCur = (builtinVtab_cursor*)cur; |
| 520 | - return pCur->iRowid>=count(aBuiltinFiles); | |
| 520 | + return pCur->iRowid>count(aBuiltinFiles); | |
| 521 | 521 | } |
| 522 | 522 | |
| 523 | 523 | /* |
| 524 | 524 | ** This method is called to "rewind" the builtinVtab_cursor object back |
| 525 | 525 | ** to the first row of output. This method is always called at least |
| 526 | 526 |
| --- src/builtin.c | |
| +++ src/builtin.c | |
| @@ -484,11 +484,11 @@ | |
| 484 | sqlite3_vtab_cursor *cur, /* The cursor */ |
| 485 | sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ |
| 486 | int i /* Which column to return */ |
| 487 | ){ |
| 488 | builtinVtab_cursor *pCur = (builtinVtab_cursor*)cur; |
| 489 | const struct BuiltinFileTable *pFile = aBuiltinFiles + pCur->iRowid; |
| 490 | switch( i ){ |
| 491 | case 0: /* name */ |
| 492 | sqlite3_result_text(ctx, pFile->zName, -1, SQLITE_STATIC); |
| 493 | break; |
| 494 | case 1: /* size */ |
| @@ -515,11 +515,11 @@ | |
| 515 | ** Return TRUE if the cursor has been moved off of the last |
| 516 | ** row of output. |
| 517 | */ |
| 518 | static int builtinVtabEof(sqlite3_vtab_cursor *cur){ |
| 519 | builtinVtab_cursor *pCur = (builtinVtab_cursor*)cur; |
| 520 | return pCur->iRowid>=count(aBuiltinFiles); |
| 521 | } |
| 522 | |
| 523 | /* |
| 524 | ** This method is called to "rewind" the builtinVtab_cursor object back |
| 525 | ** to the first row of output. This method is always called at least |
| 526 |
| --- src/builtin.c | |
| +++ src/builtin.c | |
| @@ -484,11 +484,11 @@ | |
| 484 | sqlite3_vtab_cursor *cur, /* The cursor */ |
| 485 | sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ |
| 486 | int i /* Which column to return */ |
| 487 | ){ |
| 488 | builtinVtab_cursor *pCur = (builtinVtab_cursor*)cur; |
| 489 | const struct BuiltinFileTable *pFile = aBuiltinFiles + pCur->iRowid - 1; |
| 490 | switch( i ){ |
| 491 | case 0: /* name */ |
| 492 | sqlite3_result_text(ctx, pFile->zName, -1, SQLITE_STATIC); |
| 493 | break; |
| 494 | case 1: /* size */ |
| @@ -515,11 +515,11 @@ | |
| 515 | ** Return TRUE if the cursor has been moved off of the last |
| 516 | ** row of output. |
| 517 | */ |
| 518 | static int builtinVtabEof(sqlite3_vtab_cursor *cur){ |
| 519 | builtinVtab_cursor *pCur = (builtinVtab_cursor*)cur; |
| 520 | return pCur->iRowid>count(aBuiltinFiles); |
| 521 | } |
| 522 | |
| 523 | /* |
| 524 | ** This method is called to "rewind" the builtinVtab_cursor object back |
| 525 | ** to the first row of output. This method is always called at least |
| 526 |