Пример #1
0
        /// <summary>
        /// Perform a reduce action and the shift that must immediately follow the reduce.
        /// </summary>
        private void Reduce(int ruleno)
        {
            Parse pParse = this._pParse;
            if (((this._tracePrompt != null)
                        && ((ruleno >= 0)
                        && (ruleno < _ruleNames.Length)))) {
                Trace.WriteLine(String.Format("{0}Reduce [{1}].", this._tracePrompt, _ruleNames[ruleno]));
            }
            Minor gotoMinor = _zeroMinor;
            switch (ruleno) {
            /* Beginning here are the reduction cases.  A typical example
            ** follows:
            **   case 0:
            **  #line <lineno> <grammarfile>
            **     { ... }           // User supplied code
            **     break;
            */
            case 0: /* input ::= cmdlist */
            case 1: /* cmdlist ::= cmdlist ecmd */
            case 2: /* cmdlist ::= ecmd */
            case 3: /* ecmd ::= SEMI */
            case 4: /* ecmd ::= explain cmdx SEMI */
            case 10: /* trans_opt ::= */
            case 11: /* trans_opt ::= TRANSACTION */
            case 12: /* trans_opt ::= TRANSACTION nm */
            case 20: /* savepoint_opt ::= SAVEPOINT */
            case 21: /* savepoint_opt ::= */
            case 25: /* cmd ::= create_table create_table_args */
            case 34: /* columnlist ::= columnlist COMMA column */
            case 35: /* columnlist ::= column */
            case 44: /* type ::= */
            case 51: /* signed ::= plus_num */
            case 52: /* signed ::= minus_num */
            case 53: /* carglist ::= carglist carg */
            case 54: /* carglist ::= */
            case 55: /* carg ::= CONSTRAINT nm ccons */
            case 56: /* carg ::= ccons */
            case 62: /* ccons ::= NULL onconf */
            case 90: /* conslist ::= conslist COMMA tcons */
            case 91: /* conslist ::= conslist tcons */
            case 92: /* conslist ::= tcons */
            case 93: /* tcons ::= CONSTRAINT nm */
            {

            }
              break;
            case 5: /* explain ::= */
            {
             sqlite3BeginParse(pParse, 0);
            }
              break;
            case 6: /* explain ::= EXPLAIN */
            {
             sqlite3BeginParse(pParse, 1);
            }
              break;
            case 7: /* explain ::= EXPLAIN QUERY PLAN */
            {
             sqlite3BeginParse(pParse, 2);
            }
              break;
            case 8: /* cmdx ::= cmd */
            {
             sqlite3FinishCoding(pParse);
            }
              break;
            case 9: /* cmd ::= BEGIN transtype trans_opt */
            {
             sqlite3BeginTransaction(pParse, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 13: /* transtype ::= */
            {
             gotoMinor.yy0 = TK.DEFERRED;
            }
              break;
            case 14: /* transtype ::= DEFERRED */
            case 15: /* transtype ::= IMMEDIATE */
            case 16: /* transtype ::= EXCLUSIVE */
            case 113: /* multiselect_op ::= UNION */
            case 115: /* multiselect_op ::= EXCEPT|INTERSECT */
            {
             gotoMinor.yy0 = _stack[_idx + 0].major;
            }
              break;
            case 17: /* cmd ::= COMMIT trans_opt */
            case 18: /* cmd ::= END trans_opt */
            {
             sqlite3CommitTransaction(pParse);
            }
              break;
            case 19: /* cmd ::= ROLLBACK trans_opt */
            {
             sqlite3RollbackTransaction(pParse);
            }
              break;
            case 22: /* cmd ::= SAVEPOINT nm */
            {
             sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 23: /* cmd ::= RELEASE savepoint_opt nm */
            {
             sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 24: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
            {
             sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 26: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
            {
             sqlite3StartTable(pParse, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + -4].minor.yy0, 0, 0, _stack[_idx + -2].minor.yy0);
            }
              break;
            case 27: /* createkw ::= CREATE */
            {
             pParse.db.lookaside.bEnabled = 0; gotoMinor.yy0 = _stack[_idx + 0].minor.yy0;
            }
              break;
            case 28: /* ifnotexists ::= */
            case 31: /* temp ::= */
            case 70: /* autoinc ::= */
            case 83: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
            case 85: /* init_deferred_pred_opt ::= */
            case 87: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
            case 98: /* defer_subclause_opt ::= */
            case 109: /* ifexists ::= */
            case 118: /* distinct ::= ALL */
            case 119: /* distinct ::= */
            case 157: /* groupby_opt ::= */
            case 159: /* having_opt ::= */
            case 220: /* between_op ::= BETWEEN */
            case 223: /* in_op ::= IN */
            {
             gotoMinor.yy0 = 0;
            }
              break;
            case 29: /* ifnotexists ::= IF NOT EXISTS */
            case 30: /* temp ::= TEMP */
            case 71: /* autoinc ::= AUTOINCR */
            case 86: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
            case 108: /* ifexists ::= IF EXISTS */
            case 117: /* distinct ::= DISTINCT */
            case 221: /* between_op ::= NOT BETWEEN */
            case 224: /* in_op ::= NOT IN */
            {
             gotoMinor.yy0 = 1;
            }
              break;
            case 32: /* create_table_args ::= LP columnlist conslist_opt RP */
            {
             sqlite3EndTable(pParse, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0, 0);
            }
              break;
            case 33: /* create_table_args ::= AS select */
            {
             sqlite3EndTable(pParse, 0, 0, _stack[_idx + 0].minor.yy0); sqlite3SelectDelete(pParse.db, ref _stack[_idx + 0].minor.yy0);
            }
              break;
            case 36: /* column ::= columnid type carglist */
            {
             gotoMinor.yy0.n = (int)(pParse.sLastToken.z.Length - _stack[_idx + -2].minor.yy0.z.Length) + pParse.sLastToken.z.Length; gotoMinor.yy0.z = _stack[_idx + -2].minor.yy0.z.Substring(0, gotoMinor.yy0.n);
            }
              break;
            case 37: /* columnid ::= nm */
            {
             sqlite3AddColumn(pParse, _stack[_idx + 0].minor.yy0); gotoMinor.yy0 = _stack[_idx + 0].minor.yy0;
            }
              break;
            case 38: /* id ::= ID */
            case 39: /* id ::= INDEXED */
            case 40: /* ids ::= ID|STRING */
            case 41: /* nm ::= id */
            case 42: /* nm ::= STRING */
            case 43: /* nm ::= JOIN_KW */
            case 46: /* typetoken ::= typename */
            case 49: /* typename ::= ids */
            case 84: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
            case 99: /* defer_subclause_opt ::= defer_subclause */
            case 101: /* onconf ::= ON CONFLICT resolvetype */
            case 104: /* resolvetype ::= raisetype */
            case 111: /* select ::= oneselect */
            case 125: /* as ::= AS nm */
            case 126: /* as ::= ids */
            case 136: /* dbnm ::= DOT nm */
            case 145: /* indexed_opt ::= INDEXED BY nm */
            case 150: /* orderby_opt ::= ORDER BY sortlist */
            case 158: /* groupby_opt ::= GROUP BY nexprlist */
            case 174: /* insert_cmd ::= INSERT orconf */
            case 182: /* expr ::= term */
            {
             gotoMinor.yy0 = _stack[_idx + 0].minor.yy0;
            }
              break;
            case 45: /* type ::= typetoken */
            {
             sqlite3AddColumnType(pParse, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 47: /* typetoken ::= typename LP signed RP */
            {
             gotoMinor.yy0.n = _stack[_idx + 0].minor.yy0.z.Length - _stack[_idx + -3].minor.yy0.z.Length + _stack[_idx + -3].minor.yy0.n; gotoMinor.yy0.z = _stack[_idx + -3].minor.yy0.z.Substring(0, gotoMinor.yy0.n);
            }
              break;
            case 48: /* typetoken ::= typename LP signed COMMA signed RP */
            {
             gotoMinor.yy0.n = _stack[_idx + 0].minor.yy0.z.Length - _stack[_idx + -5].minor.yy0.z.Length + _stack[_idx + -5].minor.yy0.n; gotoMinor.yy0.z = _stack[_idx + -5].minor.yy0.z.Substring(0, gotoMinor.yy0.n);
            }
              break;
            case 50: /* typename ::= typename ids */
            {
             gotoMinor.yy0.z = _stack[_idx + -1].minor.yy0.z; gotoMinor.yy0.n = _stack[_idx + 0].minor.yy0.n + _stack[_idx + 0].minor.yy0.z.Length - _stack[_idx + -1].minor.yy0.z.Length;
            }
              break;
            case 57: /* ccons ::= DEFAULT term */
            case 59: /* ccons ::= DEFAULT PLUS term */
            {
             sqlite3AddDefaultValue(pParse, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 58: /* ccons ::= DEFAULT LP expr RP */
            {
             sqlite3AddDefaultValue(pParse, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 60: /* ccons ::= DEFAULT MINUS term */
            {
             var v = new ExprSpan { pExpr = sqlite3PExpr(pParse, TK.UMINUS, _stack[_idx + 0].minor.yy0.pExpr, 0, 0), zStart = _stack[_idx + -1].minor.yy0.z, zEnd = _stack[_idx + 0].minor.yy0.zEnd }; sqlite3AddDefaultValue(pParse, v);
            }
              break;
            case 61: /* ccons ::= DEFAULT id */
            {
             var v = new ExprSpan(); spanExpr(v, pParse, TK.STRING, _stack[_idx + 0].minor.yy0); sqlite3AddDefaultValue(pParse, v);
            }
              break;
            case 63: /* ccons ::= NOT NULL onconf */
            {
             sqlite3AddNotNull(pParse, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 64: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
            {
             sqlite3AddPrimaryKey(pParse, 0, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + -2].minor.yy0);
            }
              break;
            case 65: /* ccons ::= UNIQUE onconf */
            {
             sqlite3CreateIndex(pParse, 0, 0, 0, 0, _stack[_idx + 0].minor.yy0, 0, 0, 0, 0);
            }
              break;
            case 66: /* ccons ::= CHECK LP expr RP */
            {
             sqlite3AddCheckConstraint(pParse, _stack[_idx + -1].minor.yy0.pExpr);
            }
              break;
            case 67: /* ccons ::= REFERENCES nm idxlist_opt refargs */
            {
             sqlite3CreateForeignKey(pParse, 0, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 68: /* ccons ::= defer_subclause */
            {
             sqlite3DeferForeignKey(pParse, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 69: /* ccons ::= COLLATE ids */
            {
             sqlite3AddCollateType(pParse, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 72: /* refargs ::= */
            {
             gotoMinor.yy0 = OE_None * 0x0101;
            }
              break;
            case 73: /* refargs ::= refargs refarg */
            {
             gotoMinor.yy0 = (_stack[_idx + -1].minor.yy0 & ~_stack[_idx + 0].minor.yy0.mask) | _stack[_idx + 0].minor.yy0.value;
            }
              break;
            case 74: /* refarg ::= MATCH nm */
            case 75: /* refarg ::= ON INSERT refact */
            {
             gotoMinor.yy0.value = 0;    gotoMinor.yy0.mask = 0x000000;
            }
              break;
            case 76: /* refarg ::= ON DELETE refact */
            {
             gotoMinor.yy0.value = _stack[_idx + 0].minor.yy0;    gotoMinor.yy0.mask = 0x0000ff;
            }
              break;
            case 77: /* refarg ::= ON UPDATE refact */
            {
             gotoMinor.yy0.value = _stack[_idx + 0].minor.yy0<<8; gotoMinor.yy0.mask = 0x00ff00;
            }
              break;
            case 78: /* refact ::= SET NULL */
            {
             gotoMinor.yy0 = OE_SetNull;
            }
              break;
            case 79: /* refact ::= SET DEFAULT */
            {
             gotoMinor.yy0 = OE_SetDflt;
            }
              break;
            case 80: /* refact ::= CASCADE */
            {
             gotoMinor.yy0 = OE_Cascade;
            }
              break;
            case 81: /* refact ::= RESTRICT */
            {
             gotoMinor.yy0 = OE_Restrict;
            }
              break;
            case 82: /* refact ::= NO ACTION */
            {
             gotoMinor.yy0 = OE_None;
            }
              break;
            case 88: /* conslist_opt ::= */
            {
             gotoMinor.yy0.n = 0; gotoMinor.yy0.z = null;
            }
              break;
            case 89: /* conslist_opt ::= COMMA conslist */
            case 120: /* sclp ::= selcollist COMMA */
            case 147: /* using_opt ::= USING LP inscollist RP */
            case 179: /* inscollist_opt ::= LP inscollist RP */
            {
             gotoMinor.yy0 = _stack[_idx + -1].minor.yy0;
            }
              break;
            case 94: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */
            {
             sqlite3AddPrimaryKey(pParse, _stack[_idx + -3].minor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + -2].minor.yy0, 0);
            }
              break;
            case 95: /* tcons ::= UNIQUE LP idxlist RP onconf */
            {
             sqlite3CreateIndex(pParse, 0, 0, 0, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0, 0, 0, 0, 0);
            }
              break;
            case 96: /* tcons ::= CHECK LP expr RP onconf */
            {
             sqlite3AddCheckConstraint(pParse, _stack[_idx + -2].minor.yy0.pExpr);
            }
              break;
            case 97: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */
            {
             sqlite3CreateForeignKey(pParse, _stack[_idx + -6].minor.yy0, _stack[_idx + -3].minor.yy0, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0); sqlite3DeferForeignKey(pParse, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 100: /* onconf ::= */
            case 102: /* orconf ::= */
            {
             gotoMinor.yy0 = OE_Default;
            }
              break;
            case 103: /* orconf ::= OR resolvetype */
            {
             gotoMinor.yy0 = (byte)_stack[_idx + 0].minor.yy0;
            }
              break;
            case 105: /* resolvetype ::= IGNORE */
            {
             gotoMinor.yy0 = OE_Ignore;
            }
              break;
            case 106: /* resolvetype ::= REPLACE */
            case 175: /* insert_cmd ::= REPLACE */
            {
             gotoMinor.yy0 = OE_Replace;
            }
              break;
            case 107: /* cmd ::= DROP TABLE ifexists fullname */
            {
             sqlite3DropTable(pParse, _stack[_idx + 0].minor.yy0, 0, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 110: /* cmd ::= select */
            {
             var dest = new SelectDest(SRT_Output, '\0', 0, 0, 0
            }
              break;
            case 112: /* select ::= select multiselect_op oneselect */
            {

            if (_stack[_idx + 0].minor.yy0 != null) { _stack[_idx + 0].minor.yy0->op = (TK)_stack[_idx + -1].minor.yy0; _stack[_idx + 0].minor.yy0->pPrior = _stack[_idx + -2].minor.yy0; }
            else { sqlite3SelectDelete(pParse.db, ref _stack[_idx + -2].minor.yy0); }
            gotoMinor.yy0 = _stack[_idx + 0].minor.yy0;
            }
              break;
            case 114: /* multiselect_op ::= UNION ALL */
            {
             gotoMinor.yy0 = TK.ALL;
            }
              break;
            case 116: /* oneselect ::= SELECT selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
            {
             gotoMinor.yy0 = sqlite3SelectNew(pParse, _stack[_idx + -6].minor.yy0, _stack[_idx + -5].minor.yy0, _stack[_idx + -4].minor.yy0, _stack[_idx + -3].minor.yy0, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0, D, _stack[_idx + 0].minor.yy0.pLimit, _stack[_idx + 0].minor.yy0.pOffset);
            }
              break;
            case 121: /* sclp ::= */
            case 131: /* stl_prefix ::= */
            case 143: /* on_opt ::= */
            case 148: /* using_opt ::= */
            case 149: /* orderby_opt ::= */
            case 166: /* where_opt ::= */
            case 178: /* inscollist_opt ::= */
            {
             gotoMinor.yy0 = null;
            }
              break;
            case 122: /* selcollist ::= sclp expr as */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0.pExpr); if (_stack[_idx + 0].minor.yy0.n > 0) sqlite3ExprListSetName(pParse, gotoMinor.yy0, _stack[_idx + 0].minor.yy0, 1); sqlite3ExprListSetSpan(pParse, gotoMinor.yy0, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 123: /* selcollist ::= sclp STAR */
            {
             var p = sqlite3Expr(pParse.db, TK.ALL, null); gotoMinor.yy0 = sqlite3ExprListAppend(pParse, _stack[_idx + -1].minor.yy0, p);
            }
              break;
            case 124: /* selcollist ::= sclp nm DOT STAR */
            {
             var pRight = sqlite3PExpr(pParse, TK.ALL, 0, 0, _stack[_idx + 0].minor.yy0); var pLeft = sqlite3PExpr(pParse, TK.ID, 0, 0, _stack[_idx + -2].minor.yy0); var pDot = sqlite3PExpr(pParse, TK.DOT, pLeft, pRight, 0); gotoMinor.yy0 = sqlite3ExprListAppend(pParse, _stack[_idx + -3].minor.yy0, pDot);
            }
              break;
            case 127: /* as ::= */
            {
             gotoMinor.yy0.n = 0;
            }
              break;
            case 128: /* from ::= */
            {
             gotoMinor.yy0 = new SrcList();
            }
              break;
            case 129: /* from ::= FROM seltablist */
            {
             gotoMinor.yy0 = _stack[_idx + 0].minor.yy0; sqlite3SrcListShiftJoinType(gotoMinor.yy0);
            }
              break;
            case 130: /* stl_prefix ::= seltablist joinop */
            {
             gotoMinor.yy0 = _stack[_idx + -1].minor.yy0; if (Sanity.ALWAYS(gotoMinor.yy0 != null && gotoMinor.yy0.nSrc > 0)) gotoMinor.yy0.a[gotoMinor.yy0.nSrc - 1].jointype = (byte)_stack[_idx + 0].minor.yy0;
            }
              break;
            case 132: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
            {
             gotoMinor.yy0 = sqlite3SrcListAppendFromTerm(pParse, _stack[_idx + -6].minor.yy0, _stack[_idx + -5].minor.yy0, _stack[_idx + -4].minor.yy0, _stack[_idx + -3].minor.yy0, 0, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0); sqlite3SrcListIndexedBy(pParse, gotoMinor.yy0, _stack[_idx + -2].minor.yy0);
            }
              break;
            case 133: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
            {
             gotoMinor.yy0 = sqlite3SrcListAppendFromTerm(pParse, _stack[_idx + -6].minor.yy0, 0, 0, _stack[_idx + -2].minor.yy0, _stack[_idx + -4].minor.yy0, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 134: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
            {

            if (_stack[_idx + -6].minor.yy0 == null && _stack[_idx + -2].minor.yy0.n == 0 && _stack[_idx + -1].minor.yy0 == null && _stack[_idx + 0].minor.yy0 == null) { gotoMinor.yy0 = _stack[_idx + -4].minor.yy0; }
            else { sqlite3SrcListShiftJoinType(_stack[_idx + -4].minor.yy0); var pSubquery = sqlite3SelectNew(pParse, 0, _stack[_idx + -4].minor.yy0, 0, 0, 0, 0, 0, 0, 0); gotoMinor.yy0 = sqlite3SrcListAppendFromTerm(pParse, _stack[_idx + -6].minor.yy0, 0, 0, _stack[_idx + -2].minor.yy0, pSubquery, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0); }
            }
              break;
            case 135: /* dbnm ::= */
            case 144: /* indexed_opt ::= */
            {
             gotoMinor.yy0.z = null; gotoMinor.yy0.n = 0;
            }
              break;
            case 137: /* fullname ::= nm dbnm */
            {
             gotoMinor.yy0 = sqlite3SrcListAppend(pParse.db, 0, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 138: /* joinop ::= COMMA|JOIN */
            {
             gotoMinor.yy0 = JT_INNER;
            }
              break;
            case 139: /* joinop ::= JOIN_KW JOIN */
            {
             gotoMinor.yy0 = sqlite3JoinType(pParse, _stack[_idx + -1].minor.yy0, 0, 0);
            }
              break;
            case 140: /* joinop ::= JOIN_KW nm JOIN */
            {
             gotoMinor.yy0 = sqlite3JoinType(pParse, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0, 0);
            }
              break;
            case 141: /* joinop ::= JOIN_KW nm nm JOIN */
            {
             gotoMinor.yy0 = sqlite3JoinType(pParse, _stack[_idx + -3].minor.yy0, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 142: /* on_opt ::= ON expr */
            case 153: /* sortitem ::= expr */
            case 160: /* having_opt ::= HAVING expr */
            case 167: /* where_opt ::= WHERE expr */
            {
             gotoMinor.yy0 = _stack[_idx + 0].minor.yy0.pExpr;
            }
              break;
            case 146: /* indexed_opt ::= NOT INDEXED */
            {
             gotoMinor.yy0.z = null; gotoMinor.yy0.n = 1;
            }
              break;
            case 151: /* sortlist ::= sortlist COMMA sortitem sortorder */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, _stack[_idx + -3].minor.yy0, _stack[_idx + -1].minor.yy0); if (gotoMinor.yy0 != null) gotoMinor.yy0->a[gotoMinor.yy0->nExpr-1].sortOrder = (u8)_stack[_idx + 0].minor.yy0;
            }
              break;
            case 152: /* sortlist ::= sortitem sortorder */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, 0, _stack[_idx + -1].minor.yy0); if (gotoMinor.yy0 != null && Sanity.ALWAYS(gotoMinor.yy0.a != null)) gotoMinor.yy0.a[0].sortOrder = (byte)_stack[_idx + 0].minor.yy0;
            }
              break;
            case 154: /* sortorder ::= ASC */
            case 156: /* sortorder ::= */
            {
             gotoMinor.yy0 = SQLITE_SO_ASC;
            }
              break;
            case 155: /* sortorder ::= DESC */
            {
             gotoMinor.yy0 = SQLITE_SO_DESC;
            }
              break;
            case 161: /* limit_opt ::= */
            {
             gotoMinor.yy0.pLimit = null; gotoMinor.yy0.pOffset = null;
            }
              break;
            case 162: /* limit_opt ::= LIMIT expr */
            {
             gotoMinor.yy0.pLimit = _stack[_idx + 0].minor.yy0.pExpr; gotoMinor.yy0.pOffset = null;
            }
              break;
            case 163: /* limit_opt ::= LIMIT expr OFFSET expr */
            {
             gotoMinor.yy0.pLimit = _stack[_idx + -2].minor.yy0.pExpr; gotoMinor.yy0.pOffset = _stack[_idx + 0].minor.yy0.pExpr;
            }
              break;
            case 164: /* limit_opt ::= LIMIT expr COMMA expr */
            {
             gotoMinor.yy0.pOffset = _stack[_idx + -2].minor.yy0.pExpr; gotoMinor.yy0.pLimit = _stack[_idx + 0].minor.yy0.pExpr;
            }
              break;
            case 165: /* cmd ::= DELETE FROM fullname indexed_opt where_opt */
            {
             sqlite3SrcListIndexedBy(pParse, _stack[_idx + -2].minor.yy0, _stack[_idx + -1].minor.yy0); sqlite3DeleteFrom(pParse, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 168: /* cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt */
            {

            sqlite3SrcListIndexedBy(pParse, _stack[_idx + -4].minor.yy0, _stack[_idx + -3].minor.yy0);
            sqlite3ExprListCheckLength(pParse, _stack[_idx + -1].minor.yy0, "set list");
            sqlite3Update(pParse, _stack[_idx + -4].minor.yy0, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + -5].minor.yy0);
            }
              break;
            case 169: /* setlist ::= setlist COMMA nm EQ expr */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, _stack[_idx + -4].minor.yy0, _stack[_idx + 0].minor.yy0.pExpr); sqlite3ExprListSetName(pParse, gotoMinor.yy0, _stack[_idx + -2].minor.yy0, 1);
            }
              break;
            case 170: /* setlist ::= nm EQ expr */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, 0, _stack[_idx + 0].minor.yy0.pExpr); sqlite3ExprListSetName(pParse, gotoMinor.yy0, _stack[_idx + -2].minor.yy0, 1);
            }
              break;
            case 171: /* cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP */
            {
             sqlite3Insert(pParse, _stack[_idx + -5].minor.yy0, _stack[_idx + -1].minor.yy0, 0, _stack[_idx + -4].minor.yy0, _stack[_idx + -7].minor.yy0);
            }
              break;
            case 172: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */
            {
             sqlite3Insert(pParse, _stack[_idx + -2].minor.yy0, 0, _stack[_idx + 0].minor.yy0, _stack[_idx + -1].minor.yy0, _stack[_idx + -4].minor.yy0);
            }
              break;
            case 173: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */
            {
             sqlite3Insert(pParse, _stack[_idx + -3].minor.yy0, 0, 0, _stack[_idx + -2].minor.yy0, _stack[_idx + -5].minor.yy0);
            }
              break;
            case 176: /* itemlist ::= itemlist COMMA expr */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0.pExpr);
            }
              break;
            case 177: /* itemlist ::= expr */
            {
             gotoMinor.yy0 = sqlite3ExprListAppend(pParse, 0, _stack[_idx + 0].minor.yy0.pExpr);
            }
              break;
            case 180: /* inscollist ::= inscollist COMMA nm */
            {
             gotoMinor.yy0 = sqlite3IdListAppend(pParse.db, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 181: /* inscollist ::= nm */
            {
             gotoMinor.yy0 = sqlite3IdListAppend(pParse.db, 0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 183: /* expr ::= LP expr RP */
            {
             gotoMinor.yy0.pExpr = _stack[_idx + -1].minor.yy0.pExpr; spanSet(gotoMinor.yy0, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 184: /* term ::= NULL */
            case 189: /* term ::= INTEGER|FLOAT|BLOB */
            case 190: /* term ::= STRING */
            {
             spanExpr(gotoMinor.yy0, pParse, _stack[_idx + 0].major, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 185: /* expr ::= id */
            case 186: /* expr ::= JOIN_KW */
            {
             spanExpr(gotoMinor.yy0, pParse, TK.ID, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 187: /* expr ::= nm DOT nm */
            {

            var temp1 = sqlite3PExpr(pParse, TK.ID, 0, 0, _stack[_idx + -2].minor.yy0);
            var temp2 = sqlite3PExpr(pParse, TK.ID, 0, 0, _stack[_idx + 0].minor.yy0);
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.DOT, temp1, temp2, 0);
            spanSet(gotoMinor.yy0, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 188: /* expr ::= nm DOT nm DOT nm */
            {

            var temp1 = sqlite3PExpr(pParse, TK.ID, 0, 0, _stack[_idx + -4].minor.yy0);
            var temp2 = sqlite3PExpr(pParse, TK.ID, 0, 0, _stack[_idx + -2].minor.yy0);
            var temp3 = sqlite3PExpr(pParse, TK.ID, 0, 0, _stack[_idx + 0].minor.yy0);
            var temp4 = sqlite3PExpr(pParse, TK.DOT, temp2, temp3, 0);
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.DOT, temp1, temp4, 0);
            spanSet(gotoMinor.yy0, _stack[_idx + -4].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 191: /* expr ::= REGISTER */
            {

            // When doing a nested parse, one can include terms in an expression that look like this:
            // #1 #2 ...  These terms refer to registers in the virtual machine.  #N is the N-th register. */
            if (pParse.nested == 0) { sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", _stack[_idx + 0].minor.yy0); gotoMinor.yy0.pExpr = null; }
            else { gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.REGISTER, 0, 0, _stack[_idx + 0].minor.yy0); if (gotoMinor.yy0.pExpr != null) sqlite3GetInt32(_stack[_idx + 0].minor.yy0.z, 1, ref gotoMinor.yy0.pExpr.iTable); }
            spanSet(gotoMinor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 192: /* expr ::= VARIABLE */
            {
             spanExpr(gotoMinor.yy0, pParse, TK.VARIABLE, _stack[_idx + 0].minor.yy0); sqlite3ExprAssignVarNumber(pParse, gotoMinor.yy0.pExpr); spanSet(gotoMinor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 193: /* expr ::= expr COLLATE ids */
            {
             gotoMinor.yy0.pExpr = sqlite3ExprSetCollByToken(pParse, _stack[_idx + -2].minor.yy0.pExpr, _stack[_idx + 0].minor.yy0); gotoMinor.yy0.zStart = _stack[_idx + -2].minor.yy0.zStart; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.z.Substring(_stack[_idx + 0].minor.yy0.n);
            }
              break;
            case 194: /* expr ::= CAST LP expr AS typetoken RP */
            {
             gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.CAST, _stack[_idx + -3].minor.yy0.pExpr, 0, _stack[_idx + -1].minor.yy0); spanSet(gotoMinor.yy0, _stack[_idx + -5].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 195: /* expr ::= ID LP distinct exprlist RP */
            {

            if (_stack[_idx + -1].minor.yy0 != null && _stack[_idx + -1].minor.yy0.nExpr > pParse.db.aLimit[SQLITE_LIMIT_FUNCTION_ARG]) sqlite3ErrorMsg(pParse, "too many arguments on function %T", _stack[_idx + -4].minor.yy0);
            gotoMinor.yy0.pExpr = sqlite3ExprFunction(pParse, _stack[_idx + -1].minor.yy0, _stack[_idx + -4].minor.yy0);
            spanSet(gotoMinor.yy0, _stack[_idx + -4].minor.yy0, _stack[_idx + 0].minor.yy0);
            if (_stack[_idx + -2].minor.yy0 != 0 && gotoMinor.yy0.pExpr != null) gotoMinor.yy0.pExpr->flags |= EP_Distinct;
            }
              break;
            case 196: /* expr ::= ID LP STAR RP */
            {
             gotoMinor.yy0.pExpr = sqlite3ExprFunction(pParse, 0, _stack[_idx + -3].minor.yy0); spanSet(gotoMinor.yy0, _stack[_idx + -3].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 197: /* term ::= CTIME_KW */
            {

            // The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are treated as functions that return constants
            gotoMinor.yy0.pExpr != null) gotoMinor.yy0.pExpr.op = TK.CONST_FUNC;
            spanSet(gotoMinor.yy0, _stack[_idx + 0].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 198: /* expr ::= expr AND expr */
            case 199: /* expr ::= expr OR expr */
            case 200: /* expr ::= expr LT|GT|GE|LE expr */
            case 201: /* expr ::= expr EQ|NE expr */
            case 202: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
            case 203: /* expr ::= expr PLUS|MINUS expr */
            case 204: /* expr ::= expr STAR|SLASH|REM expr */
            case 205: /* expr ::= expr CONCAT expr */
            {
             spanBinaryExpr(gotoMinor.yy0, pParse, _stack[_idx + -1].major, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 206: /* likeop ::= LIKE_KW */
            case 208: /* likeop ::= MATCH */
            {
             gotoMinor.yy0.eOperator = _stack[_idx + 0].minor.yy0; gotoMinor.yy0.not = false;
            }
              break;
            case 207: /* likeop ::= NOT LIKE_KW */
            case 209: /* likeop ::= NOT MATCH */
            {
             gotoMinor.yy0.eOperator = _stack[_idx + 0].minor.yy0; gotoMinor.yy0.not = true;
            }
              break;
            case 210: /* expr ::= expr likeop expr */
            {

            var pList = sqlite3ExprListAppend(pParse, 0, _stack[_idx + 0].minor.yy0.pExpr);
            pList = sqlite3ExprListAppend(pParse, pList, _stack[_idx + -2].minor.yy0.pExpr);
            gotoMinor.yy0.pExpr = sqlite3ExprFunction(pParse, pList, _stack[_idx + -1].minor.yy0.eOperator);
            if (_stack[_idx + -1].minor.yy0.not) gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK_NOT, gotoMinor.yy0.pExpr, 0, 0);
            gotoMinor.yy0.zStart = _stack[_idx + -2].minor.yy0.zStart; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.zEnd;
            if (gotoMinor.yy0.pExpr != null) gotoMinor.yy0.pExpr.flags |= EP_InfixFunc;
            }
              break;
            case 211: /* expr ::= expr likeop expr ESCAPE expr */
            {

            var pList = sqlite3ExprListAppend(pParse, 0, _stack[_idx + -2].minor.yy0.pExpr);
            pList = sqlite3ExprListAppend(pParse, pList, _stack[_idx + -4].minor.yy0.pExpr);
            pList = sqlite3ExprListAppend(pParse, pList, _stack[_idx + 0].minor.yy0.pExpr);
            gotoMinor.yy0.pExpr = sqlite3ExprFunction(pParse, pList, _stack[_idx + -3].minor.yy0.eOperator);
            if (_stack[_idx + -3].minor.yy0.not) gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK_NOT, gotoMinor.yy0.pExpr, 0, 0);
            gotoMinor.yy0.zStart = _stack[_idx + -4].minor.yy0.zStart; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.zEnd;
            if (gotoMinor.yy0.pExpr != null) gotoMinor.yy0.pExpr.flags |= EP_InfixFunc;
            }
              break;
            case 212: /* expr ::= expr ISNULL|NOTNULL */
            {
             spanUnaryPostfix(gotoMinor.yy0, pParse, _stack[_idx + 0].major, _stack[_idx + -1].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 213: /* expr ::= expr NOT NULL */
            {
             spanUnaryPostfix(gotoMinor.yy0, pParse, TK.NOTNULL, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0);
            }
              break;
            case 214: /* expr ::= expr IS expr */
            {
             spanBinaryExpr(gotoMinor.yy0, pParse, TK.IS, _stack[_idx + -2].minor.yy0, _stack[_idx + 0].minor.yy0); binaryToUnaryIfNull(pParse, _stack[_idx + 0].minor.yy0.pExpr, gotoMinor.yy0.pExpr, TK.ISNULL);
            }
              break;
            case 215: /* expr ::= expr IS NOT expr */
            {
             spanBinaryExpr(gotoMinor.yy0, pParse, TK.ISNOT, _stack[_idx + -3].minor.yy0, _stack[_idx + 0].minor.yy0); binaryToUnaryIfNull(pParse, _stack[_idx + 0].minor.yy0.pExpr, gotoMinor.yy0.pExpr, TK.NOTNULL);
            }
              break;
            case 216: /* expr ::= NOT expr */
            case 217: /* expr ::= BITNOT expr */
            {
             spanUnaryPrefix(gotoMinor.yy0, pParse, _stack[_idx + -1].major, _stack[_idx + 0].minor.yy0, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 218: /* expr ::= MINUS expr */
            {
             spanUnaryPrefix(gotoMinor.yy0, pParse, TK.UMINUS, _stack[_idx + 0].minor.yy0, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 219: /* expr ::= PLUS expr */
            {
             spanUnaryPrefix(gotoMinor.yy0, pParse, TK.UPLUS, _stack[_idx + 0].minor.yy0, _stack[_idx + -1].minor.yy0);
            }
              break;
            case 222: /* expr ::= expr between_op expr AND expr */
            {

            var pList = sqlite3ExprListAppend(pParse, 0, _stack[_idx + -2].minor.yy0.pExpr);
            pList = sqlite3ExprListAppend(pParse, pList, _stack[_idx + 0].minor.yy0.pExpr);
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.BETWEEN, _stack[_idx + -4].minor.yy0.pExpr, 0, 0);
            if (gotoMinor.yy0.pExpr != null) gotoMinor.yy0.pExpr.x.pList = pList;
            else sqlite3ExprListDelete(pParse.db, pList);
            if (_stack[_idx + -3].minor.yy0 != 0) gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.NOT, gotoMinor.yy0.pExpr, 0, 0);
            gotoMinor.yy0.zStart = _stack[_idx + -4].minor.yy0.zStart; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.zEnd;

            }
              break;
            case 225: /* expr ::= expr in_op LP exprlist RP */
            {

            if (_stack[_idx + -1].minor.yy0 == null) {
            // Expressions of the form
            //      expr1 IN ()
            //      expr1 NOT IN ()
            // simplify to constants 0 (false) and 1 (true), respectively,  regardless of the value of expr1.
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.INTEGER, 0, 0, sqlite3IntTokens[_stack[_idx + -3].minor.yy0]);
            sqlite3ExprDelete(pParse.db, _stack[_idx + -4].minor.yy0.pExpr);
            } else {
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.IN, _stack[_idx + -4].minor.yy0.pExpr, 0, 0);
            if (gotoMinor.yy0.pExpr != null) { gotoMinor.yy0.pExpr.x.pList = _stack[_idx + -1].minor.yy0; sqlite3ExprSetHeight(pParse, gotoMinor.yy0.pExpr); }
            else sqlite3ExprListDelete(pParse.db, ref _stack[_idx + -1].minor.yy0);
            if (_stack[_idx + -3].minor.yy0 != 0) gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.NOT, gotoMinor.yy0.pExpr, 0, 0);
            }
            gotoMinor.yy0.zStart = _stack[_idx + -4].minor.yy0.zStart; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.z.Substring(_stack[_idx + 0].minor.yy0.n);
            }
              break;
            case 226: /* expr ::= LP select RP */
            {

            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.SELECT, 0, 0, 0);
            if (gotoMinor.yy0.pExpr != null) { gotoMinor.yy0.pExpr.x.pSelect = _stack[_idx + -1].minor.yy0; Expr.ExprSetProperty(gotoMinor.yy0.pExpr, EP_xIsSelect); sqlite3ExprSetHeight(pParse, gotoMinor.yy0.pExpr); }
            else sqlite3SelectDelete(pParse.db, ref _stack[_idx + -1].minor.yy0);
            gotoMinor.yy0.zStart = _stack[_idx + -2].minor.yy0.z; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.z.Substring(_stack[_idx + 0].minor.yy0.n);
            }
              break;
            case 227: /* expr ::= expr in_op LP select RP */
            {

            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.IN, _stack[_idx + -4].minor.yy0.pExpr, 0, 0);
            if (gotoMinor.yy0.pExpr != null) { gotoMinor.yy0.pExpr.x.pSelect = _stack[_idx + -1].minor.yy0; Expr.ExprSetProperty(gotoMinor.yy0.pExpr, EP_xIsSelect); sqlite3ExprSetHeight(pParse, gotoMinor.yy0.pExpr);
            else sqlite3SelectDelete(pParse.db, ref _stack[_idx + -1].minor.yy0);
            if (_stack[_idx + -3].minor.yy0 != 0) gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.NOT, gotoMinor.yy0.pExpr, 0, 0);
            gotoMinor.yy0.zStart = _stack[_idx + -4].minor.yy0.zStart; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.z.Substring(_stack[_idx + 0].minor.yy0.n);
            }
            expr(gotoMinor.yy0) ::= expr(_stack[_idx + -4].minor.yy0) in_op(_stack[_idx + -3].minor.yy0) nm(_stack[_idx + -1].minor.yy0) dbnm(Z). [IN] {
            var pSrc = sqlite3SrcListAppend(pParse.db, 0, _stack[_idx + -1].minor.yy0, Z);
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.IN, _stack[_idx + -4].minor.yy0.pExpr, 0, 0);
            if (gotoMinor.yy0.pExpr != null) { gotoMinor.yy0.pExpr.x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); Expr.ExprSetProperty(gotoMinor.yy0.pExpr, EP_xIsSelect); sqlite3ExprSetHeight(pParse, gotoMinor.yy0.pExpr); }
            else sqlite3SrcListDelete(pParse.db, ref pSrc);
            if (_stack[_idx + -3].minor.yy0 != 0) gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.NOT, gotoMinor.yy0.pExpr, 0, 0);
            gotoMinor.yy0.zStart = _stack[_idx + -4].minor.yy0.zStart; gotoMinor.yy0.zEnd = (Z.z != null ? Z.z.Substring(Z.n) : _stack[_idx + -1].minor.yy0.z.Substring(_stack[_idx + -1].minor.yy0.n));
            }
            expr(gotoMinor.yy0) ::= EXISTS(B) LP select(_stack[_idx + -1].minor.yy0) RP(_stack[_idx + 0].minor.yy0). {
            var p = gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.EXISTS, 0, 0, 0);
            if (p != null) { p.x.pSelect = _stack[_idx + -1].minor.yy0; Expr.ExprSetProperty(p, EP_xIsSelect); sqlite3ExprSetHeight(pParse, p); }
            else sqlite3SelectDelete(pParse.db, ref _stack[_idx + -1].minor.yy0);
            gotoMinor.yy0.zStart = B.z; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.z.Substring(_stack[_idx + 0].minor.yy0.n);
            }
            // CASE expressions
            expr(gotoMinor.yy0) ::= CASE(C) case_operand(_stack[_idx + -4].minor.yy0) case_exprlist(_stack[_idx + -1].minor.yy0) case_else(Z) END(_stack[_idx + 0].minor.yy0). {
            gotoMinor.yy0.pExpr = sqlite3PExpr(pParse, TK.CASE, _stack[_idx + -4].minor.yy0, Z, 0);
            if (gotoMinor.yy0.pExpr != null) { gotoMinor.yy0.pExpr.x.pList = _stack[_idx + -1].minor.yy0; sqlite3ExprSetHeight(pParse, gotoMinor.yy0.pExpr); }
            else sqlite3ExprListDelete(pParse.db, _stack[_idx + -1].minor.yy0);
            gotoMinor.yy0.zStart = C.z; gotoMinor.yy0.zEnd = _stack[_idx + 0].minor.yy0.z.Substring(_stack[_idx + 0].minor.yy0.n);
            }
Пример #2
0
 /*
 ** Set the ExprList.a[].zSpan element of the most recently added item
 ** on the expression list.
 **
 ** pList might be NULL following an OOM error.  But pSpan should never be
 ** NULL.  If a memory allocation fails, the pParse.db.mallocFailed flag
 ** is set.
 */
 static void sqlite3ExprListSetSpan(
 Parse pParse,          /* Parsing context */
 ExprList pList,        /* List to which to add the span. */
 ExprSpan pSpan         /* The span to be added */
 )
 {
     sqlite3 db = pParse.db;
     Debug.Assert(pList != null /*|| db.mallocFailed != 0 */ );
     if (pList != null)
     {
         ExprList_item pItem = pList.a[pList.nExpr - 1];
         Debug.Assert(pList.nExpr > 0);
         Debug.Assert( /* db.mallocFailed != 0 || */ pItem.pExpr == pSpan.pExpr);
         sqlite3DbFree(db, ref pItem.zSpan);
         pItem.zSpan = pSpan.zStart.Substring(0, pSpan.zStart.Length <= pSpan.zEnd.Length ? pSpan.zStart.Length : pSpan.zStart.Length - pSpan.zEnd.Length);// sqlite3DbStrNDup( db, pSpan.zStart,
         //(int)( pSpan.zEnd- pSpan.zStart) );
     }
 }