aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2005-06-22 08:48:06 +0000
committerdrh <drh@noemail.net>2005-06-22 08:48:06 +0000
commit288d37f1b44a117f9602df9e5ad738858e0dfb3b (patch)
tree57cdbfcea4068569c9fb0f4cdb15da5d8a25b234 /src
parentedef8fcd73cea22d402dfb2fb91fe88e511207a8 (diff)
downloadsqlite-288d37f1b44a117f9602df9e5ad738858e0dfb3b.tar.gz
sqlite-288d37f1b44a117f9602df9e5ad738858e0dfb3b.zip
Allow parameters to be introduced by characters ':', '$' and '#'. This
is an experimental change. (CVS 2523) FossilOrigin-Name: f3427a139c3bd4faf9134ec6290b3eb829c0a19f
Diffstat (limited to 'src')
-rw-r--r--src/expr.c17
-rw-r--r--src/tokenize.c72
2 files changed, 38 insertions, 51 deletions
diff --git a/src/expr.c b/src/expr.c
index edba81a2a..4f21800e5 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -12,7 +12,7 @@
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
-** $Id: expr.c,v 1.206 2005/06/12 21:35:52 drh Exp $
+** $Id: expr.c,v 1.207 2005/06/22 08:48:06 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -207,9 +207,8 @@ Expr *sqlite3Expr(int op, Expr *pLeft, Expr *pRight, const Token *pToken){
/*
** When doing a nested parse, you can include terms in an expression
** that look like this: #0 #1 #2 ... These terms refer to elements
-** on the stack. "#0" (or just "#") means the top of the stack.
-** "#1" means the next down on the stack. And so forth. #-1 means
-** memory location 0. #-2 means memory location 1. And so forth.
+** on the stack. "#0" means the top of the stack.
+** "#1" means the next down on the stack. And so forth.
**
** This routine is called by the parser to deal with on of those terms.
** It immediately generates code to store the value in a memory location.
@@ -230,13 +229,9 @@ Expr *sqlite3RegisterExpr(Parse *pParse, Token *pToken){
return 0; /* Malloc failed */
}
depth = atoi(&pToken->z[1]);
- if( depth>=0 ){
- p->iTable = pParse->nMem++;
- sqlite3VdbeAddOp(v, OP_Dup, depth, 0);
- sqlite3VdbeAddOp(v, OP_MemStore, p->iTable, 1);
- }else{
- p->iTable = -1-depth;
- }
+ p->iTable = pParse->nMem++;
+ sqlite3VdbeAddOp(v, OP_Dup, depth, 0);
+ sqlite3VdbeAddOp(v, OP_MemStore, p->iTable, 1);
return p;
}
diff --git a/src/tokenize.c b/src/tokenize.c
index a54abb96c..1dab3c528 100644
--- a/src/tokenize.c
+++ b/src/tokenize.c
@@ -15,7 +15,7 @@
** individual tokens and sends those tokens one-by-one over to the
** parser for analysis.
**
-** $Id: tokenize.c,v 1.103 2005/06/06 14:45:43 drh Exp $
+** $Id: tokenize.c,v 1.104 2005/06/22 08:48:06 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -183,11 +183,6 @@ static int getToken(const unsigned char *z, int *tokenType){
*tokenType = TK_BITNOT;
return 1;
}
- case '#': {
- for(i=1; isdigit(z[i]) || (i==1 && z[1]=='-'); i++){}
- *tokenType = TK_REGISTER;
- return i;
- }
case '\'': case '"': {
int delim = z[0];
for(i=1; (c=z[i])!=0; i++){
@@ -239,50 +234,47 @@ static int getToken(const unsigned char *z, int *tokenType){
for(i=1; isdigit(z[i]); i++){}
return i;
}
- case ':': {
- for(i=1; IdChar(z[i]); i++){}
- *tokenType = i>1 ? TK_VARIABLE : TK_ILLEGAL;
- return i;
+ case '#': {
+ for(i=1; isdigit(z[i]); i++){}
+ if( i>1 ){
+ /* Parameters of the form #NNN (where NNN is a number) are used
+ ** internally by sqlite3NestedParse. */
+ *tokenType = TK_REGISTER;
+ return i;
+ }
+ /* Fall through into the next case if the '#' is not followed by
+ ** a digit. Try to match #AAAA where AAAA is a parameter name. */
}
#ifndef SQLITE_OMIT_TCL_VARIABLE
- case '$': {
+ case '$':
+#endif
+ case ':': {
+ int n = 0;
*tokenType = TK_VARIABLE;
- if( z[1]=='{' ){
- int nBrace = 1;
- for(i=2; (c=z[i])!=0 && nBrace; i++){
- if( c=='{' ){
- nBrace++;
- }else if( c=='}' ){
- nBrace--;
- }
- }
- if( c==0 ) *tokenType = TK_ILLEGAL;
- }else{
- int n = 0;
- for(i=1; (c=z[i])!=0; i++){
- if( isalnum(c) || c=='_' ){
- n++;
- }else if( c=='(' && n>0 ){
- do{
- i++;
- }while( (c=z[i])!=0 && !isspace(c) && c!=')' );
- if( c==')' ){
- i++;
- }else{
- *tokenType = TK_ILLEGAL;
- }
- break;
- }else if( c==':' && z[i+1]==':' ){
+ for(i=1; (c=z[i])!=0; i++){
+ if( IdChar(c) ){
+ n++;
+#ifndef SQLITE_OMIT_TCL_VARIABLE
+ }else if( c=='(' && n>0 ){
+ do{
+ i++;
+ }while( (c=z[i])!=0 && !isspace(c) && c!=')' );
+ if( c==')' ){
i++;
}else{
- break;
+ *tokenType = TK_ILLEGAL;
}
+ break;
+ }else if( c==':' && z[i+1]==':' ){
+ i++;
+#endif
+ }else{
+ break;
}
- if( n==0 ) *tokenType = TK_ILLEGAL;
}
+ if( n==0 ) *tokenType = TK_ILLEGAL;
return i;
}
-#endif
#ifndef SQLITE_OMIT_BLOB_LITERAL
case 'x': case 'X': {
if( (c=z[1])=='\'' || c=='"' ){