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