diff options
author | Hans-Christoph Steiner <hans@eds.org> | 2013-08-13 15:43:01 -0400 |
---|---|---|
committer | Hans-Christoph Steiner <hans@eds.org> | 2013-08-13 15:43:01 -0400 |
commit | 4228998fd796fa2f9e84fb73632e0a07cc7cd188 (patch) | |
tree | 15b2336f351468fedd0c39e9de4ad905a686f3b0 /src/test_wholenumber.c | |
parent | bdee7cf7d974b2f70d5934786c5666006e7360be (diff) | |
parent | 08119c361d1181b3e8f1abb429236e488a664753 (diff) |
Merge tag 'upstream/2.2.1'
Upstream version 2.2.1
# gpg: Signature made Tue 13 Aug 2013 03:42:56 PM EDT using RSA key ID 374BBE81
# gpg: Good signature from "Hans-Christoph Steiner <hans@at.or.at>"
# gpg: aka "[jpeg image of size 5408]"
# gpg: aka "Hans-Christoph Steiner <hs420@nyu.edu>"
# gpg: aka "Hans-Christoph Steiner <hans@eds.org>"
# gpg: aka "Hans-Christoph Steiner <hans@guardianproject.info>"
# gpg: aka "Hans-Christoph Steiner <hansi@nyu.edu>"
# gpg: aka "Hans-Christoph Steiner <hans@guardianproject.info>"
Diffstat (limited to 'src/test_wholenumber.c')
-rw-r--r-- | src/test_wholenumber.c | 311 |
1 files changed, 0 insertions, 311 deletions
diff --git a/src/test_wholenumber.c b/src/test_wholenumber.c deleted file mode 100644 index 7c42d01..0000000 --- a/src/test_wholenumber.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -** 2011 April 02 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file implements a virtual table that returns the whole numbers -** between 1 and 4294967295, inclusive. -** -** Example: -** -** CREATE VIRTUAL TABLE nums USING wholenumber; -** SELECT value FROM nums WHERE value<10; -** -** Results in: -** -** 1 2 3 4 5 6 7 8 9 -*/ -#include "sqlite3.h" -#include <assert.h> -#include <string.h> - -#ifndef SQLITE_OMIT_VIRTUALTABLE - - -/* A wholenumber cursor object */ -typedef struct wholenumber_cursor wholenumber_cursor; -struct wholenumber_cursor { - sqlite3_vtab_cursor base; /* Base class - must be first */ - sqlite3_int64 iValue; /* Current value */ - sqlite3_int64 mxValue; /* Maximum value */ -}; - -/* Methods for the wholenumber module */ -static int wholenumberConnect( - sqlite3 *db, - void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVtab, - char **pzErr -){ - sqlite3_vtab *pNew; - pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); - if( pNew==0 ) return SQLITE_NOMEM; - sqlite3_declare_vtab(db, "CREATE TABLE x(value)"); - memset(pNew, 0, sizeof(*pNew)); - return SQLITE_OK; -} -/* Note that for this virtual table, the xCreate and xConnect -** methods are identical. */ - -static int wholenumberDisconnect(sqlite3_vtab *pVtab){ - sqlite3_free(pVtab); - return SQLITE_OK; -} -/* The xDisconnect and xDestroy methods are also the same */ - - -/* -** Open a new wholenumber cursor. -*/ -static int wholenumberOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ - wholenumber_cursor *pCur; - pCur = sqlite3_malloc( sizeof(*pCur) ); - if( pCur==0 ) return SQLITE_NOMEM; - memset(pCur, 0, sizeof(*pCur)); - *ppCursor = &pCur->base; - return SQLITE_OK; -} - -/* -** Close a wholenumber cursor. -*/ -static int wholenumberClose(sqlite3_vtab_cursor *cur){ - sqlite3_free(cur); - return SQLITE_OK; -} - - -/* -** Advance a cursor to its next row of output -*/ -static int wholenumberNext(sqlite3_vtab_cursor *cur){ - wholenumber_cursor *pCur = (wholenumber_cursor*)cur; - pCur->iValue++; - return SQLITE_OK; -} - -/* -** Return the value associated with a wholenumber. -*/ -static int wholenumberColumn( - sqlite3_vtab_cursor *cur, - sqlite3_context *ctx, - int i -){ - wholenumber_cursor *pCur = (wholenumber_cursor*)cur; - sqlite3_result_int64(ctx, pCur->iValue); - return SQLITE_OK; -} - -/* -** The rowid. -*/ -static int wholenumberRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ - wholenumber_cursor *pCur = (wholenumber_cursor*)cur; - *pRowid = pCur->iValue; - return SQLITE_OK; -} - -/* -** When the wholenumber_cursor.rLimit value is 0 or less, that is a signal -** that the cursor has nothing more to output. -*/ -static int wholenumberEof(sqlite3_vtab_cursor *cur){ - wholenumber_cursor *pCur = (wholenumber_cursor*)cur; - return pCur->iValue>pCur->mxValue || pCur->iValue==0; -} - -/* -** Called to "rewind" a cursor back to the beginning so that -** it starts its output over again. Always called at least once -** prior to any wholenumberColumn, wholenumberRowid, or wholenumberEof call. -** -** idxNum Constraints -** ------ --------------------- -** 0 (none) -** 1 value > $argv0 -** 2 value >= $argv0 -** 4 value < $argv0 -** 8 value <= $argv0 -** -** 5 value > $argv0 AND value < $argv1 -** 6 value >= $argv0 AND value < $argv1 -** 9 value > $argv0 AND value <= $argv1 -** 10 value >= $argv0 AND value <= $argv1 -*/ -static int wholenumberFilter( - sqlite3_vtab_cursor *pVtabCursor, - int idxNum, const char *idxStr, - int argc, sqlite3_value **argv -){ - wholenumber_cursor *pCur = (wholenumber_cursor *)pVtabCursor; - sqlite3_int64 v; - int i = 0; - pCur->iValue = 1; - pCur->mxValue = 0xffffffff; /* 4294967295 */ - if( idxNum & 3 ){ - v = sqlite3_value_int64(argv[0]) + (idxNum&1); - if( v>pCur->iValue && v<=pCur->mxValue ) pCur->iValue = v; - i++; - } - if( idxNum & 12 ){ - v = sqlite3_value_int64(argv[i]) - ((idxNum>>2)&1); - if( v>=pCur->iValue && v<pCur->mxValue ) pCur->mxValue = v; - } - return SQLITE_OK; -} - -/* -** Search for terms of these forms: -** -** (1) value > $value -** (2) value >= $value -** (4) value < $value -** (8) value <= $value -** -** idxNum is an ORed combination of 1 or 2 with 4 or 8. -*/ -static int wholenumberBestIndex( - sqlite3_vtab *tab, - sqlite3_index_info *pIdxInfo -){ - int i; - int idxNum = 0; - int argvIdx = 1; - int ltIdx = -1; - int gtIdx = -1; - const struct sqlite3_index_constraint *pConstraint; - pConstraint = pIdxInfo->aConstraint; - for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ - if( pConstraint->usable==0 ) continue; - if( (idxNum & 3)==0 && pConstraint->op==SQLITE_INDEX_CONSTRAINT_GT ){ - idxNum |= 1; - ltIdx = i; - } - if( (idxNum & 3)==0 && pConstraint->op==SQLITE_INDEX_CONSTRAINT_GE ){ - idxNum |= 2; - ltIdx = i; - } - if( (idxNum & 12)==0 && pConstraint->op==SQLITE_INDEX_CONSTRAINT_LT ){ - idxNum |= 4; - gtIdx = i; - } - if( (idxNum & 12)==0 && pConstraint->op==SQLITE_INDEX_CONSTRAINT_LE ){ - idxNum |= 8; - gtIdx = i; - } - } - pIdxInfo->idxNum = idxNum; - if( ltIdx>=0 ){ - pIdxInfo->aConstraintUsage[ltIdx].argvIndex = argvIdx++; - pIdxInfo->aConstraintUsage[ltIdx].omit = 1; - } - if( gtIdx>=0 ){ - pIdxInfo->aConstraintUsage[gtIdx].argvIndex = argvIdx; - pIdxInfo->aConstraintUsage[gtIdx].omit = 1; - } - if( pIdxInfo->nOrderBy==1 - && pIdxInfo->aOrderBy[0].desc==0 - ){ - pIdxInfo->orderByConsumed = 1; - } - pIdxInfo->estimatedCost = (double)1; - return SQLITE_OK; -} - -/* -** A virtual table module that provides read-only access to a -** Tcl global variable namespace. -*/ -static sqlite3_module wholenumberModule = { - 0, /* iVersion */ - wholenumberConnect, - wholenumberConnect, - wholenumberBestIndex, - wholenumberDisconnect, - wholenumberDisconnect, - wholenumberOpen, /* xOpen - open a cursor */ - wholenumberClose, /* xClose - close a cursor */ - wholenumberFilter, /* xFilter - configure scan constraints */ - wholenumberNext, /* xNext - advance a cursor */ - wholenumberEof, /* xEof - check for end of scan */ - wholenumberColumn, /* xColumn - read data */ - wholenumberRowid, /* xRowid - read data */ - 0, /* xUpdate */ - 0, /* xBegin */ - 0, /* xSync */ - 0, /* xCommit */ - 0, /* xRollback */ - 0, /* xFindMethod */ - 0, /* xRename */ -}; - -#endif /* SQLITE_OMIT_VIRTUALTABLE */ - - -/* -** Register the wholenumber virtual table -*/ -int wholenumber_register(sqlite3 *db){ - int rc = SQLITE_OK; -#ifndef SQLITE_OMIT_VIRTUALTABLE - rc = sqlite3_create_module(db, "wholenumber", &wholenumberModule, 0); -#endif - return rc; -} - -#ifdef SQLITE_TEST -#include <tcl.h> -/* -** Decode a pointer to an sqlite3 object. -*/ -extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); - -/* -** Register the echo virtual table module. -*/ -static int register_wholenumber_module( - ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ - Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ - int objc, /* Number of arguments */ - Tcl_Obj *CONST objv[] /* Command arguments */ -){ - sqlite3 *db; - if( objc!=2 ){ - Tcl_WrongNumArgs(interp, 1, objv, "DB"); - return TCL_ERROR; - } - if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; - wholenumber_register(db); - return TCL_OK; -} - - -/* -** Register commands with the TCL interpreter. -*/ -int Sqlitetestwholenumber_Init(Tcl_Interp *interp){ - static struct { - char *zName; - Tcl_ObjCmdProc *xProc; - void *clientData; - } aObjCmd[] = { - { "register_wholenumber_module", register_wholenumber_module, 0 }, - }; - int i; - for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ - Tcl_CreateObjCommand(interp, aObjCmd[i].zName, - aObjCmd[i].xProc, aObjCmd[i].clientData, 0); - } - return TCL_OK; -} - -#endif /* SQLITE_TEST */ |