| 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);
|
| }
|
|
|
|
|