aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-12-29 15:04:49 +0000
committerdrh <drh@noemail.net>2017-12-29 15:04:49 +0000
commit092457b18ce71b6b0f30ea8a67817310feffaebc (patch)
treee967666936f525c57f84a914d272dcdc22a9c031 /src
parentfe6d20e9f4d17ad82fd4c4cc69181ad5f52d9d93 (diff)
downloadsqlite-092457b18ce71b6b0f30ea8a67817310feffaebc.tar.gz
sqlite-092457b18ce71b6b0f30ea8a67817310feffaebc.zip
Change the function name to sqlite_unsupported_offset(X). Only enable the
function if compiled with -DSQLITE_ENABLE_OFFSET_SQL_FUNC. The makefiles add that definition to shell builds. FossilOrigin-Name: 7a7f826e324b1a2c332e2f1d0740fd0babffcaca6275a798572f02ad367b99ab
Diffstat (limited to 'src')
-rw-r--r--src/btree.c4
-rw-r--r--src/btree.h4
-rw-r--r--src/expr.c9
-rw-r--r--src/func.c5
-rw-r--r--src/sqliteInt.h2
-rw-r--r--src/test_config.c6
-rw-r--r--src/vdbe.c17
-rw-r--r--src/where.c6
8 files changed, 39 insertions, 14 deletions
diff --git a/src/btree.c b/src/btree.c
index a8d91cc0c..8cd5ee673 100644
--- a/src/btree.c
+++ b/src/btree.c
@@ -4432,17 +4432,19 @@ i64 sqlite3BtreeIntegerKey(BtCursor *pCur){
return pCur->info.nKey;
}
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
/*
** Return the offset into the database file for the start of the
** payload to which the cursor is pointing.
*/
-i64 sqlite3BtreeLocation(BtCursor *pCur){
+i64 sqlite3BtreeOffset(BtCursor *pCur){
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState==CURSOR_VALID );
getCellInfo(pCur);
return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) +
(i64)(pCur->info.pPayload - pCur->pPage->aData);
}
+#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
/*
** Return the number of bytes of payload for the entry that pCur is
diff --git a/src/btree.h b/src/btree.h
index 43c0b9a8a..e8e114bd2 100644
--- a/src/btree.h
+++ b/src/btree.h
@@ -291,7 +291,9 @@ int sqlite3BtreeNext(BtCursor*, int flags);
int sqlite3BtreeEof(BtCursor*);
int sqlite3BtreePrevious(BtCursor*, int flags);
i64 sqlite3BtreeIntegerKey(BtCursor*);
-i64 sqlite3BtreeLocation(BtCursor*);
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+i64 sqlite3BtreeOffset(BtCursor*);
+#endif
int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*);
const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt);
u32 sqlite3BtreePayloadSize(BtCursor*);
diff --git a/src/expr.c b/src/expr.c
index dd7d548ed..32cc4423f 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3870,14 +3870,17 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
if( !pColl ) pColl = db->pDfltColl;
sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
}
- if( pDef->funcFlags & SQLITE_FUNC_LOCATION ){
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){
Expr *pArg = pFarg->a[0].pExpr;
if( pArg->op==TK_COLUMN ){
- sqlite3VdbeAddOp3(v, OP_Location, pArg->iTable, pArg->iColumn,target);
+ sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
}
- }else{
+ }else
+#endif
+ {
sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
constMask, r1, target, (char*)pDef, P4_FUNCDEF);
sqlite3VdbeChangeP5(v, (u8)nFarg);
diff --git a/src/func.c b/src/func.c
index f81c4865d..4758b0191 100644
--- a/src/func.c
+++ b/src/func.c
@@ -1799,8 +1799,11 @@ void sqlite3RegisterBuiltinFunctions(void){
#ifdef SQLITE_DEBUG
FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY),
#endif
- FUNCTION2(location, 1, 0, 0, noopFunc, SQLITE_FUNC_LOCATION|
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ FUNCTION2(sqlite_unsupported_offset,
+ 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET|
SQLITE_FUNC_TYPEOF),
+#endif
FUNCTION(ltrim, 1, 1, 0, trimFunc ),
FUNCTION(ltrim, 2, 1, 0, trimFunc ),
FUNCTION(rtrim, 1, 2, 0, trimFunc ),
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 24a36e2c5..8e7913320 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -1629,7 +1629,7 @@ struct FuncDestructor {
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
** single query - might change over time */
#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */
-#define SQLITE_FUNC_LOCATION 0x8000 /* Built-in location() function */
+#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */
/*
** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
diff --git a/src/test_config.c b/src/test_config.c
index 24a7287da..ad63016ba 100644
--- a/src/test_config.c
+++ b/src/test_config.c
@@ -160,6 +160,12 @@ static void set_options(Tcl_Interp *interp){
Tcl_SetVar2(interp, "sqlite_options", "mem5", "0", TCL_GLOBAL_ONLY);
#endif
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ Tcl_SetVar2(interp, "sqlite_options", "offset_sql_func","1",TCL_GLOBAL_ONLY);
+#else
+ Tcl_SetVar2(interp, "sqlite_options", "offset_sql_func","0",TCL_GLOBAL_ONLY);
+#endif
+
#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
Tcl_SetVar2(interp, "sqlite_options", "preupdate", "1", TCL_GLOBAL_ONLY);
#else
diff --git a/src/vdbe.c b/src/vdbe.c
index 68762ae5e..26336d940 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -2349,19 +2349,23 @@ case OP_IfNullRow: { /* jump */
break;
}
-/* Opcode: Location P1 P2 P3 * *
-** Synopsis: r[P3] = location(P1)
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+/* Opcode: Offset P1 P2 P3 * *
+** Synopsis: r[P3] = sqlite_offset(P1)
**
-** Store in register r[P3] the location in the database file that is the
+** Store in register r[P3] the byte offset into the database file that is the
** start of the payload for the record at which that cursor P1 is currently
** pointing.
**
-** P2 is the column number for the argument to the location() function.
+** P2 is the column number for the argument to the sqlite_offset() function.
** This opcode does not use P2 itself, but the P2 value is used by the
** code generator. The P1, P2, and P3 operands to this opcode are the
** as as for OP_Column.
+**
+** This opcode is only available if SQLite is compiled with the
+** -DSQLITE_ENABLE_OFFSET_SQL_FUNC option.
*/
-case OP_Location: { /* out3 */
+case OP_Offset: { /* out3 */
VdbeCursor *pC; /* The VDBE cursor */
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
@@ -2369,10 +2373,11 @@ case OP_Location: { /* out3 */
if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){
sqlite3VdbeMemSetNull(pOut);
}else{
- sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeLocation(pC->uc.pCursor));
+ sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
}
break;
}
+#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
/* Opcode: Column P1 P2 P3 P4 P5
** Synopsis: r[P3]=PX
diff --git a/src/where.c b/src/where.c
index 146c8124c..ec5352794 100644
--- a/src/where.c
+++ b/src/where.c
@@ -5146,7 +5146,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
pOp = sqlite3VdbeGetOp(v, k);
for(; k<last; k++, pOp++){
if( pOp->p1!=pLevel->iTabCur ) continue;
- if( pOp->opcode==OP_Column || pOp->opcode==OP_Location ){
+ if( pOp->opcode==OP_Column
+#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
+ || pOp->opcode==OP_Offset
+#endif
+ ){
int x = pOp->p2;
assert( pIdx->pTable==pTab );
if( !HasRowid(pTab) ){