aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-12-16 20:20:37 +0000
committerdrh <drh@noemail.net>2017-12-16 20:20:37 +0000
commit2fc865c1153d739208657ea652f74426bf20f678 (patch)
treebaccd44ab9c4694428b24dfd064e872540f702a7 /src/expr.c
parentebeffef36c5ad0e855cd208cc39989fc33511a6c (diff)
downloadsqlite-2fc865c1153d739208657ea652f74426bf20f678.tar.gz
sqlite-2fc865c1153d739208657ea652f74426bf20f678.zip
Add an experimental location(X) SQL function that attempt to return the
location of the payload within the database for the record that contains column X. location(X) returns NULL if X is not an ordinary table column or if SQLite cannot figure out the location because it is using a covering index. FossilOrigin-Name: 51be9558164301c5dd4df23ab8b3e67de0b522f8d36f79f3d84d45d3dc2a83a4
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/expr.c b/src/expr.c
index 524e53934..b7c64d3c1 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3871,9 +3871,18 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
if( !pColl ) pColl = db->pDfltColl;
sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
}
- sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
- constMask, r1, target, (char*)pDef, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nFarg);
+ if( pDef->funcFlags & SQLITE_FUNC_LOCATION ){
+ Expr *pArg = pFarg->a[0].pExpr;
+ if( pArg->op==TK_COLUMN ){
+ sqlite3VdbeAddOp2(v, OP_Location, pArg->iTable, target);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Null, 0, target);
+ }
+ }else{
+ sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0,
+ constMask, r1, target, (char*)pDef, P4_FUNCDEF);
+ sqlite3VdbeChangeP5(v, (u8)nFarg);
+ }
if( nFarg && constMask==0 ){
sqlite3ReleaseTempRange(pParse, r1, nFarg);
}