Index: third_party/sqlite/src/src/treeview.c |
diff --git a/third_party/sqlite/src/src/treeview.c b/third_party/sqlite/src/src/treeview.c |
index a26e9e2b9f48f07e5c8f2387c8bbf533c9f5141b..0ea512b5c64745afcddcd2de81a24721ffc81f02 100644 |
--- a/third_party/sqlite/src/src/treeview.c |
+++ b/third_party/sqlite/src/src/treeview.c |
@@ -63,8 +63,9 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ |
sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); |
} |
va_start(ap, zFormat); |
- sqlite3VXPrintf(&acc, 0, zFormat, ap); |
+ sqlite3VXPrintf(&acc, zFormat, ap); |
va_end(ap); |
+ assert( acc.nChar>0 ); |
if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1); |
sqlite3StrAccumFinish(&acc); |
fprintf(stdout,"%s", zBuf); |
@@ -98,17 +99,17 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ |
char zLine[1000]; |
const struct Cte *pCte = &pWith->a[i]; |
sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); |
- sqlite3XPrintf(&x, 0, "%s", pCte->zName); |
+ sqlite3XPrintf(&x, "%s", pCte->zName); |
if( pCte->pCols && pCte->pCols->nExpr>0 ){ |
char cSep = '('; |
int j; |
for(j=0; j<pCte->pCols->nExpr; j++){ |
- sqlite3XPrintf(&x, 0, "%c%s", cSep, pCte->pCols->a[j].zName); |
+ sqlite3XPrintf(&x, "%c%s", cSep, pCte->pCols->a[j].zName); |
cSep = ','; |
} |
- sqlite3XPrintf(&x, 0, ")"); |
+ sqlite3XPrintf(&x, ")"); |
} |
- sqlite3XPrintf(&x, 0, " AS"); |
+ sqlite3XPrintf(&x, " AS"); |
sqlite3StrAccumFinish(&x); |
sqlite3TreeViewItem(pView, zLine, i<pWith->nCte-1); |
sqlite3TreeViewSelect(pView, pCte->pSelect, 0); |
@@ -120,7 +121,7 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ |
/* |
-** Generate a human-readable description of a the Select object. |
+** Generate a human-readable description of a Select object. |
*/ |
void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ |
int n = 0; |
@@ -132,9 +133,10 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ |
sqlite3TreeViewPush(pView, 1); |
} |
do{ |
- sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x", |
+ sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x nSelectRow=%d", |
((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), |
- ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags |
+ ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags, |
+ (int)p->nSelectRow |
); |
if( cnt++ ) sqlite3TreeViewPop(pView); |
if( p->pPrior ){ |
@@ -159,20 +161,20 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ |
StrAccum x; |
char zLine[100]; |
sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); |
- sqlite3XPrintf(&x, 0, "{%d,*}", pItem->iCursor); |
+ sqlite3XPrintf(&x, "{%d,*}", pItem->iCursor); |
if( pItem->zDatabase ){ |
- sqlite3XPrintf(&x, 0, " %s.%s", pItem->zDatabase, pItem->zName); |
+ sqlite3XPrintf(&x, " %s.%s", pItem->zDatabase, pItem->zName); |
}else if( pItem->zName ){ |
- sqlite3XPrintf(&x, 0, " %s", pItem->zName); |
+ sqlite3XPrintf(&x, " %s", pItem->zName); |
} |
if( pItem->pTab ){ |
- sqlite3XPrintf(&x, 0, " tabname=%Q", pItem->pTab->zName); |
+ sqlite3XPrintf(&x, " tabname=%Q", pItem->pTab->zName); |
} |
if( pItem->zAlias ){ |
- sqlite3XPrintf(&x, 0, " (AS %s)", pItem->zAlias); |
+ sqlite3XPrintf(&x, " (AS %s)", pItem->zAlias); |
} |
if( pItem->fg.jointype & JT_LEFT ){ |
- sqlite3XPrintf(&x, 0, " LEFT-JOIN"); |
+ sqlite3XPrintf(&x, " LEFT-JOIN"); |
} |
sqlite3StrAccumFinish(&x); |
sqlite3TreeViewItem(pView, zLine, i<p->pSrc->nSrc-1); |
@@ -338,6 +340,12 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ |
case TK_ISNULL: zUniOp = "ISNULL"; break; |
case TK_NOTNULL: zUniOp = "NOTNULL"; break; |
+ case TK_SPAN: { |
+ sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); |
+ sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); |
+ break; |
+ } |
+ |
case TK_COLLATE: { |
sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); |
sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); |
@@ -438,6 +446,21 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ |
break; |
} |
#endif |
+ case TK_MATCH: { |
+ sqlite3TreeViewLine(pView, "MATCH {%d:%d}%s", |
+ pExpr->iTable, pExpr->iColumn, zFlgs); |
+ sqlite3TreeViewExpr(pView, pExpr->pRight, 0); |
+ break; |
+ } |
+ case TK_VECTOR: { |
+ sqlite3TreeViewBareExprList(pView, pExpr->x.pList, "VECTOR"); |
+ break; |
+ } |
+ case TK_SELECT_COLUMN: { |
+ sqlite3TreeViewLine(pView, "SELECT-COLUMN %d", pExpr->iColumn); |
+ sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); |
+ break; |
+ } |
default: { |
sqlite3TreeViewLine(pView, "op=%d", pExpr->op); |
break; |
@@ -454,21 +477,20 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ |
sqlite3TreeViewPop(pView); |
} |
+ |
/* |
** Generate a human-readable explanation of an expression list. |
*/ |
-void sqlite3TreeViewExprList( |
+void sqlite3TreeViewBareExprList( |
TreeView *pView, |
const ExprList *pList, |
- u8 moreToFollow, |
const char *zLabel |
){ |
- int i; |
- pView = sqlite3TreeViewPush(pView, moreToFollow); |
if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; |
if( pList==0 ){ |
sqlite3TreeViewLine(pView, "%s (empty)", zLabel); |
}else{ |
+ int i; |
sqlite3TreeViewLine(pView, "%s", zLabel); |
for(i=0; i<pList->nExpr; i++){ |
int j = pList->a[i].u.x.iOrderByCol; |
@@ -480,6 +502,15 @@ void sqlite3TreeViewExprList( |
if( j ) sqlite3TreeViewPop(pView); |
} |
} |
+} |
+void sqlite3TreeViewExprList( |
+ TreeView *pView, |
+ const ExprList *pList, |
+ u8 moreToFollow, |
+ const char *zLabel |
+){ |
+ pView = sqlite3TreeViewPush(pView, moreToFollow); |
+ sqlite3TreeViewBareExprList(pView, pList, zLabel); |
sqlite3TreeViewPop(pView); |
} |