| | @@ -1,8 +1,8 @@ |
| 1 | 1 | /****************************************************************************** |
| 2 | 2 | ** This file is an amalgamation of many separate C source files from SQLite |
| 3 | | -** version 3.17.0. By combining all the individual C code files into this |
| 3 | +** version 3.18.0. By combining all the individual C code files into this |
| 4 | 4 | ** single large file, the entire code can be compiled as a single translation |
| 5 | 5 | ** unit. This allows many compilers to do optimizations that would not be |
| 6 | 6 | ** possible if the files were compiled separately. Performance improvements |
| 7 | 7 | ** of 5% or more are commonly seen when SQLite is compiled as a single |
| 8 | 8 | ** translation unit. |
| | @@ -396,13 +396,13 @@ |
| 396 | 396 | ** |
| 397 | 397 | ** See also: [sqlite3_libversion()], |
| 398 | 398 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 399 | 399 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 400 | 400 | */ |
| 401 | | -#define SQLITE_VERSION "3.17.0" |
| 402 | | -#define SQLITE_VERSION_NUMBER 3017000 |
| 403 | | -#define SQLITE_SOURCE_ID "2017-02-13 16:02:40 ada05cfa86ad7f5645450ac7a2a21c9aa6e57d2c" |
| 401 | +#define SQLITE_VERSION "3.18.0" |
| 402 | +#define SQLITE_VERSION_NUMBER 3018000 |
| 403 | +#define SQLITE_SOURCE_ID "2017-02-23 02:15:33 7a959f6d1ea038988cdb4c02d6f37abaec2580a0" |
| 404 | 404 | |
| 405 | 405 | /* |
| 406 | 406 | ** CAPI3REF: Run-Time Library Version Numbers |
| 407 | 407 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 408 | 408 | ** |
| | @@ -12457,10 +12457,11 @@ |
| 12457 | 12457 | SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); |
| 12458 | 12458 | SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); |
| 12459 | 12459 | |
| 12460 | 12460 | SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); |
| 12461 | 12461 | SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); |
| 12462 | +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor*); |
| 12462 | 12463 | |
| 12463 | 12464 | #ifndef SQLITE_OMIT_INCRBLOB |
| 12464 | 12465 | SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor*, u32 offset, u32 amt, void*); |
| 12465 | 12466 | SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); |
| 12466 | 12467 | SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *); |
| | @@ -12757,117 +12758,119 @@ |
| 12757 | 12758 | #define OP_Divide 50 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ |
| 12758 | 12759 | #define OP_Remainder 51 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ |
| 12759 | 12760 | #define OP_Concat 52 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ |
| 12760 | 12761 | #define OP_Last 53 |
| 12761 | 12762 | #define OP_BitNot 54 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */ |
| 12762 | | -#define OP_SorterSort 55 |
| 12763 | | -#define OP_Sort 56 |
| 12764 | | -#define OP_Rewind 57 |
| 12765 | | -#define OP_IdxLE 58 /* synopsis: key=r[P3@P4] */ |
| 12766 | | -#define OP_IdxGT 59 /* synopsis: key=r[P3@P4] */ |
| 12767 | | -#define OP_IdxLT 60 /* synopsis: key=r[P3@P4] */ |
| 12768 | | -#define OP_IdxGE 61 /* synopsis: key=r[P3@P4] */ |
| 12769 | | -#define OP_RowSetRead 62 /* synopsis: r[P3]=rowset(P1) */ |
| 12770 | | -#define OP_RowSetTest 63 /* synopsis: if r[P3] in rowset(P1) goto P2 */ |
| 12771 | | -#define OP_Program 64 |
| 12772 | | -#define OP_FkIfZero 65 /* synopsis: if fkctr[P1]==0 goto P2 */ |
| 12773 | | -#define OP_IfPos 66 /* synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ |
| 12774 | | -#define OP_IfNotZero 67 /* synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ |
| 12775 | | -#define OP_DecrJumpZero 68 /* synopsis: if (--r[P1])==0 goto P2 */ |
| 12776 | | -#define OP_IncrVacuum 69 |
| 12777 | | -#define OP_VNext 70 |
| 12778 | | -#define OP_Init 71 /* synopsis: Start at P2 */ |
| 12779 | | -#define OP_Return 72 |
| 12780 | | -#define OP_EndCoroutine 73 |
| 12781 | | -#define OP_HaltIfNull 74 /* synopsis: if r[P3]=null halt */ |
| 12782 | | -#define OP_Halt 75 |
| 12783 | | -#define OP_Integer 76 /* synopsis: r[P2]=P1 */ |
| 12784 | | -#define OP_Int64 77 /* synopsis: r[P2]=P4 */ |
| 12785 | | -#define OP_String 78 /* synopsis: r[P2]='P4' (len=P1) */ |
| 12786 | | -#define OP_Null 79 /* synopsis: r[P2..P3]=NULL */ |
| 12787 | | -#define OP_SoftNull 80 /* synopsis: r[P1]=NULL */ |
| 12788 | | -#define OP_Blob 81 /* synopsis: r[P2]=P4 (len=P1) */ |
| 12789 | | -#define OP_Variable 82 /* synopsis: r[P2]=parameter(P1,P4) */ |
| 12790 | | -#define OP_Move 83 /* synopsis: r[P2@P3]=r[P1@P3] */ |
| 12791 | | -#define OP_Copy 84 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ |
| 12792 | | -#define OP_SCopy 85 /* synopsis: r[P2]=r[P1] */ |
| 12793 | | -#define OP_IntCopy 86 /* synopsis: r[P2]=r[P1] */ |
| 12794 | | -#define OP_ResultRow 87 /* synopsis: output=r[P1@P2] */ |
| 12795 | | -#define OP_CollSeq 88 |
| 12796 | | -#define OP_Function0 89 /* synopsis: r[P3]=func(r[P2@P5]) */ |
| 12797 | | -#define OP_Function 90 /* synopsis: r[P3]=func(r[P2@P5]) */ |
| 12798 | | -#define OP_AddImm 91 /* synopsis: r[P1]=r[P1]+P2 */ |
| 12799 | | -#define OP_RealAffinity 92 |
| 12800 | | -#define OP_Cast 93 /* synopsis: affinity(r[P1]) */ |
| 12801 | | -#define OP_Permutation 94 |
| 12802 | | -#define OP_Compare 95 /* synopsis: r[P1@P3] <-> r[P2@P3] */ |
| 12803 | | -#define OP_Column 96 /* synopsis: r[P3]=PX */ |
| 12763 | +#define OP_IfSmaller 55 |
| 12764 | +#define OP_SorterSort 56 |
| 12765 | +#define OP_Sort 57 |
| 12766 | +#define OP_Rewind 58 |
| 12767 | +#define OP_IdxLE 59 /* synopsis: key=r[P3@P4] */ |
| 12768 | +#define OP_IdxGT 60 /* synopsis: key=r[P3@P4] */ |
| 12769 | +#define OP_IdxLT 61 /* synopsis: key=r[P3@P4] */ |
| 12770 | +#define OP_IdxGE 62 /* synopsis: key=r[P3@P4] */ |
| 12771 | +#define OP_RowSetRead 63 /* synopsis: r[P3]=rowset(P1) */ |
| 12772 | +#define OP_RowSetTest 64 /* synopsis: if r[P3] in rowset(P1) goto P2 */ |
| 12773 | +#define OP_Program 65 |
| 12774 | +#define OP_FkIfZero 66 /* synopsis: if fkctr[P1]==0 goto P2 */ |
| 12775 | +#define OP_IfPos 67 /* synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ |
| 12776 | +#define OP_IfNotZero 68 /* synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ |
| 12777 | +#define OP_DecrJumpZero 69 /* synopsis: if (--r[P1])==0 goto P2 */ |
| 12778 | +#define OP_IncrVacuum 70 |
| 12779 | +#define OP_VNext 71 |
| 12780 | +#define OP_Init 72 /* synopsis: Start at P2 */ |
| 12781 | +#define OP_Return 73 |
| 12782 | +#define OP_EndCoroutine 74 |
| 12783 | +#define OP_HaltIfNull 75 /* synopsis: if r[P3]=null halt */ |
| 12784 | +#define OP_Halt 76 |
| 12785 | +#define OP_Integer 77 /* synopsis: r[P2]=P1 */ |
| 12786 | +#define OP_Int64 78 /* synopsis: r[P2]=P4 */ |
| 12787 | +#define OP_String 79 /* synopsis: r[P2]='P4' (len=P1) */ |
| 12788 | +#define OP_Null 80 /* synopsis: r[P2..P3]=NULL */ |
| 12789 | +#define OP_SoftNull 81 /* synopsis: r[P1]=NULL */ |
| 12790 | +#define OP_Blob 82 /* synopsis: r[P2]=P4 (len=P1) */ |
| 12791 | +#define OP_Variable 83 /* synopsis: r[P2]=parameter(P1,P4) */ |
| 12792 | +#define OP_Move 84 /* synopsis: r[P2@P3]=r[P1@P3] */ |
| 12793 | +#define OP_Copy 85 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ |
| 12794 | +#define OP_SCopy 86 /* synopsis: r[P2]=r[P1] */ |
| 12795 | +#define OP_IntCopy 87 /* synopsis: r[P2]=r[P1] */ |
| 12796 | +#define OP_ResultRow 88 /* synopsis: output=r[P1@P2] */ |
| 12797 | +#define OP_CollSeq 89 |
| 12798 | +#define OP_Function0 90 /* synopsis: r[P3]=func(r[P2@P5]) */ |
| 12799 | +#define OP_Function 91 /* synopsis: r[P3]=func(r[P2@P5]) */ |
| 12800 | +#define OP_AddImm 92 /* synopsis: r[P1]=r[P1]+P2 */ |
| 12801 | +#define OP_RealAffinity 93 |
| 12802 | +#define OP_Cast 94 /* synopsis: affinity(r[P1]) */ |
| 12803 | +#define OP_Permutation 95 |
| 12804 | +#define OP_Compare 96 /* synopsis: r[P1@P3] <-> r[P2@P3] */ |
| 12804 | 12805 | #define OP_String8 97 /* same as TK_STRING, synopsis: r[P2]='P4' */ |
| 12805 | | -#define OP_Affinity 98 /* synopsis: affinity(r[P1@P2]) */ |
| 12806 | | -#define OP_MakeRecord 99 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ |
| 12807 | | -#define OP_Count 100 /* synopsis: r[P2]=count() */ |
| 12808 | | -#define OP_ReadCookie 101 |
| 12809 | | -#define OP_SetCookie 102 |
| 12810 | | -#define OP_ReopenIdx 103 /* synopsis: root=P2 iDb=P3 */ |
| 12811 | | -#define OP_OpenRead 104 /* synopsis: root=P2 iDb=P3 */ |
| 12812 | | -#define OP_OpenWrite 105 /* synopsis: root=P2 iDb=P3 */ |
| 12813 | | -#define OP_OpenAutoindex 106 /* synopsis: nColumn=P2 */ |
| 12814 | | -#define OP_OpenEphemeral 107 /* synopsis: nColumn=P2 */ |
| 12815 | | -#define OP_SorterOpen 108 |
| 12816 | | -#define OP_SequenceTest 109 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ |
| 12817 | | -#define OP_OpenPseudo 110 /* synopsis: P3 columns in r[P2] */ |
| 12818 | | -#define OP_Close 111 |
| 12819 | | -#define OP_ColumnsUsed 112 |
| 12820 | | -#define OP_Sequence 113 /* synopsis: r[P2]=cursor[P1].ctr++ */ |
| 12821 | | -#define OP_NewRowid 114 /* synopsis: r[P2]=rowid */ |
| 12822 | | -#define OP_Insert 115 /* synopsis: intkey=r[P3] data=r[P2] */ |
| 12823 | | -#define OP_InsertInt 116 /* synopsis: intkey=P3 data=r[P2] */ |
| 12824 | | -#define OP_Delete 117 |
| 12825 | | -#define OP_ResetCount 118 |
| 12826 | | -#define OP_SorterCompare 119 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ |
| 12827 | | -#define OP_SorterData 120 /* synopsis: r[P2]=data */ |
| 12828 | | -#define OP_RowData 121 /* synopsis: r[P2]=data */ |
| 12829 | | -#define OP_Rowid 122 /* synopsis: r[P2]=rowid */ |
| 12830 | | -#define OP_NullRow 123 |
| 12831 | | -#define OP_SorterInsert 124 /* synopsis: key=r[P2] */ |
| 12832 | | -#define OP_IdxInsert 125 /* synopsis: key=r[P2] */ |
| 12833 | | -#define OP_IdxDelete 126 /* synopsis: key=r[P2@P3] */ |
| 12834 | | -#define OP_Seek 127 /* synopsis: Move P3 to P1.rowid */ |
| 12835 | | -#define OP_IdxRowid 128 /* synopsis: r[P2]=rowid */ |
| 12836 | | -#define OP_Destroy 129 |
| 12837 | | -#define OP_Clear 130 |
| 12838 | | -#define OP_ResetSorter 131 |
| 12806 | +#define OP_Column 98 /* synopsis: r[P3]=PX */ |
| 12807 | +#define OP_Affinity 99 /* synopsis: affinity(r[P1@P2]) */ |
| 12808 | +#define OP_MakeRecord 100 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ |
| 12809 | +#define OP_Count 101 /* synopsis: r[P2]=count() */ |
| 12810 | +#define OP_ReadCookie 102 |
| 12811 | +#define OP_SetCookie 103 |
| 12812 | +#define OP_ReopenIdx 104 /* synopsis: root=P2 iDb=P3 */ |
| 12813 | +#define OP_OpenRead 105 /* synopsis: root=P2 iDb=P3 */ |
| 12814 | +#define OP_OpenWrite 106 /* synopsis: root=P2 iDb=P3 */ |
| 12815 | +#define OP_OpenAutoindex 107 /* synopsis: nColumn=P2 */ |
| 12816 | +#define OP_OpenEphemeral 108 /* synopsis: nColumn=P2 */ |
| 12817 | +#define OP_SorterOpen 109 |
| 12818 | +#define OP_SequenceTest 110 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ |
| 12819 | +#define OP_OpenPseudo 111 /* synopsis: P3 columns in r[P2] */ |
| 12820 | +#define OP_Close 112 |
| 12821 | +#define OP_ColumnsUsed 113 |
| 12822 | +#define OP_Sequence 114 /* synopsis: r[P2]=cursor[P1].ctr++ */ |
| 12823 | +#define OP_NewRowid 115 /* synopsis: r[P2]=rowid */ |
| 12824 | +#define OP_Insert 116 /* synopsis: intkey=r[P3] data=r[P2] */ |
| 12825 | +#define OP_InsertInt 117 /* synopsis: intkey=P3 data=r[P2] */ |
| 12826 | +#define OP_Delete 118 |
| 12827 | +#define OP_ResetCount 119 |
| 12828 | +#define OP_SorterCompare 120 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ |
| 12829 | +#define OP_SorterData 121 /* synopsis: r[P2]=data */ |
| 12830 | +#define OP_RowData 122 /* synopsis: r[P2]=data */ |
| 12831 | +#define OP_Rowid 123 /* synopsis: r[P2]=rowid */ |
| 12832 | +#define OP_NullRow 124 |
| 12833 | +#define OP_SorterInsert 125 /* synopsis: key=r[P2] */ |
| 12834 | +#define OP_IdxInsert 126 /* synopsis: key=r[P2] */ |
| 12835 | +#define OP_IdxDelete 127 /* synopsis: key=r[P2@P3] */ |
| 12836 | +#define OP_Seek 128 /* synopsis: Move P3 to P1.rowid */ |
| 12837 | +#define OP_IdxRowid 129 /* synopsis: r[P2]=rowid */ |
| 12838 | +#define OP_Destroy 130 |
| 12839 | +#define OP_Clear 131 |
| 12839 | 12840 | #define OP_Real 132 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ |
| 12840 | | -#define OP_CreateIndex 133 /* synopsis: r[P2]=root iDb=P1 */ |
| 12841 | | -#define OP_CreateTable 134 /* synopsis: r[P2]=root iDb=P1 */ |
| 12842 | | -#define OP_ParseSchema 135 |
| 12843 | | -#define OP_LoadAnalysis 136 |
| 12844 | | -#define OP_DropTable 137 |
| 12845 | | -#define OP_DropIndex 138 |
| 12846 | | -#define OP_DropTrigger 139 |
| 12847 | | -#define OP_IntegrityCk 140 |
| 12848 | | -#define OP_RowSetAdd 141 /* synopsis: rowset(P1)=r[P2] */ |
| 12849 | | -#define OP_Param 142 |
| 12850 | | -#define OP_FkCounter 143 /* synopsis: fkctr[P1]+=P2 */ |
| 12851 | | -#define OP_MemMax 144 /* synopsis: r[P1]=max(r[P1],r[P2]) */ |
| 12852 | | -#define OP_OffsetLimit 145 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ |
| 12853 | | -#define OP_AggStep0 146 /* synopsis: accum=r[P3] step(r[P2@P5]) */ |
| 12854 | | -#define OP_AggStep 147 /* synopsis: accum=r[P3] step(r[P2@P5]) */ |
| 12855 | | -#define OP_AggFinal 148 /* synopsis: accum=r[P1] N=P2 */ |
| 12856 | | -#define OP_Expire 149 |
| 12857 | | -#define OP_TableLock 150 /* synopsis: iDb=P1 root=P2 write=P3 */ |
| 12858 | | -#define OP_VBegin 151 |
| 12859 | | -#define OP_VCreate 152 |
| 12860 | | -#define OP_VDestroy 153 |
| 12861 | | -#define OP_VOpen 154 |
| 12862 | | -#define OP_VColumn 155 /* synopsis: r[P3]=vcolumn(P2) */ |
| 12863 | | -#define OP_VRename 156 |
| 12864 | | -#define OP_Pagecount 157 |
| 12865 | | -#define OP_MaxPgcnt 158 |
| 12866 | | -#define OP_CursorHint 159 |
| 12867 | | -#define OP_Noop 160 |
| 12868 | | -#define OP_Explain 161 |
| 12841 | +#define OP_ResetSorter 133 |
| 12842 | +#define OP_CreateIndex 134 /* synopsis: r[P2]=root iDb=P1 */ |
| 12843 | +#define OP_CreateTable 135 /* synopsis: r[P2]=root iDb=P1 */ |
| 12844 | +#define OP_SqlExec 136 |
| 12845 | +#define OP_ParseSchema 137 |
| 12846 | +#define OP_LoadAnalysis 138 |
| 12847 | +#define OP_DropTable 139 |
| 12848 | +#define OP_DropIndex 140 |
| 12849 | +#define OP_DropTrigger 141 |
| 12850 | +#define OP_IntegrityCk 142 |
| 12851 | +#define OP_RowSetAdd 143 /* synopsis: rowset(P1)=r[P2] */ |
| 12852 | +#define OP_Param 144 |
| 12853 | +#define OP_FkCounter 145 /* synopsis: fkctr[P1]+=P2 */ |
| 12854 | +#define OP_MemMax 146 /* synopsis: r[P1]=max(r[P1],r[P2]) */ |
| 12855 | +#define OP_OffsetLimit 147 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ |
| 12856 | +#define OP_AggStep0 148 /* synopsis: accum=r[P3] step(r[P2@P5]) */ |
| 12857 | +#define OP_AggStep 149 /* synopsis: accum=r[P3] step(r[P2@P5]) */ |
| 12858 | +#define OP_AggFinal 150 /* synopsis: accum=r[P1] N=P2 */ |
| 12859 | +#define OP_Expire 151 |
| 12860 | +#define OP_TableLock 152 /* synopsis: iDb=P1 root=P2 write=P3 */ |
| 12861 | +#define OP_VBegin 153 |
| 12862 | +#define OP_VCreate 154 |
| 12863 | +#define OP_VDestroy 155 |
| 12864 | +#define OP_VOpen 156 |
| 12865 | +#define OP_VColumn 157 /* synopsis: r[P3]=vcolumn(P2) */ |
| 12866 | +#define OP_VRename 158 |
| 12867 | +#define OP_Pagecount 159 |
| 12868 | +#define OP_MaxPgcnt 160 |
| 12869 | +#define OP_CursorHint 161 |
| 12870 | +#define OP_Noop 162 |
| 12871 | +#define OP_Explain 163 |
| 12869 | 12872 | |
| 12870 | 12873 | /* Properties such as "out2" or "jump" that are specified in |
| 12871 | 12874 | ** comments following the "case" for each opcode in the vdbe.c |
| 12872 | 12875 | ** are encoded into bitvectors as follows: |
| 12873 | 12876 | */ |
| | @@ -12883,32 +12886,32 @@ |
| 12883 | 12886 | /* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0x03, 0x03, 0x09,\ |
| 12884 | 12887 | /* 24 */ 0x09, 0x09, 0x09, 0x26, 0x26, 0x09, 0x09, 0x09,\ |
| 12885 | 12888 | /* 32 */ 0x09, 0x09, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ |
| 12886 | 12889 | /* 40 */ 0x0b, 0x0b, 0x01, 0x26, 0x26, 0x26, 0x26, 0x26,\ |
| 12887 | 12890 | /* 48 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x01, 0x12, 0x01,\ |
| 12888 | | -/* 56 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x23, 0x0b,\ |
| 12889 | | -/* 64 */ 0x01, 0x01, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01,\ |
| 12890 | | -/* 72 */ 0x02, 0x02, 0x08, 0x00, 0x10, 0x10, 0x10, 0x10,\ |
| 12891 | | -/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00,\ |
| 12892 | | -/* 88 */ 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00,\ |
| 12893 | | -/* 96 */ 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ |
| 12891 | +/* 56 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x23,\ |
| 12892 | +/* 64 */ 0x0b, 0x01, 0x01, 0x03, 0x03, 0x03, 0x01, 0x01,\ |
| 12893 | +/* 72 */ 0x01, 0x02, 0x02, 0x08, 0x00, 0x10, 0x10, 0x10,\ |
| 12894 | +/* 80 */ 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10,\ |
| 12895 | +/* 88 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00,\ |
| 12896 | +/* 96 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ |
| 12894 | 12897 | /* 104 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 12895 | | -/* 112 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 12896 | | -/* 120 */ 0x00, 0x00, 0x10, 0x00, 0x04, 0x04, 0x00, 0x00,\ |
| 12897 | | -/* 128 */ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00,\ |
| 12898 | | -/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00,\ |
| 12899 | | -/* 144 */ 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ |
| 12900 | | -/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ |
| 12901 | | -/* 160 */ 0x00, 0x00,} |
| 12898 | +/* 112 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,\ |
| 12899 | +/* 120 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x04, 0x00,\ |
| 12900 | +/* 128 */ 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10,\ |
| 12901 | +/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,\ |
| 12902 | +/* 144 */ 0x10, 0x00, 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00,\ |
| 12903 | +/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ |
| 12904 | +/* 160 */ 0x10, 0x00, 0x00, 0x00,} |
| 12902 | 12905 | |
| 12903 | 12906 | /* The sqlite3P2Values() routine is able to run faster if it knows |
| 12904 | 12907 | ** the value of the largest JUMP opcode. The smaller the maximum |
| 12905 | 12908 | ** JUMP opcode the better, so the mkopcodeh.tcl script that |
| 12906 | 12909 | ** generated this include file strives to group all JUMP opcodes |
| 12907 | 12910 | ** together near the beginning of the list. |
| 12908 | 12911 | */ |
| 12909 | | -#define SQLITE_MX_JUMP_OPCODE 71 /* Maximum JUMP opcode */ |
| 12912 | +#define SQLITE_MX_JUMP_OPCODE 72 /* Maximum JUMP opcode */ |
| 12910 | 12913 | |
| 12911 | 12914 | /************** End of opcodes.h *********************************************/ |
| 12912 | 12915 | /************** Continuing where we left off in vdbe.h ***********************/ |
| 12913 | 12916 | |
| 12914 | 12917 | /* |
| | @@ -14074,10 +14077,11 @@ |
| 14074 | 14077 | u8 suppressErr; /* Do not issue error messages if true */ |
| 14075 | 14078 | u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ |
| 14076 | 14079 | u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ |
| 14077 | 14080 | u8 mTrace; /* zero or more SQLITE_TRACE flags */ |
| 14078 | 14081 | u8 skipBtreeMutex; /* True if no shared-cache backends */ |
| 14082 | + u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ |
| 14079 | 14083 | int nextPagesize; /* Pagesize after VACUUM if >0 */ |
| 14080 | 14084 | u32 magic; /* Magic number for detect library misuse */ |
| 14081 | 14085 | int nChange; /* Value returned by sqlite3_changes() */ |
| 14082 | 14086 | int nTotalChange; /* Value returned by sqlite3_total_changes() */ |
| 14083 | 14087 | int aLimit[SQLITE_N_LIMIT]; /* Limits */ |
| | @@ -14589,18 +14593,18 @@ |
| 14589 | 14593 | char *zColAff; /* String defining the affinity of each column */ |
| 14590 | 14594 | ExprList *pCheck; /* All CHECK constraints */ |
| 14591 | 14595 | /* ... also used as column name list in a VIEW */ |
| 14592 | 14596 | int tnum; /* Root BTree page for this table */ |
| 14593 | 14597 | u32 nTabRef; /* Number of pointers to this Table */ |
| 14598 | + u32 tabFlags; /* Mask of TF_* values */ |
| 14594 | 14599 | i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ |
| 14595 | 14600 | i16 nCol; /* Number of columns in this table */ |
| 14596 | 14601 | LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ |
| 14597 | 14602 | LogEst szTabRow; /* Estimated size of each table row in bytes */ |
| 14598 | 14603 | #ifdef SQLITE_ENABLE_COSTMULT |
| 14599 | 14604 | LogEst costMult; /* Cost multiplier for using this table */ |
| 14600 | 14605 | #endif |
| 14601 | | - u8 tabFlags; /* Mask of TF_* values */ |
| 14602 | 14606 | u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ |
| 14603 | 14607 | #ifndef SQLITE_OMIT_ALTERTABLE |
| 14604 | 14608 | int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ |
| 14605 | 14609 | #endif |
| 14606 | 14610 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| | @@ -14620,27 +14624,29 @@ |
| 14620 | 14624 | ** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING |
| 14621 | 14625 | ** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden, |
| 14622 | 14626 | ** the TF_OOOHidden attribute would apply in this case. Such tables require |
| 14623 | 14627 | ** special handling during INSERT processing. |
| 14624 | 14628 | */ |
| 14625 | | -#define TF_Readonly 0x01 /* Read-only system table */ |
| 14626 | | -#define TF_Ephemeral 0x02 /* An ephemeral table */ |
| 14627 | | -#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ |
| 14628 | | -#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ |
| 14629 | | -#define TF_Virtual 0x10 /* Is a virtual table */ |
| 14630 | | -#define TF_WithoutRowid 0x20 /* No rowid. PRIMARY KEY is the key */ |
| 14631 | | -#define TF_NoVisibleRowid 0x40 /* No user-visible "rowid" column */ |
| 14632 | | -#define TF_OOOHidden 0x80 /* Out-of-Order hidden columns */ |
| 14633 | | - |
| 14629 | +#define TF_Readonly 0x0001 /* Read-only system table */ |
| 14630 | +#define TF_Ephemeral 0x0002 /* An ephemeral table */ |
| 14631 | +#define TF_HasPrimaryKey 0x0004 /* Table has a primary key */ |
| 14632 | +#define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */ |
| 14633 | +#define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ |
| 14634 | +#define TF_WithoutRowid 0x0020 /* No rowid. PRIMARY KEY is the key */ |
| 14635 | +#define TF_NoVisibleRowid 0x0040 /* No user-visible "rowid" column */ |
| 14636 | +#define TF_OOOHidden 0x0080 /* Out-of-Order hidden columns */ |
| 14637 | +#define TF_StatsUsed 0x0100 /* Query planner decisions affected by |
| 14638 | + ** Index.aiRowLogEst[] values */ |
| 14639 | +#define TF_HasNotNull 0x0200 /* Contains NOT NULL constraints */ |
| 14634 | 14640 | |
| 14635 | 14641 | /* |
| 14636 | 14642 | ** Test to see whether or not a table is a virtual table. This is |
| 14637 | 14643 | ** done as a macro so that it will be optimized out when virtual |
| 14638 | 14644 | ** table support is omitted from the build. |
| 14639 | 14645 | */ |
| 14640 | 14646 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 14641 | | -# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) |
| 14647 | +# define IsVirtual(X) ((X)->nModuleArg) |
| 14642 | 14648 | #else |
| 14643 | 14649 | # define IsVirtual(X) 0 |
| 14644 | 14650 | #endif |
| 14645 | 14651 | |
| 14646 | 14652 | /* |
| | @@ -14871,10 +14877,11 @@ |
| 14871 | 14877 | unsigned bUnordered:1; /* Use this index for == or IN queries only */ |
| 14872 | 14878 | unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ |
| 14873 | 14879 | unsigned isResized:1; /* True if resizeIndexObject() has been called */ |
| 14874 | 14880 | unsigned isCovering:1; /* True if this is a covering index */ |
| 14875 | 14881 | unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ |
| 14882 | + unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ |
| 14876 | 14883 | #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 14877 | 14884 | int nSample; /* Number of elements in aSample[] */ |
| 14878 | 14885 | int nSampleCol; /* Size of IndexSample.anEq[] and so on */ |
| 14879 | 14886 | tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ |
| 14880 | 14887 | IndexSample *aSample; /* Samples of the left-most key */ |
| | @@ -15181,11 +15188,11 @@ |
| 15181 | 15188 | ** form is used for name resolution with nested FROM clauses. |
| 15182 | 15189 | */ |
| 15183 | 15190 | struct ExprList { |
| 15184 | 15191 | int nExpr; /* Number of expressions on the list */ |
| 15185 | 15192 | struct ExprList_item { /* For each expression in the list */ |
| 15186 | | - Expr *pExpr; /* The list of expressions */ |
| 15193 | + Expr *pExpr; /* The parse tree for this expression */ |
| 15187 | 15194 | char *zName; /* Token associated with this expression */ |
| 15188 | 15195 | char *zSpan; /* Original text of the expression */ |
| 15189 | 15196 | u8 sortOrder; /* 1 for DESC or 0 for ASC */ |
| 15190 | 15197 | unsigned done :1; /* A flag to indicate when processing is finished */ |
| 15191 | 15198 | unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ |
| | @@ -16504,10 +16511,11 @@ |
| 16504 | 16511 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); |
| 16505 | 16512 | SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*); |
| 16506 | 16513 | SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int); |
| 16507 | 16514 | SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*); |
| 16508 | 16515 | SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*, int); |
| 16516 | +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int); |
| 16509 | 16517 | SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int); |
| 16510 | 16518 | SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Expr*, Expr*, int); |
| 16511 | 16519 | SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); |
| 16512 | 16520 | SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); |
| 16513 | 16521 | SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); |
| | @@ -17450,11 +17458,11 @@ |
| 17450 | 17458 | "COMPILER=gcc-" __VERSION__, |
| 17451 | 17459 | #endif |
| 17452 | 17460 | #if SQLITE_COVERAGE_TEST |
| 17453 | 17461 | "COVERAGE_TEST", |
| 17454 | 17462 | #endif |
| 17455 | | -#if SQLITE_DEBUG |
| 17463 | +#ifdef SQLITE_DEBUG |
| 17456 | 17464 | "DEBUG", |
| 17457 | 17465 | #endif |
| 17458 | 17466 | #if SQLITE_DEFAULT_LOCKING_MODE |
| 17459 | 17467 | "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), |
| 17460 | 17468 | #endif |
| | @@ -24050,12 +24058,12 @@ |
| 24050 | 24058 | #ifdef SQLITE_DEBUG |
| 24051 | 24059 | assert( p->nRef>0 || p->owner==0 ); |
| 24052 | 24060 | p->owner = tid; |
| 24053 | 24061 | p->nRef++; |
| 24054 | 24062 | if( p->trace ){ |
| 24055 | | - OSTRACE(("ENTER-MUTEX tid=%lu, mutex=%p (%d), nRef=%d\n", |
| 24056 | | - tid, p, p->trace, p->nRef)); |
| 24063 | + OSTRACE(("ENTER-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", |
| 24064 | + tid, p->id, p, p->trace, p->nRef)); |
| 24057 | 24065 | } |
| 24058 | 24066 | #endif |
| 24059 | 24067 | } |
| 24060 | 24068 | |
| 24061 | 24069 | static int winMutexTry(sqlite3_mutex *p){ |
| | @@ -24093,12 +24101,12 @@ |
| 24093 | 24101 | #else |
| 24094 | 24102 | UNUSED_PARAMETER(p); |
| 24095 | 24103 | #endif |
| 24096 | 24104 | #ifdef SQLITE_DEBUG |
| 24097 | 24105 | if( p->trace ){ |
| 24098 | | - OSTRACE(("TRY-MUTEX tid=%lu, mutex=%p (%d), owner=%lu, nRef=%d, rc=%s\n", |
| 24099 | | - tid, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); |
| 24106 | + OSTRACE(("TRY-MUTEX tid=%lu, mutex(%d)=%p (%d), owner=%lu, nRef=%d, rc=%s\n", |
| 24107 | + tid, p->id, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); |
| 24100 | 24108 | } |
| 24101 | 24109 | #endif |
| 24102 | 24110 | return rc; |
| 24103 | 24111 | } |
| 24104 | 24112 | |
| | @@ -24122,12 +24130,12 @@ |
| 24122 | 24130 | #endif |
| 24123 | 24131 | assert( winMutex_isInit==1 ); |
| 24124 | 24132 | LeaveCriticalSection(&p->mutex); |
| 24125 | 24133 | #ifdef SQLITE_DEBUG |
| 24126 | 24134 | if( p->trace ){ |
| 24127 | | - OSTRACE(("LEAVE-MUTEX tid=%lu, mutex=%p (%d), nRef=%d\n", |
| 24128 | | - tid, p, p->trace, p->nRef)); |
| 24135 | + OSTRACE(("LEAVE-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", |
| 24136 | + tid, p->id, p, p->trace, p->nRef)); |
| 24129 | 24137 | } |
| 24130 | 24138 | #endif |
| 24131 | 24139 | } |
| 24132 | 24140 | |
| 24133 | 24141 | SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ |
| | @@ -24572,11 +24580,11 @@ |
| 24572 | 24580 | return sqlite3GlobalConfig.m.xSize(p); |
| 24573 | 24581 | } |
| 24574 | 24582 | SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ |
| 24575 | 24583 | assert( p!=0 ); |
| 24576 | 24584 | if( db==0 || !isLookaside(db,p) ){ |
| 24577 | | -#if SQLITE_DEBUG |
| 24585 | +#ifdef SQLITE_DEBUG |
| 24578 | 24586 | if( db==0 ){ |
| 24579 | 24587 | assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); |
| 24580 | 24588 | assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); |
| 24581 | 24589 | }else{ |
| 24582 | 24590 | assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); |
| | @@ -24633,11 +24641,11 @@ |
| 24633 | 24641 | measureAllocationSize(db, p); |
| 24634 | 24642 | return; |
| 24635 | 24643 | } |
| 24636 | 24644 | if( isLookaside(db, p) ){ |
| 24637 | 24645 | LookasideSlot *pBuf = (LookasideSlot*)p; |
| 24638 | | -#if SQLITE_DEBUG |
| 24646 | +#ifdef SQLITE_DEBUG |
| 24639 | 24647 | /* Trash all content in the buffer being freed */ |
| 24640 | 24648 | memset(p, 0xaa, db->lookaside.sz); |
| 24641 | 24649 | #endif |
| 24642 | 24650 | pBuf->pNext = db->lookaside.pFree; |
| 24643 | 24651 | db->lookaside.pFree = pBuf; |
| | @@ -25002,11 +25010,11 @@ |
| 25002 | 25010 | |
| 25003 | 25011 | /* |
| 25004 | 25012 | ** Conversion types fall into various categories as defined by the |
| 25005 | 25013 | ** following enumeration. |
| 25006 | 25014 | */ |
| 25007 | | -#define etRADIX 0 /* Integer types. %d, %x, %o, and so forth */ |
| 25015 | +#define etRADIX 0 /* non-decimal integer types. %x %o */ |
| 25008 | 25016 | #define etFLOAT 1 /* Floating point. %f */ |
| 25009 | 25017 | #define etEXP 2 /* Exponentional notation. %e and %E */ |
| 25010 | 25018 | #define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */ |
| 25011 | 25019 | #define etSIZE 4 /* Return number of characters processed so far. %n */ |
| 25012 | 25020 | #define etSTRING 5 /* Strings. %s */ |
| | @@ -25020,12 +25028,13 @@ |
| 25020 | 25028 | #define etTOKEN 11 /* a pointer to a Token structure */ |
| 25021 | 25029 | #define etSRCLIST 12 /* a pointer to a SrcList */ |
| 25022 | 25030 | #define etPOINTER 13 /* The %p conversion */ |
| 25023 | 25031 | #define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */ |
| 25024 | 25032 | #define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ |
| 25033 | +#define etDECIMAL 16 /* %d or %u, but not %x, %o */ |
| 25025 | 25034 | |
| 25026 | | -#define etINVALID 16 /* Any unrecognized conversion type */ |
| 25035 | +#define etINVALID 17 /* Any unrecognized conversion type */ |
| 25027 | 25036 | |
| 25028 | 25037 | |
| 25029 | 25038 | /* |
| 25030 | 25039 | ** An "etByte" is an 8-bit unsigned value. |
| 25031 | 25040 | */ |
| | @@ -25045,40 +25054,40 @@ |
| 25045 | 25054 | } et_info; |
| 25046 | 25055 | |
| 25047 | 25056 | /* |
| 25048 | 25057 | ** Allowed values for et_info.flags |
| 25049 | 25058 | */ |
| 25050 | | -#define FLAG_SIGNED 1 /* True if the value to convert is signed */ |
| 25051 | | -#define FLAG_STRING 4 /* Allow infinity precision */ |
| 25059 | +#define FLAG_SIGNED 1 /* True if the value to convert is signed */ |
| 25060 | +#define FLAG_STRING 4 /* Allow infinite precision */ |
| 25052 | 25061 | |
| 25053 | 25062 | |
| 25054 | 25063 | /* |
| 25055 | 25064 | ** The following table is searched linearly, so it is good to put the |
| 25056 | 25065 | ** most frequently used conversion types first. |
| 25057 | 25066 | */ |
| 25058 | 25067 | static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; |
| 25059 | 25068 | static const char aPrefix[] = "-x0\000X0"; |
| 25060 | 25069 | static const et_info fmtinfo[] = { |
| 25061 | | - { 'd', 10, 1, etRADIX, 0, 0 }, |
| 25070 | + { 'd', 10, 1, etDECIMAL, 0, 0 }, |
| 25062 | 25071 | { 's', 0, 4, etSTRING, 0, 0 }, |
| 25063 | 25072 | { 'g', 0, 1, etGENERIC, 30, 0 }, |
| 25064 | 25073 | { 'z', 0, 4, etDYNSTRING, 0, 0 }, |
| 25065 | 25074 | { 'q', 0, 4, etSQLESCAPE, 0, 0 }, |
| 25066 | 25075 | { 'Q', 0, 4, etSQLESCAPE2, 0, 0 }, |
| 25067 | 25076 | { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, |
| 25068 | 25077 | { 'c', 0, 0, etCHARX, 0, 0 }, |
| 25069 | 25078 | { 'o', 8, 0, etRADIX, 0, 2 }, |
| 25070 | | - { 'u', 10, 0, etRADIX, 0, 0 }, |
| 25079 | + { 'u', 10, 0, etDECIMAL, 0, 0 }, |
| 25071 | 25080 | { 'x', 16, 0, etRADIX, 16, 1 }, |
| 25072 | 25081 | { 'X', 16, 0, etRADIX, 0, 4 }, |
| 25073 | 25082 | #ifndef SQLITE_OMIT_FLOATING_POINT |
| 25074 | 25083 | { 'f', 0, 1, etFLOAT, 0, 0 }, |
| 25075 | 25084 | { 'e', 0, 1, etEXP, 30, 0 }, |
| 25076 | 25085 | { 'E', 0, 1, etEXP, 14, 0 }, |
| 25077 | 25086 | { 'G', 0, 1, etGENERIC, 14, 0 }, |
| 25078 | 25087 | #endif |
| 25079 | | - { 'i', 10, 1, etRADIX, 0, 0 }, |
| 25088 | + { 'i', 10, 1, etDECIMAL, 0, 0 }, |
| 25080 | 25089 | { 'n', 0, 0, etSIZE, 0, 0 }, |
| 25081 | 25090 | { '%', 0, 0, etPERCENT, 0, 0 }, |
| 25082 | 25091 | { 'p', 16, 0, etPOINTER, 0, 1 }, |
| 25083 | 25092 | |
| 25084 | 25093 | /* All the rest are undocumented and are for internal use only */ |
| | @@ -25166,18 +25175,17 @@ |
| 25166 | 25175 | int precision; /* Precision of the current field */ |
| 25167 | 25176 | int length; /* Length of the field */ |
| 25168 | 25177 | int idx; /* A general purpose loop counter */ |
| 25169 | 25178 | int width; /* Width of the current field */ |
| 25170 | 25179 | etByte flag_leftjustify; /* True if "-" flag is present */ |
| 25171 | | - etByte flag_plussign; /* True if "+" flag is present */ |
| 25172 | | - etByte flag_blanksign; /* True if " " flag is present */ |
| 25180 | + etByte flag_prefix; /* '+' or ' ' or 0 for prefix */ |
| 25173 | 25181 | etByte flag_alternateform; /* True if "#" flag is present */ |
| 25174 | 25182 | etByte flag_altform2; /* True if "!" flag is present */ |
| 25175 | 25183 | etByte flag_zeropad; /* True if field width constant starts with zero */ |
| 25176 | | - etByte flag_long; /* True if "l" flag is present */ |
| 25177 | | - etByte flag_longlong; /* True if the "ll" flag is present */ |
| 25184 | + etByte flag_long; /* 1 for the "l" flag, 2 for "ll", 0 by default */ |
| 25178 | 25185 | etByte done; /* Loop termination flag */ |
| 25186 | + etByte cThousand; /* Thousands separator for %d and %u */ |
| 25179 | 25187 | etByte xtype = etINVALID; /* Conversion paradigm */ |
| 25180 | 25188 | u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ |
| 25181 | 25189 | char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ |
| 25182 | 25190 | sqlite_uint64 longvalue; /* Value for integer types */ |
| 25183 | 25191 | LONGDOUBLE_TYPE realvalue; /* Value for real types */ |
| | @@ -25216,21 +25224,22 @@ |
| 25216 | 25224 | if( (c=(*++fmt))==0 ){ |
| 25217 | 25225 | sqlite3StrAccumAppend(pAccum, "%", 1); |
| 25218 | 25226 | break; |
| 25219 | 25227 | } |
| 25220 | 25228 | /* Find out what flags are present */ |
| 25221 | | - flag_leftjustify = flag_plussign = flag_blanksign = |
| 25229 | + flag_leftjustify = flag_prefix = cThousand = |
| 25222 | 25230 | flag_alternateform = flag_altform2 = flag_zeropad = 0; |
| 25223 | 25231 | done = 0; |
| 25224 | 25232 | do{ |
| 25225 | 25233 | switch( c ){ |
| 25226 | 25234 | case '-': flag_leftjustify = 1; break; |
| 25227 | | - case '+': flag_plussign = 1; break; |
| 25228 | | - case ' ': flag_blanksign = 1; break; |
| 25235 | + case '+': flag_prefix = '+'; break; |
| 25236 | + case ' ': flag_prefix = ' '; break; |
| 25229 | 25237 | case '#': flag_alternateform = 1; break; |
| 25230 | 25238 | case '!': flag_altform2 = 1; break; |
| 25231 | 25239 | case '0': flag_zeropad = 1; break; |
| 25240 | + case ',': cThousand = ','; break; |
| 25232 | 25241 | default: done = 1; break; |
| 25233 | 25242 | } |
| 25234 | 25243 | }while( !done && (c=(*++fmt))!=0 ); |
| 25235 | 25244 | /* Get the field width */ |
| 25236 | 25245 | if( c=='*' ){ |
| | @@ -25296,17 +25305,15 @@ |
| 25296 | 25305 | /* Get the conversion type modifier */ |
| 25297 | 25306 | if( c=='l' ){ |
| 25298 | 25307 | flag_long = 1; |
| 25299 | 25308 | c = *++fmt; |
| 25300 | 25309 | if( c=='l' ){ |
| 25301 | | - flag_longlong = 1; |
| 25310 | + flag_long = 2; |
| 25302 | 25311 | c = *++fmt; |
| 25303 | | - }else{ |
| 25304 | | - flag_longlong = 0; |
| 25305 | 25312 | } |
| 25306 | 25313 | }else{ |
| 25307 | | - flag_long = flag_longlong = 0; |
| 25314 | + flag_long = 0; |
| 25308 | 25315 | } |
| 25309 | 25316 | /* Fetch the info entry for the field */ |
| 25310 | 25317 | infop = &fmtinfo[0]; |
| 25311 | 25318 | xtype = etINVALID; |
| 25312 | 25319 | for(idx=0; idx<ArraySize(fmtinfo); idx++){ |
| | @@ -25320,41 +25327,42 @@ |
| 25320 | 25327 | /* |
| 25321 | 25328 | ** At this point, variables are initialized as follows: |
| 25322 | 25329 | ** |
| 25323 | 25330 | ** flag_alternateform TRUE if a '#' is present. |
| 25324 | 25331 | ** flag_altform2 TRUE if a '!' is present. |
| 25325 | | - ** flag_plussign TRUE if a '+' is present. |
| 25332 | + ** flag_prefix '+' or ' ' or zero |
| 25326 | 25333 | ** flag_leftjustify TRUE if a '-' is present or if the |
| 25327 | 25334 | ** field width was negative. |
| 25328 | 25335 | ** flag_zeropad TRUE if the width began with 0. |
| 25329 | | - ** flag_long TRUE if the letter 'l' (ell) prefixed |
| 25330 | | - ** the conversion character. |
| 25331 | | - ** flag_longlong TRUE if the letter 'll' (ell ell) prefixed |
| 25332 | | - ** the conversion character. |
| 25333 | | - ** flag_blanksign TRUE if a ' ' is present. |
| 25336 | + ** flag_long 1 for "l", 2 for "ll" |
| 25334 | 25337 | ** width The specified field width. This is |
| 25335 | 25338 | ** always non-negative. Zero is the default. |
| 25336 | 25339 | ** precision The specified precision. The default |
| 25337 | 25340 | ** is -1. |
| 25338 | 25341 | ** xtype The class of the conversion. |
| 25339 | 25342 | ** infop Pointer to the appropriate info struct. |
| 25340 | 25343 | */ |
| 25341 | 25344 | switch( xtype ){ |
| 25342 | 25345 | case etPOINTER: |
| 25343 | | - flag_longlong = sizeof(char*)==sizeof(i64); |
| 25344 | | - flag_long = sizeof(char*)==sizeof(long int); |
| 25346 | + flag_long = sizeof(char*)==sizeof(i64) ? 2 : |
| 25347 | + sizeof(char*)==sizeof(long int) ? 1 : 0; |
| 25345 | 25348 | /* Fall through into the next case */ |
| 25346 | 25349 | case etORDINAL: |
| 25347 | | - case etRADIX: |
| 25350 | + case etRADIX: |
| 25351 | + cThousand = 0; |
| 25352 | + /* Fall through into the next case */ |
| 25353 | + case etDECIMAL: |
| 25348 | 25354 | if( infop->flags & FLAG_SIGNED ){ |
| 25349 | 25355 | i64 v; |
| 25350 | 25356 | if( bArgList ){ |
| 25351 | 25357 | v = getIntArg(pArgList); |
| 25352 | | - }else if( flag_longlong ){ |
| 25353 | | - v = va_arg(ap,i64); |
| 25354 | 25358 | }else if( flag_long ){ |
| 25355 | | - v = va_arg(ap,long int); |
| 25359 | + if( flag_long==2 ){ |
| 25360 | + v = va_arg(ap,i64) ; |
| 25361 | + }else{ |
| 25362 | + v = va_arg(ap,long int); |
| 25363 | + } |
| 25356 | 25364 | }else{ |
| 25357 | 25365 | v = va_arg(ap,int); |
| 25358 | 25366 | } |
| 25359 | 25367 | if( v<0 ){ |
| 25360 | 25368 | if( v==SMALLEST_INT64 ){ |
| | @@ -25363,35 +25371,35 @@ |
| 25363 | 25371 | longvalue = -v; |
| 25364 | 25372 | } |
| 25365 | 25373 | prefix = '-'; |
| 25366 | 25374 | }else{ |
| 25367 | 25375 | longvalue = v; |
| 25368 | | - if( flag_plussign ) prefix = '+'; |
| 25369 | | - else if( flag_blanksign ) prefix = ' '; |
| 25370 | | - else prefix = 0; |
| 25376 | + prefix = flag_prefix; |
| 25371 | 25377 | } |
| 25372 | 25378 | }else{ |
| 25373 | 25379 | if( bArgList ){ |
| 25374 | 25380 | longvalue = (u64)getIntArg(pArgList); |
| 25375 | | - }else if( flag_longlong ){ |
| 25376 | | - longvalue = va_arg(ap,u64); |
| 25377 | 25381 | }else if( flag_long ){ |
| 25378 | | - longvalue = va_arg(ap,unsigned long int); |
| 25382 | + if( flag_long==2 ){ |
| 25383 | + longvalue = va_arg(ap,u64); |
| 25384 | + }else{ |
| 25385 | + longvalue = va_arg(ap,unsigned long int); |
| 25386 | + } |
| 25379 | 25387 | }else{ |
| 25380 | 25388 | longvalue = va_arg(ap,unsigned int); |
| 25381 | 25389 | } |
| 25382 | 25390 | prefix = 0; |
| 25383 | 25391 | } |
| 25384 | 25392 | if( longvalue==0 ) flag_alternateform = 0; |
| 25385 | 25393 | if( flag_zeropad && precision<width-(prefix!=0) ){ |
| 25386 | 25394 | precision = width-(prefix!=0); |
| 25387 | 25395 | } |
| 25388 | | - if( precision<etBUFSIZE-10 ){ |
| 25396 | + if( precision<etBUFSIZE-10-etBUFSIZE/3 ){ |
| 25389 | 25397 | nOut = etBUFSIZE; |
| 25390 | 25398 | zOut = buf; |
| 25391 | 25399 | }else{ |
| 25392 | | - nOut = precision + 10; |
| 25400 | + nOut = precision + 10 + precision/3; |
| 25393 | 25401 | zOut = zExtra = sqlite3Malloc( nOut ); |
| 25394 | 25402 | if( zOut==0 ){ |
| 25395 | 25403 | setStrAccumError(pAccum, STRACCUM_NOMEM); |
| 25396 | 25404 | return; |
| 25397 | 25405 | } |
| | @@ -25413,12 +25421,27 @@ |
| 25413 | 25421 | *(--bufpt) = cset[longvalue%base]; |
| 25414 | 25422 | longvalue = longvalue/base; |
| 25415 | 25423 | }while( longvalue>0 ); |
| 25416 | 25424 | } |
| 25417 | 25425 | length = (int)(&zOut[nOut-1]-bufpt); |
| 25418 | | - for(idx=precision-length; idx>0; idx--){ |
| 25426 | + while( precision>length ){ |
| 25419 | 25427 | *(--bufpt) = '0'; /* Zero pad */ |
| 25428 | + length++; |
| 25429 | + } |
| 25430 | + if( cThousand ){ |
| 25431 | + int nn = (length - 1)/3; /* Number of "," to insert */ |
| 25432 | + int ix = (length - 1)%3 + 1; |
| 25433 | + bufpt -= nn; |
| 25434 | + for(idx=0; nn>0; idx++){ |
| 25435 | + bufpt[idx] = bufpt[idx+nn]; |
| 25436 | + ix--; |
| 25437 | + if( ix==0 ){ |
| 25438 | + bufpt[++idx] = cThousand; |
| 25439 | + nn--; |
| 25440 | + ix = 3; |
| 25441 | + } |
| 25442 | + } |
| 25420 | 25443 | } |
| 25421 | 25444 | if( prefix ) *(--bufpt) = prefix; /* Add sign */ |
| 25422 | 25445 | if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ |
| 25423 | 25446 | const char *pre; |
| 25424 | 25447 | char x; |
| | @@ -25441,13 +25464,11 @@ |
| 25441 | 25464 | if( precision<0 ) precision = 6; /* Set default precision */ |
| 25442 | 25465 | if( realvalue<0.0 ){ |
| 25443 | 25466 | realvalue = -realvalue; |
| 25444 | 25467 | prefix = '-'; |
| 25445 | 25468 | }else{ |
| 25446 | | - if( flag_plussign ) prefix = '+'; |
| 25447 | | - else if( flag_blanksign ) prefix = ' '; |
| 25448 | | - else prefix = 0; |
| 25469 | + prefix = flag_prefix; |
| 25449 | 25470 | } |
| 25450 | 25471 | if( xtype==etGENERIC && precision>0 ) precision--; |
| 25451 | 25472 | testcase( precision>0xfff ); |
| 25452 | 25473 | for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){} |
| 25453 | 25474 | if( xtype==etFLOAT ) realvalue += rounder; |
| | @@ -29464,117 +29485,119 @@ |
| 29464 | 29485 | /* 50 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), |
| 29465 | 29486 | /* 51 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), |
| 29466 | 29487 | /* 52 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), |
| 29467 | 29488 | /* 53 */ "Last" OpHelp(""), |
| 29468 | 29489 | /* 54 */ "BitNot" OpHelp("r[P1]= ~r[P1]"), |
| 29469 | | - /* 55 */ "SorterSort" OpHelp(""), |
| 29470 | | - /* 56 */ "Sort" OpHelp(""), |
| 29471 | | - /* 57 */ "Rewind" OpHelp(""), |
| 29472 | | - /* 58 */ "IdxLE" OpHelp("key=r[P3@P4]"), |
| 29473 | | - /* 59 */ "IdxGT" OpHelp("key=r[P3@P4]"), |
| 29474 | | - /* 60 */ "IdxLT" OpHelp("key=r[P3@P4]"), |
| 29475 | | - /* 61 */ "IdxGE" OpHelp("key=r[P3@P4]"), |
| 29476 | | - /* 62 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), |
| 29477 | | - /* 63 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), |
| 29478 | | - /* 64 */ "Program" OpHelp(""), |
| 29479 | | - /* 65 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), |
| 29480 | | - /* 66 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), |
| 29481 | | - /* 67 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), |
| 29482 | | - /* 68 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), |
| 29483 | | - /* 69 */ "IncrVacuum" OpHelp(""), |
| 29484 | | - /* 70 */ "VNext" OpHelp(""), |
| 29485 | | - /* 71 */ "Init" OpHelp("Start at P2"), |
| 29486 | | - /* 72 */ "Return" OpHelp(""), |
| 29487 | | - /* 73 */ "EndCoroutine" OpHelp(""), |
| 29488 | | - /* 74 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), |
| 29489 | | - /* 75 */ "Halt" OpHelp(""), |
| 29490 | | - /* 76 */ "Integer" OpHelp("r[P2]=P1"), |
| 29491 | | - /* 77 */ "Int64" OpHelp("r[P2]=P4"), |
| 29492 | | - /* 78 */ "String" OpHelp("r[P2]='P4' (len=P1)"), |
| 29493 | | - /* 79 */ "Null" OpHelp("r[P2..P3]=NULL"), |
| 29494 | | - /* 80 */ "SoftNull" OpHelp("r[P1]=NULL"), |
| 29495 | | - /* 81 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), |
| 29496 | | - /* 82 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), |
| 29497 | | - /* 83 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), |
| 29498 | | - /* 84 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), |
| 29499 | | - /* 85 */ "SCopy" OpHelp("r[P2]=r[P1]"), |
| 29500 | | - /* 86 */ "IntCopy" OpHelp("r[P2]=r[P1]"), |
| 29501 | | - /* 87 */ "ResultRow" OpHelp("output=r[P1@P2]"), |
| 29502 | | - /* 88 */ "CollSeq" OpHelp(""), |
| 29503 | | - /* 89 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"), |
| 29504 | | - /* 90 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), |
| 29505 | | - /* 91 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), |
| 29506 | | - /* 92 */ "RealAffinity" OpHelp(""), |
| 29507 | | - /* 93 */ "Cast" OpHelp("affinity(r[P1])"), |
| 29508 | | - /* 94 */ "Permutation" OpHelp(""), |
| 29509 | | - /* 95 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), |
| 29510 | | - /* 96 */ "Column" OpHelp("r[P3]=PX"), |
| 29490 | + /* 55 */ "IfSmaller" OpHelp(""), |
| 29491 | + /* 56 */ "SorterSort" OpHelp(""), |
| 29492 | + /* 57 */ "Sort" OpHelp(""), |
| 29493 | + /* 58 */ "Rewind" OpHelp(""), |
| 29494 | + /* 59 */ "IdxLE" OpHelp("key=r[P3@P4]"), |
| 29495 | + /* 60 */ "IdxGT" OpHelp("key=r[P3@P4]"), |
| 29496 | + /* 61 */ "IdxLT" OpHelp("key=r[P3@P4]"), |
| 29497 | + /* 62 */ "IdxGE" OpHelp("key=r[P3@P4]"), |
| 29498 | + /* 63 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), |
| 29499 | + /* 64 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), |
| 29500 | + /* 65 */ "Program" OpHelp(""), |
| 29501 | + /* 66 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), |
| 29502 | + /* 67 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), |
| 29503 | + /* 68 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), |
| 29504 | + /* 69 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), |
| 29505 | + /* 70 */ "IncrVacuum" OpHelp(""), |
| 29506 | + /* 71 */ "VNext" OpHelp(""), |
| 29507 | + /* 72 */ "Init" OpHelp("Start at P2"), |
| 29508 | + /* 73 */ "Return" OpHelp(""), |
| 29509 | + /* 74 */ "EndCoroutine" OpHelp(""), |
| 29510 | + /* 75 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), |
| 29511 | + /* 76 */ "Halt" OpHelp(""), |
| 29512 | + /* 77 */ "Integer" OpHelp("r[P2]=P1"), |
| 29513 | + /* 78 */ "Int64" OpHelp("r[P2]=P4"), |
| 29514 | + /* 79 */ "String" OpHelp("r[P2]='P4' (len=P1)"), |
| 29515 | + /* 80 */ "Null" OpHelp("r[P2..P3]=NULL"), |
| 29516 | + /* 81 */ "SoftNull" OpHelp("r[P1]=NULL"), |
| 29517 | + /* 82 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), |
| 29518 | + /* 83 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), |
| 29519 | + /* 84 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), |
| 29520 | + /* 85 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), |
| 29521 | + /* 86 */ "SCopy" OpHelp("r[P2]=r[P1]"), |
| 29522 | + /* 87 */ "IntCopy" OpHelp("r[P2]=r[P1]"), |
| 29523 | + /* 88 */ "ResultRow" OpHelp("output=r[P1@P2]"), |
| 29524 | + /* 89 */ "CollSeq" OpHelp(""), |
| 29525 | + /* 90 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"), |
| 29526 | + /* 91 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), |
| 29527 | + /* 92 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), |
| 29528 | + /* 93 */ "RealAffinity" OpHelp(""), |
| 29529 | + /* 94 */ "Cast" OpHelp("affinity(r[P1])"), |
| 29530 | + /* 95 */ "Permutation" OpHelp(""), |
| 29531 | + /* 96 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), |
| 29511 | 29532 | /* 97 */ "String8" OpHelp("r[P2]='P4'"), |
| 29512 | | - /* 98 */ "Affinity" OpHelp("affinity(r[P1@P2])"), |
| 29513 | | - /* 99 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), |
| 29514 | | - /* 100 */ "Count" OpHelp("r[P2]=count()"), |
| 29515 | | - /* 101 */ "ReadCookie" OpHelp(""), |
| 29516 | | - /* 102 */ "SetCookie" OpHelp(""), |
| 29517 | | - /* 103 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), |
| 29518 | | - /* 104 */ "OpenRead" OpHelp("root=P2 iDb=P3"), |
| 29519 | | - /* 105 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), |
| 29520 | | - /* 106 */ "OpenAutoindex" OpHelp("nColumn=P2"), |
| 29521 | | - /* 107 */ "OpenEphemeral" OpHelp("nColumn=P2"), |
| 29522 | | - /* 108 */ "SorterOpen" OpHelp(""), |
| 29523 | | - /* 109 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), |
| 29524 | | - /* 110 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), |
| 29525 | | - /* 111 */ "Close" OpHelp(""), |
| 29526 | | - /* 112 */ "ColumnsUsed" OpHelp(""), |
| 29527 | | - /* 113 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), |
| 29528 | | - /* 114 */ "NewRowid" OpHelp("r[P2]=rowid"), |
| 29529 | | - /* 115 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), |
| 29530 | | - /* 116 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), |
| 29531 | | - /* 117 */ "Delete" OpHelp(""), |
| 29532 | | - /* 118 */ "ResetCount" OpHelp(""), |
| 29533 | | - /* 119 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), |
| 29534 | | - /* 120 */ "SorterData" OpHelp("r[P2]=data"), |
| 29535 | | - /* 121 */ "RowData" OpHelp("r[P2]=data"), |
| 29536 | | - /* 122 */ "Rowid" OpHelp("r[P2]=rowid"), |
| 29537 | | - /* 123 */ "NullRow" OpHelp(""), |
| 29538 | | - /* 124 */ "SorterInsert" OpHelp("key=r[P2]"), |
| 29539 | | - /* 125 */ "IdxInsert" OpHelp("key=r[P2]"), |
| 29540 | | - /* 126 */ "IdxDelete" OpHelp("key=r[P2@P3]"), |
| 29541 | | - /* 127 */ "Seek" OpHelp("Move P3 to P1.rowid"), |
| 29542 | | - /* 128 */ "IdxRowid" OpHelp("r[P2]=rowid"), |
| 29543 | | - /* 129 */ "Destroy" OpHelp(""), |
| 29544 | | - /* 130 */ "Clear" OpHelp(""), |
| 29545 | | - /* 131 */ "ResetSorter" OpHelp(""), |
| 29533 | + /* 98 */ "Column" OpHelp("r[P3]=PX"), |
| 29534 | + /* 99 */ "Affinity" OpHelp("affinity(r[P1@P2])"), |
| 29535 | + /* 100 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), |
| 29536 | + /* 101 */ "Count" OpHelp("r[P2]=count()"), |
| 29537 | + /* 102 */ "ReadCookie" OpHelp(""), |
| 29538 | + /* 103 */ "SetCookie" OpHelp(""), |
| 29539 | + /* 104 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), |
| 29540 | + /* 105 */ "OpenRead" OpHelp("root=P2 iDb=P3"), |
| 29541 | + /* 106 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), |
| 29542 | + /* 107 */ "OpenAutoindex" OpHelp("nColumn=P2"), |
| 29543 | + /* 108 */ "OpenEphemeral" OpHelp("nColumn=P2"), |
| 29544 | + /* 109 */ "SorterOpen" OpHelp(""), |
| 29545 | + /* 110 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), |
| 29546 | + /* 111 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), |
| 29547 | + /* 112 */ "Close" OpHelp(""), |
| 29548 | + /* 113 */ "ColumnsUsed" OpHelp(""), |
| 29549 | + /* 114 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), |
| 29550 | + /* 115 */ "NewRowid" OpHelp("r[P2]=rowid"), |
| 29551 | + /* 116 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), |
| 29552 | + /* 117 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), |
| 29553 | + /* 118 */ "Delete" OpHelp(""), |
| 29554 | + /* 119 */ "ResetCount" OpHelp(""), |
| 29555 | + /* 120 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), |
| 29556 | + /* 121 */ "SorterData" OpHelp("r[P2]=data"), |
| 29557 | + /* 122 */ "RowData" OpHelp("r[P2]=data"), |
| 29558 | + /* 123 */ "Rowid" OpHelp("r[P2]=rowid"), |
| 29559 | + /* 124 */ "NullRow" OpHelp(""), |
| 29560 | + /* 125 */ "SorterInsert" OpHelp("key=r[P2]"), |
| 29561 | + /* 126 */ "IdxInsert" OpHelp("key=r[P2]"), |
| 29562 | + /* 127 */ "IdxDelete" OpHelp("key=r[P2@P3]"), |
| 29563 | + /* 128 */ "Seek" OpHelp("Move P3 to P1.rowid"), |
| 29564 | + /* 129 */ "IdxRowid" OpHelp("r[P2]=rowid"), |
| 29565 | + /* 130 */ "Destroy" OpHelp(""), |
| 29566 | + /* 131 */ "Clear" OpHelp(""), |
| 29546 | 29567 | /* 132 */ "Real" OpHelp("r[P2]=P4"), |
| 29547 | | - /* 133 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), |
| 29548 | | - /* 134 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), |
| 29549 | | - /* 135 */ "ParseSchema" OpHelp(""), |
| 29550 | | - /* 136 */ "LoadAnalysis" OpHelp(""), |
| 29551 | | - /* 137 */ "DropTable" OpHelp(""), |
| 29552 | | - /* 138 */ "DropIndex" OpHelp(""), |
| 29553 | | - /* 139 */ "DropTrigger" OpHelp(""), |
| 29554 | | - /* 140 */ "IntegrityCk" OpHelp(""), |
| 29555 | | - /* 141 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), |
| 29556 | | - /* 142 */ "Param" OpHelp(""), |
| 29557 | | - /* 143 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), |
| 29558 | | - /* 144 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), |
| 29559 | | - /* 145 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), |
| 29560 | | - /* 146 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"), |
| 29561 | | - /* 147 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), |
| 29562 | | - /* 148 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), |
| 29563 | | - /* 149 */ "Expire" OpHelp(""), |
| 29564 | | - /* 150 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), |
| 29565 | | - /* 151 */ "VBegin" OpHelp(""), |
| 29566 | | - /* 152 */ "VCreate" OpHelp(""), |
| 29567 | | - /* 153 */ "VDestroy" OpHelp(""), |
| 29568 | | - /* 154 */ "VOpen" OpHelp(""), |
| 29569 | | - /* 155 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), |
| 29570 | | - /* 156 */ "VRename" OpHelp(""), |
| 29571 | | - /* 157 */ "Pagecount" OpHelp(""), |
| 29572 | | - /* 158 */ "MaxPgcnt" OpHelp(""), |
| 29573 | | - /* 159 */ "CursorHint" OpHelp(""), |
| 29574 | | - /* 160 */ "Noop" OpHelp(""), |
| 29575 | | - /* 161 */ "Explain" OpHelp(""), |
| 29568 | + /* 133 */ "ResetSorter" OpHelp(""), |
| 29569 | + /* 134 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), |
| 29570 | + /* 135 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), |
| 29571 | + /* 136 */ "SqlExec" OpHelp(""), |
| 29572 | + /* 137 */ "ParseSchema" OpHelp(""), |
| 29573 | + /* 138 */ "LoadAnalysis" OpHelp(""), |
| 29574 | + /* 139 */ "DropTable" OpHelp(""), |
| 29575 | + /* 140 */ "DropIndex" OpHelp(""), |
| 29576 | + /* 141 */ "DropTrigger" OpHelp(""), |
| 29577 | + /* 142 */ "IntegrityCk" OpHelp(""), |
| 29578 | + /* 143 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), |
| 29579 | + /* 144 */ "Param" OpHelp(""), |
| 29580 | + /* 145 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), |
| 29581 | + /* 146 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), |
| 29582 | + /* 147 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), |
| 29583 | + /* 148 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"), |
| 29584 | + /* 149 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), |
| 29585 | + /* 150 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), |
| 29586 | + /* 151 */ "Expire" OpHelp(""), |
| 29587 | + /* 152 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), |
| 29588 | + /* 153 */ "VBegin" OpHelp(""), |
| 29589 | + /* 154 */ "VCreate" OpHelp(""), |
| 29590 | + /* 155 */ "VDestroy" OpHelp(""), |
| 29591 | + /* 156 */ "VOpen" OpHelp(""), |
| 29592 | + /* 157 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), |
| 29593 | + /* 158 */ "VRename" OpHelp(""), |
| 29594 | + /* 159 */ "Pagecount" OpHelp(""), |
| 29595 | + /* 160 */ "MaxPgcnt" OpHelp(""), |
| 29596 | + /* 161 */ "CursorHint" OpHelp(""), |
| 29597 | + /* 162 */ "Noop" OpHelp(""), |
| 29598 | + /* 163 */ "Explain" OpHelp(""), |
| 29576 | 29599 | }; |
| 29577 | 29600 | return azName[i]; |
| 29578 | 29601 | } |
| 29579 | 29602 | #endif |
| 29580 | 29603 | |
| | @@ -37952,46 +37975,84 @@ |
| 37952 | 37975 | * be freed immediately and any attempt to access any of that freed |
| 37953 | 37976 | * data will almost certainly result in an immediate access violation. |
| 37954 | 37977 | ****************************************************************************** |
| 37955 | 37978 | */ |
| 37956 | 37979 | #ifndef SQLITE_WIN32_HEAP_CREATE |
| 37957 | | -# define SQLITE_WIN32_HEAP_CREATE (TRUE) |
| 37980 | +# define SQLITE_WIN32_HEAP_CREATE (TRUE) |
| 37981 | +#endif |
| 37982 | + |
| 37983 | +/* |
| 37984 | + * This is the maximum possible initial size of the Win32-specific heap, in |
| 37985 | + * bytes. |
| 37986 | + */ |
| 37987 | +#ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE |
| 37988 | +# define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U) |
| 37989 | +#endif |
| 37990 | + |
| 37991 | +/* |
| 37992 | + * This is the extra space for the initial size of the Win32-specific heap, |
| 37993 | + * in bytes. This value may be zero. |
| 37994 | + */ |
| 37995 | +#ifndef SQLITE_WIN32_HEAP_INIT_EXTRA |
| 37996 | +# define SQLITE_WIN32_HEAP_INIT_EXTRA (4194304) |
| 37997 | +#endif |
| 37998 | + |
| 37999 | +/* |
| 38000 | + * Calculate the maximum legal cache size, in pages, based on the maximum |
| 38001 | + * possible initial heap size and the default page size, setting aside the |
| 38002 | + * needed extra space. |
| 38003 | + */ |
| 38004 | +#ifndef SQLITE_WIN32_MAX_CACHE_SIZE |
| 38005 | +# define SQLITE_WIN32_MAX_CACHE_SIZE (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - \ |
| 38006 | + (SQLITE_WIN32_HEAP_INIT_EXTRA)) / \ |
| 38007 | + (SQLITE_DEFAULT_PAGE_SIZE)) |
| 37958 | 38008 | #endif |
| 37959 | 38009 | |
| 37960 | 38010 | /* |
| 37961 | 38011 | * This is cache size used in the calculation of the initial size of the |
| 37962 | 38012 | * Win32-specific heap. It cannot be negative. |
| 37963 | 38013 | */ |
| 37964 | 38014 | #ifndef SQLITE_WIN32_CACHE_SIZE |
| 37965 | 38015 | # if SQLITE_DEFAULT_CACHE_SIZE>=0 |
| 37966 | | -# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE) |
| 38016 | +# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE) |
| 37967 | 38017 | # else |
| 37968 | | -# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE)) |
| 38018 | +# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE)) |
| 37969 | 38019 | # endif |
| 37970 | 38020 | #endif |
| 37971 | 38021 | |
| 38022 | +/* |
| 38023 | + * Make sure that the calculated cache size, in pages, cannot cause the |
| 38024 | + * initial size of the Win32-specific heap to exceed the maximum amount |
| 38025 | + * of memory that can be specified in the call to HeapCreate. |
| 38026 | + */ |
| 38027 | +#if SQLITE_WIN32_CACHE_SIZE>SQLITE_WIN32_MAX_CACHE_SIZE |
| 38028 | +# undef SQLITE_WIN32_CACHE_SIZE |
| 38029 | +# define SQLITE_WIN32_CACHE_SIZE (2000) |
| 38030 | +#endif |
| 38031 | + |
| 37972 | 38032 | /* |
| 37973 | 38033 | * The initial size of the Win32-specific heap. This value may be zero. |
| 37974 | 38034 | */ |
| 37975 | 38035 | #ifndef SQLITE_WIN32_HEAP_INIT_SIZE |
| 37976 | | -# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \ |
| 37977 | | - (SQLITE_DEFAULT_PAGE_SIZE) + 4194304) |
| 38036 | +# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \ |
| 38037 | + (SQLITE_DEFAULT_PAGE_SIZE) + \ |
| 38038 | + (SQLITE_WIN32_HEAP_INIT_EXTRA)) |
| 37978 | 38039 | #endif |
| 37979 | 38040 | |
| 37980 | 38041 | /* |
| 37981 | 38042 | * The maximum size of the Win32-specific heap. This value may be zero. |
| 37982 | 38043 | */ |
| 37983 | 38044 | #ifndef SQLITE_WIN32_HEAP_MAX_SIZE |
| 37984 | | -# define SQLITE_WIN32_HEAP_MAX_SIZE (0) |
| 38045 | +# define SQLITE_WIN32_HEAP_MAX_SIZE (0) |
| 37985 | 38046 | #endif |
| 37986 | 38047 | |
| 37987 | 38048 | /* |
| 37988 | 38049 | * The extra flags to use in calls to the Win32 heap APIs. This value may be |
| 37989 | 38050 | * zero for the default behavior. |
| 37990 | 38051 | */ |
| 37991 | 38052 | #ifndef SQLITE_WIN32_HEAP_FLAGS |
| 37992 | | -# define SQLITE_WIN32_HEAP_FLAGS (0) |
| 38053 | +# define SQLITE_WIN32_HEAP_FLAGS (0) |
| 37993 | 38054 | #endif |
| 37994 | 38055 | |
| 37995 | 38056 | |
| 37996 | 38057 | /* |
| 37997 | 38058 | ** The winMemData structure stores information required by the Win32-specific |
| | @@ -44084,11 +44145,11 @@ |
| 44084 | 44145 | ** This routine is for use inside of assert() statements only. For |
| 44085 | 44146 | ** example: |
| 44086 | 44147 | ** |
| 44087 | 44148 | ** assert( sqlite3PcachePageSanity(pPg) ); |
| 44088 | 44149 | */ |
| 44089 | | -#if SQLITE_DEBUG |
| 44150 | +#ifdef SQLITE_DEBUG |
| 44090 | 44151 | SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ |
| 44091 | 44152 | PCache *pCache; |
| 44092 | 44153 | assert( pPg!=0 ); |
| 44093 | 44154 | assert( pPg->pgno>0 || pPg->pPager==0 ); /* Page number is 1 or more */ |
| 44094 | 44155 | pCache = pPg->pCache; |
| | @@ -63636,11 +63697,11 @@ |
| 63636 | 63697 | pCur->aiIdx[pCur->iPage] = 0; |
| 63637 | 63698 | return getAndInitPage(pBt, newPgno, &pCur->apPage[pCur->iPage], |
| 63638 | 63699 | pCur, pCur->curPagerFlags); |
| 63639 | 63700 | } |
| 63640 | 63701 | |
| 63641 | | -#if SQLITE_DEBUG |
| 63702 | +#ifdef SQLITE_DEBUG |
| 63642 | 63703 | /* |
| 63643 | 63704 | ** Page pParent is an internal (non-leaf) tree page. This function |
| 63644 | 63705 | ** asserts that page number iChild is the left-child if the iIdx'th |
| 63645 | 63706 | ** cell in page pParent. Or, if iIdx is equal to the total number of |
| 63646 | 63707 | ** cells in pParent, that page number iChild is the right-child of |
| | @@ -64178,10 +64239,34 @@ |
| 64178 | 64239 | ** have been deleted? This API will need to change to return an error code |
| 64179 | 64240 | ** as well as the boolean result value. |
| 64180 | 64241 | */ |
| 64181 | 64242 | return (CURSOR_VALID!=pCur->eState); |
| 64182 | 64243 | } |
| 64244 | + |
| 64245 | +/* |
| 64246 | +** Return an estimate for the number of rows in the table that pCur is |
| 64247 | +** pointing to. Return a negative number if no estimate is currently |
| 64248 | +** available. |
| 64249 | +*/ |
| 64250 | +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ |
| 64251 | + i64 n; |
| 64252 | + u8 i; |
| 64253 | + |
| 64254 | + assert( cursorOwnsBtShared(pCur) ); |
| 64255 | + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); |
| 64256 | + |
| 64257 | + /* Currently this interface is only called by the OP_IfSmaller |
| 64258 | + ** opcode, and it that case the cursor will always be valid and |
| 64259 | + ** will always point to a leaf node. */ |
| 64260 | + if( NEVER(pCur->eState!=CURSOR_VALID) ) return -1; |
| 64261 | + if( NEVER(pCur->apPage[pCur->iPage]->leaf==0) ) return -1; |
| 64262 | + |
| 64263 | + for(n=1, i=0; i<=pCur->iPage; i++){ |
| 64264 | + n *= pCur->apPage[i]->nCell; |
| 64265 | + } |
| 64266 | + return n; |
| 64267 | +} |
| 64183 | 64268 | |
| 64184 | 64269 | /* |
| 64185 | 64270 | ** Advance the cursor to the next entry in the database. If |
| 64186 | 64271 | ** successful then set *pRes=0. If the cursor |
| 64187 | 64272 | ** was already pointing to the last entry in the database before |
| | @@ -65023,11 +65108,11 @@ |
| 65023 | 65108 | ** pPrior Where to write the pgno of the first overflow page |
| 65024 | 65109 | ** |
| 65025 | 65110 | ** Use a call to btreeParseCellPtr() to verify that the values above |
| 65026 | 65111 | ** were computed correctly. |
| 65027 | 65112 | */ |
| 65028 | | -#if SQLITE_DEBUG |
| 65113 | +#ifdef SQLITE_DEBUG |
| 65029 | 65114 | { |
| 65030 | 65115 | CellInfo info; |
| 65031 | 65116 | pPage->xParseCell(pPage, pCell, &info); |
| 65032 | 65117 | assert( nHeader==(int)(info.pPayload - pCell) ); |
| 65033 | 65118 | assert( info.nKey==pX->nKey ); |
| | @@ -73753,17 +73838,17 @@ |
| 73753 | 73838 | ** Then the internal cache might have been left in an inconsistent |
| 73754 | 73839 | ** state. We need to rollback the statement transaction, if there is |
| 73755 | 73840 | ** one, or the complete transaction if there is no statement transaction. |
| 73756 | 73841 | */ |
| 73757 | 73842 | |
| 73843 | + if( p->magic!=VDBE_MAGIC_RUN ){ |
| 73844 | + return SQLITE_OK; |
| 73845 | + } |
| 73758 | 73846 | if( db->mallocFailed ){ |
| 73759 | 73847 | p->rc = SQLITE_NOMEM_BKPT; |
| 73760 | 73848 | } |
| 73761 | 73849 | closeAllCursors(p); |
| 73762 | | - if( p->magic!=VDBE_MAGIC_RUN ){ |
| 73763 | | - return SQLITE_OK; |
| 73764 | | - } |
| 73765 | 73850 | checkActiveVdbeCnt(db); |
| 73766 | 73851 | |
| 73767 | 73852 | /* No commit or rollback needed if the program never started or if the |
| 73768 | 73853 | ** SQL statement does not read or write a database file. */ |
| 73769 | 73854 | if( p->pc>=0 && p->bIsReader ){ |
| | @@ -74706,11 +74791,11 @@ |
| 74706 | 74791 | } |
| 74707 | 74792 | assert( u<=pKeyInfo->nField + 1 ); |
| 74708 | 74793 | p->nField = u; |
| 74709 | 74794 | } |
| 74710 | 74795 | |
| 74711 | | -#if SQLITE_DEBUG |
| 74796 | +#ifdef SQLITE_DEBUG |
| 74712 | 74797 | /* |
| 74713 | 74798 | ** This function compares two index or table record keys in the same way |
| 74714 | 74799 | ** as the sqlite3VdbeRecordCompare() routine. Unlike VdbeRecordCompare(), |
| 74715 | 74800 | ** this function deserializes and compares values using the |
| 74716 | 74801 | ** sqlite3VdbeSerialGet() and sqlite3MemCompare() functions. It is used |
| | @@ -74811,11 +74896,11 @@ |
| 74811 | 74896 | if( pKeyInfo->db->mallocFailed ) return 1; |
| 74812 | 74897 | return 0; |
| 74813 | 74898 | } |
| 74814 | 74899 | #endif |
| 74815 | 74900 | |
| 74816 | | -#if SQLITE_DEBUG |
| 74901 | +#ifdef SQLITE_DEBUG |
| 74817 | 74902 | /* |
| 74818 | 74903 | ** Count the number of fields (a.k.a. columns) in the record given by |
| 74819 | 74904 | ** pKey,nKey. The verify that this count is less than or equal to the |
| 74820 | 74905 | ** limit given by pKeyInfo->nField + pKeyInfo->nXField. |
| 74821 | 74906 | ** |
| | @@ -79658,39 +79743,39 @@ |
| 79658 | 79743 | if( pCtx->pOut != pOut ){ |
| 79659 | 79744 | pCtx->pOut = pOut; |
| 79660 | 79745 | for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; |
| 79661 | 79746 | } |
| 79662 | 79747 | |
| 79663 | | - memAboutToChange(p, pCtx->pOut); |
| 79748 | + memAboutToChange(p, pOut); |
| 79664 | 79749 | #ifdef SQLITE_DEBUG |
| 79665 | 79750 | for(i=0; i<pCtx->argc; i++){ |
| 79666 | 79751 | assert( memIsValid(pCtx->argv[i]) ); |
| 79667 | 79752 | REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); |
| 79668 | 79753 | } |
| 79669 | 79754 | #endif |
| 79670 | | - MemSetTypeFlag(pCtx->pOut, MEM_Null); |
| 79755 | + MemSetTypeFlag(pOut, MEM_Null); |
| 79671 | 79756 | pCtx->fErrorOrAux = 0; |
| 79672 | 79757 | (*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */ |
| 79673 | 79758 | |
| 79674 | 79759 | /* If the function returned an error, throw an exception */ |
| 79675 | 79760 | if( pCtx->fErrorOrAux ){ |
| 79676 | 79761 | if( pCtx->isError ){ |
| 79677 | | - sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut)); |
| 79762 | + sqlite3VdbeError(p, "%s", sqlite3_value_text(pOut)); |
| 79678 | 79763 | rc = pCtx->isError; |
| 79679 | 79764 | } |
| 79680 | 79765 | sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1); |
| 79681 | 79766 | if( rc ) goto abort_due_to_error; |
| 79682 | 79767 | } |
| 79683 | 79768 | |
| 79684 | 79769 | /* Copy the result of the function into register P3 */ |
| 79685 | 79770 | if( pOut->flags & (MEM_Str|MEM_Blob) ){ |
| 79686 | | - sqlite3VdbeChangeEncoding(pCtx->pOut, encoding); |
| 79687 | | - if( sqlite3VdbeMemTooBig(pCtx->pOut) ) goto too_big; |
| 79771 | + sqlite3VdbeChangeEncoding(pOut, encoding); |
| 79772 | + if( sqlite3VdbeMemTooBig(pOut) ) goto too_big; |
| 79688 | 79773 | } |
| 79689 | 79774 | |
| 79690 | | - REGISTER_TRACE(pOp->p3, pCtx->pOut); |
| 79691 | | - UPDATE_MAX_BLOBSIZE(pCtx->pOut); |
| 79775 | + REGISTER_TRACE(pOp->p3, pOut); |
| 79776 | + UPDATE_MAX_BLOBSIZE(pOut); |
| 79692 | 79777 | break; |
| 79693 | 79778 | } |
| 79694 | 79779 | |
| 79695 | 79780 | /* Opcode: BitAnd P1 P2 P3 * * |
| 79696 | 79781 | ** Synopsis: r[P3]=r[P1]&r[P2] |
| | @@ -80187,11 +80272,11 @@ |
| 80187 | 80272 | pKeyInfo = pOp->p4.pKeyInfo; |
| 80188 | 80273 | assert( n>0 ); |
| 80189 | 80274 | assert( pKeyInfo!=0 ); |
| 80190 | 80275 | p1 = pOp->p1; |
| 80191 | 80276 | p2 = pOp->p2; |
| 80192 | | -#if SQLITE_DEBUG |
| 80277 | +#ifdef SQLITE_DEBUG |
| 80193 | 80278 | if( aPermute ){ |
| 80194 | 80279 | int k, mx = 0; |
| 80195 | 80280 | for(k=0; k<n; k++) if( aPermute[k]>mx ) mx = aPermute[k]; |
| 80196 | 80281 | assert( p1>0 && p1+mx<=(p->nMem+1 - p->nCursor)+1 ); |
| 80197 | 80282 | assert( p2>0 && p2+mx<=(p->nMem+1 - p->nCursor)+1 ); |
| | @@ -82836,10 +82921,37 @@ |
| 82836 | 82921 | assert( pOp->p2==0 ); |
| 82837 | 82922 | } |
| 82838 | 82923 | break; |
| 82839 | 82924 | } |
| 82840 | 82925 | |
| 82926 | +/* Opcode: IfSmaller P1 P2 P3 * * |
| 82927 | +** |
| 82928 | +** Estimate the number of rows in the table P1. Jump to P2 if that |
| 82929 | +** estimate is less than approximately 2**(0.1*P3). |
| 82930 | +*/ |
| 82931 | +case OP_IfSmaller: { /* jump */ |
| 82932 | + VdbeCursor *pC; |
| 82933 | + BtCursor *pCrsr; |
| 82934 | + int res; |
| 82935 | + i64 sz; |
| 82936 | + |
| 82937 | + assert( pOp->p1>=0 && pOp->p1<p->nCursor ); |
| 82938 | + pC = p->apCsr[pOp->p1]; |
| 82939 | + assert( pC!=0 ); |
| 82940 | + pCrsr = pC->uc.pCursor; |
| 82941 | + assert( pCrsr ); |
| 82942 | + rc = sqlite3BtreeFirst(pCrsr, &res); |
| 82943 | + if( rc ) goto abort_due_to_error; |
| 82944 | + if( res==0 ){ |
| 82945 | + sz = sqlite3BtreeRowCountEst(pCrsr); |
| 82946 | + if( ALWAYS(sz>=0) && sqlite3LogEst((u64)sz)<pOp->p3 ) res = 1; |
| 82947 | + } |
| 82948 | + VdbeBranchTaken(res!=0,2); |
| 82949 | + if( res ) goto jump_to_p2; |
| 82950 | + break; |
| 82951 | +} |
| 82952 | + |
| 82841 | 82953 | |
| 82842 | 82954 | /* Opcode: SorterSort P1 P2 * * * |
| 82843 | 82955 | ** |
| 82844 | 82956 | ** After all records have been inserted into the Sorter object |
| 82845 | 82957 | ** identified by P1, invoke this opcode to actually do the sorting. |
| | @@ -83479,10 +83591,22 @@ |
| 83479 | 83591 | rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags); |
| 83480 | 83592 | if( rc ) goto abort_due_to_error; |
| 83481 | 83593 | pOut->u.i = pgno; |
| 83482 | 83594 | break; |
| 83483 | 83595 | } |
| 83596 | + |
| 83597 | +/* Opcode: SqlExec * * * P4 * |
| 83598 | +** |
| 83599 | +** Run the SQL statement or statements specified in the P4 string. |
| 83600 | +*/ |
| 83601 | +case OP_SqlExec: { |
| 83602 | + db->nSqlExec++; |
| 83603 | + rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0); |
| 83604 | + db->nSqlExec--; |
| 83605 | + if( rc ) goto abort_due_to_error; |
| 83606 | + break; |
| 83607 | +} |
| 83484 | 83608 | |
| 83485 | 83609 | /* Opcode: ParseSchema P1 * * P4 * |
| 83486 | 83610 | ** |
| 83487 | 83611 | ** Read and parse all entries from the SQLITE_MASTER table of database P1 |
| 83488 | 83612 | ** that match the WHERE clause P4. |
| | @@ -83600,11 +83724,11 @@ |
| 83600 | 83724 | ** |
| 83601 | 83725 | ** Do an analysis of the currently open database. Store in |
| 83602 | 83726 | ** register P1 the text of an error message describing any problems. |
| 83603 | 83727 | ** If no problems are found, store a NULL in register P1. |
| 83604 | 83728 | ** |
| 83605 | | -** The register P3 contains the maximum number of allowed errors. |
| 83729 | +** The register P3 contains one less than the maximum number of allowed errors. |
| 83606 | 83730 | ** At most reg(P3) errors will be reported. |
| 83607 | 83731 | ** In other words, the analysis stops as soon as reg(P1) errors are |
| 83608 | 83732 | ** seen. Reg(P1) is updated with the number of errors remaining. |
| 83609 | 83733 | ** |
| 83610 | 83734 | ** The root page numbers of all tables in the database are integers |
| | @@ -83633,18 +83757,18 @@ |
| 83633 | 83757 | assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); |
| 83634 | 83758 | pIn1 = &aMem[pOp->p1]; |
| 83635 | 83759 | assert( pOp->p5<db->nDb ); |
| 83636 | 83760 | assert( DbMaskTest(p->btreeMask, pOp->p5) ); |
| 83637 | 83761 | z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot, |
| 83638 | | - (int)pnErr->u.i, &nErr); |
| 83639 | | - pnErr->u.i -= nErr; |
| 83762 | + (int)pnErr->u.i+1, &nErr); |
| 83640 | 83763 | sqlite3VdbeMemSetNull(pIn1); |
| 83641 | 83764 | if( nErr==0 ){ |
| 83642 | 83765 | assert( z==0 ); |
| 83643 | 83766 | }else if( z==0 ){ |
| 83644 | 83767 | goto no_mem; |
| 83645 | 83768 | }else{ |
| 83769 | + pnErr->u.i -= nErr-1; |
| 83646 | 83770 | sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free); |
| 83647 | 83771 | } |
| 83648 | 83772 | UPDATE_MAX_BLOBSIZE(pIn1); |
| 83649 | 83773 | sqlite3VdbeChangeEncoding(pIn1, encoding); |
| 83650 | 83774 | break; |
| | @@ -92833,11 +92957,11 @@ |
| 92833 | 92957 | int nVal = sqlite3ExprVectorSize(pLeft); |
| 92834 | 92958 | Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0; |
| 92835 | 92959 | char *zRet; |
| 92836 | 92960 | |
| 92837 | 92961 | assert( pExpr->op==TK_IN ); |
| 92838 | | - zRet = sqlite3DbMallocZero(pParse->db, nVal+1); |
| 92962 | + zRet = sqlite3DbMallocRaw(pParse->db, nVal+1); |
| 92839 | 92963 | if( zRet ){ |
| 92840 | 92964 | int i; |
| 92841 | 92965 | for(i=0; i<nVal; i++){ |
| 92842 | 92966 | Expr *pA = sqlite3VectorFieldSubexpr(pLeft, i); |
| 92843 | 92967 | char a = sqlite3ExprAffinity(pA); |
| | @@ -93738,11 +93862,11 @@ |
| 93738 | 93862 | ** Clear all column cache entries. |
| 93739 | 93863 | */ |
| 93740 | 93864 | SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){ |
| 93741 | 93865 | int i; |
| 93742 | 93866 | |
| 93743 | | -#if SQLITE_DEBUG |
| 93867 | +#ifdef SQLITE_DEBUG |
| 93744 | 93868 | if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ |
| 93745 | 93869 | printf("CLEAR\n"); |
| 93746 | 93870 | } |
| 93747 | 93871 | #endif |
| 93748 | 93872 | for(i=0; i<pParse->nColCache; i++){ |
| | @@ -95145,10 +95269,21 @@ |
| 95145 | 95269 | if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; |
| 95146 | 95270 | if( sqlite3ExprCompare(pExprA, pExprB, iTab) ) return 1; |
| 95147 | 95271 | } |
| 95148 | 95272 | return 0; |
| 95149 | 95273 | } |
| 95274 | + |
| 95275 | +/* |
| 95276 | +** Like sqlite3ExprCompare() except COLLATE operators at the top-level |
| 95277 | +** are ignored. |
| 95278 | +*/ |
| 95279 | +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ |
| 95280 | + return sqlite3ExprCompare( |
| 95281 | + sqlite3ExprSkipCollate(pA), |
| 95282 | + sqlite3ExprSkipCollate(pB), |
| 95283 | + iTab); |
| 95284 | +} |
| 95150 | 95285 | |
| 95151 | 95286 | /* |
| 95152 | 95287 | ** Return true if we can prove the pE2 will always be true if pE1 is |
| 95153 | 95288 | ** true. Return false if we cannot complete the proof or if pE2 might |
| 95154 | 95289 | ** be false. Examples: |
| | @@ -96698,10 +96833,11 @@ |
| 96698 | 96833 | Stat4Sample current; /* Current row as a Stat4Sample */ |
| 96699 | 96834 | u32 iPrn; /* Pseudo-random number used for sampling */ |
| 96700 | 96835 | Stat4Sample *aBest; /* Array of nCol best samples */ |
| 96701 | 96836 | int iMin; /* Index in a[] of entry with minimum score */ |
| 96702 | 96837 | int nSample; /* Current number of samples */ |
| 96838 | + int nMaxEqZero; /* Max leading 0 in anEq[] for any a[] entry */ |
| 96703 | 96839 | int iGet; /* Index of current sample accessed by stat_get() */ |
| 96704 | 96840 | Stat4Sample *a; /* Array of mxSample Stat4Sample objects */ |
| 96705 | 96841 | sqlite3 *db; /* Database connection, for malloc() */ |
| 96706 | 96842 | }; |
| 96707 | 96843 | |
| | @@ -96962,10 +97098,17 @@ |
| 96962 | 97098 | int i; |
| 96963 | 97099 | |
| 96964 | 97100 | assert( IsStat4 || nEqZero==0 ); |
| 96965 | 97101 | |
| 96966 | 97102 | #ifdef SQLITE_ENABLE_STAT4 |
| 97103 | + /* Stat4Accum.nMaxEqZero is set to the maximum number of leading 0 |
| 97104 | + ** values in the anEq[] array of any sample in Stat4Accum.a[]. In |
| 97105 | + ** other words, if nMaxEqZero is n, then it is guaranteed that there |
| 97106 | + ** are no samples with Stat4Sample.anEq[m]==0 for (m>=n). */ |
| 97107 | + if( nEqZero>p->nMaxEqZero ){ |
| 97108 | + p->nMaxEqZero = nEqZero; |
| 97109 | + } |
| 96967 | 97110 | if( pNew->isPSample==0 ){ |
| 96968 | 97111 | Stat4Sample *pUpgrade = 0; |
| 96969 | 97112 | assert( pNew->anEq[pNew->iCol]>0 ); |
| 96970 | 97113 | |
| 96971 | 97114 | /* This sample is being added because the prefix that ends in column |
| | @@ -97059,16 +97202,26 @@ |
| 97059 | 97202 | if( p->nSample<p->mxSample || sampleIsBetter(p, pBest, &p->a[p->iMin]) ){ |
| 97060 | 97203 | sampleInsert(p, pBest, i); |
| 97061 | 97204 | } |
| 97062 | 97205 | } |
| 97063 | 97206 | |
| 97064 | | - /* Update the anEq[] fields of any samples already collected. */ |
| 97207 | + /* Check that no sample contains an anEq[] entry with an index of |
| 97208 | + ** p->nMaxEqZero or greater set to zero. */ |
| 97065 | 97209 | for(i=p->nSample-1; i>=0; i--){ |
| 97066 | 97210 | int j; |
| 97067 | | - for(j=iChng; j<p->nCol; j++){ |
| 97068 | | - if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; |
| 97211 | + for(j=p->nMaxEqZero; j<p->nCol; j++) assert( p->a[i].anEq[j]>0 ); |
| 97212 | + } |
| 97213 | + |
| 97214 | + /* Update the anEq[] fields of any samples already collected. */ |
| 97215 | + if( iChng<p->nMaxEqZero ){ |
| 97216 | + for(i=p->nSample-1; i>=0; i--){ |
| 97217 | + int j; |
| 97218 | + for(j=iChng; j<p->nCol; j++){ |
| 97219 | + if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; |
| 97220 | + } |
| 97069 | 97221 | } |
| 97222 | + p->nMaxEqZero = iChng; |
| 97070 | 97223 | } |
| 97071 | 97224 | #endif |
| 97072 | 97225 | |
| 97073 | 97226 | #if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4) |
| 97074 | 97227 | if( iChng==0 ){ |
| | @@ -97778,44 +97931,32 @@ |
| 97778 | 97931 | /* Form 1: Analyze everything */ |
| 97779 | 97932 | for(i=0; i<db->nDb; i++){ |
| 97780 | 97933 | if( i==1 ) continue; /* Do not analyze the TEMP database */ |
| 97781 | 97934 | analyzeDatabase(pParse, i); |
| 97782 | 97935 | } |
| 97783 | | - }else if( pName2->n==0 ){ |
| 97784 | | - /* Form 2: Analyze the database or table named */ |
| 97785 | | - iDb = sqlite3FindDb(db, pName1); |
| 97786 | | - if( iDb>=0 ){ |
| 97787 | | - analyzeDatabase(pParse, iDb); |
| 97788 | | - }else{ |
| 97789 | | - z = sqlite3NameFromToken(db, pName1); |
| 97790 | | - if( z ){ |
| 97791 | | - if( (pIdx = sqlite3FindIndex(db, z, 0))!=0 ){ |
| 97792 | | - analyzeTable(pParse, pIdx->pTable, pIdx); |
| 97793 | | - }else if( (pTab = sqlite3LocateTable(pParse, 0, z, 0))!=0 ){ |
| 97794 | | - analyzeTable(pParse, pTab, 0); |
| 97795 | | - } |
| 97796 | | - sqlite3DbFree(db, z); |
| 97797 | | - } |
| 97798 | | - } |
| 97799 | | - }else{ |
| 97800 | | - /* Form 3: Analyze the fully qualified table name */ |
| 97936 | + }else if( pName2->n==0 && (iDb = sqlite3FindDb(db, pName1))>=0 ){ |
| 97937 | + /* Analyze the schema named as the argument */ |
| 97938 | + analyzeDatabase(pParse, iDb); |
| 97939 | + }else{ |
| 97940 | + /* Form 3: Analyze the table or index named as an argument */ |
| 97801 | 97941 | iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); |
| 97802 | 97942 | if( iDb>=0 ){ |
| 97803 | | - zDb = db->aDb[iDb].zDbSName; |
| 97943 | + zDb = pName2->n ? db->aDb[iDb].zDbSName : 0; |
| 97804 | 97944 | z = sqlite3NameFromToken(db, pTableName); |
| 97805 | 97945 | if( z ){ |
| 97806 | 97946 | if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ |
| 97807 | 97947 | analyzeTable(pParse, pIdx->pTable, pIdx); |
| 97808 | 97948 | }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){ |
| 97809 | 97949 | analyzeTable(pParse, pTab, 0); |
| 97810 | 97950 | } |
| 97811 | 97951 | sqlite3DbFree(db, z); |
| 97812 | 97952 | } |
| 97813 | | - } |
| 97953 | + } |
| 97814 | 97954 | } |
| 97815 | | - v = sqlite3GetVdbe(pParse); |
| 97816 | | - if( v ) sqlite3VdbeAddOp0(v, OP_Expire); |
| 97955 | + if( db->nSqlExec==0 && (v = sqlite3GetVdbe(pParse))!=0 ){ |
| 97956 | + sqlite3VdbeAddOp0(v, OP_Expire); |
| 97957 | + } |
| 97817 | 97958 | } |
| 97818 | 97959 | |
| 97819 | 97960 | /* |
| 97820 | 97961 | ** Used to pass information from the analyzer reader through to the |
| 97821 | 97962 | ** callback routine. |
| | @@ -97940,19 +98081,24 @@ |
| 97940 | 98081 | } |
| 97941 | 98082 | aiRowEst = pIndex->aiRowEst; |
| 97942 | 98083 | #endif |
| 97943 | 98084 | pIndex->bUnordered = 0; |
| 97944 | 98085 | decodeIntArray((char*)z, nCol, aiRowEst, pIndex->aiRowLogEst, pIndex); |
| 97945 | | - if( pIndex->pPartIdxWhere==0 ) pTable->nRowLogEst = pIndex->aiRowLogEst[0]; |
| 98086 | + pIndex->hasStat1 = 1; |
| 98087 | + if( pIndex->pPartIdxWhere==0 ){ |
| 98088 | + pTable->nRowLogEst = pIndex->aiRowLogEst[0]; |
| 98089 | + pTable->tabFlags |= TF_HasStat1; |
| 98090 | + } |
| 97946 | 98091 | }else{ |
| 97947 | 98092 | Index fakeIdx; |
| 97948 | 98093 | fakeIdx.szIdxRow = pTable->szTabRow; |
| 97949 | 98094 | #ifdef SQLITE_ENABLE_COSTMULT |
| 97950 | 98095 | fakeIdx.pTable = pTable; |
| 97951 | 98096 | #endif |
| 97952 | 98097 | decodeIntArray((char*)z, 1, 0, &pTable->nRowLogEst, &fakeIdx); |
| 97953 | 98098 | pTable->szTabRow = fakeIdx.szIdxRow; |
| 98099 | + pTable->tabFlags |= TF_HasStat1; |
| 97954 | 98100 | } |
| 97955 | 98101 | |
| 97956 | 98102 | return 0; |
| 97957 | 98103 | } |
| 97958 | 98104 | |
| | @@ -98243,19 +98389,24 @@ |
| 98243 | 98389 | SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ |
| 98244 | 98390 | analysisInfo sInfo; |
| 98245 | 98391 | HashElem *i; |
| 98246 | 98392 | char *zSql; |
| 98247 | 98393 | int rc = SQLITE_OK; |
| 98394 | + Schema *pSchema = db->aDb[iDb].pSchema; |
| 98248 | 98395 | |
| 98249 | 98396 | assert( iDb>=0 && iDb<db->nDb ); |
| 98250 | 98397 | assert( db->aDb[iDb].pBt!=0 ); |
| 98251 | 98398 | |
| 98252 | 98399 | /* Clear any prior statistics */ |
| 98253 | 98400 | assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 98254 | | - for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ |
| 98401 | + for(i=sqliteHashFirst(&pSchema->tblHash); i; i=sqliteHashNext(i)){ |
| 98402 | + Table *pTab = sqliteHashData(i); |
| 98403 | + pTab->tabFlags &= ~TF_HasStat1; |
| 98404 | + } |
| 98405 | + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ |
| 98255 | 98406 | Index *pIdx = sqliteHashData(i); |
| 98256 | | - pIdx->aiRowLogEst[0] = 0; |
| 98407 | + pIdx->hasStat1 = 0; |
| 98257 | 98408 | #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 98258 | 98409 | sqlite3DeleteIndexSamples(db, pIdx); |
| 98259 | 98410 | pIdx->aSample = 0; |
| 98260 | 98411 | #endif |
| 98261 | 98412 | } |
| | @@ -98274,23 +98425,23 @@ |
| 98274 | 98425 | } |
| 98275 | 98426 | } |
| 98276 | 98427 | |
| 98277 | 98428 | /* Set appropriate defaults on all indexes not in the sqlite_stat1 table */ |
| 98278 | 98429 | assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 98279 | | - for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ |
| 98430 | + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ |
| 98280 | 98431 | Index *pIdx = sqliteHashData(i); |
| 98281 | | - if( pIdx->aiRowLogEst[0]==0 ) sqlite3DefaultRowEst(pIdx); |
| 98432 | + if( !pIdx->hasStat1 ) sqlite3DefaultRowEst(pIdx); |
| 98282 | 98433 | } |
| 98283 | 98434 | |
| 98284 | 98435 | /* Load the statistics from the sqlite_stat4 table. */ |
| 98285 | 98436 | #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 98286 | 98437 | if( rc==SQLITE_OK && OptimizationEnabled(db, SQLITE_Stat34) ){ |
| 98287 | 98438 | db->lookaside.bDisable++; |
| 98288 | 98439 | rc = loadStat4(db, sInfo.zDatabase); |
| 98289 | 98440 | db->lookaside.bDisable--; |
| 98290 | 98441 | } |
| 98291 | | - for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ |
| 98442 | + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ |
| 98292 | 98443 | Index *pIdx = sqliteHashData(i); |
| 98293 | 98444 | sqlite3_free(pIdx->aiRowEst); |
| 98294 | 98445 | pIdx->aiRowEst = 0; |
| 98295 | 98446 | } |
| 98296 | 98447 | #endif |
| | @@ -100271,10 +100422,11 @@ |
| 100271 | 100422 | SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ |
| 100272 | 100423 | Table *p; |
| 100273 | 100424 | p = pParse->pNewTable; |
| 100274 | 100425 | if( p==0 || NEVER(p->nCol<1) ) return; |
| 100275 | 100426 | p->aCol[p->nCol-1].notNull = (u8)onError; |
| 100427 | + p->tabFlags |= TF_HasNotNull; |
| 100276 | 100428 | } |
| 100277 | 100429 | |
| 100278 | 100430 | /* |
| 100279 | 100431 | ** Scan the column type name zType (length nType) and return the |
| 100280 | 100432 | ** associated affinity type. |
| | @@ -102609,10 +102761,13 @@ |
| 102609 | 102761 | /* 10, 9, 8, 7, 6 */ |
| 102610 | 102762 | LogEst aVal[] = { 33, 32, 30, 28, 26 }; |
| 102611 | 102763 | LogEst *a = pIdx->aiRowLogEst; |
| 102612 | 102764 | int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); |
| 102613 | 102765 | int i; |
| 102766 | + |
| 102767 | + /* Indexes with default row estimates should not have stat1 data */ |
| 102768 | + assert( !pIdx->hasStat1 ); |
| 102614 | 102769 | |
| 102615 | 102770 | /* Set the first entry (number of rows in the index) to the estimated |
| 102616 | 102771 | ** number of rows in the table, or half the number of rows in the table |
| 102617 | 102772 | ** for a partial index. But do not let the estimate drop below 10. */ |
| 102618 | 102773 | a[0] = pIdx->pTable->nRowLogEst; |
| | @@ -109798,10 +109953,13 @@ |
| 109798 | 109953 | VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); |
| 109799 | 109954 | } |
| 109800 | 109955 | } |
| 109801 | 109956 | sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); |
| 109802 | 109957 | VdbeComment((v, "for %s", pIdx->zName)); |
| 109958 | +#ifdef SQLITE_ENABLE_NULL_TRIM |
| 109959 | + if( pIdx->idxType==2 ) sqlite3SetMakeRecordP5(v, pIdx->pTable); |
| 109960 | +#endif |
| 109803 | 109961 | |
| 109804 | 109962 | /* In an UPDATE operation, if this index is the PRIMARY KEY index |
| 109805 | 109963 | ** of a WITHOUT ROWID table and there has been no change the |
| 109806 | 109964 | ** primary key, then no collision is possible. The collision detection |
| 109807 | 109965 | ** logic below can all be skipped. */ |
| | @@ -109953,12 +110111,15 @@ |
| 109953 | 110111 | |
| 109954 | 110112 | /* Records with omitted columns are only allowed for schema format |
| 109955 | 110113 | ** version 2 and later (SQLite version 3.1.4, 2005-02-20). */ |
| 109956 | 110114 | if( pTab->pSchema->file_format<2 ) return; |
| 109957 | 110115 | |
| 109958 | | - for(i=pTab->nCol; i>1 && pTab->aCol[i-1].pDflt==0; i--){} |
| 109959 | | - sqlite3VdbeChangeP5(v, i); |
| 110116 | + for(i=pTab->nCol-1; i>0; i--){ |
| 110117 | + if( pTab->aCol[i].pDflt!=0 ) break; |
| 110118 | + if( pTab->aCol[i].colFlags & COLFLAG_PRIMKEY ) break; |
| 110119 | + } |
| 110120 | + sqlite3VdbeChangeP5(v, i+1); |
| 109960 | 110121 | } |
| 109961 | 110122 | #endif |
| 109962 | 110123 | |
| 109963 | 110124 | /* |
| 109964 | 110125 | ** This routine generates code to finish the INSERT or UPDATE operation |
| | @@ -110244,11 +110405,11 @@ |
| 110244 | 110405 | } |
| 110245 | 110406 | if( sqlite3TriggerList(pParse, pDest) ){ |
| 110246 | 110407 | return 0; /* tab1 must not have triggers */ |
| 110247 | 110408 | } |
| 110248 | 110409 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 110249 | | - if( pDest->tabFlags & TF_Virtual ){ |
| 110410 | + if( IsVirtual(pDest) ){ |
| 110250 | 110411 | return 0; /* tab1 must not be a virtual table */ |
| 110251 | 110412 | } |
| 110252 | 110413 | #endif |
| 110253 | 110414 | if( onError==OE_Default ){ |
| 110254 | 110415 | if( pDest->iPKey>=0 ) onError = pDest->keyConf; |
| | @@ -110306,11 +110467,11 @@ |
| 110306 | 110467 | } |
| 110307 | 110468 | if( HasRowid(pDest)!=HasRowid(pSrc) ){ |
| 110308 | 110469 | return 0; /* source and destination must both be WITHOUT ROWID or not */ |
| 110309 | 110470 | } |
| 110310 | 110471 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 110311 | | - if( pSrc->tabFlags & TF_Virtual ){ |
| 110472 | + if( IsVirtual(pSrc) ){ |
| 110312 | 110473 | return 0; /* tab2 must not be a virtual table */ |
| 110313 | 110474 | } |
| 110314 | 110475 | #endif |
| 110315 | 110476 | if( pSrc->pSelect ){ |
| 110316 | 110477 | return 0; /* tab2 may not be a view */ |
| | @@ -110603,11 +110764,11 @@ |
| 110603 | 110764 | /* Invoke the callback function if required */ |
| 110604 | 110765 | if( xCallback && (SQLITE_ROW==rc || |
| 110605 | 110766 | (SQLITE_DONE==rc && !callbackIsInit |
| 110606 | 110767 | && db->flags&SQLITE_NullCallback)) ){ |
| 110607 | 110768 | if( !callbackIsInit ){ |
| 110608 | | - azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1); |
| 110769 | + azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); |
| 110609 | 110770 | if( azCols==0 ){ |
| 110610 | 110771 | goto exec_out; |
| 110611 | 110772 | } |
| 110612 | 110773 | for(i=0; i<nCol; i++){ |
| 110613 | 110774 | azCols[i] = (char *)sqlite3_column_name(pStmt, i); |
| | @@ -110624,10 +110785,11 @@ |
| 110624 | 110785 | if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){ |
| 110625 | 110786 | sqlite3OomFault(db); |
| 110626 | 110787 | goto exec_out; |
| 110627 | 110788 | } |
| 110628 | 110789 | } |
| 110790 | + azVals[i] = 0; |
| 110629 | 110791 | } |
| 110630 | 110792 | if( xCallback(pArg, nCol, azVals, azCols) ){ |
| 110631 | 110793 | /* EVIDENCE-OF: R-38229-40159 If the callback function to |
| 110632 | 110794 | ** sqlite3_exec() returns non-zero, then sqlite3_exec() will |
| 110633 | 110795 | ** return SQLITE_ABORT. */ |
| | @@ -112094,15 +112256,15 @@ |
| 112094 | 112256 | #define PragTyp_JOURNAL_SIZE_LIMIT 20 |
| 112095 | 112257 | #define PragTyp_LOCK_PROXY_FILE 21 |
| 112096 | 112258 | #define PragTyp_LOCKING_MODE 22 |
| 112097 | 112259 | #define PragTyp_PAGE_COUNT 23 |
| 112098 | 112260 | #define PragTyp_MMAP_SIZE 24 |
| 112099 | | -#define PragTyp_PAGE_SIZE 25 |
| 112100 | | -#define PragTyp_SECURE_DELETE 26 |
| 112101 | | -#define PragTyp_SHRINK_MEMORY 27 |
| 112102 | | -#define PragTyp_SOFT_HEAP_LIMIT 28 |
| 112103 | | -#define PragTyp_STATS 29 |
| 112261 | +#define PragTyp_OPTIMIZE 25 |
| 112262 | +#define PragTyp_PAGE_SIZE 26 |
| 112263 | +#define PragTyp_SECURE_DELETE 27 |
| 112264 | +#define PragTyp_SHRINK_MEMORY 28 |
| 112265 | +#define PragTyp_SOFT_HEAP_LIMIT 29 |
| 112104 | 112266 | #define PragTyp_SYNCHRONOUS 30 |
| 112105 | 112267 | #define PragTyp_TABLE_INFO 31 |
| 112106 | 112268 | #define PragTyp_TEMP_STORE 32 |
| 112107 | 112269 | #define PragTyp_TEMP_STORE_DIRECTORY 33 |
| 112108 | 112270 | #define PragTyp_THREADS 34 |
| | @@ -112112,10 +112274,11 @@ |
| 112112 | 112274 | #define PragTyp_HEXKEY 38 |
| 112113 | 112275 | #define PragTyp_KEY 39 |
| 112114 | 112276 | #define PragTyp_REKEY 40 |
| 112115 | 112277 | #define PragTyp_LOCK_STATUS 41 |
| 112116 | 112278 | #define PragTyp_PARSER_TRACE 42 |
| 112279 | +#define PragTyp_STATS 43 |
| 112117 | 112280 | |
| 112118 | 112281 | /* Property flags associated with various pragma. */ |
| 112119 | 112282 | #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ |
| 112120 | 112283 | #define PragFlg_NoColumns 0x02 /* OP_ResultRow called with zero columns */ |
| 112121 | 112284 | #define PragFlg_NoColumns1 0x04 /* zero columns if RHS argument is present */ |
| | @@ -112135,51 +112298,52 @@ |
| 112135 | 112298 | /* 2 */ "name", |
| 112136 | 112299 | /* 3 */ "type", |
| 112137 | 112300 | /* 4 */ "notnull", |
| 112138 | 112301 | /* 5 */ "dflt_value", |
| 112139 | 112302 | /* 6 */ "pk", |
| 112140 | | - /* 7 */ "table", /* Used by: stats */ |
| 112141 | | - /* 8 */ "index", |
| 112142 | | - /* 9 */ "width", |
| 112143 | | - /* 10 */ "height", |
| 112144 | | - /* 11 */ "seqno", /* Used by: index_info */ |
| 112145 | | - /* 12 */ "cid", |
| 112146 | | - /* 13 */ "name", |
| 112147 | | - /* 14 */ "seqno", /* Used by: index_xinfo */ |
| 112148 | | - /* 15 */ "cid", |
| 112149 | | - /* 16 */ "name", |
| 112150 | | - /* 17 */ "desc", |
| 112151 | | - /* 18 */ "coll", |
| 112152 | | - /* 19 */ "key", |
| 112153 | | - /* 20 */ "seq", /* Used by: index_list */ |
| 112154 | | - /* 21 */ "name", |
| 112155 | | - /* 22 */ "unique", |
| 112156 | | - /* 23 */ "origin", |
| 112157 | | - /* 24 */ "partial", |
| 112158 | | - /* 25 */ "seq", /* Used by: database_list */ |
| 112159 | | - /* 26 */ "name", |
| 112160 | | - /* 27 */ "file", |
| 112161 | | - /* 28 */ "seq", /* Used by: collation_list */ |
| 112162 | | - /* 29 */ "name", |
| 112163 | | - /* 30 */ "id", /* Used by: foreign_key_list */ |
| 112164 | | - /* 31 */ "seq", |
| 112165 | | - /* 32 */ "table", |
| 112166 | | - /* 33 */ "from", |
| 112167 | | - /* 34 */ "to", |
| 112168 | | - /* 35 */ "on_update", |
| 112169 | | - /* 36 */ "on_delete", |
| 112170 | | - /* 37 */ "match", |
| 112171 | | - /* 38 */ "table", /* Used by: foreign_key_check */ |
| 112172 | | - /* 39 */ "rowid", |
| 112173 | | - /* 40 */ "parent", |
| 112174 | | - /* 41 */ "fkid", |
| 112175 | | - /* 42 */ "busy", /* Used by: wal_checkpoint */ |
| 112176 | | - /* 43 */ "log", |
| 112177 | | - /* 44 */ "checkpointed", |
| 112178 | | - /* 45 */ "timeout", /* Used by: busy_timeout */ |
| 112179 | | - /* 46 */ "database", /* Used by: lock_status */ |
| 112180 | | - /* 47 */ "status", |
| 112303 | + /* 7 */ "tbl", /* Used by: stats */ |
| 112304 | + /* 8 */ "idx", |
| 112305 | + /* 9 */ "wdth", |
| 112306 | + /* 10 */ "hght", |
| 112307 | + /* 11 */ "flgs", |
| 112308 | + /* 12 */ "seqno", /* Used by: index_info */ |
| 112309 | + /* 13 */ "cid", |
| 112310 | + /* 14 */ "name", |
| 112311 | + /* 15 */ "seqno", /* Used by: index_xinfo */ |
| 112312 | + /* 16 */ "cid", |
| 112313 | + /* 17 */ "name", |
| 112314 | + /* 18 */ "desc", |
| 112315 | + /* 19 */ "coll", |
| 112316 | + /* 20 */ "key", |
| 112317 | + /* 21 */ "seq", /* Used by: index_list */ |
| 112318 | + /* 22 */ "name", |
| 112319 | + /* 23 */ "unique", |
| 112320 | + /* 24 */ "origin", |
| 112321 | + /* 25 */ "partial", |
| 112322 | + /* 26 */ "seq", /* Used by: database_list */ |
| 112323 | + /* 27 */ "name", |
| 112324 | + /* 28 */ "file", |
| 112325 | + /* 29 */ "seq", /* Used by: collation_list */ |
| 112326 | + /* 30 */ "name", |
| 112327 | + /* 31 */ "id", /* Used by: foreign_key_list */ |
| 112328 | + /* 32 */ "seq", |
| 112329 | + /* 33 */ "table", |
| 112330 | + /* 34 */ "from", |
| 112331 | + /* 35 */ "to", |
| 112332 | + /* 36 */ "on_update", |
| 112333 | + /* 37 */ "on_delete", |
| 112334 | + /* 38 */ "match", |
| 112335 | + /* 39 */ "table", /* Used by: foreign_key_check */ |
| 112336 | + /* 40 */ "rowid", |
| 112337 | + /* 41 */ "parent", |
| 112338 | + /* 42 */ "fkid", |
| 112339 | + /* 43 */ "busy", /* Used by: wal_checkpoint */ |
| 112340 | + /* 44 */ "log", |
| 112341 | + /* 45 */ "checkpointed", |
| 112342 | + /* 46 */ "timeout", /* Used by: busy_timeout */ |
| 112343 | + /* 47 */ "database", /* Used by: lock_status */ |
| 112344 | + /* 48 */ "status", |
| 112181 | 112345 | }; |
| 112182 | 112346 | |
| 112183 | 112347 | /* Definitions of all built-in pragmas */ |
| 112184 | 112348 | typedef struct PragmaName { |
| 112185 | 112349 | const char *const zName; /* Name of pragma */ |
| | @@ -112221,11 +112385,11 @@ |
| 112221 | 112385 | #endif |
| 112222 | 112386 | #endif |
| 112223 | 112387 | {/* zName: */ "busy_timeout", |
| 112224 | 112388 | /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, |
| 112225 | 112389 | /* ePragFlg: */ PragFlg_Result0, |
| 112226 | | - /* ColNames: */ 45, 1, |
| 112390 | + /* ColNames: */ 46, 1, |
| 112227 | 112391 | /* iArg: */ 0 }, |
| 112228 | 112392 | #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
| 112229 | 112393 | {/* zName: */ "cache_size", |
| 112230 | 112394 | /* ePragTyp: */ PragTyp_CACHE_SIZE, |
| 112231 | 112395 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, |
| | @@ -112258,11 +112422,11 @@ |
| 112258 | 112422 | #endif |
| 112259 | 112423 | #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
| 112260 | 112424 | {/* zName: */ "collation_list", |
| 112261 | 112425 | /* ePragTyp: */ PragTyp_COLLATION_LIST, |
| 112262 | 112426 | /* ePragFlg: */ PragFlg_Result0, |
| 112263 | | - /* ColNames: */ 28, 2, |
| 112427 | + /* ColNames: */ 29, 2, |
| 112264 | 112428 | /* iArg: */ 0 }, |
| 112265 | 112429 | #endif |
| 112266 | 112430 | #if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) |
| 112267 | 112431 | {/* zName: */ "compile_options", |
| 112268 | 112432 | /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, |
| | @@ -112293,11 +112457,11 @@ |
| 112293 | 112457 | #endif |
| 112294 | 112458 | #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
| 112295 | 112459 | {/* zName: */ "database_list", |
| 112296 | 112460 | /* ePragTyp: */ PragTyp_DATABASE_LIST, |
| 112297 | 112461 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, |
| 112298 | | - /* ColNames: */ 25, 3, |
| 112462 | + /* ColNames: */ 26, 3, |
| 112299 | 112463 | /* iArg: */ 0 }, |
| 112300 | 112464 | #endif |
| 112301 | 112465 | #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) |
| 112302 | 112466 | {/* zName: */ "default_cache_size", |
| 112303 | 112467 | /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, |
| | @@ -112330,18 +112494,18 @@ |
| 112330 | 112494 | #endif |
| 112331 | 112495 | #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
| 112332 | 112496 | {/* zName: */ "foreign_key_check", |
| 112333 | 112497 | /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, |
| 112334 | 112498 | /* ePragFlg: */ PragFlg_NeedSchema, |
| 112335 | | - /* ColNames: */ 38, 4, |
| 112499 | + /* ColNames: */ 39, 4, |
| 112336 | 112500 | /* iArg: */ 0 }, |
| 112337 | 112501 | #endif |
| 112338 | 112502 | #if !defined(SQLITE_OMIT_FOREIGN_KEY) |
| 112339 | 112503 | {/* zName: */ "foreign_key_list", |
| 112340 | 112504 | /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, |
| 112341 | 112505 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, |
| 112342 | | - /* ColNames: */ 30, 8, |
| 112506 | + /* ColNames: */ 31, 8, |
| 112343 | 112507 | /* iArg: */ 0 }, |
| 112344 | 112508 | #endif |
| 112345 | 112509 | #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
| 112346 | 112510 | #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
| 112347 | 112511 | {/* zName: */ "foreign_keys", |
| | @@ -112400,21 +112564,21 @@ |
| 112400 | 112564 | #endif |
| 112401 | 112565 | #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
| 112402 | 112566 | {/* zName: */ "index_info", |
| 112403 | 112567 | /* ePragTyp: */ PragTyp_INDEX_INFO, |
| 112404 | 112568 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, |
| 112405 | | - /* ColNames: */ 11, 3, |
| 112569 | + /* ColNames: */ 12, 3, |
| 112406 | 112570 | /* iArg: */ 0 }, |
| 112407 | 112571 | {/* zName: */ "index_list", |
| 112408 | 112572 | /* ePragTyp: */ PragTyp_INDEX_LIST, |
| 112409 | 112573 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, |
| 112410 | | - /* ColNames: */ 20, 5, |
| 112574 | + /* ColNames: */ 21, 5, |
| 112411 | 112575 | /* iArg: */ 0 }, |
| 112412 | 112576 | {/* zName: */ "index_xinfo", |
| 112413 | 112577 | /* ePragTyp: */ PragTyp_INDEX_INFO, |
| 112414 | 112578 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, |
| 112415 | | - /* ColNames: */ 14, 6, |
| 112579 | + /* ColNames: */ 15, 6, |
| 112416 | 112580 | /* iArg: */ 1 }, |
| 112417 | 112581 | #endif |
| 112418 | 112582 | #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) |
| 112419 | 112583 | {/* zName: */ "integrity_check", |
| 112420 | 112584 | /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, |
| | @@ -112457,11 +112621,11 @@ |
| 112457 | 112621 | #endif |
| 112458 | 112622 | #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
| 112459 | 112623 | {/* zName: */ "lock_status", |
| 112460 | 112624 | /* ePragTyp: */ PragTyp_LOCK_STATUS, |
| 112461 | 112625 | /* ePragFlg: */ PragFlg_Result0, |
| 112462 | | - /* ColNames: */ 46, 2, |
| 112626 | + /* ColNames: */ 47, 2, |
| 112463 | 112627 | /* iArg: */ 0 }, |
| 112464 | 112628 | #endif |
| 112465 | 112629 | #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
| 112466 | 112630 | {/* zName: */ "locking_mode", |
| 112467 | 112631 | /* ePragTyp: */ PragTyp_LOCKING_MODE, |
| | @@ -112476,10 +112640,17 @@ |
| 112476 | 112640 | {/* zName: */ "mmap_size", |
| 112477 | 112641 | /* ePragTyp: */ PragTyp_MMAP_SIZE, |
| 112478 | 112642 | /* ePragFlg: */ 0, |
| 112479 | 112643 | /* ColNames: */ 0, 0, |
| 112480 | 112644 | /* iArg: */ 0 }, |
| 112645 | +#endif |
| 112646 | + {/* zName: */ "optimize", |
| 112647 | + /* ePragTyp: */ PragTyp_OPTIMIZE, |
| 112648 | + /* ePragFlg: */ PragFlg_NoColumns, |
| 112649 | + /* ColNames: */ 0, 0, |
| 112650 | + /* iArg: */ 0 }, |
| 112651 | +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
| 112481 | 112652 | {/* zName: */ "page_count", |
| 112482 | 112653 | /* ePragTyp: */ PragTyp_PAGE_COUNT, |
| 112483 | 112654 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, |
| 112484 | 112655 | /* ColNames: */ 0, 0, |
| 112485 | 112656 | /* iArg: */ 0 }, |
| | @@ -112574,15 +112745,15 @@ |
| 112574 | 112745 | /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, |
| 112575 | 112746 | /* ColNames: */ 0, 0, |
| 112576 | 112747 | /* iArg: */ SQLITE_SqlTrace }, |
| 112577 | 112748 | #endif |
| 112578 | 112749 | #endif |
| 112579 | | -#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
| 112750 | +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG) |
| 112580 | 112751 | {/* zName: */ "stats", |
| 112581 | 112752 | /* ePragTyp: */ PragTyp_STATS, |
| 112582 | 112753 | /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, |
| 112583 | | - /* ColNames: */ 7, 4, |
| 112754 | + /* ColNames: */ 7, 5, |
| 112584 | 112755 | /* iArg: */ 0 }, |
| 112585 | 112756 | #endif |
| 112586 | 112757 | #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
| 112587 | 112758 | {/* zName: */ "synchronous", |
| 112588 | 112759 | /* ePragTyp: */ PragTyp_SYNCHRONOUS, |
| | @@ -112657,11 +112828,11 @@ |
| 112657 | 112828 | /* ColNames: */ 0, 0, |
| 112658 | 112829 | /* iArg: */ 0 }, |
| 112659 | 112830 | {/* zName: */ "wal_checkpoint", |
| 112660 | 112831 | /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, |
| 112661 | 112832 | /* ePragFlg: */ PragFlg_NeedSchema, |
| 112662 | | - /* ColNames: */ 42, 3, |
| 112833 | + /* ColNames: */ 43, 3, |
| 112663 | 112834 | /* iArg: */ 0 }, |
| 112664 | 112835 | #endif |
| 112665 | 112836 | #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
| 112666 | 112837 | {/* zName: */ "writable_schema", |
| 112667 | 112838 | /* ePragTyp: */ PragTyp_FLAG, |
| | @@ -112668,11 +112839,11 @@ |
| 112668 | 112839 | /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, |
| 112669 | 112840 | /* ColNames: */ 0, 0, |
| 112670 | 112841 | /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, |
| 112671 | 112842 | #endif |
| 112672 | 112843 | }; |
| 112673 | | -/* Number of pragmas: 60 on by default, 73 total. */ |
| 112844 | +/* Number of pragmas: 60 on by default, 74 total. */ |
| 112674 | 112845 | |
| 112675 | 112846 | /************** End of pragma.h **********************************************/ |
| 112676 | 112847 | /************** Continuing where we left off in pragma.c *********************/ |
| 112677 | 112848 | |
| 112678 | 112849 | /* |
| | @@ -112937,10 +113108,26 @@ |
| 112937 | 113108 | lwr = mid + 1; |
| 112938 | 113109 | } |
| 112939 | 113110 | } |
| 112940 | 113111 | return lwr>upr ? 0 : &aPragmaName[mid]; |
| 112941 | 113112 | } |
| 113113 | + |
| 113114 | +/* |
| 113115 | +** Helper subroutine for PRAGMA integrity_check: |
| 113116 | +** |
| 113117 | +** Generate code to output a single-column result row with the result |
| 113118 | +** held in register regResult. Decrement the result count and halt if |
| 113119 | +** the maximum number of result rows have been issued. |
| 113120 | +*/ |
| 113121 | +static int integrityCheckResultRow(Vdbe *v, int regResult){ |
| 113122 | + int addr; |
| 113123 | + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 1); |
| 113124 | + addr = sqlite3VdbeAddOp3(v, OP_IfPos, 1, sqlite3VdbeCurrentAddr(v)+2, 1); |
| 113125 | + VdbeCoverage(v); |
| 113126 | + sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 113127 | + return addr; |
| 113128 | +} |
| 112942 | 113129 | |
| 112943 | 113130 | /* |
| 112944 | 113131 | ** Process a pragma statement. |
| 112945 | 113132 | ** |
| 112946 | 113133 | ** Pragmas are of this form: |
| | @@ -113741,33 +113928,37 @@ |
| 113741 | 113928 | } |
| 113742 | 113929 | } |
| 113743 | 113930 | } |
| 113744 | 113931 | break; |
| 113745 | 113932 | |
| 113933 | +#ifdef SQLITE_DEBUG |
| 113746 | 113934 | case PragTyp_STATS: { |
| 113747 | 113935 | Index *pIdx; |
| 113748 | 113936 | HashElem *i; |
| 113749 | | - pParse->nMem = 4; |
| 113937 | + pParse->nMem = 5; |
| 113750 | 113938 | sqlite3CodeVerifySchema(pParse, iDb); |
| 113751 | 113939 | for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ |
| 113752 | 113940 | Table *pTab = sqliteHashData(i); |
| 113753 | | - sqlite3VdbeMultiLoad(v, 1, "ssii", |
| 113941 | + sqlite3VdbeMultiLoad(v, 1, "ssiii", |
| 113754 | 113942 | pTab->zName, |
| 113755 | 113943 | 0, |
| 113756 | 113944 | pTab->szTabRow, |
| 113757 | | - pTab->nRowLogEst); |
| 113758 | | - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); |
| 113945 | + pTab->nRowLogEst, |
| 113946 | + pTab->tabFlags); |
| 113947 | + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); |
| 113759 | 113948 | for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| 113760 | | - sqlite3VdbeMultiLoad(v, 2, "sii", |
| 113949 | + sqlite3VdbeMultiLoad(v, 2, "siii", |
| 113761 | 113950 | pIdx->zName, |
| 113762 | 113951 | pIdx->szIdxRow, |
| 113763 | | - pIdx->aiRowLogEst[0]); |
| 113764 | | - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); |
| 113952 | + pIdx->aiRowLogEst[0], |
| 113953 | + pIdx->hasStat1); |
| 113954 | + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); |
| 113765 | 113955 | } |
| 113766 | 113956 | } |
| 113767 | 113957 | } |
| 113768 | 113958 | break; |
| 113959 | +#endif |
| 113769 | 113960 | |
| 113770 | 113961 | case PragTyp_INDEX_INFO: if( zRight ){ |
| 113771 | 113962 | Index *pIdx; |
| 113772 | 113963 | Table *pTab; |
| 113773 | 113964 | pIdx = sqlite3FindIndex(db, zRight, zDb); |
| | @@ -114020,13 +114211,21 @@ |
| 114020 | 114211 | #ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX |
| 114021 | 114212 | # define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 |
| 114022 | 114213 | #endif |
| 114023 | 114214 | |
| 114024 | 114215 | #ifndef SQLITE_OMIT_INTEGRITY_CHECK |
| 114025 | | - /* Pragma "quick_check" is reduced version of |
| 114216 | + /* PRAGMA integrity_check |
| 114217 | + ** PRAGMA integrity_check(N) |
| 114218 | + ** PRAGMA quick_check |
| 114219 | + ** PRAGMA quick_check(N) |
| 114220 | + ** |
| 114221 | + ** Verify the integrity of the database. |
| 114222 | + ** |
| 114223 | + ** The "quick_check" is reduced version of |
| 114026 | 114224 | ** integrity_check designed to detect most database corruption |
| 114027 | | - ** without most of the overhead of a full integrity-check. |
| 114225 | + ** without the overhead of cross-checking indexes. Quick_check |
| 114226 | + ** is linear time wherease integrity_check is O(NlogN). |
| 114028 | 114227 | */ |
| 114029 | 114228 | case PragTyp_INTEGRITY_CHECK: { |
| 114030 | 114229 | int i, j, addr, mxErr; |
| 114031 | 114230 | |
| 114032 | 114231 | int isQuick = (sqlite3Tolower(zLeft[0])=='q'); |
| | @@ -114053,11 +114252,11 @@ |
| 114053 | 114252 | sqlite3GetInt32(zRight, &mxErr); |
| 114054 | 114253 | if( mxErr<=0 ){ |
| 114055 | 114254 | mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; |
| 114056 | 114255 | } |
| 114057 | 114256 | } |
| 114058 | | - sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */ |
| 114257 | + sqlite3VdbeAddOp2(v, OP_Integer, mxErr-1, 1); /* reg[1] holds errors left */ |
| 114059 | 114258 | |
| 114060 | 114259 | /* Do an integrity check on each database file */ |
| 114061 | 114260 | for(i=0; i<db->nDb; i++){ |
| 114062 | 114261 | HashElem *x; |
| 114063 | 114262 | Hash *pTbls; |
| | @@ -114068,14 +114267,10 @@ |
| 114068 | 114267 | |
| 114069 | 114268 | if( OMIT_TEMPDB && i==1 ) continue; |
| 114070 | 114269 | if( iDb>=0 && i!=iDb ) continue; |
| 114071 | 114270 | |
| 114072 | 114271 | sqlite3CodeVerifySchema(pParse, i); |
| 114073 | | - addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ |
| 114074 | | - VdbeCoverage(v); |
| 114075 | | - sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 114076 | | - sqlite3VdbeJumpHere(v, addr); |
| 114077 | 114272 | |
| 114078 | 114273 | /* Do an integrity check of the B-Tree |
| 114079 | 114274 | ** |
| 114080 | 114275 | ** Begin by finding the root pages numbers |
| 114081 | 114276 | ** for all tables and indices in the database. |
| | @@ -114111,29 +114306,30 @@ |
| 114111 | 114306 | sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, |
| 114112 | 114307 | sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName), |
| 114113 | 114308 | P4_DYNAMIC); |
| 114114 | 114309 | sqlite3VdbeAddOp3(v, OP_Move, 2, 4, 1); |
| 114115 | 114310 | sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2); |
| 114116 | | - sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1); |
| 114311 | + integrityCheckResultRow(v, 2); |
| 114117 | 114312 | sqlite3VdbeJumpHere(v, addr); |
| 114118 | 114313 | |
| 114119 | 114314 | /* Make sure all the indices are constructed correctly. |
| 114120 | 114315 | */ |
| 114121 | | - for(x=sqliteHashFirst(pTbls); x && !isQuick; x=sqliteHashNext(x)){ |
| 114316 | + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 114122 | 114317 | Table *pTab = sqliteHashData(x); |
| 114123 | 114318 | Index *pIdx, *pPk; |
| 114124 | 114319 | Index *pPrior = 0; |
| 114125 | 114320 | int loopTop; |
| 114126 | 114321 | int iDataCur, iIdxCur; |
| 114127 | 114322 | int r1 = -1; |
| 114128 | 114323 | |
| 114129 | | - if( pTab->pIndex==0 ) continue; |
| 114324 | + if( pTab->pCheck==0 |
| 114325 | + && (pTab->tabFlags & TF_HasNotNull)==0 |
| 114326 | + && (pTab->pIndex==0 || isQuick) |
| 114327 | + ){ |
| 114328 | + continue; /* No additional checks needed for this table */ |
| 114329 | + } |
| 114130 | 114330 | pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); |
| 114131 | | - addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ |
| 114132 | | - VdbeCoverage(v); |
| 114133 | | - sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 114134 | | - sqlite3VdbeJumpHere(v, addr); |
| 114135 | 114331 | sqlite3ExprCacheClear(pParse); |
| 114136 | 114332 | sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, |
| 114137 | 114333 | 1, 0, &iDataCur, &iIdxCur); |
| 114138 | 114334 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); |
| 114139 | 114335 | for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| | @@ -114144,28 +114340,46 @@ |
| 114144 | 114340 | sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); |
| 114145 | 114341 | loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); |
| 114146 | 114342 | /* Verify that all NOT NULL columns really are NOT NULL */ |
| 114147 | 114343 | for(j=0; j<pTab->nCol; j++){ |
| 114148 | 114344 | char *zErr; |
| 114149 | | - int jmp2, jmp3; |
| 114345 | + int jmp2; |
| 114150 | 114346 | if( j==pTab->iPKey ) continue; |
| 114151 | 114347 | if( pTab->aCol[j].notNull==0 ) continue; |
| 114152 | 114348 | sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); |
| 114153 | 114349 | sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); |
| 114154 | 114350 | jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); |
| 114155 | | - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ |
| 114156 | 114351 | zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, |
| 114157 | 114352 | pTab->aCol[j].zName); |
| 114158 | 114353 | sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); |
| 114159 | | - sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); |
| 114160 | | - jmp3 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); |
| 114161 | | - sqlite3VdbeAddOp0(v, OP_Halt); |
| 114354 | + integrityCheckResultRow(v, 3); |
| 114162 | 114355 | sqlite3VdbeJumpHere(v, jmp2); |
| 114163 | | - sqlite3VdbeJumpHere(v, jmp3); |
| 114356 | + } |
| 114357 | + /* Verify CHECK constraints */ |
| 114358 | + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ |
| 114359 | + int addrCkFault = sqlite3VdbeMakeLabel(v); |
| 114360 | + int addrCkOk = sqlite3VdbeMakeLabel(v); |
| 114361 | + ExprList *pCheck = pTab->pCheck; |
| 114362 | + char *zErr; |
| 114363 | + int k; |
| 114364 | + pParse->iSelfTab = iDataCur; |
| 114365 | + sqlite3ExprCachePush(pParse); |
| 114366 | + for(k=pCheck->nExpr-1; k>0; k--){ |
| 114367 | + sqlite3ExprIfFalse(pParse, pCheck->a[k].pExpr, addrCkFault, 0); |
| 114368 | + } |
| 114369 | + sqlite3ExprIfTrue(pParse, pCheck->a[0].pExpr, addrCkOk, |
| 114370 | + SQLITE_JUMPIFNULL); |
| 114371 | + sqlite3VdbeResolveLabel(v, addrCkFault); |
| 114372 | + zErr = sqlite3MPrintf(db, "CHECK constraint failed in %s", |
| 114373 | + pTab->zName); |
| 114374 | + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); |
| 114375 | + integrityCheckResultRow(v, 3); |
| 114376 | + sqlite3VdbeResolveLabel(v, addrCkOk); |
| 114377 | + sqlite3ExprCachePop(pParse); |
| 114164 | 114378 | } |
| 114165 | 114379 | /* Validate index entries for the current row */ |
| 114166 | | - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 114380 | + for(j=0, pIdx=pTab->pIndex; pIdx && !isQuick; pIdx=pIdx->pNext, j++){ |
| 114167 | 114381 | int jmp2, jmp3, jmp4, jmp5; |
| 114168 | 114382 | int ckUniq = sqlite3VdbeMakeLabel(v); |
| 114169 | 114383 | if( pPk==pIdx ) continue; |
| 114170 | 114384 | r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, |
| 114171 | 114385 | pPrior, r1); |
| | @@ -114172,20 +114386,17 @@ |
| 114172 | 114386 | pPrior = pIdx; |
| 114173 | 114387 | sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1); /* increment entry count */ |
| 114174 | 114388 | /* Verify that an index entry exists for the current table row */ |
| 114175 | 114389 | jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, |
| 114176 | 114390 | pIdx->nColumn); VdbeCoverage(v); |
| 114177 | | - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ |
| 114178 | 114391 | sqlite3VdbeLoadString(v, 3, "row "); |
| 114179 | 114392 | sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); |
| 114180 | 114393 | sqlite3VdbeLoadString(v, 4, " missing from index "); |
| 114181 | 114394 | sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); |
| 114182 | 114395 | jmp5 = sqlite3VdbeLoadString(v, 4, pIdx->zName); |
| 114183 | 114396 | sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); |
| 114184 | | - sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); |
| 114185 | | - jmp4 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); |
| 114186 | | - sqlite3VdbeAddOp0(v, OP_Halt); |
| 114397 | + jmp4 = integrityCheckResultRow(v, 3); |
| 114187 | 114398 | sqlite3VdbeJumpHere(v, jmp2); |
| 114188 | 114399 | /* For UNIQUE indexes, verify that only one entry exists with the |
| 114189 | 114400 | ** current key. The entry is unique if (1) any column is NULL |
| 114190 | 114401 | ** or (2) the next entry has a different key */ |
| 114191 | 114402 | if( IsUniqueIndex(pIdx) ){ |
| | @@ -114202,11 +114413,10 @@ |
| 114202 | 114413 | jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); |
| 114203 | 114414 | sqlite3VdbeGoto(v, uniqOk); |
| 114204 | 114415 | sqlite3VdbeJumpHere(v, jmp6); |
| 114205 | 114416 | sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, |
| 114206 | 114417 | pIdx->nKeyCol); VdbeCoverage(v); |
| 114207 | | - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ |
| 114208 | 114418 | sqlite3VdbeLoadString(v, 3, "non-unique entry in index "); |
| 114209 | 114419 | sqlite3VdbeGoto(v, jmp5); |
| 114210 | 114420 | sqlite3VdbeResolveLabel(v, uniqOk); |
| 114211 | 114421 | } |
| 114212 | 114422 | sqlite3VdbeJumpHere(v, jmp4); |
| | @@ -114213,40 +114423,39 @@ |
| 114213 | 114423 | sqlite3ResolvePartIdxLabel(pParse, jmp3); |
| 114214 | 114424 | } |
| 114215 | 114425 | sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); |
| 114216 | 114426 | sqlite3VdbeJumpHere(v, loopTop-1); |
| 114217 | 114427 | #ifndef SQLITE_OMIT_BTREECOUNT |
| 114218 | | - sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); |
| 114219 | | - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 114220 | | - if( pPk==pIdx ) continue; |
| 114221 | | - addr = sqlite3VdbeCurrentAddr(v); |
| 114222 | | - sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr+2); VdbeCoverage(v); |
| 114223 | | - sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 114224 | | - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); |
| 114225 | | - sqlite3VdbeAddOp3(v, OP_Eq, 8+j, addr+8, 3); VdbeCoverage(v); |
| 114226 | | - sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); |
| 114227 | | - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); |
| 114228 | | - sqlite3VdbeLoadString(v, 3, pIdx->zName); |
| 114229 | | - sqlite3VdbeAddOp3(v, OP_Concat, 3, 2, 7); |
| 114230 | | - sqlite3VdbeAddOp2(v, OP_ResultRow, 7, 1); |
| 114428 | + if( !isQuick ){ |
| 114429 | + sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); |
| 114430 | + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 114431 | + if( pPk==pIdx ) continue; |
| 114432 | + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); |
| 114433 | + addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+j, 0, 3); VdbeCoverage(v); |
| 114434 | + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); |
| 114435 | + sqlite3VdbeLoadString(v, 3, pIdx->zName); |
| 114436 | + sqlite3VdbeAddOp3(v, OP_Concat, 3, 2, 7); |
| 114437 | + integrityCheckResultRow(v, 7); |
| 114438 | + sqlite3VdbeJumpHere(v, addr); |
| 114439 | + } |
| 114231 | 114440 | } |
| 114232 | 114441 | #endif /* SQLITE_OMIT_BTREECOUNT */ |
| 114233 | 114442 | } |
| 114234 | 114443 | } |
| 114235 | 114444 | { |
| 114236 | 114445 | static const int iLn = VDBE_OFFSET_LINENO(2); |
| 114237 | 114446 | static const VdbeOpList endCode[] = { |
| 114238 | 114447 | { OP_AddImm, 1, 0, 0}, /* 0 */ |
| 114239 | | - { OP_If, 1, 4, 0}, /* 1 */ |
| 114448 | + { OP_IfNotZero, 1, 4, 0}, /* 1 */ |
| 114240 | 114449 | { OP_String8, 0, 3, 0}, /* 2 */ |
| 114241 | 114450 | { OP_ResultRow, 3, 1, 0}, /* 3 */ |
| 114242 | 114451 | }; |
| 114243 | 114452 | VdbeOp *aOp; |
| 114244 | 114453 | |
| 114245 | 114454 | aOp = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); |
| 114246 | 114455 | if( aOp ){ |
| 114247 | | - aOp[0].p2 = -mxErr; |
| 114456 | + aOp[0].p2 = 1-mxErr; |
| 114248 | 114457 | aOp[2].p4type = P4_STATIC; |
| 114249 | 114458 | aOp[2].p4.z = "ok"; |
| 114250 | 114459 | } |
| 114251 | 114460 | } |
| 114252 | 114461 | } |
| | @@ -114466,10 +114675,92 @@ |
| 114466 | 114675 | */ |
| 114467 | 114676 | case PragTyp_SHRINK_MEMORY: { |
| 114468 | 114677 | sqlite3_db_release_memory(db); |
| 114469 | 114678 | break; |
| 114470 | 114679 | } |
| 114680 | + |
| 114681 | + /* |
| 114682 | + ** PRAGMA optimize |
| 114683 | + ** PRAGMA schema.optimize |
| 114684 | + ** |
| 114685 | + ** Attempt to optimize the database. All schemas are optimized in the first |
| 114686 | + ** form, and only the specified schema is optimized in the second form. |
| 114687 | + ** |
| 114688 | + ** The details of optimizations performed by this pragma does are expected |
| 114689 | + ** to change and improve over time. Applications should anticipate that |
| 114690 | + ** this pragma will perform new optimizations in future releases. |
| 114691 | + ** |
| 114692 | + ** Argments to this pragma are currently ignored, but future enhancements |
| 114693 | + ** might make use of arguments to control which optimizations are allowed |
| 114694 | + ** or to suggest limits on how much CPU time and I/O should be expended |
| 114695 | + ** in the optimization effort. |
| 114696 | + ** |
| 114697 | + ** The current implementation runs ANALYZE on any tables which might have |
| 114698 | + ** benefitted from having recent statistics at some point since the start |
| 114699 | + ** of the current connection. Only tables in "schema" are analyzed in the |
| 114700 | + ** second form. In the first form, all tables except TEMP tables are |
| 114701 | + ** checked. |
| 114702 | + ** |
| 114703 | + ** In the current implementation, a table is analyzed only if both of |
| 114704 | + ** the following are true: |
| 114705 | + ** |
| 114706 | + ** (1) The query planner used sqlite_stat1-style statistics for one or |
| 114707 | + ** more indexes of the table at some point during the lifetime of |
| 114708 | + ** the current connection. |
| 114709 | + ** |
| 114710 | + ** (2) One or more indexes of the table are currently unanalyzed OR |
| 114711 | + ** the number of rows in the table has increased by 25 times or more |
| 114712 | + ** since the last time ANALYZE was run. |
| 114713 | + ** |
| 114714 | + ** The rules for when tables are analyzed are likely to change in |
| 114715 | + ** future releases. |
| 114716 | + */ |
| 114717 | + case PragTyp_OPTIMIZE: { |
| 114718 | + int iDbLast; /* Loop termination point for the schema loop */ |
| 114719 | + int iTabCur; /* Cursor for a table whose size needs checking */ |
| 114720 | + HashElem *k; /* Loop over tables of a schema */ |
| 114721 | + Schema *pSchema; /* The current schema */ |
| 114722 | + Table *pTab; /* A table in the schema */ |
| 114723 | + Index *pIdx; /* An index of the table */ |
| 114724 | + LogEst szThreshold; /* Size threshold above which reanalysis is needd */ |
| 114725 | + char *zSubSql; /* SQL statement for the OP_SqlExec opcode */ |
| 114726 | + |
| 114727 | + iTabCur = pParse->nTab++; |
| 114728 | + for(iDbLast = zDb?iDb:db->nDb-1; iDb<=iDbLast; iDb++){ |
| 114729 | + if( iDb==1 ) continue; |
| 114730 | + sqlite3CodeVerifySchema(pParse, iDb); |
| 114731 | + pSchema = db->aDb[iDb].pSchema; |
| 114732 | + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ |
| 114733 | + pTab = (Table*)sqliteHashData(k); |
| 114734 | + |
| 114735 | + /* If table pTab has not been used in a way that would benefit from |
| 114736 | + ** having analysis statistics during the current session, then skip it. |
| 114737 | + ** This also has the effect of skipping virtual tables and views */ |
| 114738 | + if( (pTab->tabFlags & TF_StatsUsed)==0 ) continue; |
| 114739 | + |
| 114740 | + /* Reanalyze if the table is 25 times larger than the last analysis */ |
| 114741 | + szThreshold = pTab->nRowLogEst + 46; assert( sqlite3LogEst(25)==46 ); |
| 114742 | + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| 114743 | + if( !pIdx->hasStat1 ){ |
| 114744 | + szThreshold = 0; /* Always analyze if any index lacks statistics */ |
| 114745 | + break; |
| 114746 | + } |
| 114747 | + } |
| 114748 | + if( szThreshold ){ |
| 114749 | + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); |
| 114750 | + sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, |
| 114751 | + sqlite3VdbeCurrentAddr(v)+2, szThreshold); |
| 114752 | + VdbeCoverage(v); |
| 114753 | + } |
| 114754 | + zSubSql = sqlite3MPrintf(db, "ANALYZE \"%w\".\"%w\"", |
| 114755 | + db->aDb[iDb].zDbSName, pTab->zName); |
| 114756 | + sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0, zSubSql, P4_DYNAMIC); |
| 114757 | + } |
| 114758 | + } |
| 114759 | + sqlite3VdbeAddOp0(v, OP_Expire); |
| 114760 | + break; |
| 114761 | + } |
| 114471 | 114762 | |
| 114472 | 114763 | /* |
| 114473 | 114764 | ** PRAGMA busy_timeout |
| 114474 | 114765 | ** PRAGMA busy_timeout = N |
| 114475 | 114766 | ** |
| | @@ -123782,12 +124073,29 @@ |
| 123782 | 124073 | ** transient would cause the database file to appear to be deleted |
| 123783 | 124074 | ** following reboot. |
| 123784 | 124075 | */ |
| 123785 | 124076 | SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm){ |
| 123786 | 124077 | Vdbe *v = sqlite3GetVdbe(pParse); |
| 123787 | | - int iDb = pNm ? sqlite3TwoPartName(pParse, pNm, pNm, &pNm) : 0; |
| 123788 | | - if( v && (iDb>=2 || iDb==0) ){ |
| 124078 | + int iDb = 0; |
| 124079 | + if( v==0 ) return; |
| 124080 | + if( pNm ){ |
| 124081 | +#ifndef SQLITE_BUG_COMPATIBLE_20160819 |
| 124082 | + /* Default behavior: Report an error if the argument to VACUUM is |
| 124083 | + ** not recognized */ |
| 124084 | + iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); |
| 124085 | + if( iDb<0 ) return; |
| 124086 | +#else |
| 124087 | + /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments |
| 124088 | + ** to VACUUM are silently ignored. This is a back-out of a bug fix that |
| 124089 | + ** occurred on 2016-08-19 (https://www.sqlite.org/src/info/083f9e6270). |
| 124090 | + ** The buggy behavior is required for binary compatibility with some |
| 124091 | + ** legacy applications. */ |
| 124092 | + iDb = sqlite3FindDb(pParse->db, pNm); |
| 124093 | + if( iDb<0 ) iDb = 0; |
| 124094 | +#endif |
| 124095 | + } |
| 124096 | + if( iDb!=1 ){ |
| 123789 | 124097 | sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); |
| 123790 | 124098 | sqlite3VdbeUsesBtree(v, iDb); |
| 123791 | 124099 | } |
| 123792 | 124100 | return; |
| 123793 | 124101 | } |
| | @@ -124377,12 +124685,11 @@ |
| 124377 | 124685 | |
| 124378 | 124686 | db = pParse->db; |
| 124379 | 124687 | iDb = sqlite3SchemaToIndex(db, pTable->pSchema); |
| 124380 | 124688 | assert( iDb>=0 ); |
| 124381 | 124689 | |
| 124382 | | - pTable->tabFlags |= TF_Virtual; |
| 124383 | | - pTable->nModuleArg = 0; |
| 124690 | + assert( pTable->nModuleArg==0 ); |
| 124384 | 124691 | addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName)); |
| 124385 | 124692 | addModuleArgument(db, pTable, 0); |
| 124386 | 124693 | addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName)); |
| 124387 | 124694 | assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0) |
| 124388 | 124695 | || (pParse->sNameToken.z==pName1->z && pName2->z==0) |
| | @@ -124666,11 +124973,11 @@ |
| 124666 | 124973 | const char *zMod; |
| 124667 | 124974 | Module *pMod; |
| 124668 | 124975 | int rc; |
| 124669 | 124976 | |
| 124670 | 124977 | assert( pTab ); |
| 124671 | | - if( (pTab->tabFlags & TF_Virtual)==0 || sqlite3GetVTable(db, pTab) ){ |
| 124978 | + if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){ |
| 124672 | 124979 | return SQLITE_OK; |
| 124673 | 124980 | } |
| 124674 | 124981 | |
| 124675 | 124982 | /* Locate the required virtual table module */ |
| 124676 | 124983 | zMod = pTab->azModuleArg[0]; |
| | @@ -124736,11 +125043,11 @@ |
| 124736 | 125043 | Table *pTab; |
| 124737 | 125044 | Module *pMod; |
| 124738 | 125045 | const char *zMod; |
| 124739 | 125046 | |
| 124740 | 125047 | pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); |
| 124741 | | - assert( pTab && (pTab->tabFlags & TF_Virtual)!=0 && !pTab->pVTable ); |
| 125048 | + assert( pTab && IsVirtual(pTab) && !pTab->pVTable ); |
| 124742 | 125049 | |
| 124743 | 125050 | /* Locate the required virtual table module */ |
| 124744 | 125051 | zMod = pTab->azModuleArg[0]; |
| 124745 | 125052 | pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); |
| 124746 | 125053 | |
| | @@ -124790,11 +125097,11 @@ |
| 124790 | 125097 | sqlite3Error(db, SQLITE_MISUSE); |
| 124791 | 125098 | sqlite3_mutex_leave(db->mutex); |
| 124792 | 125099 | return SQLITE_MISUSE_BKPT; |
| 124793 | 125100 | } |
| 124794 | 125101 | pTab = pCtx->pTab; |
| 124795 | | - assert( (pTab->tabFlags & TF_Virtual)!=0 ); |
| 125102 | + assert( IsVirtual(pTab) ); |
| 124796 | 125103 | |
| 124797 | 125104 | pParse = sqlite3StackAllocZero(db, sizeof(*pParse)); |
| 124798 | 125105 | if( pParse==0 ){ |
| 124799 | 125106 | rc = SQLITE_NOMEM_BKPT; |
| 124800 | 125107 | }else{ |
| | @@ -124804,11 +125111,11 @@ |
| 124804 | 125111 | |
| 124805 | 125112 | if( SQLITE_OK==sqlite3RunParser(pParse, zCreateTable, &zErr) |
| 124806 | 125113 | && pParse->pNewTable |
| 124807 | 125114 | && !db->mallocFailed |
| 124808 | 125115 | && !pParse->pNewTable->pSelect |
| 124809 | | - && (pParse->pNewTable->tabFlags & TF_Virtual)==0 |
| 125116 | + && !IsVirtual(pParse->pNewTable) |
| 124810 | 125117 | ){ |
| 124811 | 125118 | if( !pTab->aCol ){ |
| 124812 | 125119 | Table *pNew = pParse->pNewTable; |
| 124813 | 125120 | Index *pIdx; |
| 124814 | 125121 | pTab->aCol = pNew->aCol; |
| | @@ -125093,11 +125400,11 @@ |
| 125093 | 125400 | /* Check to see the left operand is a column in a virtual table */ |
| 125094 | 125401 | if( NEVER(pExpr==0) ) return pDef; |
| 125095 | 125402 | if( pExpr->op!=TK_COLUMN ) return pDef; |
| 125096 | 125403 | pTab = pExpr->pTab; |
| 125097 | 125404 | if( NEVER(pTab==0) ) return pDef; |
| 125098 | | - if( (pTab->tabFlags & TF_Virtual)==0 ) return pDef; |
| 125405 | + if( !IsVirtual(pTab) ) return pDef; |
| 125099 | 125406 | pVtab = sqlite3GetVTable(db, pTab)->pVtab; |
| 125100 | 125407 | assert( pVtab!=0 ); |
| 125101 | 125408 | assert( pVtab->pModule!=0 ); |
| 125102 | 125409 | pMod = (sqlite3_module *)pVtab->pModule; |
| 125103 | 125410 | if( pMod->xFindFunction==0 ) return pDef; |
| | @@ -125188,12 +125495,11 @@ |
| 125188 | 125495 | return 0; |
| 125189 | 125496 | } |
| 125190 | 125497 | pMod->pEpoTab = pTab; |
| 125191 | 125498 | pTab->nTabRef = 1; |
| 125192 | 125499 | pTab->pSchema = db->aDb[0].pSchema; |
| 125193 | | - pTab->tabFlags |= TF_Virtual; |
| 125194 | | - pTab->nModuleArg = 0; |
| 125500 | + assert( pTab->nModuleArg==0 ); |
| 125195 | 125501 | pTab->iPKey = -1; |
| 125196 | 125502 | addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); |
| 125197 | 125503 | addModuleArgument(db, pTab, 0); |
| 125198 | 125504 | addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); |
| 125199 | 125505 | rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); |
| | @@ -125260,11 +125566,11 @@ |
| 125260 | 125566 | case SQLITE_VTAB_CONSTRAINT_SUPPORT: { |
| 125261 | 125567 | VtabCtx *p = db->pVtabCtx; |
| 125262 | 125568 | if( !p ){ |
| 125263 | 125569 | rc = SQLITE_MISUSE_BKPT; |
| 125264 | 125570 | }else{ |
| 125265 | | - assert( p->pTab==0 || (p->pTab->tabFlags & TF_Virtual)!=0 ); |
| 125571 | + assert( p->pTab==0 || IsVirtual(p->pTab) ); |
| 125266 | 125572 | p->pVTable->bConstraint = (u8)va_arg(ap, int); |
| 125267 | 125573 | } |
| 125268 | 125574 | break; |
| 125269 | 125575 | } |
| 125270 | 125576 | default: |
| | @@ -125699,12 +126005,17 @@ |
| 125699 | 126005 | WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ |
| 125700 | 126006 | #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 125701 | 126007 | UnpackedRecord *pRec; /* Probe for stat4 (if required) */ |
| 125702 | 126008 | int nRecValid; /* Number of valid fields currently in pRec */ |
| 125703 | 126009 | #endif |
| 126010 | + unsigned int bldFlags; /* SQLITE_BLDF_* flags */ |
| 125704 | 126011 | }; |
| 125705 | 126012 | |
| 126013 | +/* Allowed values for WhereLoopBuider.bldFlags */ |
| 126014 | +#define SQLITE_BLDF_INDEXED 0x0001 /* An index is used */ |
| 126015 | +#define SQLITE_BLDF_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ |
| 126016 | + |
| 125706 | 126017 | /* |
| 125707 | 126018 | ** The WHERE clause processing routine has two halves. The |
| 125708 | 126019 | ** first part does the start of the WHERE loop and the second |
| 125709 | 126020 | ** half does the tail of the WHERE loop. An instance of |
| 125710 | 126021 | ** this structure is returned by the first half and passed |
| | @@ -125715,11 +126026,11 @@ |
| 125715 | 126026 | */ |
| 125716 | 126027 | struct WhereInfo { |
| 125717 | 126028 | Parse *pParse; /* Parsing and code generating context */ |
| 125718 | 126029 | SrcList *pTabList; /* List of tables in the join */ |
| 125719 | 126030 | ExprList *pOrderBy; /* The ORDER BY clause or NULL */ |
| 125720 | | - ExprList *pDistinctSet; /* DISTINCT over all these values */ |
| 126031 | + ExprList *pResultSet; /* Result set of the query */ |
| 125721 | 126032 | LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ |
| 125722 | 126033 | int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ |
| 125723 | 126034 | int iContinue; /* Jump here to continue with next record */ |
| 125724 | 126035 | int iBreak; /* Jump here to break out of the loop */ |
| 125725 | 126036 | int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ |
| | @@ -126899,10 +127210,11 @@ |
| 126899 | 127210 | Parse *pParse; /* Parsing context */ |
| 126900 | 127211 | sqlite3 *db; /* Database connection */ |
| 126901 | 127212 | Vdbe *v; /* The prepared stmt under constructions */ |
| 126902 | 127213 | struct SrcList_item *pTabItem; /* FROM clause term being coded */ |
| 126903 | 127214 | int addrBrk; /* Jump here to break out of the loop */ |
| 127215 | + int addrHalt; /* addrBrk for the outermost loop */ |
| 126904 | 127216 | int addrCont; /* Jump here to continue with next cycle */ |
| 126905 | 127217 | int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ |
| 126906 | 127218 | int iReleaseReg = 0; /* Temp register to free before returning */ |
| 126907 | 127219 | |
| 126908 | 127220 | pParse = pWInfo->pParse; |
| | @@ -126939,10 +127251,15 @@ |
| 126939 | 127251 | if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ |
| 126940 | 127252 | pLevel->iLeftJoin = ++pParse->nMem; |
| 126941 | 127253 | sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); |
| 126942 | 127254 | VdbeComment((v, "init LEFT JOIN no-match flag")); |
| 126943 | 127255 | } |
| 127256 | + |
| 127257 | + /* Compute a safe address to jump to if we discover that the table for |
| 127258 | + ** this loop is empty and can never contribute content. */ |
| 127259 | + for(j=iLevel; j>0 && pWInfo->a[j].iLeftJoin==0; j--){} |
| 127260 | + addrHalt = pWInfo->a[j].addrBrk; |
| 126944 | 127261 | |
| 126945 | 127262 | /* Special case of a FROM clause subquery implemented as a co-routine */ |
| 126946 | 127263 | if( pTabItem->fg.viaCoroutine ){ |
| 126947 | 127264 | int regYield = pTabItem->regReturn; |
| 126948 | 127265 | sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); |
| | @@ -127124,11 +127441,11 @@ |
| 127124 | 127441 | VdbeCoverageIf(v, pX->op==TK_LT); |
| 127125 | 127442 | VdbeCoverageIf(v, pX->op==TK_GE); |
| 127126 | 127443 | sqlite3ExprCacheAffinityChange(pParse, r1, 1); |
| 127127 | 127444 | sqlite3ReleaseTempReg(pParse, rTemp); |
| 127128 | 127445 | }else{ |
| 127129 | | - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk); |
| 127446 | + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrHalt); |
| 127130 | 127447 | VdbeCoverageIf(v, bRev==0); |
| 127131 | 127448 | VdbeCoverageIf(v, bRev!=0); |
| 127132 | 127449 | } |
| 127133 | 127450 | if( pEnd ){ |
| 127134 | 127451 | Expr *pX; |
| | @@ -127770,11 +128087,11 @@ |
| 127770 | 128087 | pLevel->op = OP_Noop; |
| 127771 | 128088 | }else{ |
| 127772 | 128089 | codeCursorHint(pTabItem, pWInfo, pLevel, 0); |
| 127773 | 128090 | pLevel->op = aStep[bRev]; |
| 127774 | 128091 | pLevel->p1 = iCur; |
| 127775 | | - pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk); |
| 128092 | + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrHalt); |
| 127776 | 128093 | VdbeCoverageIf(v, bRev==0); |
| 127777 | 128094 | VdbeCoverageIf(v, bRev!=0); |
| 127778 | 128095 | pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; |
| 127779 | 128096 | } |
| 127780 | 128097 | } |
| | @@ -128095,19 +128412,10 @@ |
| 128095 | 128412 | #ifdef SQLITE_EBCDIC |
| 128096 | 128413 | if( *pnoCase ) return 0; |
| 128097 | 128414 | #endif |
| 128098 | 128415 | pList = pExpr->x.pList; |
| 128099 | 128416 | pLeft = pList->a[1].pExpr; |
| 128100 | | - if( pLeft->op!=TK_COLUMN |
| 128101 | | - || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT |
| 128102 | | - || IsVirtual(pLeft->pTab) /* Value might be numeric */ |
| 128103 | | - ){ |
| 128104 | | - /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must |
| 128105 | | - ** be the name of an indexed column with TEXT affinity. */ |
| 128106 | | - return 0; |
| 128107 | | - } |
| 128108 | | - assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */ |
| 128109 | 128417 | |
| 128110 | 128418 | pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); |
| 128111 | 128419 | op = pRight->op; |
| 128112 | 128420 | if( op==TK_VARIABLE ){ |
| 128113 | 128421 | Vdbe *pReprepare = pParse->pReprepare; |
| | @@ -128120,10 +128428,27 @@ |
| 128120 | 128428 | assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); |
| 128121 | 128429 | }else if( op==TK_STRING ){ |
| 128122 | 128430 | z = pRight->u.zToken; |
| 128123 | 128431 | } |
| 128124 | 128432 | if( z ){ |
| 128433 | + |
| 128434 | + /* If the RHS begins with a digit or a minus sign, then the LHS must |
| 128435 | + ** be an ordinary column (not a virtual table column) with TEXT affinity. |
| 128436 | + ** Otherwise the LHS might be numeric and "lhs >= rhs" would be false |
| 128437 | + ** even though "lhs LIKE rhs" is true. But if the RHS does not start |
| 128438 | + ** with a digit or '-', then "lhs LIKE rhs" will always be false if |
| 128439 | + ** the LHS is numeric and so the optimization still works. |
| 128440 | + */ |
| 128441 | + if( sqlite3Isdigit(z[0]) || z[0]=='-' ){ |
| 128442 | + if( pLeft->op!=TK_COLUMN |
| 128443 | + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT |
| 128444 | + || IsVirtual(pLeft->pTab) /* Value might be numeric */ |
| 128445 | + ){ |
| 128446 | + sqlite3ValueFree(pVal); |
| 128447 | + return 0; |
| 128448 | + } |
| 128449 | + } |
| 128125 | 128450 | cnt = 0; |
| 128126 | 128451 | while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ |
| 128127 | 128452 | cnt++; |
| 128128 | 128453 | } |
| 128129 | 128454 | if( cnt!=0 && 255!=(u8)z[cnt-1] ){ |
| | @@ -128748,11 +129073,11 @@ |
| 128748 | 129073 | iCur = pFrom->a[i].iCursor; |
| 128749 | 129074 | for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| 128750 | 129075 | if( pIdx->aColExpr==0 ) continue; |
| 128751 | 129076 | for(i=0; i<pIdx->nKeyCol; i++){ |
| 128752 | 129077 | if( pIdx->aiColumn[i]!=XN_EXPR ) continue; |
| 128753 | | - if( sqlite3ExprCompare(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){ |
| 129078 | + if( sqlite3ExprCompareSkip(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){ |
| 128754 | 129079 | *piCur = iCur; |
| 128755 | 129080 | *piColumn = XN_EXPR; |
| 128756 | 129081 | return 1; |
| 128757 | 129082 | } |
| 128758 | 129083 | } |
| | @@ -129539,11 +129864,12 @@ |
| 129539 | 129864 | do{ |
| 129540 | 129865 | for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){ |
| 129541 | 129866 | if( pTerm->leftCursor==iCur |
| 129542 | 129867 | && pTerm->u.leftColumn==iColumn |
| 129543 | 129868 | && (iColumn!=XN_EXPR |
| 129544 | | - || sqlite3ExprCompare(pTerm->pExpr->pLeft,pScan->pIdxExpr,iCur)==0) |
| 129869 | + || sqlite3ExprCompareSkip(pTerm->pExpr->pLeft, |
| 129870 | + pScan->pIdxExpr,iCur)==0) |
| 129545 | 129871 | && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) |
| 129546 | 129872 | ){ |
| 129547 | 129873 | if( (pTerm->eOperator & WO_EQUIV)!=0 |
| 129548 | 129874 | && pScan->nEquiv<ArraySize(pScan->aiCur) |
| 129549 | 129875 | && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN |
| | @@ -131716,10 +132042,15 @@ |
| 131716 | 132042 | testcase( eOp & WO_IS ); |
| 131717 | 132043 | testcase( eOp & WO_ISNULL ); |
| 131718 | 132044 | continue; |
| 131719 | 132045 | } |
| 131720 | 132046 | |
| 132047 | + if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ |
| 132048 | + pBuilder->bldFlags |= SQLITE_BLDF_UNIQUE; |
| 132049 | + }else{ |
| 132050 | + pBuilder->bldFlags |= SQLITE_BLDF_INDEXED; |
| 132051 | + } |
| 131721 | 132052 | pNew->wsFlags = saved_wsFlags; |
| 131722 | 132053 | pNew->u.btree.nEq = saved_nEq; |
| 131723 | 132054 | pNew->u.btree.nBtm = saved_nBtm; |
| 131724 | 132055 | pNew->u.btree.nTop = saved_nTop; |
| 131725 | 132056 | pNew->nLTerm = saved_nLTerm; |
| | @@ -132263,11 +132594,19 @@ |
| 132263 | 132594 | pNew->nOut = rSize; |
| 132264 | 132595 | if( rc ) break; |
| 132265 | 132596 | } |
| 132266 | 132597 | } |
| 132267 | 132598 | |
| 132599 | + pBuilder->bldFlags = 0; |
| 132268 | 132600 | rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); |
| 132601 | + if( pBuilder->bldFlags==SQLITE_BLDF_INDEXED ){ |
| 132602 | + /* If a non-unique index is used, or if a prefix of the key for |
| 132603 | + ** unique index is used (making the index functionally non-unique) |
| 132604 | + ** then the sqlite_stat1 data becomes important for scoring the |
| 132605 | + ** plan */ |
| 132606 | + pTab->tabFlags |= TF_StatsUsed; |
| 132607 | + } |
| 132269 | 132608 | #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 132270 | 132609 | sqlite3Stat4ProbeFree(pBuilder->pRec); |
| 132271 | 132610 | pBuilder->nRecValid = 0; |
| 132272 | 132611 | pBuilder->pRec = 0; |
| 132273 | 132612 | #endif |
| | @@ -133443,13 +133782,13 @@ |
| 133443 | 133782 | && (pWInfo->wctrlFlags & WHERE_DISTINCTBY)==0 |
| 133444 | 133783 | && pWInfo->eDistinct==WHERE_DISTINCT_NOOP |
| 133445 | 133784 | && nRowEst |
| 133446 | 133785 | ){ |
| 133447 | 133786 | Bitmask notUsed; |
| 133448 | | - int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pDistinctSet, pFrom, |
| 133787 | + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pResultSet, pFrom, |
| 133449 | 133788 | WHERE_DISTINCTBY, nLoop-1, pFrom->aLoop[nLoop-1], ¬Used); |
| 133450 | | - if( rc==pWInfo->pDistinctSet->nExpr ){ |
| 133789 | + if( rc==pWInfo->pResultSet->nExpr ){ |
| 133451 | 133790 | pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; |
| 133452 | 133791 | } |
| 133453 | 133792 | } |
| 133454 | 133793 | if( pWInfo->pOrderBy ){ |
| 133455 | 133794 | if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ |
| | @@ -133682,11 +134021,11 @@ |
| 133682 | 134021 | SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( |
| 133683 | 134022 | Parse *pParse, /* The parser context */ |
| 133684 | 134023 | SrcList *pTabList, /* FROM clause: A list of all tables to be scanned */ |
| 133685 | 134024 | Expr *pWhere, /* The WHERE clause */ |
| 133686 | 134025 | ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ |
| 133687 | | - ExprList *pDistinctSet, /* Try not to output two rows that duplicate these */ |
| 134026 | + ExprList *pResultSet, /* Query result set. Req'd for DISTINCT */ |
| 133688 | 134027 | u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */ |
| 133689 | 134028 | int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number |
| 133690 | 134029 | ** If WHERE_USE_LIMIT, then the limit amount */ |
| 133691 | 134030 | ){ |
| 133692 | 134031 | int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */ |
| | @@ -133758,11 +134097,11 @@ |
| 133758 | 134097 | goto whereBeginError; |
| 133759 | 134098 | } |
| 133760 | 134099 | pWInfo->pParse = pParse; |
| 133761 | 134100 | pWInfo->pTabList = pTabList; |
| 133762 | 134101 | pWInfo->pOrderBy = pOrderBy; |
| 133763 | | - pWInfo->pDistinctSet = pDistinctSet; |
| 134102 | + pWInfo->pResultSet = pResultSet; |
| 133764 | 134103 | pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; |
| 133765 | 134104 | pWInfo->nLevel = nTabList; |
| 133766 | 134105 | pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); |
| 133767 | 134106 | pWInfo->wctrlFlags = wctrlFlags; |
| 133768 | 134107 | pWInfo->iLimit = iAuxArg; |
| | @@ -133836,17 +134175,17 @@ |
| 133836 | 134175 | /* Analyze all of the subexpressions. */ |
| 133837 | 134176 | sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); |
| 133838 | 134177 | if( db->mallocFailed ) goto whereBeginError; |
| 133839 | 134178 | |
| 133840 | 134179 | if( wctrlFlags & WHERE_WANT_DISTINCT ){ |
| 133841 | | - if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pDistinctSet) ){ |
| 134180 | + if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ |
| 133842 | 134181 | /* The DISTINCT marking is pointless. Ignore it. */ |
| 133843 | 134182 | pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; |
| 133844 | 134183 | }else if( pOrderBy==0 ){ |
| 133845 | 134184 | /* Try to ORDER BY the result set to make distinct processing easier */ |
| 133846 | 134185 | pWInfo->wctrlFlags |= WHERE_DISTINCTBY; |
| 133847 | | - pWInfo->pOrderBy = pDistinctSet; |
| 134186 | + pWInfo->pOrderBy = pResultSet; |
| 133848 | 134187 | } |
| 133849 | 134188 | } |
| 133850 | 134189 | |
| 133851 | 134190 | /* Construct the WhereLoop objects */ |
| 133852 | 134191 | #if defined(WHERETRACE_ENABLED) |
| | @@ -133918,14 +134257,14 @@ |
| 133918 | 134257 | } |
| 133919 | 134258 | } |
| 133920 | 134259 | #endif |
| 133921 | 134260 | /* Attempt to omit tables from the join that do not effect the result */ |
| 133922 | 134261 | if( pWInfo->nLevel>=2 |
| 133923 | | - && pDistinctSet!=0 |
| 134262 | + && pResultSet!=0 |
| 133924 | 134263 | && OptimizationEnabled(db, SQLITE_OmitNoopJoin) |
| 133925 | 134264 | ){ |
| 133926 | | - Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pDistinctSet); |
| 134265 | + Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet); |
| 133927 | 134266 | if( sWLB.pOrderBy ){ |
| 133928 | 134267 | tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy); |
| 133929 | 134268 | } |
| 133930 | 134269 | while( pWInfo->nLevel>=2 ){ |
| 133931 | 134270 | WhereTerm *pTerm, *pEnd; |
| | @@ -134704,166 +135043,166 @@ |
| 134704 | 135043 | ** |
| 134705 | 135044 | *********** Begin parsing tables **********************************************/ |
| 134706 | 135045 | #define YY_ACTTAB_COUNT (1567) |
| 134707 | 135046 | static const YYACTIONTYPE yy_action[] = { |
| 134708 | 135047 | /* 0 */ 325, 832, 351, 825, 5, 203, 203, 819, 99, 100, |
| 134709 | | - /* 10 */ 90, 842, 842, 854, 857, 846, 846, 97, 97, 98, |
| 135048 | + /* 10 */ 90, 978, 978, 853, 856, 845, 845, 97, 97, 98, |
| 134710 | 135049 | /* 20 */ 98, 98, 98, 301, 96, 96, 96, 96, 95, 95, |
| 134711 | | - /* 30 */ 94, 94, 94, 93, 351, 325, 977, 977, 824, 824, |
| 134712 | | - /* 40 */ 826, 947, 354, 99, 100, 90, 842, 842, 854, 857, |
| 134713 | | - /* 50 */ 846, 846, 97, 97, 98, 98, 98, 98, 338, 96, |
| 135050 | + /* 30 */ 94, 94, 94, 93, 351, 325, 976, 976, 824, 824, |
| 135051 | + /* 40 */ 826, 946, 354, 99, 100, 90, 978, 978, 853, 856, |
| 135052 | + /* 50 */ 845, 845, 97, 97, 98, 98, 98, 98, 338, 96, |
| 134714 | 135053 | /* 60 */ 96, 96, 96, 95, 95, 94, 94, 94, 93, 351, |
| 134715 | | - /* 70 */ 95, 95, 94, 94, 94, 93, 351, 791, 977, 977, |
| 135054 | + /* 70 */ 95, 95, 94, 94, 94, 93, 351, 791, 976, 976, |
| 134716 | 135055 | /* 80 */ 325, 94, 94, 94, 93, 351, 792, 75, 99, 100, |
| 134717 | | - /* 90 */ 90, 842, 842, 854, 857, 846, 846, 97, 97, 98, |
| 135056 | + /* 90 */ 90, 978, 978, 853, 856, 845, 845, 97, 97, 98, |
| 134718 | 135057 | /* 100 */ 98, 98, 98, 450, 96, 96, 96, 96, 95, 95, |
| 134719 | 135058 | /* 110 */ 94, 94, 94, 93, 351, 1333, 155, 155, 2, 325, |
| 134720 | 135059 | /* 120 */ 275, 146, 132, 52, 52, 93, 351, 99, 100, 90, |
| 134721 | | - /* 130 */ 842, 842, 854, 857, 846, 846, 97, 97, 98, 98, |
| 135060 | + /* 130 */ 978, 978, 853, 856, 845, 845, 97, 97, 98, 98, |
| 134722 | 135061 | /* 140 */ 98, 98, 101, 96, 96, 96, 96, 95, 95, 94, |
| 134723 | | - /* 150 */ 94, 94, 93, 351, 958, 958, 325, 268, 428, 413, |
| 134724 | | - /* 160 */ 411, 61, 752, 752, 99, 100, 90, 842, 842, 854, |
| 134725 | | - /* 170 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 60, |
| 135062 | + /* 150 */ 94, 94, 93, 351, 957, 957, 325, 268, 428, 413, |
| 135063 | + /* 160 */ 411, 61, 752, 752, 99, 100, 90, 978, 978, 853, |
| 135064 | + /* 170 */ 856, 845, 845, 97, 97, 98, 98, 98, 98, 60, |
| 134726 | 135065 | /* 180 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, |
| 134727 | | - /* 190 */ 351, 325, 270, 329, 273, 277, 959, 960, 250, 99, |
| 134728 | | - /* 200 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, |
| 135066 | + /* 190 */ 351, 325, 270, 329, 273, 277, 958, 959, 250, 99, |
| 135067 | + /* 200 */ 100, 90, 978, 978, 853, 856, 845, 845, 97, 97, |
| 134729 | 135068 | /* 210 */ 98, 98, 98, 98, 301, 96, 96, 96, 96, 95, |
| 134730 | | - /* 220 */ 95, 94, 94, 94, 93, 351, 325, 938, 1326, 698, |
| 134731 | | - /* 230 */ 706, 1326, 242, 412, 99, 100, 90, 842, 842, 854, |
| 134732 | | - /* 240 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 347, |
| 135069 | + /* 220 */ 95, 94, 94, 94, 93, 351, 325, 937, 1326, 698, |
| 135070 | + /* 230 */ 706, 1326, 242, 412, 99, 100, 90, 978, 978, 853, |
| 135071 | + /* 240 */ 856, 845, 845, 97, 97, 98, 98, 98, 98, 347, |
| 134733 | 135072 | /* 250 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, |
| 134734 | | - /* 260 */ 351, 325, 938, 1327, 384, 699, 1327, 381, 379, 99, |
| 134735 | | - /* 270 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, |
| 135073 | + /* 260 */ 351, 325, 937, 1327, 384, 699, 1327, 381, 379, 99, |
| 135074 | + /* 270 */ 100, 90, 978, 978, 853, 856, 845, 845, 97, 97, |
| 134736 | 135075 | /* 280 */ 98, 98, 98, 98, 701, 96, 96, 96, 96, 95, |
| 134737 | 135076 | /* 290 */ 95, 94, 94, 94, 93, 351, 325, 92, 89, 178, |
| 134738 | | - /* 300 */ 833, 936, 373, 700, 99, 100, 90, 842, 842, 854, |
| 134739 | | - /* 310 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 375, |
| 135077 | + /* 300 */ 833, 935, 373, 700, 99, 100, 90, 978, 978, 853, |
| 135078 | + /* 310 */ 856, 845, 845, 97, 97, 98, 98, 98, 98, 375, |
| 134740 | 135079 | /* 320 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, |
| 134741 | | - /* 330 */ 351, 325, 1276, 947, 354, 818, 936, 739, 739, 99, |
| 134742 | | - /* 340 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, |
| 135080 | + /* 330 */ 351, 325, 1275, 946, 354, 818, 935, 739, 739, 99, |
| 135081 | + /* 340 */ 100, 90, 978, 978, 853, 856, 845, 845, 97, 97, |
| 134743 | 135082 | /* 350 */ 98, 98, 98, 98, 230, 96, 96, 96, 96, 95, |
| 134744 | | - /* 360 */ 95, 94, 94, 94, 93, 351, 325, 969, 227, 92, |
| 134745 | | - /* 370 */ 89, 178, 373, 300, 99, 100, 90, 842, 842, 854, |
| 134746 | | - /* 380 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 921, |
| 135083 | + /* 360 */ 95, 94, 94, 94, 93, 351, 325, 968, 227, 92, |
| 135084 | + /* 370 */ 89, 178, 373, 300, 99, 100, 90, 978, 978, 853, |
| 135085 | + /* 380 */ 856, 845, 845, 97, 97, 98, 98, 98, 98, 920, |
| 134747 | 135086 | /* 390 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, |
| 134748 | 135087 | /* 400 */ 351, 325, 449, 447, 447, 447, 147, 737, 737, 99, |
| 134749 | | - /* 410 */ 100, 90, 842, 842, 854, 857, 846, 846, 97, 97, |
| 135088 | + /* 410 */ 100, 90, 978, 978, 853, 856, 845, 845, 97, 97, |
| 134750 | 135089 | /* 420 */ 98, 98, 98, 98, 296, 96, 96, 96, 96, 95, |
| 134751 | | - /* 430 */ 95, 94, 94, 94, 93, 351, 325, 419, 231, 958, |
| 134752 | | - /* 440 */ 958, 158, 25, 422, 99, 100, 90, 842, 842, 854, |
| 134753 | | - /* 450 */ 857, 846, 846, 97, 97, 98, 98, 98, 98, 450, |
| 135090 | + /* 430 */ 95, 94, 94, 94, 93, 351, 325, 419, 231, 957, |
| 135091 | + /* 440 */ 957, 158, 25, 422, 99, 100, 90, 978, 978, 853, |
| 135092 | + /* 450 */ 856, 845, 845, 97, 97, 98, 98, 98, 98, 450, |
| 134754 | 135093 | /* 460 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, |
| 134755 | | - /* 470 */ 351, 443, 224, 224, 420, 958, 958, 962, 325, 52, |
| 134756 | | - /* 480 */ 52, 959, 960, 176, 415, 78, 99, 100, 90, 842, |
| 134757 | | - /* 490 */ 842, 854, 857, 846, 846, 97, 97, 98, 98, 98, |
| 135094 | + /* 470 */ 351, 443, 224, 224, 420, 957, 957, 961, 325, 52, |
| 135095 | + /* 480 */ 52, 958, 959, 176, 415, 78, 99, 100, 90, 978, |
| 135096 | + /* 490 */ 978, 853, 856, 845, 845, 97, 97, 98, 98, 98, |
| 134758 | 135097 | /* 500 */ 98, 379, 96, 96, 96, 96, 95, 95, 94, 94, |
| 134759 | | - /* 510 */ 94, 93, 351, 325, 428, 418, 298, 959, 960, 962, |
| 134760 | | - /* 520 */ 81, 99, 88, 90, 842, 842, 854, 857, 846, 846, |
| 135098 | + /* 510 */ 94, 93, 351, 325, 428, 418, 298, 958, 959, 961, |
| 135099 | + /* 520 */ 81, 99, 88, 90, 978, 978, 853, 856, 845, 845, |
| 134761 | 135100 | /* 530 */ 97, 97, 98, 98, 98, 98, 717, 96, 96, 96, |
| 134762 | | - /* 540 */ 96, 95, 95, 94, 94, 94, 93, 351, 325, 843, |
| 134763 | | - /* 550 */ 843, 855, 858, 996, 318, 343, 379, 100, 90, 842, |
| 134764 | | - /* 560 */ 842, 854, 857, 846, 846, 97, 97, 98, 98, 98, |
| 135101 | + /* 540 */ 96, 95, 95, 94, 94, 94, 93, 351, 325, 842, |
| 135102 | + /* 550 */ 842, 854, 857, 996, 318, 343, 379, 100, 90, 978, |
| 135103 | + /* 560 */ 978, 853, 856, 845, 845, 97, 97, 98, 98, 98, |
| 134765 | 135104 | /* 570 */ 98, 450, 96, 96, 96, 96, 95, 95, 94, 94, |
| 134766 | 135105 | /* 580 */ 94, 93, 351, 325, 350, 350, 350, 260, 377, 340, |
| 134767 | | - /* 590 */ 929, 52, 52, 90, 842, 842, 854, 857, 846, 846, |
| 135106 | + /* 590 */ 928, 52, 52, 90, 978, 978, 853, 856, 845, 845, |
| 134768 | 135107 | /* 600 */ 97, 97, 98, 98, 98, 98, 361, 96, 96, 96, |
| 134769 | 135108 | /* 610 */ 96, 95, 95, 94, 94, 94, 93, 351, 86, 445, |
| 134770 | | - /* 620 */ 847, 3, 1203, 361, 360, 378, 344, 813, 958, 958, |
| 134771 | | - /* 630 */ 1300, 86, 445, 729, 3, 212, 169, 287, 405, 282, |
| 135109 | + /* 620 */ 846, 3, 1202, 361, 360, 378, 344, 813, 957, 957, |
| 135110 | + /* 630 */ 1299, 86, 445, 729, 3, 212, 169, 287, 405, 282, |
| 134772 | 135111 | /* 640 */ 404, 199, 232, 450, 300, 760, 83, 84, 280, 245, |
| 134773 | 135112 | /* 650 */ 262, 365, 251, 85, 352, 352, 92, 89, 178, 83, |
| 134774 | 135113 | /* 660 */ 84, 242, 412, 52, 52, 448, 85, 352, 352, 246, |
| 134775 | | - /* 670 */ 959, 960, 194, 455, 670, 402, 399, 398, 448, 243, |
| 135114 | + /* 670 */ 958, 959, 194, 455, 670, 402, 399, 398, 448, 243, |
| 134776 | 135115 | /* 680 */ 221, 114, 434, 776, 361, 450, 397, 268, 747, 224, |
| 134777 | 135116 | /* 690 */ 224, 132, 132, 198, 832, 434, 452, 451, 428, 427, |
| 134778 | 135117 | /* 700 */ 819, 415, 734, 713, 132, 52, 52, 832, 268, 452, |
| 134779 | | - /* 710 */ 451, 734, 194, 819, 363, 402, 399, 398, 450, 1271, |
| 134780 | | - /* 720 */ 1271, 23, 958, 958, 86, 445, 397, 3, 228, 429, |
| 134781 | | - /* 730 */ 895, 824, 824, 826, 827, 19, 203, 720, 52, 52, |
| 135118 | + /* 710 */ 451, 734, 194, 819, 363, 402, 399, 398, 450, 1270, |
| 135119 | + /* 720 */ 1270, 23, 957, 957, 86, 445, 397, 3, 228, 429, |
| 135120 | + /* 730 */ 894, 824, 824, 826, 827, 19, 203, 720, 52, 52, |
| 134782 | 135121 | /* 740 */ 428, 408, 439, 249, 824, 824, 826, 827, 19, 229, |
| 134783 | 135122 | /* 750 */ 403, 153, 83, 84, 761, 177, 241, 450, 721, 85, |
| 134784 | | - /* 760 */ 352, 352, 120, 157, 959, 960, 58, 977, 409, 355, |
| 135123 | + /* 760 */ 352, 352, 120, 157, 958, 959, 58, 976, 409, 355, |
| 134785 | 135124 | /* 770 */ 330, 448, 268, 428, 430, 320, 790, 32, 32, 86, |
| 134786 | 135125 | /* 780 */ 445, 776, 3, 341, 98, 98, 98, 98, 434, 96, |
| 134787 | 135126 | /* 790 */ 96, 96, 96, 95, 95, 94, 94, 94, 93, 351, |
| 134788 | | - /* 800 */ 832, 120, 452, 451, 813, 887, 819, 83, 84, 977, |
| 134789 | | - /* 810 */ 813, 132, 410, 920, 85, 352, 352, 132, 407, 789, |
| 134790 | | - /* 820 */ 958, 958, 92, 89, 178, 917, 448, 262, 370, 261, |
| 134791 | | - /* 830 */ 82, 914, 80, 262, 370, 261, 776, 824, 824, 826, |
| 134792 | | - /* 840 */ 827, 19, 934, 434, 96, 96, 96, 96, 95, 95, |
| 134793 | | - /* 850 */ 94, 94, 94, 93, 351, 832, 74, 452, 451, 958, |
| 134794 | | - /* 860 */ 958, 819, 959, 960, 120, 92, 89, 178, 945, 2, |
| 134795 | | - /* 870 */ 918, 965, 268, 1, 976, 76, 445, 762, 3, 708, |
| 134796 | | - /* 880 */ 901, 901, 387, 958, 958, 757, 919, 371, 740, 778, |
| 135127 | + /* 800 */ 832, 120, 452, 451, 813, 886, 819, 83, 84, 976, |
| 135128 | + /* 810 */ 813, 132, 410, 919, 85, 352, 352, 132, 407, 789, |
| 135129 | + /* 820 */ 957, 957, 92, 89, 178, 916, 448, 262, 370, 261, |
| 135130 | + /* 830 */ 82, 913, 80, 262, 370, 261, 776, 824, 824, 826, |
| 135131 | + /* 840 */ 827, 19, 933, 434, 96, 96, 96, 96, 95, 95, |
| 135132 | + /* 850 */ 94, 94, 94, 93, 351, 832, 74, 452, 451, 957, |
| 135133 | + /* 860 */ 957, 819, 958, 959, 120, 92, 89, 178, 944, 2, |
| 135134 | + /* 870 */ 917, 964, 268, 1, 975, 76, 445, 762, 3, 708, |
| 135135 | + /* 880 */ 900, 900, 387, 957, 957, 757, 918, 371, 740, 778, |
| 134797 | 135136 | /* 890 */ 756, 257, 824, 824, 826, 827, 19, 417, 741, 450, |
| 134798 | | - /* 900 */ 24, 959, 960, 83, 84, 369, 958, 958, 177, 226, |
| 134799 | | - /* 910 */ 85, 352, 352, 885, 315, 314, 313, 215, 311, 10, |
| 134800 | | - /* 920 */ 10, 683, 448, 349, 348, 959, 960, 909, 777, 157, |
| 134801 | | - /* 930 */ 120, 958, 958, 337, 776, 416, 711, 310, 450, 434, |
| 134802 | | - /* 940 */ 450, 321, 450, 791, 103, 200, 175, 450, 959, 960, |
| 134803 | | - /* 950 */ 908, 832, 792, 452, 451, 9, 9, 819, 10, 10, |
| 135137 | + /* 900 */ 24, 958, 959, 83, 84, 369, 957, 957, 177, 226, |
| 135138 | + /* 910 */ 85, 352, 352, 884, 315, 314, 313, 215, 311, 10, |
| 135139 | + /* 920 */ 10, 683, 448, 349, 348, 958, 959, 908, 777, 157, |
| 135140 | + /* 930 */ 120, 957, 957, 337, 776, 416, 711, 310, 450, 434, |
| 135141 | + /* 940 */ 450, 321, 450, 791, 103, 200, 175, 450, 958, 959, |
| 135142 | + /* 950 */ 907, 832, 792, 452, 451, 9, 9, 819, 10, 10, |
| 134804 | 135143 | /* 960 */ 52, 52, 51, 51, 180, 716, 248, 10, 10, 171, |
| 134805 | | - /* 970 */ 170, 167, 339, 959, 960, 247, 984, 702, 702, 450, |
| 134806 | | - /* 980 */ 715, 233, 686, 982, 889, 983, 182, 914, 824, 824, |
| 135144 | + /* 970 */ 170, 167, 339, 958, 959, 247, 984, 702, 702, 450, |
| 135145 | + /* 980 */ 715, 233, 686, 982, 888, 983, 182, 913, 824, 824, |
| 134807 | 135146 | /* 990 */ 826, 827, 19, 183, 256, 423, 132, 181, 394, 10, |
| 134808 | | - /* 1000 */ 10, 889, 891, 749, 958, 958, 917, 268, 985, 198, |
| 135147 | + /* 1000 */ 10, 888, 890, 749, 957, 957, 916, 268, 985, 198, |
| 134809 | 135148 | /* 1010 */ 985, 349, 348, 425, 415, 299, 817, 832, 326, 825, |
| 134810 | 135149 | /* 1020 */ 120, 332, 133, 819, 268, 98, 98, 98, 98, 91, |
| 134811 | 135150 | /* 1030 */ 96, 96, 96, 96, 95, 95, 94, 94, 94, 93, |
| 134812 | | - /* 1040 */ 351, 157, 810, 371, 382, 359, 959, 960, 358, 268, |
| 134813 | | - /* 1050 */ 450, 918, 368, 324, 824, 824, 826, 450, 709, 450, |
| 134814 | | - /* 1060 */ 264, 380, 889, 450, 877, 746, 253, 919, 255, 433, |
| 135151 | + /* 1040 */ 351, 157, 810, 371, 382, 359, 958, 959, 358, 268, |
| 135152 | + /* 1050 */ 450, 917, 368, 324, 824, 824, 826, 450, 709, 450, |
| 135153 | + /* 1060 */ 264, 380, 888, 450, 876, 746, 253, 918, 255, 433, |
| 134815 | 135154 | /* 1070 */ 36, 36, 234, 450, 234, 120, 269, 37, 37, 12, |
| 134816 | 135155 | /* 1080 */ 12, 334, 272, 27, 27, 450, 330, 118, 450, 162, |
| 134817 | 135156 | /* 1090 */ 742, 280, 450, 38, 38, 450, 985, 356, 985, 450, |
| 134818 | | - /* 1100 */ 709, 1210, 450, 132, 450, 39, 39, 450, 40, 40, |
| 135157 | + /* 1100 */ 709, 1209, 450, 132, 450, 39, 39, 450, 40, 40, |
| 134819 | 135158 | /* 1110 */ 450, 362, 41, 41, 450, 42, 42, 450, 254, 28, |
| 134820 | 135159 | /* 1120 */ 28, 450, 29, 29, 31, 31, 450, 43, 43, 450, |
| 134821 | 135160 | /* 1130 */ 44, 44, 450, 714, 45, 45, 450, 11, 11, 767, |
| 134822 | 135161 | /* 1140 */ 450, 46, 46, 450, 268, 450, 105, 105, 450, 47, |
| 134823 | 135162 | /* 1150 */ 47, 450, 48, 48, 450, 237, 33, 33, 450, 172, |
| 134824 | 135163 | /* 1160 */ 49, 49, 450, 50, 50, 34, 34, 274, 122, 122, |
| 134825 | | - /* 1170 */ 450, 123, 123, 450, 124, 124, 450, 898, 56, 56, |
| 134826 | | - /* 1180 */ 450, 897, 35, 35, 450, 267, 450, 817, 450, 817, |
| 135164 | + /* 1170 */ 450, 123, 123, 450, 124, 124, 450, 897, 56, 56, |
| 135165 | + /* 1180 */ 450, 896, 35, 35, 450, 267, 450, 817, 450, 817, |
| 134827 | 135166 | /* 1190 */ 106, 106, 450, 53, 53, 385, 107, 107, 450, 817, |
| 134828 | 135167 | /* 1200 */ 108, 108, 817, 450, 104, 104, 121, 121, 119, 119, |
| 134829 | 135168 | /* 1210 */ 450, 117, 112, 112, 450, 276, 450, 225, 111, 111, |
| 134830 | | - /* 1220 */ 450, 730, 450, 109, 109, 450, 673, 674, 675, 912, |
| 135169 | + /* 1220 */ 450, 730, 450, 109, 109, 450, 673, 674, 675, 911, |
| 134831 | 135170 | /* 1230 */ 110, 110, 317, 998, 55, 55, 57, 57, 692, 331, |
| 134832 | | - /* 1240 */ 54, 54, 26, 26, 696, 30, 30, 317, 937, 197, |
| 135171 | + /* 1240 */ 54, 54, 26, 26, 696, 30, 30, 317, 936, 197, |
| 134833 | 135172 | /* 1250 */ 196, 195, 335, 281, 336, 446, 331, 745, 689, 436, |
| 134834 | | - /* 1260 */ 440, 444, 120, 72, 386, 223, 175, 345, 757, 933, |
| 135173 | + /* 1260 */ 440, 444, 120, 72, 386, 223, 175, 345, 757, 932, |
| 134835 | 135174 | /* 1270 */ 20, 286, 319, 756, 815, 372, 374, 202, 202, 202, |
| 134836 | | - /* 1280 */ 263, 395, 285, 74, 208, 21, 696, 719, 718, 884, |
| 135175 | + /* 1280 */ 263, 395, 285, 74, 208, 21, 696, 719, 718, 883, |
| 134837 | 135176 | /* 1290 */ 120, 120, 120, 120, 120, 754, 278, 828, 77, 74, |
| 134838 | | - /* 1300 */ 726, 727, 785, 783, 880, 202, 999, 208, 894, 893, |
| 134839 | | - /* 1310 */ 894, 893, 694, 816, 763, 116, 774, 1290, 431, 432, |
| 135177 | + /* 1300 */ 726, 727, 785, 783, 879, 202, 999, 208, 893, 892, |
| 135178 | + /* 1310 */ 893, 892, 694, 816, 763, 116, 774, 1289, 431, 432, |
| 134840 | 135179 | /* 1320 */ 302, 999, 390, 303, 823, 697, 691, 680, 159, 289, |
| 134841 | | - /* 1330 */ 679, 884, 681, 952, 291, 218, 293, 7, 316, 828, |
| 134842 | | - /* 1340 */ 173, 805, 259, 364, 252, 911, 376, 713, 295, 435, |
| 134843 | | - /* 1350 */ 308, 168, 955, 993, 135, 400, 990, 284, 882, 881, |
| 134844 | | - /* 1360 */ 205, 928, 926, 59, 333, 62, 144, 156, 130, 72, |
| 135180 | + /* 1330 */ 679, 883, 681, 951, 291, 218, 293, 7, 316, 828, |
| 135181 | + /* 1340 */ 173, 805, 259, 364, 252, 910, 376, 713, 295, 435, |
| 135182 | + /* 1350 */ 308, 168, 954, 993, 135, 400, 990, 284, 881, 880, |
| 135183 | + /* 1360 */ 205, 927, 925, 59, 333, 62, 144, 156, 130, 72, |
| 134845 | 135184 | /* 1370 */ 802, 366, 367, 393, 137, 185, 189, 160, 139, 383, |
| 134846 | | - /* 1380 */ 67, 896, 140, 141, 142, 148, 389, 812, 775, 266, |
| 134847 | | - /* 1390 */ 219, 190, 154, 391, 913, 876, 271, 406, 191, 322, |
| 135185 | + /* 1380 */ 67, 895, 140, 141, 142, 148, 389, 812, 775, 266, |
| 135186 | + /* 1390 */ 219, 190, 154, 391, 912, 875, 271, 406, 191, 322, |
| 134848 | 135187 | /* 1400 */ 682, 733, 192, 342, 732, 724, 731, 711, 723, 421, |
| 134849 | 135188 | /* 1410 */ 705, 71, 323, 6, 204, 771, 288, 79, 297, 346, |
| 134850 | | - /* 1420 */ 772, 704, 290, 283, 703, 770, 292, 294, 967, 239, |
| 134851 | | - /* 1430 */ 769, 102, 862, 438, 426, 240, 424, 442, 73, 213, |
| 134852 | | - /* 1440 */ 688, 238, 22, 453, 953, 214, 217, 216, 454, 677, |
| 135189 | + /* 1420 */ 772, 704, 290, 283, 703, 770, 292, 294, 966, 239, |
| 135190 | + /* 1430 */ 769, 102, 861, 438, 426, 240, 424, 442, 73, 213, |
| 135191 | + /* 1440 */ 688, 238, 22, 453, 952, 214, 217, 216, 454, 677, |
| 134853 | 135192 | /* 1450 */ 676, 671, 753, 125, 115, 235, 126, 669, 353, 166, |
| 134854 | | - /* 1460 */ 127, 244, 179, 357, 306, 304, 305, 307, 113, 892, |
| 134855 | | - /* 1470 */ 327, 890, 811, 328, 134, 128, 136, 138, 743, 258, |
| 134856 | | - /* 1480 */ 907, 184, 143, 129, 910, 186, 63, 64, 145, 187, |
| 134857 | | - /* 1490 */ 906, 65, 8, 66, 13, 188, 202, 899, 265, 149, |
| 135193 | + /* 1460 */ 127, 244, 179, 357, 306, 304, 305, 307, 113, 891, |
| 135194 | + /* 1470 */ 327, 889, 811, 328, 134, 128, 136, 138, 743, 258, |
| 135195 | + /* 1480 */ 906, 184, 143, 129, 909, 186, 63, 64, 145, 187, |
| 135196 | + /* 1490 */ 905, 65, 8, 66, 13, 188, 202, 898, 265, 149, |
| 134858 | 135197 | /* 1500 */ 987, 388, 150, 685, 161, 392, 285, 193, 279, 396, |
| 134859 | 135198 | /* 1510 */ 151, 401, 68, 14, 15, 722, 69, 236, 831, 131, |
| 134860 | | - /* 1520 */ 830, 860, 70, 751, 16, 414, 755, 4, 174, 220, |
| 134861 | | - /* 1530 */ 222, 784, 201, 152, 779, 77, 74, 17, 18, 875, |
| 134862 | | - /* 1540 */ 861, 859, 916, 864, 915, 207, 206, 942, 163, 437, |
| 134863 | | - /* 1550 */ 948, 943, 164, 209, 1002, 441, 863, 165, 210, 829, |
| 134864 | | - /* 1560 */ 695, 87, 312, 211, 1292, 1291, 309, |
| 135199 | + /* 1520 */ 830, 859, 70, 751, 16, 414, 755, 4, 174, 220, |
| 135200 | + /* 1530 */ 222, 784, 201, 152, 779, 77, 74, 17, 18, 874, |
| 135201 | + /* 1540 */ 860, 858, 915, 863, 914, 207, 206, 941, 163, 437, |
| 135202 | + /* 1550 */ 947, 942, 164, 209, 1002, 441, 862, 165, 210, 829, |
| 135203 | + /* 1560 */ 695, 87, 312, 211, 1291, 1290, 309, |
| 134865 | 135204 | }; |
| 134866 | 135205 | static const YYCODETYPE yy_lookahead[] = { |
| 134867 | 135206 | /* 0 */ 19, 95, 53, 97, 22, 24, 24, 101, 27, 28, |
| 134868 | 135207 | /* 10 */ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, |
| 134869 | 135208 | /* 20 */ 39, 40, 41, 152, 43, 44, 45, 46, 47, 48, |
| | @@ -135112,55 +135451,55 @@ |
| 135112 | 135451 | /* 300 */ 1256, 1200, 1206, 1260, 1247, 1261, 1263, 1262, 1266, 1278, |
| 135113 | 135452 | /* 310 */ 1282, 1292, 1294, 1297, 1298, 1299, 1300, 1221, 1224, 1228, |
| 135114 | 135453 | /* 320 */ 1288, 1291, 1276, 1277, 1295, |
| 135115 | 135454 | }; |
| 135116 | 135455 | static const YYACTIONTYPE yy_default[] = { |
| 135117 | | - /* 0 */ 1281, 1271, 1271, 1271, 1203, 1203, 1203, 1203, 1271, 1096, |
| 135118 | | - /* 10 */ 1125, 1125, 1255, 1332, 1332, 1332, 1332, 1332, 1332, 1202, |
| 135119 | | - /* 20 */ 1332, 1332, 1332, 1332, 1271, 1100, 1131, 1332, 1332, 1332, |
| 135120 | | - /* 30 */ 1332, 1204, 1205, 1332, 1332, 1332, 1254, 1256, 1141, 1140, |
| 135121 | | - /* 40 */ 1139, 1138, 1237, 1112, 1136, 1129, 1133, 1204, 1198, 1199, |
| 135122 | | - /* 50 */ 1197, 1201, 1205, 1332, 1132, 1167, 1182, 1166, 1332, 1332, |
| 135456 | + /* 0 */ 1280, 1270, 1270, 1270, 1202, 1202, 1202, 1202, 1270, 1096, |
| 135457 | + /* 10 */ 1125, 1125, 1254, 1332, 1332, 1332, 1332, 1332, 1332, 1201, |
| 135458 | + /* 20 */ 1332, 1332, 1332, 1332, 1270, 1100, 1131, 1332, 1332, 1332, |
| 135459 | + /* 30 */ 1332, 1203, 1204, 1332, 1332, 1332, 1253, 1255, 1141, 1140, |
| 135460 | + /* 40 */ 1139, 1138, 1236, 1112, 1136, 1129, 1133, 1203, 1197, 1198, |
| 135461 | + /* 50 */ 1196, 1200, 1204, 1332, 1132, 1167, 1181, 1166, 1332, 1332, |
| 135123 | 135462 | /* 60 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135124 | 135463 | /* 70 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135125 | 135464 | /* 80 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135126 | 135465 | /* 90 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135127 | | - /* 100 */ 1332, 1332, 1332, 1332, 1176, 1181, 1188, 1180, 1177, 1169, |
| 135466 | + /* 100 */ 1332, 1332, 1332, 1332, 1175, 1180, 1187, 1179, 1176, 1169, |
| 135128 | 135467 | /* 110 */ 1168, 1170, 1171, 1332, 1019, 1067, 1332, 1332, 1332, 1172, |
| 135129 | | - /* 120 */ 1332, 1173, 1185, 1184, 1183, 1262, 1289, 1288, 1332, 1332, |
| 135468 | + /* 120 */ 1332, 1173, 1184, 1183, 1182, 1261, 1288, 1287, 1332, 1332, |
| 135130 | 135469 | /* 130 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135131 | 135470 | /* 140 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135132 | | - /* 150 */ 1332, 1332, 1332, 1332, 1332, 1281, 1271, 1025, 1025, 1332, |
| 135133 | | - /* 160 */ 1271, 1271, 1271, 1271, 1271, 1271, 1267, 1100, 1091, 1332, |
| 135471 | + /* 150 */ 1332, 1332, 1332, 1332, 1332, 1280, 1270, 1025, 1025, 1332, |
| 135472 | + /* 160 */ 1270, 1270, 1270, 1270, 1270, 1270, 1266, 1100, 1091, 1332, |
| 135134 | 135473 | /* 170 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135135 | | - /* 180 */ 1259, 1257, 1332, 1218, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135474 | + /* 180 */ 1258, 1256, 1332, 1217, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135136 | 135475 | /* 190 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135137 | 135476 | /* 200 */ 1332, 1332, 1332, 1332, 1096, 1332, 1332, 1332, 1332, 1332, |
| 135138 | | - /* 210 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1283, 1332, 1232, |
| 135477 | + /* 210 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1282, 1332, 1231, |
| 135139 | 135478 | /* 220 */ 1096, 1096, 1096, 1098, 1080, 1090, 1004, 1135, 1114, 1114, |
| 135140 | | - /* 230 */ 1321, 1135, 1321, 1042, 1303, 1039, 1125, 1114, 1200, 1125, |
| 135479 | + /* 230 */ 1321, 1135, 1321, 1042, 1302, 1039, 1125, 1114, 1199, 1125, |
| 135141 | 135480 | /* 240 */ 1125, 1097, 1090, 1332, 1324, 1105, 1105, 1323, 1323, 1105, |
| 135142 | 135481 | /* 250 */ 1146, 1070, 1135, 1076, 1076, 1076, 1076, 1105, 1016, 1135, |
| 135143 | | - /* 260 */ 1146, 1070, 1070, 1135, 1105, 1016, 1236, 1318, 1105, 1105, |
| 135144 | | - /* 270 */ 1016, 1211, 1105, 1016, 1105, 1016, 1211, 1068, 1068, 1068, |
| 135145 | | - /* 280 */ 1057, 1211, 1068, 1042, 1068, 1057, 1068, 1068, 1118, 1113, |
| 135146 | | - /* 290 */ 1118, 1113, 1118, 1113, 1118, 1113, 1105, 1206, 1105, 1332, |
| 135147 | | - /* 300 */ 1211, 1215, 1215, 1211, 1130, 1119, 1128, 1126, 1135, 1022, |
| 135148 | | - /* 310 */ 1060, 1286, 1286, 1282, 1282, 1282, 1282, 1329, 1329, 1267, |
| 135149 | | - /* 320 */ 1298, 1298, 1044, 1044, 1298, 1332, 1332, 1332, 1332, 1332, |
| 135150 | | - /* 330 */ 1332, 1293, 1332, 1220, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135482 | + /* 260 */ 1146, 1070, 1070, 1135, 1105, 1016, 1235, 1318, 1105, 1105, |
| 135483 | + /* 270 */ 1016, 1210, 1105, 1016, 1105, 1016, 1210, 1068, 1068, 1068, |
| 135484 | + /* 280 */ 1057, 1210, 1068, 1042, 1068, 1057, 1068, 1068, 1118, 1113, |
| 135485 | + /* 290 */ 1118, 1113, 1118, 1113, 1118, 1113, 1105, 1205, 1105, 1332, |
| 135486 | + /* 300 */ 1210, 1214, 1214, 1210, 1130, 1119, 1128, 1126, 1135, 1022, |
| 135487 | + /* 310 */ 1060, 1285, 1285, 1281, 1281, 1281, 1281, 1329, 1329, 1266, |
| 135488 | + /* 320 */ 1297, 1297, 1044, 1044, 1297, 1332, 1332, 1332, 1332, 1332, |
| 135489 | + /* 330 */ 1332, 1292, 1332, 1219, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135151 | 135490 | /* 340 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135152 | | - /* 350 */ 1332, 1332, 1152, 1332, 1000, 1264, 1332, 1332, 1263, 1332, |
| 135491 | + /* 350 */ 1332, 1332, 1152, 1332, 1000, 1263, 1332, 1332, 1262, 1332, |
| 135153 | 135492 | /* 360 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135154 | 135493 | /* 370 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1320, |
| 135155 | | - /* 380 */ 1332, 1332, 1332, 1332, 1332, 1332, 1235, 1234, 1332, 1332, |
| 135494 | + /* 380 */ 1332, 1332, 1332, 1332, 1332, 1332, 1234, 1233, 1332, 1332, |
| 135156 | 135495 | /* 390 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135157 | 135496 | /* 400 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, |
| 135158 | | - /* 410 */ 1332, 1082, 1332, 1332, 1332, 1307, 1332, 1332, 1332, 1332, |
| 135497 | + /* 410 */ 1332, 1082, 1332, 1332, 1332, 1306, 1332, 1332, 1332, 1332, |
| 135159 | 135498 | /* 420 */ 1332, 1332, 1332, 1127, 1332, 1120, 1332, 1332, 1311, 1332, |
| 135160 | | - /* 430 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1273, |
| 135161 | | - /* 440 */ 1332, 1332, 1332, 1272, 1332, 1332, 1332, 1332, 1332, 1154, |
| 135499 | + /* 430 */ 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1272, |
| 135500 | + /* 440 */ 1332, 1332, 1332, 1271, 1332, 1332, 1332, 1332, 1332, 1154, |
| 135162 | 135501 | /* 450 */ 1332, 1153, 1157, 1332, 1010, 1332, |
| 135163 | 135502 | }; |
| 135164 | 135503 | /********** End of lemon-generated parsing tables *****************************/ |
| 135165 | 135504 | |
| 135166 | 135505 | /* The next table maps tokens (terminal symbols) into fallback tokens. |
| | @@ -135602,147 +135941,147 @@ |
| 135602 | 135941 | /* 169 */ "expr ::= expr EQ|NE expr", |
| 135603 | 135942 | /* 170 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", |
| 135604 | 135943 | /* 171 */ "expr ::= expr PLUS|MINUS expr", |
| 135605 | 135944 | /* 172 */ "expr ::= expr STAR|SLASH|REM expr", |
| 135606 | 135945 | /* 173 */ "expr ::= expr CONCAT expr", |
| 135607 | | - /* 174 */ "likeop ::= LIKE_KW|MATCH", |
| 135608 | | - /* 175 */ "likeop ::= NOT LIKE_KW|MATCH", |
| 135609 | | - /* 176 */ "expr ::= expr likeop expr", |
| 135610 | | - /* 177 */ "expr ::= expr likeop expr ESCAPE expr", |
| 135611 | | - /* 178 */ "expr ::= expr ISNULL|NOTNULL", |
| 135612 | | - /* 179 */ "expr ::= expr NOT NULL", |
| 135613 | | - /* 180 */ "expr ::= expr IS expr", |
| 135614 | | - /* 181 */ "expr ::= expr IS NOT expr", |
| 135615 | | - /* 182 */ "expr ::= NOT expr", |
| 135616 | | - /* 183 */ "expr ::= BITNOT expr", |
| 135617 | | - /* 184 */ "expr ::= MINUS expr", |
| 135618 | | - /* 185 */ "expr ::= PLUS expr", |
| 135619 | | - /* 186 */ "between_op ::= BETWEEN", |
| 135620 | | - /* 187 */ "between_op ::= NOT BETWEEN", |
| 135621 | | - /* 188 */ "expr ::= expr between_op expr AND expr", |
| 135622 | | - /* 189 */ "in_op ::= IN", |
| 135623 | | - /* 190 */ "in_op ::= NOT IN", |
| 135624 | | - /* 191 */ "expr ::= expr in_op LP exprlist RP", |
| 135625 | | - /* 192 */ "expr ::= LP select RP", |
| 135626 | | - /* 193 */ "expr ::= expr in_op LP select RP", |
| 135627 | | - /* 194 */ "expr ::= expr in_op nm dbnm paren_exprlist", |
| 135628 | | - /* 195 */ "expr ::= EXISTS LP select RP", |
| 135629 | | - /* 196 */ "expr ::= CASE case_operand case_exprlist case_else END", |
| 135630 | | - /* 197 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", |
| 135631 | | - /* 198 */ "case_exprlist ::= WHEN expr THEN expr", |
| 135632 | | - /* 199 */ "case_else ::= ELSE expr", |
| 135633 | | - /* 200 */ "case_else ::=", |
| 135634 | | - /* 201 */ "case_operand ::= expr", |
| 135635 | | - /* 202 */ "case_operand ::=", |
| 135636 | | - /* 203 */ "exprlist ::=", |
| 135637 | | - /* 204 */ "nexprlist ::= nexprlist COMMA expr", |
| 135638 | | - /* 205 */ "nexprlist ::= expr", |
| 135639 | | - /* 206 */ "paren_exprlist ::=", |
| 135640 | | - /* 207 */ "paren_exprlist ::= LP exprlist RP", |
| 135641 | | - /* 208 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", |
| 135642 | | - /* 209 */ "uniqueflag ::= UNIQUE", |
| 135643 | | - /* 210 */ "uniqueflag ::=", |
| 135644 | | - /* 211 */ "eidlist_opt ::=", |
| 135645 | | - /* 212 */ "eidlist_opt ::= LP eidlist RP", |
| 135646 | | - /* 213 */ "eidlist ::= eidlist COMMA nm collate sortorder", |
| 135647 | | - /* 214 */ "eidlist ::= nm collate sortorder", |
| 135648 | | - /* 215 */ "collate ::=", |
| 135649 | | - /* 216 */ "collate ::= COLLATE ID|STRING", |
| 135650 | | - /* 217 */ "cmd ::= DROP INDEX ifexists fullname", |
| 135651 | | - /* 218 */ "cmd ::= VACUUM", |
| 135652 | | - /* 219 */ "cmd ::= VACUUM nm", |
| 135653 | | - /* 220 */ "cmd ::= PRAGMA nm dbnm", |
| 135654 | | - /* 221 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", |
| 135655 | | - /* 222 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", |
| 135656 | | - /* 223 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", |
| 135657 | | - /* 224 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", |
| 135658 | | - /* 225 */ "plus_num ::= PLUS INTEGER|FLOAT", |
| 135659 | | - /* 226 */ "minus_num ::= MINUS INTEGER|FLOAT", |
| 135660 | | - /* 227 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", |
| 135661 | | - /* 228 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", |
| 135662 | | - /* 229 */ "trigger_time ::= BEFORE", |
| 135663 | | - /* 230 */ "trigger_time ::= AFTER", |
| 135664 | | - /* 231 */ "trigger_time ::= INSTEAD OF", |
| 135665 | | - /* 232 */ "trigger_time ::=", |
| 135666 | | - /* 233 */ "trigger_event ::= DELETE|INSERT", |
| 135667 | | - /* 234 */ "trigger_event ::= UPDATE", |
| 135668 | | - /* 235 */ "trigger_event ::= UPDATE OF idlist", |
| 135669 | | - /* 236 */ "when_clause ::=", |
| 135670 | | - /* 237 */ "when_clause ::= WHEN expr", |
| 135671 | | - /* 238 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", |
| 135672 | | - /* 239 */ "trigger_cmd_list ::= trigger_cmd SEMI", |
| 135673 | | - /* 240 */ "trnm ::= nm DOT nm", |
| 135674 | | - /* 241 */ "tridxby ::= INDEXED BY nm", |
| 135675 | | - /* 242 */ "tridxby ::= NOT INDEXED", |
| 135676 | | - /* 243 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", |
| 135677 | | - /* 244 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select", |
| 135678 | | - /* 245 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", |
| 135679 | | - /* 246 */ "trigger_cmd ::= select", |
| 135680 | | - /* 247 */ "expr ::= RAISE LP IGNORE RP", |
| 135681 | | - /* 248 */ "expr ::= RAISE LP raisetype COMMA nm RP", |
| 135682 | | - /* 249 */ "raisetype ::= ROLLBACK", |
| 135683 | | - /* 250 */ "raisetype ::= ABORT", |
| 135684 | | - /* 251 */ "raisetype ::= FAIL", |
| 135685 | | - /* 252 */ "cmd ::= DROP TRIGGER ifexists fullname", |
| 135686 | | - /* 253 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", |
| 135687 | | - /* 254 */ "cmd ::= DETACH database_kw_opt expr", |
| 135688 | | - /* 255 */ "key_opt ::=", |
| 135689 | | - /* 256 */ "key_opt ::= KEY expr", |
| 135690 | | - /* 257 */ "cmd ::= REINDEX", |
| 135691 | | - /* 258 */ "cmd ::= REINDEX nm dbnm", |
| 135692 | | - /* 259 */ "cmd ::= ANALYZE", |
| 135693 | | - /* 260 */ "cmd ::= ANALYZE nm dbnm", |
| 135694 | | - /* 261 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", |
| 135695 | | - /* 262 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", |
| 135696 | | - /* 263 */ "add_column_fullname ::= fullname", |
| 135697 | | - /* 264 */ "cmd ::= create_vtab", |
| 135698 | | - /* 265 */ "cmd ::= create_vtab LP vtabarglist RP", |
| 135699 | | - /* 266 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", |
| 135700 | | - /* 267 */ "vtabarg ::=", |
| 135701 | | - /* 268 */ "vtabargtoken ::= ANY", |
| 135702 | | - /* 269 */ "vtabargtoken ::= lp anylist RP", |
| 135703 | | - /* 270 */ "lp ::= LP", |
| 135704 | | - /* 271 */ "with ::=", |
| 135705 | | - /* 272 */ "with ::= WITH wqlist", |
| 135706 | | - /* 273 */ "with ::= WITH RECURSIVE wqlist", |
| 135707 | | - /* 274 */ "wqlist ::= nm eidlist_opt AS LP select RP", |
| 135708 | | - /* 275 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", |
| 135709 | | - /* 276 */ "input ::= cmdlist", |
| 135710 | | - /* 277 */ "cmdlist ::= cmdlist ecmd", |
| 135711 | | - /* 278 */ "cmdlist ::= ecmd", |
| 135712 | | - /* 279 */ "ecmd ::= SEMI", |
| 135713 | | - /* 280 */ "ecmd ::= explain cmdx SEMI", |
| 135714 | | - /* 281 */ "explain ::=", |
| 135715 | | - /* 282 */ "trans_opt ::=", |
| 135716 | | - /* 283 */ "trans_opt ::= TRANSACTION", |
| 135717 | | - /* 284 */ "trans_opt ::= TRANSACTION nm", |
| 135718 | | - /* 285 */ "savepoint_opt ::= SAVEPOINT", |
| 135719 | | - /* 286 */ "savepoint_opt ::=", |
| 135720 | | - /* 287 */ "cmd ::= create_table create_table_args", |
| 135721 | | - /* 288 */ "columnlist ::= columnlist COMMA columnname carglist", |
| 135722 | | - /* 289 */ "columnlist ::= columnname carglist", |
| 135723 | | - /* 290 */ "nm ::= ID|INDEXED", |
| 135724 | | - /* 291 */ "nm ::= STRING", |
| 135725 | | - /* 292 */ "nm ::= JOIN_KW", |
| 135726 | | - /* 293 */ "typetoken ::= typename", |
| 135727 | | - /* 294 */ "typename ::= ID|STRING", |
| 135728 | | - /* 295 */ "signed ::= plus_num", |
| 135729 | | - /* 296 */ "signed ::= minus_num", |
| 135730 | | - /* 297 */ "carglist ::= carglist ccons", |
| 135731 | | - /* 298 */ "carglist ::=", |
| 135732 | | - /* 299 */ "ccons ::= NULL onconf", |
| 135733 | | - /* 300 */ "conslist_opt ::= COMMA conslist", |
| 135734 | | - /* 301 */ "conslist ::= conslist tconscomma tcons", |
| 135735 | | - /* 302 */ "conslist ::= tcons", |
| 135736 | | - /* 303 */ "tconscomma ::=", |
| 135737 | | - /* 304 */ "defer_subclause_opt ::= defer_subclause", |
| 135738 | | - /* 305 */ "resolvetype ::= raisetype", |
| 135739 | | - /* 306 */ "selectnowith ::= oneselect", |
| 135740 | | - /* 307 */ "oneselect ::= values", |
| 135741 | | - /* 308 */ "sclp ::= selcollist COMMA", |
| 135742 | | - /* 309 */ "as ::= ID|STRING", |
| 135743 | | - /* 310 */ "expr ::= term", |
| 135946 | + /* 174 */ "likeop ::= NOT LIKE_KW|MATCH", |
| 135947 | + /* 175 */ "expr ::= expr likeop expr", |
| 135948 | + /* 176 */ "expr ::= expr likeop expr ESCAPE expr", |
| 135949 | + /* 177 */ "expr ::= expr ISNULL|NOTNULL", |
| 135950 | + /* 178 */ "expr ::= expr NOT NULL", |
| 135951 | + /* 179 */ "expr ::= expr IS expr", |
| 135952 | + /* 180 */ "expr ::= expr IS NOT expr", |
| 135953 | + /* 181 */ "expr ::= NOT expr", |
| 135954 | + /* 182 */ "expr ::= BITNOT expr", |
| 135955 | + /* 183 */ "expr ::= MINUS expr", |
| 135956 | + /* 184 */ "expr ::= PLUS expr", |
| 135957 | + /* 185 */ "between_op ::= BETWEEN", |
| 135958 | + /* 186 */ "between_op ::= NOT BETWEEN", |
| 135959 | + /* 187 */ "expr ::= expr between_op expr AND expr", |
| 135960 | + /* 188 */ "in_op ::= IN", |
| 135961 | + /* 189 */ "in_op ::= NOT IN", |
| 135962 | + /* 190 */ "expr ::= expr in_op LP exprlist RP", |
| 135963 | + /* 191 */ "expr ::= LP select RP", |
| 135964 | + /* 192 */ "expr ::= expr in_op LP select RP", |
| 135965 | + /* 193 */ "expr ::= expr in_op nm dbnm paren_exprlist", |
| 135966 | + /* 194 */ "expr ::= EXISTS LP select RP", |
| 135967 | + /* 195 */ "expr ::= CASE case_operand case_exprlist case_else END", |
| 135968 | + /* 196 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", |
| 135969 | + /* 197 */ "case_exprlist ::= WHEN expr THEN expr", |
| 135970 | + /* 198 */ "case_else ::= ELSE expr", |
| 135971 | + /* 199 */ "case_else ::=", |
| 135972 | + /* 200 */ "case_operand ::= expr", |
| 135973 | + /* 201 */ "case_operand ::=", |
| 135974 | + /* 202 */ "exprlist ::=", |
| 135975 | + /* 203 */ "nexprlist ::= nexprlist COMMA expr", |
| 135976 | + /* 204 */ "nexprlist ::= expr", |
| 135977 | + /* 205 */ "paren_exprlist ::=", |
| 135978 | + /* 206 */ "paren_exprlist ::= LP exprlist RP", |
| 135979 | + /* 207 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", |
| 135980 | + /* 208 */ "uniqueflag ::= UNIQUE", |
| 135981 | + /* 209 */ "uniqueflag ::=", |
| 135982 | + /* 210 */ "eidlist_opt ::=", |
| 135983 | + /* 211 */ "eidlist_opt ::= LP eidlist RP", |
| 135984 | + /* 212 */ "eidlist ::= eidlist COMMA nm collate sortorder", |
| 135985 | + /* 213 */ "eidlist ::= nm collate sortorder", |
| 135986 | + /* 214 */ "collate ::=", |
| 135987 | + /* 215 */ "collate ::= COLLATE ID|STRING", |
| 135988 | + /* 216 */ "cmd ::= DROP INDEX ifexists fullname", |
| 135989 | + /* 217 */ "cmd ::= VACUUM", |
| 135990 | + /* 218 */ "cmd ::= VACUUM nm", |
| 135991 | + /* 219 */ "cmd ::= PRAGMA nm dbnm", |
| 135992 | + /* 220 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", |
| 135993 | + /* 221 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", |
| 135994 | + /* 222 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", |
| 135995 | + /* 223 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", |
| 135996 | + /* 224 */ "plus_num ::= PLUS INTEGER|FLOAT", |
| 135997 | + /* 225 */ "minus_num ::= MINUS INTEGER|FLOAT", |
| 135998 | + /* 226 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", |
| 135999 | + /* 227 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", |
| 136000 | + /* 228 */ "trigger_time ::= BEFORE", |
| 136001 | + /* 229 */ "trigger_time ::= AFTER", |
| 136002 | + /* 230 */ "trigger_time ::= INSTEAD OF", |
| 136003 | + /* 231 */ "trigger_time ::=", |
| 136004 | + /* 232 */ "trigger_event ::= DELETE|INSERT", |
| 136005 | + /* 233 */ "trigger_event ::= UPDATE", |
| 136006 | + /* 234 */ "trigger_event ::= UPDATE OF idlist", |
| 136007 | + /* 235 */ "when_clause ::=", |
| 136008 | + /* 236 */ "when_clause ::= WHEN expr", |
| 136009 | + /* 237 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", |
| 136010 | + /* 238 */ "trigger_cmd_list ::= trigger_cmd SEMI", |
| 136011 | + /* 239 */ "trnm ::= nm DOT nm", |
| 136012 | + /* 240 */ "tridxby ::= INDEXED BY nm", |
| 136013 | + /* 241 */ "tridxby ::= NOT INDEXED", |
| 136014 | + /* 242 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", |
| 136015 | + /* 243 */ "trigger_cmd ::= insert_cmd INTO trnm idlist_opt select", |
| 136016 | + /* 244 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", |
| 136017 | + /* 245 */ "trigger_cmd ::= select", |
| 136018 | + /* 246 */ "expr ::= RAISE LP IGNORE RP", |
| 136019 | + /* 247 */ "expr ::= RAISE LP raisetype COMMA nm RP", |
| 136020 | + /* 248 */ "raisetype ::= ROLLBACK", |
| 136021 | + /* 249 */ "raisetype ::= ABORT", |
| 136022 | + /* 250 */ "raisetype ::= FAIL", |
| 136023 | + /* 251 */ "cmd ::= DROP TRIGGER ifexists fullname", |
| 136024 | + /* 252 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", |
| 136025 | + /* 253 */ "cmd ::= DETACH database_kw_opt expr", |
| 136026 | + /* 254 */ "key_opt ::=", |
| 136027 | + /* 255 */ "key_opt ::= KEY expr", |
| 136028 | + /* 256 */ "cmd ::= REINDEX", |
| 136029 | + /* 257 */ "cmd ::= REINDEX nm dbnm", |
| 136030 | + /* 258 */ "cmd ::= ANALYZE", |
| 136031 | + /* 259 */ "cmd ::= ANALYZE nm dbnm", |
| 136032 | + /* 260 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", |
| 136033 | + /* 261 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", |
| 136034 | + /* 262 */ "add_column_fullname ::= fullname", |
| 136035 | + /* 263 */ "cmd ::= create_vtab", |
| 136036 | + /* 264 */ "cmd ::= create_vtab LP vtabarglist RP", |
| 136037 | + /* 265 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", |
| 136038 | + /* 266 */ "vtabarg ::=", |
| 136039 | + /* 267 */ "vtabargtoken ::= ANY", |
| 136040 | + /* 268 */ "vtabargtoken ::= lp anylist RP", |
| 136041 | + /* 269 */ "lp ::= LP", |
| 136042 | + /* 270 */ "with ::=", |
| 136043 | + /* 271 */ "with ::= WITH wqlist", |
| 136044 | + /* 272 */ "with ::= WITH RECURSIVE wqlist", |
| 136045 | + /* 273 */ "wqlist ::= nm eidlist_opt AS LP select RP", |
| 136046 | + /* 274 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", |
| 136047 | + /* 275 */ "input ::= cmdlist", |
| 136048 | + /* 276 */ "cmdlist ::= cmdlist ecmd", |
| 136049 | + /* 277 */ "cmdlist ::= ecmd", |
| 136050 | + /* 278 */ "ecmd ::= SEMI", |
| 136051 | + /* 279 */ "ecmd ::= explain cmdx SEMI", |
| 136052 | + /* 280 */ "explain ::=", |
| 136053 | + /* 281 */ "trans_opt ::=", |
| 136054 | + /* 282 */ "trans_opt ::= TRANSACTION", |
| 136055 | + /* 283 */ "trans_opt ::= TRANSACTION nm", |
| 136056 | + /* 284 */ "savepoint_opt ::= SAVEPOINT", |
| 136057 | + /* 285 */ "savepoint_opt ::=", |
| 136058 | + /* 286 */ "cmd ::= create_table create_table_args", |
| 136059 | + /* 287 */ "columnlist ::= columnlist COMMA columnname carglist", |
| 136060 | + /* 288 */ "columnlist ::= columnname carglist", |
| 136061 | + /* 289 */ "nm ::= ID|INDEXED", |
| 136062 | + /* 290 */ "nm ::= STRING", |
| 136063 | + /* 291 */ "nm ::= JOIN_KW", |
| 136064 | + /* 292 */ "typetoken ::= typename", |
| 136065 | + /* 293 */ "typename ::= ID|STRING", |
| 136066 | + /* 294 */ "signed ::= plus_num", |
| 136067 | + /* 295 */ "signed ::= minus_num", |
| 136068 | + /* 296 */ "carglist ::= carglist ccons", |
| 136069 | + /* 297 */ "carglist ::=", |
| 136070 | + /* 298 */ "ccons ::= NULL onconf", |
| 136071 | + /* 299 */ "conslist_opt ::= COMMA conslist", |
| 136072 | + /* 300 */ "conslist ::= conslist tconscomma tcons", |
| 136073 | + /* 301 */ "conslist ::= tcons", |
| 136074 | + /* 302 */ "tconscomma ::=", |
| 136075 | + /* 303 */ "defer_subclause_opt ::= defer_subclause", |
| 136076 | + /* 304 */ "resolvetype ::= raisetype", |
| 136077 | + /* 305 */ "selectnowith ::= oneselect", |
| 136078 | + /* 306 */ "oneselect ::= values", |
| 136079 | + /* 307 */ "sclp ::= selcollist COMMA", |
| 136080 | + /* 308 */ "as ::= ID|STRING", |
| 136081 | + /* 309 */ "expr ::= term", |
| 136082 | + /* 310 */ "likeop ::= LIKE_KW|MATCH", |
| 135744 | 136083 | /* 311 */ "exprlist ::= nexprlist", |
| 135745 | 136084 | /* 312 */ "nmnum ::= plus_num", |
| 135746 | 136085 | /* 313 */ "nmnum ::= nm", |
| 135747 | 136086 | /* 314 */ "nmnum ::= ON", |
| 135748 | 136087 | /* 315 */ "nmnum ::= DELETE", |
| | @@ -136375,11 +136714,10 @@ |
| 136375 | 136714 | { 173, 3 }, |
| 136376 | 136715 | { 173, 3 }, |
| 136377 | 136716 | { 173, 3 }, |
| 136378 | 136717 | { 173, 3 }, |
| 136379 | 136718 | { 173, 3 }, |
| 136380 | | - { 221, 1 }, |
| 136381 | 136719 | { 221, 2 }, |
| 136382 | 136720 | { 173, 3 }, |
| 136383 | 136721 | { 173, 5 }, |
| 136384 | 136722 | { 173, 2 }, |
| 136385 | 136723 | { 173, 3 }, |
| | @@ -136512,10 +136850,11 @@ |
| 136512 | 136850 | { 194, 1 }, |
| 136513 | 136851 | { 195, 1 }, |
| 136514 | 136852 | { 209, 2 }, |
| 136515 | 136853 | { 210, 1 }, |
| 136516 | 136854 | { 173, 1 }, |
| 136855 | + { 221, 1 }, |
| 136517 | 136856 | { 208, 1 }, |
| 136518 | 136857 | { 230, 1 }, |
| 136519 | 136858 | { 230, 1 }, |
| 136520 | 136859 | { 230, 1 }, |
| 136521 | 136860 | { 230, 1 }, |
| | @@ -136654,11 +136993,11 @@ |
| 136654 | 136993 | case 42: /* autoinc ::= */ yytestcase(yyruleno==42); |
| 136655 | 136994 | case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57); |
| 136656 | 136995 | case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67); |
| 136657 | 136996 | case 76: /* ifexists ::= */ yytestcase(yyruleno==76); |
| 136658 | 136997 | case 90: /* distinct ::= */ yytestcase(yyruleno==90); |
| 136659 | | - case 215: /* collate ::= */ yytestcase(yyruleno==215); |
| 136998 | + case 214: /* collate ::= */ yytestcase(yyruleno==214); |
| 136660 | 136999 | {yymsp[1].minor.yy194 = 0;} |
| 136661 | 137000 | break; |
| 136662 | 137001 | case 17: /* ifnotexists ::= IF NOT EXISTS */ |
| 136663 | 137002 | {yymsp[-2].minor.yy194 = 1;} |
| 136664 | 137003 | break; |
| | @@ -136798,13 +137137,13 @@ |
| 136798 | 137137 | case 144: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==144); |
| 136799 | 137138 | {yymsp[-1].minor.yy194 = yymsp[0].minor.yy194;} |
| 136800 | 137139 | break; |
| 136801 | 137140 | case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ |
| 136802 | 137141 | case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75); |
| 136803 | | - case 187: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==187); |
| 136804 | | - case 190: /* in_op ::= NOT IN */ yytestcase(yyruleno==190); |
| 136805 | | - case 216: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==216); |
| 137142 | + case 186: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==186); |
| 137143 | + case 189: /* in_op ::= NOT IN */ yytestcase(yyruleno==189); |
| 137144 | + case 215: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==215); |
| 136806 | 137145 | {yymsp[-1].minor.yy194 = 1;} |
| 136807 | 137146 | break; |
| 136808 | 137147 | case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ |
| 136809 | 137148 | {yymsp[-1].minor.yy194 = 0;} |
| 136810 | 137149 | break; |
| | @@ -136964,13 +137303,13 @@ |
| 136964 | 137303 | {yymsp[0].minor.yy194 = SF_All;} |
| 136965 | 137304 | break; |
| 136966 | 137305 | case 91: /* sclp ::= */ |
| 136967 | 137306 | case 119: /* orderby_opt ::= */ yytestcase(yyruleno==119); |
| 136968 | 137307 | case 126: /* groupby_opt ::= */ yytestcase(yyruleno==126); |
| 136969 | | - case 203: /* exprlist ::= */ yytestcase(yyruleno==203); |
| 136970 | | - case 206: /* paren_exprlist ::= */ yytestcase(yyruleno==206); |
| 136971 | | - case 211: /* eidlist_opt ::= */ yytestcase(yyruleno==211); |
| 137308 | + case 202: /* exprlist ::= */ yytestcase(yyruleno==202); |
| 137309 | + case 205: /* paren_exprlist ::= */ yytestcase(yyruleno==205); |
| 137310 | + case 210: /* eidlist_opt ::= */ yytestcase(yyruleno==210); |
| 136972 | 137311 | {yymsp[1].minor.yy148 = 0;} |
| 136973 | 137312 | break; |
| 136974 | 137313 | case 92: /* selcollist ::= sclp expr as */ |
| 136975 | 137314 | { |
| 136976 | 137315 | yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy148, yymsp[-1].minor.yy190.pExpr); |
| | @@ -136992,12 +137331,12 @@ |
| 136992 | 137331 | yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, pDot); |
| 136993 | 137332 | } |
| 136994 | 137333 | break; |
| 136995 | 137334 | case 95: /* as ::= AS nm */ |
| 136996 | 137335 | case 106: /* dbnm ::= DOT nm */ yytestcase(yyruleno==106); |
| 136997 | | - case 225: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==225); |
| 136998 | | - case 226: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==226); |
| 137336 | + case 224: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==224); |
| 137337 | + case 225: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==225); |
| 136999 | 137338 | {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} |
| 137000 | 137339 | break; |
| 137001 | 137340 | case 97: /* from ::= */ |
| 137002 | 137341 | {yymsp[1].minor.yy185 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy185));} |
| 137003 | 137342 | break; |
| | @@ -137076,18 +137415,18 @@ |
| 137076 | 137415 | {yymsp[-3].minor.yy194 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} |
| 137077 | 137416 | break; |
| 137078 | 137417 | case 112: /* on_opt ::= ON expr */ |
| 137079 | 137418 | case 129: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==129); |
| 137080 | 137419 | case 136: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==136); |
| 137081 | | - case 199: /* case_else ::= ELSE expr */ yytestcase(yyruleno==199); |
| 137420 | + case 198: /* case_else ::= ELSE expr */ yytestcase(yyruleno==198); |
| 137082 | 137421 | {yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr;} |
| 137083 | 137422 | break; |
| 137084 | 137423 | case 113: /* on_opt ::= */ |
| 137085 | 137424 | case 128: /* having_opt ::= */ yytestcase(yyruleno==128); |
| 137086 | 137425 | case 135: /* where_opt ::= */ yytestcase(yyruleno==135); |
| 137087 | | - case 200: /* case_else ::= */ yytestcase(yyruleno==200); |
| 137088 | | - case 202: /* case_operand ::= */ yytestcase(yyruleno==202); |
| 137426 | + case 199: /* case_else ::= */ yytestcase(yyruleno==199); |
| 137427 | + case 201: /* case_operand ::= */ yytestcase(yyruleno==201); |
| 137089 | 137428 | {yymsp[1].minor.yy72 = 0;} |
| 137090 | 137429 | break; |
| 137091 | 137430 | case 115: /* indexed_opt ::= INDEXED BY nm */ |
| 137092 | 137431 | {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} |
| 137093 | 137432 | break; |
| | @@ -137320,17 +137659,14 @@ |
| 137320 | 137659 | case 171: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==171); |
| 137321 | 137660 | case 172: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==172); |
| 137322 | 137661 | case 173: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==173); |
| 137323 | 137662 | {spanBinaryExpr(pParse,yymsp[-1].major,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190);} |
| 137324 | 137663 | break; |
| 137325 | | - case 174: /* likeop ::= LIKE_KW|MATCH */ |
| 137326 | | -{yymsp[0].minor.yy0=yymsp[0].minor.yy0;/*A-overwrites-X*/} |
| 137327 | | - break; |
| 137328 | | - case 175: /* likeop ::= NOT LIKE_KW|MATCH */ |
| 137664 | + case 174: /* likeop ::= NOT LIKE_KW|MATCH */ |
| 137329 | 137665 | {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} |
| 137330 | 137666 | break; |
| 137331 | | - case 176: /* expr ::= expr likeop expr */ |
| 137667 | + case 175: /* expr ::= expr likeop expr */ |
| 137332 | 137668 | { |
| 137333 | 137669 | ExprList *pList; |
| 137334 | 137670 | int bNot = yymsp[-1].minor.yy0.n & 0x80000000; |
| 137335 | 137671 | yymsp[-1].minor.yy0.n &= 0x7fffffff; |
| 137336 | 137672 | pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy190.pExpr); |
| | @@ -137339,11 +137675,11 @@ |
| 137339 | 137675 | exprNot(pParse, bNot, &yymsp[-2].minor.yy190); |
| 137340 | 137676 | yymsp[-2].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd; |
| 137341 | 137677 | if( yymsp[-2].minor.yy190.pExpr ) yymsp[-2].minor.yy190.pExpr->flags |= EP_InfixFunc; |
| 137342 | 137678 | } |
| 137343 | 137679 | break; |
| 137344 | | - case 177: /* expr ::= expr likeop expr ESCAPE expr */ |
| 137680 | + case 176: /* expr ::= expr likeop expr ESCAPE expr */ |
| 137345 | 137681 | { |
| 137346 | 137682 | ExprList *pList; |
| 137347 | 137683 | int bNot = yymsp[-3].minor.yy0.n & 0x80000000; |
| 137348 | 137684 | yymsp[-3].minor.yy0.n &= 0x7fffffff; |
| 137349 | 137685 | pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr); |
| | @@ -137353,43 +137689,43 @@ |
| 137353 | 137689 | exprNot(pParse, bNot, &yymsp[-4].minor.yy190); |
| 137354 | 137690 | yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd; |
| 137355 | 137691 | if( yymsp[-4].minor.yy190.pExpr ) yymsp[-4].minor.yy190.pExpr->flags |= EP_InfixFunc; |
| 137356 | 137692 | } |
| 137357 | 137693 | break; |
| 137358 | | - case 178: /* expr ::= expr ISNULL|NOTNULL */ |
| 137694 | + case 177: /* expr ::= expr ISNULL|NOTNULL */ |
| 137359 | 137695 | {spanUnaryPostfix(pParse,yymsp[0].major,&yymsp[-1].minor.yy190,&yymsp[0].minor.yy0);} |
| 137360 | 137696 | break; |
| 137361 | | - case 179: /* expr ::= expr NOT NULL */ |
| 137697 | + case 178: /* expr ::= expr NOT NULL */ |
| 137362 | 137698 | {spanUnaryPostfix(pParse,TK_NOTNULL,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy0);} |
| 137363 | 137699 | break; |
| 137364 | | - case 180: /* expr ::= expr IS expr */ |
| 137700 | + case 179: /* expr ::= expr IS expr */ |
| 137365 | 137701 | { |
| 137366 | 137702 | spanBinaryExpr(pParse,TK_IS,&yymsp[-2].minor.yy190,&yymsp[0].minor.yy190); |
| 137367 | 137703 | binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-2].minor.yy190.pExpr, TK_ISNULL); |
| 137368 | 137704 | } |
| 137369 | 137705 | break; |
| 137370 | | - case 181: /* expr ::= expr IS NOT expr */ |
| 137706 | + case 180: /* expr ::= expr IS NOT expr */ |
| 137371 | 137707 | { |
| 137372 | 137708 | spanBinaryExpr(pParse,TK_ISNOT,&yymsp[-3].minor.yy190,&yymsp[0].minor.yy190); |
| 137373 | 137709 | binaryToUnaryIfNull(pParse, yymsp[0].minor.yy190.pExpr, yymsp[-3].minor.yy190.pExpr, TK_NOTNULL); |
| 137374 | 137710 | } |
| 137375 | 137711 | break; |
| 137376 | | - case 182: /* expr ::= NOT expr */ |
| 137377 | | - case 183: /* expr ::= BITNOT expr */ yytestcase(yyruleno==183); |
| 137712 | + case 181: /* expr ::= NOT expr */ |
| 137713 | + case 182: /* expr ::= BITNOT expr */ yytestcase(yyruleno==182); |
| 137378 | 137714 | {spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,yymsp[-1].major,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/} |
| 137379 | 137715 | break; |
| 137380 | | - case 184: /* expr ::= MINUS expr */ |
| 137716 | + case 183: /* expr ::= MINUS expr */ |
| 137381 | 137717 | {spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UMINUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/} |
| 137382 | 137718 | break; |
| 137383 | | - case 185: /* expr ::= PLUS expr */ |
| 137719 | + case 184: /* expr ::= PLUS expr */ |
| 137384 | 137720 | {spanUnaryPrefix(&yymsp[-1].minor.yy190,pParse,TK_UPLUS,&yymsp[0].minor.yy190,&yymsp[-1].minor.yy0);/*A-overwrites-B*/} |
| 137385 | 137721 | break; |
| 137386 | | - case 186: /* between_op ::= BETWEEN */ |
| 137387 | | - case 189: /* in_op ::= IN */ yytestcase(yyruleno==189); |
| 137722 | + case 185: /* between_op ::= BETWEEN */ |
| 137723 | + case 188: /* in_op ::= IN */ yytestcase(yyruleno==188); |
| 137388 | 137724 | {yymsp[0].minor.yy194 = 0;} |
| 137389 | 137725 | break; |
| 137390 | | - case 188: /* expr ::= expr between_op expr AND expr */ |
| 137726 | + case 187: /* expr ::= expr between_op expr AND expr */ |
| 137391 | 137727 | { |
| 137392 | 137728 | ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr); |
| 137393 | 137729 | pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy190.pExpr); |
| 137394 | 137730 | yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy190.pExpr, 0); |
| 137395 | 137731 | if( yymsp[-4].minor.yy190.pExpr ){ |
| | @@ -137399,11 +137735,11 @@ |
| 137399 | 137735 | } |
| 137400 | 137736 | exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); |
| 137401 | 137737 | yymsp[-4].minor.yy190.zEnd = yymsp[0].minor.yy190.zEnd; |
| 137402 | 137738 | } |
| 137403 | 137739 | break; |
| 137404 | | - case 191: /* expr ::= expr in_op LP exprlist RP */ |
| 137740 | + case 190: /* expr ::= expr in_op LP exprlist RP */ |
| 137405 | 137741 | { |
| 137406 | 137742 | if( yymsp[-1].minor.yy148==0 ){ |
| 137407 | 137743 | /* Expressions of the form |
| 137408 | 137744 | ** |
| 137409 | 137745 | ** expr1 IN () |
| | @@ -137452,26 +137788,26 @@ |
| 137452 | 137788 | exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); |
| 137453 | 137789 | } |
| 137454 | 137790 | yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; |
| 137455 | 137791 | } |
| 137456 | 137792 | break; |
| 137457 | | - case 192: /* expr ::= LP select RP */ |
| 137793 | + case 191: /* expr ::= LP select RP */ |
| 137458 | 137794 | { |
| 137459 | 137795 | spanSet(&yymsp[-2].minor.yy190,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ |
| 137460 | 137796 | yymsp[-2].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0); |
| 137461 | 137797 | sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy190.pExpr, yymsp[-1].minor.yy243); |
| 137462 | 137798 | } |
| 137463 | 137799 | break; |
| 137464 | | - case 193: /* expr ::= expr in_op LP select RP */ |
| 137800 | + case 192: /* expr ::= expr in_op LP select RP */ |
| 137465 | 137801 | { |
| 137466 | 137802 | yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0); |
| 137467 | 137803 | sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, yymsp[-1].minor.yy243); |
| 137468 | 137804 | exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); |
| 137469 | 137805 | yymsp[-4].minor.yy190.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; |
| 137470 | 137806 | } |
| 137471 | 137807 | break; |
| 137472 | | - case 194: /* expr ::= expr in_op nm dbnm paren_exprlist */ |
| 137808 | + case 193: /* expr ::= expr in_op nm dbnm paren_exprlist */ |
| 137473 | 137809 | { |
| 137474 | 137810 | SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); |
| 137475 | 137811 | Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); |
| 137476 | 137812 | if( yymsp[0].minor.yy148 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy148); |
| 137477 | 137813 | yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy190.pExpr, 0); |
| | @@ -137478,19 +137814,19 @@ |
| 137478 | 137814 | sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy190.pExpr, pSelect); |
| 137479 | 137815 | exprNot(pParse, yymsp[-3].minor.yy194, &yymsp[-4].minor.yy190); |
| 137480 | 137816 | yymsp[-4].minor.yy190.zEnd = yymsp[-1].minor.yy0.z ? &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n] : &yymsp[-2].minor.yy0.z[yymsp[-2].minor.yy0.n]; |
| 137481 | 137817 | } |
| 137482 | 137818 | break; |
| 137483 | | - case 195: /* expr ::= EXISTS LP select RP */ |
| 137819 | + case 194: /* expr ::= EXISTS LP select RP */ |
| 137484 | 137820 | { |
| 137485 | 137821 | Expr *p; |
| 137486 | 137822 | spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-B*/ |
| 137487 | 137823 | p = yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); |
| 137488 | 137824 | sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy243); |
| 137489 | 137825 | } |
| 137490 | 137826 | break; |
| 137491 | | - case 196: /* expr ::= CASE case_operand case_exprlist case_else END */ |
| 137827 | + case 195: /* expr ::= CASE case_operand case_exprlist case_else END */ |
| 137492 | 137828 | { |
| 137493 | 137829 | spanSet(&yymsp[-4].minor.yy190,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-C*/ |
| 137494 | 137830 | yymsp[-4].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy72, 0); |
| 137495 | 137831 | if( yymsp[-4].minor.yy190.pExpr ){ |
| 137496 | 137832 | yymsp[-4].minor.yy190.pExpr->x.pList = yymsp[-1].minor.yy72 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[-1].minor.yy72) : yymsp[-2].minor.yy148; |
| | @@ -137499,313 +137835,314 @@ |
| 137499 | 137835 | sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy148); |
| 137500 | 137836 | sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy72); |
| 137501 | 137837 | } |
| 137502 | 137838 | } |
| 137503 | 137839 | break; |
| 137504 | | - case 197: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 137840 | + case 196: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ |
| 137505 | 137841 | { |
| 137506 | 137842 | yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[-2].minor.yy190.pExpr); |
| 137507 | 137843 | yymsp[-4].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy148, yymsp[0].minor.yy190.pExpr); |
| 137508 | 137844 | } |
| 137509 | 137845 | break; |
| 137510 | | - case 198: /* case_exprlist ::= WHEN expr THEN expr */ |
| 137846 | + case 197: /* case_exprlist ::= WHEN expr THEN expr */ |
| 137511 | 137847 | { |
| 137512 | 137848 | yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy190.pExpr); |
| 137513 | 137849 | yymsp[-3].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy148, yymsp[0].minor.yy190.pExpr); |
| 137514 | 137850 | } |
| 137515 | 137851 | break; |
| 137516 | | - case 201: /* case_operand ::= expr */ |
| 137852 | + case 200: /* case_operand ::= expr */ |
| 137517 | 137853 | {yymsp[0].minor.yy72 = yymsp[0].minor.yy190.pExpr; /*A-overwrites-X*/} |
| 137518 | 137854 | break; |
| 137519 | | - case 204: /* nexprlist ::= nexprlist COMMA expr */ |
| 137855 | + case 203: /* nexprlist ::= nexprlist COMMA expr */ |
| 137520 | 137856 | {yymsp[-2].minor.yy148 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy148,yymsp[0].minor.yy190.pExpr);} |
| 137521 | 137857 | break; |
| 137522 | | - case 205: /* nexprlist ::= expr */ |
| 137858 | + case 204: /* nexprlist ::= expr */ |
| 137523 | 137859 | {yymsp[0].minor.yy148 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy190.pExpr); /*A-overwrites-Y*/} |
| 137524 | 137860 | break; |
| 137525 | | - case 207: /* paren_exprlist ::= LP exprlist RP */ |
| 137526 | | - case 212: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==212); |
| 137861 | + case 206: /* paren_exprlist ::= LP exprlist RP */ |
| 137862 | + case 211: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==211); |
| 137527 | 137863 | {yymsp[-2].minor.yy148 = yymsp[-1].minor.yy148;} |
| 137528 | 137864 | break; |
| 137529 | | - case 208: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 137865 | + case 207: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ |
| 137530 | 137866 | { |
| 137531 | 137867 | sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, |
| 137532 | 137868 | sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy148, yymsp[-10].minor.yy194, |
| 137533 | 137869 | &yymsp[-11].minor.yy0, yymsp[0].minor.yy72, SQLITE_SO_ASC, yymsp[-8].minor.yy194, SQLITE_IDXTYPE_APPDEF); |
| 137534 | 137870 | } |
| 137535 | 137871 | break; |
| 137536 | | - case 209: /* uniqueflag ::= UNIQUE */ |
| 137537 | | - case 250: /* raisetype ::= ABORT */ yytestcase(yyruleno==250); |
| 137872 | + case 208: /* uniqueflag ::= UNIQUE */ |
| 137873 | + case 249: /* raisetype ::= ABORT */ yytestcase(yyruleno==249); |
| 137538 | 137874 | {yymsp[0].minor.yy194 = OE_Abort;} |
| 137539 | 137875 | break; |
| 137540 | | - case 210: /* uniqueflag ::= */ |
| 137876 | + case 209: /* uniqueflag ::= */ |
| 137541 | 137877 | {yymsp[1].minor.yy194 = OE_None;} |
| 137542 | 137878 | break; |
| 137543 | | - case 213: /* eidlist ::= eidlist COMMA nm collate sortorder */ |
| 137879 | + case 212: /* eidlist ::= eidlist COMMA nm collate sortorder */ |
| 137544 | 137880 | { |
| 137545 | 137881 | yymsp[-4].minor.yy148 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy148, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194); |
| 137546 | 137882 | } |
| 137547 | 137883 | break; |
| 137548 | | - case 214: /* eidlist ::= nm collate sortorder */ |
| 137884 | + case 213: /* eidlist ::= nm collate sortorder */ |
| 137549 | 137885 | { |
| 137550 | 137886 | yymsp[-2].minor.yy148 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy194, yymsp[0].minor.yy194); /*A-overwrites-Y*/ |
| 137551 | 137887 | } |
| 137552 | 137888 | break; |
| 137553 | | - case 217: /* cmd ::= DROP INDEX ifexists fullname */ |
| 137889 | + case 216: /* cmd ::= DROP INDEX ifexists fullname */ |
| 137554 | 137890 | {sqlite3DropIndex(pParse, yymsp[0].minor.yy185, yymsp[-1].minor.yy194);} |
| 137555 | 137891 | break; |
| 137556 | | - case 218: /* cmd ::= VACUUM */ |
| 137892 | + case 217: /* cmd ::= VACUUM */ |
| 137557 | 137893 | {sqlite3Vacuum(pParse,0);} |
| 137558 | 137894 | break; |
| 137559 | | - case 219: /* cmd ::= VACUUM nm */ |
| 137895 | + case 218: /* cmd ::= VACUUM nm */ |
| 137560 | 137896 | {sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);} |
| 137561 | 137897 | break; |
| 137562 | | - case 220: /* cmd ::= PRAGMA nm dbnm */ |
| 137898 | + case 219: /* cmd ::= PRAGMA nm dbnm */ |
| 137563 | 137899 | {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} |
| 137564 | 137900 | break; |
| 137565 | | - case 221: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 137901 | + case 220: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ |
| 137566 | 137902 | {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} |
| 137567 | 137903 | break; |
| 137568 | | - case 222: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 137904 | + case 221: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ |
| 137569 | 137905 | {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} |
| 137570 | 137906 | break; |
| 137571 | | - case 223: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 137907 | + case 222: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ |
| 137572 | 137908 | {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} |
| 137573 | 137909 | break; |
| 137574 | | - case 224: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 137910 | + case 223: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ |
| 137575 | 137911 | {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} |
| 137576 | 137912 | break; |
| 137577 | | - case 227: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 137913 | + case 226: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ |
| 137578 | 137914 | { |
| 137579 | 137915 | Token all; |
| 137580 | 137916 | all.z = yymsp[-3].minor.yy0.z; |
| 137581 | 137917 | all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; |
| 137582 | 137918 | sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy145, &all); |
| 137583 | 137919 | } |
| 137584 | 137920 | break; |
| 137585 | | - case 228: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 137921 | + case 227: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ |
| 137586 | 137922 | { |
| 137587 | 137923 | sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy194, yymsp[-4].minor.yy332.a, yymsp[-4].minor.yy332.b, yymsp[-2].minor.yy185, yymsp[0].minor.yy72, yymsp[-10].minor.yy194, yymsp[-8].minor.yy194); |
| 137588 | 137924 | yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ |
| 137589 | 137925 | } |
| 137590 | 137926 | break; |
| 137591 | | - case 229: /* trigger_time ::= BEFORE */ |
| 137927 | + case 228: /* trigger_time ::= BEFORE */ |
| 137592 | 137928 | { yymsp[0].minor.yy194 = TK_BEFORE; } |
| 137593 | 137929 | break; |
| 137594 | | - case 230: /* trigger_time ::= AFTER */ |
| 137930 | + case 229: /* trigger_time ::= AFTER */ |
| 137595 | 137931 | { yymsp[0].minor.yy194 = TK_AFTER; } |
| 137596 | 137932 | break; |
| 137597 | | - case 231: /* trigger_time ::= INSTEAD OF */ |
| 137933 | + case 230: /* trigger_time ::= INSTEAD OF */ |
| 137598 | 137934 | { yymsp[-1].minor.yy194 = TK_INSTEAD;} |
| 137599 | 137935 | break; |
| 137600 | | - case 232: /* trigger_time ::= */ |
| 137936 | + case 231: /* trigger_time ::= */ |
| 137601 | 137937 | { yymsp[1].minor.yy194 = TK_BEFORE; } |
| 137602 | 137938 | break; |
| 137603 | | - case 233: /* trigger_event ::= DELETE|INSERT */ |
| 137604 | | - case 234: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==234); |
| 137939 | + case 232: /* trigger_event ::= DELETE|INSERT */ |
| 137940 | + case 233: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==233); |
| 137605 | 137941 | {yymsp[0].minor.yy332.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy332.b = 0;} |
| 137606 | 137942 | break; |
| 137607 | | - case 235: /* trigger_event ::= UPDATE OF idlist */ |
| 137943 | + case 234: /* trigger_event ::= UPDATE OF idlist */ |
| 137608 | 137944 | {yymsp[-2].minor.yy332.a = TK_UPDATE; yymsp[-2].minor.yy332.b = yymsp[0].minor.yy254;} |
| 137609 | 137945 | break; |
| 137610 | | - case 236: /* when_clause ::= */ |
| 137611 | | - case 255: /* key_opt ::= */ yytestcase(yyruleno==255); |
| 137946 | + case 235: /* when_clause ::= */ |
| 137947 | + case 254: /* key_opt ::= */ yytestcase(yyruleno==254); |
| 137612 | 137948 | { yymsp[1].minor.yy72 = 0; } |
| 137613 | 137949 | break; |
| 137614 | | - case 237: /* when_clause ::= WHEN expr */ |
| 137615 | | - case 256: /* key_opt ::= KEY expr */ yytestcase(yyruleno==256); |
| 137950 | + case 236: /* when_clause ::= WHEN expr */ |
| 137951 | + case 255: /* key_opt ::= KEY expr */ yytestcase(yyruleno==255); |
| 137616 | 137952 | { yymsp[-1].minor.yy72 = yymsp[0].minor.yy190.pExpr; } |
| 137617 | 137953 | break; |
| 137618 | | - case 238: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 137954 | + case 237: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ |
| 137619 | 137955 | { |
| 137620 | 137956 | assert( yymsp[-2].minor.yy145!=0 ); |
| 137621 | 137957 | yymsp[-2].minor.yy145->pLast->pNext = yymsp[-1].minor.yy145; |
| 137622 | 137958 | yymsp[-2].minor.yy145->pLast = yymsp[-1].minor.yy145; |
| 137623 | 137959 | } |
| 137624 | 137960 | break; |
| 137625 | | - case 239: /* trigger_cmd_list ::= trigger_cmd SEMI */ |
| 137961 | + case 238: /* trigger_cmd_list ::= trigger_cmd SEMI */ |
| 137626 | 137962 | { |
| 137627 | 137963 | assert( yymsp[-1].minor.yy145!=0 ); |
| 137628 | 137964 | yymsp[-1].minor.yy145->pLast = yymsp[-1].minor.yy145; |
| 137629 | 137965 | } |
| 137630 | 137966 | break; |
| 137631 | | - case 240: /* trnm ::= nm DOT nm */ |
| 137967 | + case 239: /* trnm ::= nm DOT nm */ |
| 137632 | 137968 | { |
| 137633 | 137969 | yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; |
| 137634 | 137970 | sqlite3ErrorMsg(pParse, |
| 137635 | 137971 | "qualified table names are not allowed on INSERT, UPDATE, and DELETE " |
| 137636 | 137972 | "statements within triggers"); |
| 137637 | 137973 | } |
| 137638 | 137974 | break; |
| 137639 | | - case 241: /* tridxby ::= INDEXED BY nm */ |
| 137975 | + case 240: /* tridxby ::= INDEXED BY nm */ |
| 137640 | 137976 | { |
| 137641 | 137977 | sqlite3ErrorMsg(pParse, |
| 137642 | 137978 | "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " |
| 137643 | 137979 | "within triggers"); |
| 137644 | 137980 | } |
| 137645 | 137981 | break; |
| 137646 | | - case 242: /* tridxby ::= NOT INDEXED */ |
| 137982 | + case 241: /* tridxby ::= NOT INDEXED */ |
| 137647 | 137983 | { |
| 137648 | 137984 | sqlite3ErrorMsg(pParse, |
| 137649 | 137985 | "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " |
| 137650 | 137986 | "within triggers"); |
| 137651 | 137987 | } |
| 137652 | 137988 | break; |
| 137653 | | - case 243: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ |
| 137989 | + case 242: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ |
| 137654 | 137990 | {yymsp[-6].minor.yy145 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy148, yymsp[0].minor.yy72, yymsp[-5].minor.yy194);} |
| 137655 | 137991 | break; |
| 137656 | | - case 244: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */ |
| 137992 | + case 243: /* trigger_cmd ::= insert_cmd INTO trnm idlist_opt select */ |
| 137657 | 137993 | {yymsp[-4].minor.yy145 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy254, yymsp[0].minor.yy243, yymsp[-4].minor.yy194);/*A-overwrites-R*/} |
| 137658 | 137994 | break; |
| 137659 | | - case 245: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ |
| 137995 | + case 244: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ |
| 137660 | 137996 | {yymsp[-4].minor.yy145 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy72);} |
| 137661 | 137997 | break; |
| 137662 | | - case 246: /* trigger_cmd ::= select */ |
| 137998 | + case 245: /* trigger_cmd ::= select */ |
| 137663 | 137999 | {yymsp[0].minor.yy145 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy243); /*A-overwrites-X*/} |
| 137664 | 138000 | break; |
| 137665 | | - case 247: /* expr ::= RAISE LP IGNORE RP */ |
| 138001 | + case 246: /* expr ::= RAISE LP IGNORE RP */ |
| 137666 | 138002 | { |
| 137667 | 138003 | spanSet(&yymsp[-3].minor.yy190,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ |
| 137668 | 138004 | yymsp[-3].minor.yy190.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0); |
| 137669 | 138005 | if( yymsp[-3].minor.yy190.pExpr ){ |
| 137670 | 138006 | yymsp[-3].minor.yy190.pExpr->affinity = OE_Ignore; |
| 137671 | 138007 | } |
| 137672 | 138008 | } |
| 137673 | 138009 | break; |
| 137674 | | - case 248: /* expr ::= RAISE LP raisetype COMMA nm RP */ |
| 138010 | + case 247: /* expr ::= RAISE LP raisetype COMMA nm RP */ |
| 137675 | 138011 | { |
| 137676 | 138012 | spanSet(&yymsp[-5].minor.yy190,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/ |
| 137677 | 138013 | yymsp[-5].minor.yy190.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); |
| 137678 | 138014 | if( yymsp[-5].minor.yy190.pExpr ) { |
| 137679 | 138015 | yymsp[-5].minor.yy190.pExpr->affinity = (char)yymsp[-3].minor.yy194; |
| 137680 | 138016 | } |
| 137681 | 138017 | } |
| 137682 | 138018 | break; |
| 137683 | | - case 249: /* raisetype ::= ROLLBACK */ |
| 138019 | + case 248: /* raisetype ::= ROLLBACK */ |
| 137684 | 138020 | {yymsp[0].minor.yy194 = OE_Rollback;} |
| 137685 | 138021 | break; |
| 137686 | | - case 251: /* raisetype ::= FAIL */ |
| 138022 | + case 250: /* raisetype ::= FAIL */ |
| 137687 | 138023 | {yymsp[0].minor.yy194 = OE_Fail;} |
| 137688 | 138024 | break; |
| 137689 | | - case 252: /* cmd ::= DROP TRIGGER ifexists fullname */ |
| 138025 | + case 251: /* cmd ::= DROP TRIGGER ifexists fullname */ |
| 137690 | 138026 | { |
| 137691 | 138027 | sqlite3DropTrigger(pParse,yymsp[0].minor.yy185,yymsp[-1].minor.yy194); |
| 137692 | 138028 | } |
| 137693 | 138029 | break; |
| 137694 | | - case 253: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 138030 | + case 252: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ |
| 137695 | 138031 | { |
| 137696 | 138032 | sqlite3Attach(pParse, yymsp[-3].minor.yy190.pExpr, yymsp[-1].minor.yy190.pExpr, yymsp[0].minor.yy72); |
| 137697 | 138033 | } |
| 137698 | 138034 | break; |
| 137699 | | - case 254: /* cmd ::= DETACH database_kw_opt expr */ |
| 138035 | + case 253: /* cmd ::= DETACH database_kw_opt expr */ |
| 137700 | 138036 | { |
| 137701 | 138037 | sqlite3Detach(pParse, yymsp[0].minor.yy190.pExpr); |
| 137702 | 138038 | } |
| 137703 | 138039 | break; |
| 137704 | | - case 257: /* cmd ::= REINDEX */ |
| 138040 | + case 256: /* cmd ::= REINDEX */ |
| 137705 | 138041 | {sqlite3Reindex(pParse, 0, 0);} |
| 137706 | 138042 | break; |
| 137707 | | - case 258: /* cmd ::= REINDEX nm dbnm */ |
| 138043 | + case 257: /* cmd ::= REINDEX nm dbnm */ |
| 137708 | 138044 | {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} |
| 137709 | 138045 | break; |
| 137710 | | - case 259: /* cmd ::= ANALYZE */ |
| 138046 | + case 258: /* cmd ::= ANALYZE */ |
| 137711 | 138047 | {sqlite3Analyze(pParse, 0, 0);} |
| 137712 | 138048 | break; |
| 137713 | | - case 260: /* cmd ::= ANALYZE nm dbnm */ |
| 138049 | + case 259: /* cmd ::= ANALYZE nm dbnm */ |
| 137714 | 138050 | {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} |
| 137715 | 138051 | break; |
| 137716 | | - case 261: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 138052 | + case 260: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ |
| 137717 | 138053 | { |
| 137718 | 138054 | sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy185,&yymsp[0].minor.yy0); |
| 137719 | 138055 | } |
| 137720 | 138056 | break; |
| 137721 | | - case 262: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 138057 | + case 261: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ |
| 137722 | 138058 | { |
| 137723 | 138059 | yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; |
| 137724 | 138060 | sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); |
| 137725 | 138061 | } |
| 137726 | 138062 | break; |
| 137727 | | - case 263: /* add_column_fullname ::= fullname */ |
| 138063 | + case 262: /* add_column_fullname ::= fullname */ |
| 137728 | 138064 | { |
| 137729 | 138065 | disableLookaside(pParse); |
| 137730 | 138066 | sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy185); |
| 137731 | 138067 | } |
| 137732 | 138068 | break; |
| 137733 | | - case 264: /* cmd ::= create_vtab */ |
| 138069 | + case 263: /* cmd ::= create_vtab */ |
| 137734 | 138070 | {sqlite3VtabFinishParse(pParse,0);} |
| 137735 | 138071 | break; |
| 137736 | | - case 265: /* cmd ::= create_vtab LP vtabarglist RP */ |
| 138072 | + case 264: /* cmd ::= create_vtab LP vtabarglist RP */ |
| 137737 | 138073 | {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} |
| 137738 | 138074 | break; |
| 137739 | | - case 266: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 138075 | + case 265: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ |
| 137740 | 138076 | { |
| 137741 | 138077 | sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy194); |
| 137742 | 138078 | } |
| 137743 | 138079 | break; |
| 137744 | | - case 267: /* vtabarg ::= */ |
| 138080 | + case 266: /* vtabarg ::= */ |
| 137745 | 138081 | {sqlite3VtabArgInit(pParse);} |
| 137746 | 138082 | break; |
| 137747 | | - case 268: /* vtabargtoken ::= ANY */ |
| 137748 | | - case 269: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==269); |
| 137749 | | - case 270: /* lp ::= LP */ yytestcase(yyruleno==270); |
| 138083 | + case 267: /* vtabargtoken ::= ANY */ |
| 138084 | + case 268: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==268); |
| 138085 | + case 269: /* lp ::= LP */ yytestcase(yyruleno==269); |
| 137750 | 138086 | {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} |
| 137751 | 138087 | break; |
| 137752 | | - case 271: /* with ::= */ |
| 138088 | + case 270: /* with ::= */ |
| 137753 | 138089 | {yymsp[1].minor.yy285 = 0;} |
| 137754 | 138090 | break; |
| 137755 | | - case 272: /* with ::= WITH wqlist */ |
| 138091 | + case 271: /* with ::= WITH wqlist */ |
| 137756 | 138092 | { yymsp[-1].minor.yy285 = yymsp[0].minor.yy285; } |
| 137757 | 138093 | break; |
| 137758 | | - case 273: /* with ::= WITH RECURSIVE wqlist */ |
| 138094 | + case 272: /* with ::= WITH RECURSIVE wqlist */ |
| 137759 | 138095 | { yymsp[-2].minor.yy285 = yymsp[0].minor.yy285; } |
| 137760 | 138096 | break; |
| 137761 | | - case 274: /* wqlist ::= nm eidlist_opt AS LP select RP */ |
| 138097 | + case 273: /* wqlist ::= nm eidlist_opt AS LP select RP */ |
| 137762 | 138098 | { |
| 137763 | 138099 | yymsp[-5].minor.yy285 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243); /*A-overwrites-X*/ |
| 137764 | 138100 | } |
| 137765 | 138101 | break; |
| 137766 | | - case 275: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 138102 | + case 274: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ |
| 137767 | 138103 | { |
| 137768 | 138104 | yymsp[-7].minor.yy285 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy285, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy148, yymsp[-1].minor.yy243); |
| 137769 | 138105 | } |
| 137770 | 138106 | break; |
| 137771 | 138107 | default: |
| 137772 | | - /* (276) input ::= cmdlist */ yytestcase(yyruleno==276); |
| 137773 | | - /* (277) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==277); |
| 137774 | | - /* (278) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=278); |
| 137775 | | - /* (279) ecmd ::= SEMI */ yytestcase(yyruleno==279); |
| 137776 | | - /* (280) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==280); |
| 137777 | | - /* (281) explain ::= */ yytestcase(yyruleno==281); |
| 137778 | | - /* (282) trans_opt ::= */ yytestcase(yyruleno==282); |
| 137779 | | - /* (283) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==283); |
| 137780 | | - /* (284) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==284); |
| 137781 | | - /* (285) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==285); |
| 137782 | | - /* (286) savepoint_opt ::= */ yytestcase(yyruleno==286); |
| 137783 | | - /* (287) cmd ::= create_table create_table_args */ yytestcase(yyruleno==287); |
| 137784 | | - /* (288) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==288); |
| 137785 | | - /* (289) columnlist ::= columnname carglist */ yytestcase(yyruleno==289); |
| 137786 | | - /* (290) nm ::= ID|INDEXED */ yytestcase(yyruleno==290); |
| 137787 | | - /* (291) nm ::= STRING */ yytestcase(yyruleno==291); |
| 137788 | | - /* (292) nm ::= JOIN_KW */ yytestcase(yyruleno==292); |
| 137789 | | - /* (293) typetoken ::= typename */ yytestcase(yyruleno==293); |
| 137790 | | - /* (294) typename ::= ID|STRING */ yytestcase(yyruleno==294); |
| 137791 | | - /* (295) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=295); |
| 137792 | | - /* (296) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=296); |
| 137793 | | - /* (297) carglist ::= carglist ccons */ yytestcase(yyruleno==297); |
| 137794 | | - /* (298) carglist ::= */ yytestcase(yyruleno==298); |
| 137795 | | - /* (299) ccons ::= NULL onconf */ yytestcase(yyruleno==299); |
| 137796 | | - /* (300) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==300); |
| 137797 | | - /* (301) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==301); |
| 137798 | | - /* (302) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=302); |
| 137799 | | - /* (303) tconscomma ::= */ yytestcase(yyruleno==303); |
| 137800 | | - /* (304) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=304); |
| 137801 | | - /* (305) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=305); |
| 137802 | | - /* (306) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=306); |
| 137803 | | - /* (307) oneselect ::= values */ yytestcase(yyruleno==307); |
| 137804 | | - /* (308) sclp ::= selcollist COMMA */ yytestcase(yyruleno==308); |
| 137805 | | - /* (309) as ::= ID|STRING */ yytestcase(yyruleno==309); |
| 137806 | | - /* (310) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=310); |
| 138108 | + /* (275) input ::= cmdlist */ yytestcase(yyruleno==275); |
| 138109 | + /* (276) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==276); |
| 138110 | + /* (277) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=277); |
| 138111 | + /* (278) ecmd ::= SEMI */ yytestcase(yyruleno==278); |
| 138112 | + /* (279) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==279); |
| 138113 | + /* (280) explain ::= */ yytestcase(yyruleno==280); |
| 138114 | + /* (281) trans_opt ::= */ yytestcase(yyruleno==281); |
| 138115 | + /* (282) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==282); |
| 138116 | + /* (283) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==283); |
| 138117 | + /* (284) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==284); |
| 138118 | + /* (285) savepoint_opt ::= */ yytestcase(yyruleno==285); |
| 138119 | + /* (286) cmd ::= create_table create_table_args */ yytestcase(yyruleno==286); |
| 138120 | + /* (287) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==287); |
| 138121 | + /* (288) columnlist ::= columnname carglist */ yytestcase(yyruleno==288); |
| 138122 | + /* (289) nm ::= ID|INDEXED */ yytestcase(yyruleno==289); |
| 138123 | + /* (290) nm ::= STRING */ yytestcase(yyruleno==290); |
| 138124 | + /* (291) nm ::= JOIN_KW */ yytestcase(yyruleno==291); |
| 138125 | + /* (292) typetoken ::= typename */ yytestcase(yyruleno==292); |
| 138126 | + /* (293) typename ::= ID|STRING */ yytestcase(yyruleno==293); |
| 138127 | + /* (294) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=294); |
| 138128 | + /* (295) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=295); |
| 138129 | + /* (296) carglist ::= carglist ccons */ yytestcase(yyruleno==296); |
| 138130 | + /* (297) carglist ::= */ yytestcase(yyruleno==297); |
| 138131 | + /* (298) ccons ::= NULL onconf */ yytestcase(yyruleno==298); |
| 138132 | + /* (299) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==299); |
| 138133 | + /* (300) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==300); |
| 138134 | + /* (301) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=301); |
| 138135 | + /* (302) tconscomma ::= */ yytestcase(yyruleno==302); |
| 138136 | + /* (303) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=303); |
| 138137 | + /* (304) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=304); |
| 138138 | + /* (305) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=305); |
| 138139 | + /* (306) oneselect ::= values */ yytestcase(yyruleno==306); |
| 138140 | + /* (307) sclp ::= selcollist COMMA */ yytestcase(yyruleno==307); |
| 138141 | + /* (308) as ::= ID|STRING */ yytestcase(yyruleno==308); |
| 138142 | + /* (309) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=309); |
| 138143 | + /* (310) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==310); |
| 137807 | 138144 | /* (311) exprlist ::= nexprlist */ yytestcase(yyruleno==311); |
| 137808 | 138145 | /* (312) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=312); |
| 137809 | 138146 | /* (313) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=313); |
| 137810 | 138147 | /* (314) nmnum ::= ON */ yytestcase(yyruleno==314); |
| 137811 | 138148 | /* (315) nmnum ::= DELETE */ yytestcase(yyruleno==315); |
| | @@ -181079,11 +181416,13 @@ |
| 181079 | 181416 | typedef unsigned short u16; |
| 181080 | 181417 | typedef short i16; |
| 181081 | 181418 | typedef sqlite3_int64 i64; |
| 181082 | 181419 | typedef sqlite3_uint64 u64; |
| 181083 | 181420 | |
| 181084 | | -#define ArraySize(x) ((int)(sizeof(x) / sizeof(x[0]))) |
| 181421 | +#ifndef ArraySize |
| 181422 | +# define ArraySize(x) ((int)(sizeof(x) / sizeof(x[0]))) |
| 181423 | +#endif |
| 181085 | 181424 | |
| 181086 | 181425 | #define testcase(x) |
| 181087 | 181426 | #define ALWAYS(x) 1 |
| 181088 | 181427 | #define NEVER(x) 0 |
| 181089 | 181428 | |
| | @@ -186302,11 +186641,14 @@ |
| 186302 | 186641 | if( p1->bEof==0 ){ |
| 186303 | 186642 | if( (p1->iRowid==iLast) |
| 186304 | 186643 | || (bFromValid && fts5RowidCmp(pExpr, p1->iRowid, iFrom)<0) |
| 186305 | 186644 | ){ |
| 186306 | 186645 | int rc = fts5ExprNodeNext(pExpr, p1, bFromValid, iFrom); |
| 186307 | | - if( rc!=SQLITE_OK ) return rc; |
| 186646 | + if( rc!=SQLITE_OK ){ |
| 186647 | + pNode->bNomatch = 0; |
| 186648 | + return rc; |
| 186649 | + } |
| 186308 | 186650 | } |
| 186309 | 186651 | } |
| 186310 | 186652 | } |
| 186311 | 186653 | |
| 186312 | 186654 | fts5ExprNodeTest_OR(pExpr, pNode); |
| | @@ -186333,11 +186675,14 @@ |
| 186333 | 186675 | Fts5ExprNode *pChild = pAnd->apChild[iChild]; |
| 186334 | 186676 | int cmp = fts5RowidCmp(pExpr, iLast, pChild->iRowid); |
| 186335 | 186677 | if( cmp>0 ){ |
| 186336 | 186678 | /* Advance pChild until it points to iLast or laster */ |
| 186337 | 186679 | rc = fts5ExprNodeNext(pExpr, pChild, 1, iLast); |
| 186338 | | - if( rc!=SQLITE_OK ) return rc; |
| 186680 | + if( rc!=SQLITE_OK ){ |
| 186681 | + pAnd->bNomatch = 0; |
| 186682 | + return rc; |
| 186683 | + } |
| 186339 | 186684 | } |
| 186340 | 186685 | |
| 186341 | 186686 | /* If the child node is now at EOF, so is the parent AND node. Otherwise, |
| 186342 | 186687 | ** the child node is guaranteed to have advanced at least as far as |
| 186343 | 186688 | ** rowid iLast. So if it is not at exactly iLast, pChild->iRowid is the |
| | @@ -186372,10 +186717,12 @@ |
| 186372 | 186717 | i64 iFrom |
| 186373 | 186718 | ){ |
| 186374 | 186719 | int rc = fts5ExprNodeNext(pExpr, pNode->apChild[0], bFromValid, iFrom); |
| 186375 | 186720 | if( rc==SQLITE_OK ){ |
| 186376 | 186721 | rc = fts5ExprNodeTest_AND(pExpr, pNode); |
| 186722 | + }else{ |
| 186723 | + pNode->bNomatch = 0; |
| 186377 | 186724 | } |
| 186378 | 186725 | return rc; |
| 186379 | 186726 | } |
| 186380 | 186727 | |
| 186381 | 186728 | static int fts5ExprNodeTest_NOT( |
| | @@ -186414,10 +186761,13 @@ |
| 186414 | 186761 | ){ |
| 186415 | 186762 | int rc = fts5ExprNodeNext(pExpr, pNode->apChild[0], bFromValid, iFrom); |
| 186416 | 186763 | if( rc==SQLITE_OK ){ |
| 186417 | 186764 | rc = fts5ExprNodeTest_NOT(pExpr, pNode); |
| 186418 | 186765 | } |
| 186766 | + if( rc!=SQLITE_OK ){ |
| 186767 | + pNode->bNomatch = 0; |
| 186768 | + } |
| 186419 | 186769 | return rc; |
| 186420 | 186770 | } |
| 186421 | 186771 | |
| 186422 | 186772 | /* |
| 186423 | 186773 | ** If pNode currently points to a match, this function returns SQLITE_OK |
| | @@ -197534,11 +197884,11 @@ |
| 197534 | 197884 | int nArg, /* Number of args */ |
| 197535 | 197885 | sqlite3_value **apUnused /* Function arguments */ |
| 197536 | 197886 | ){ |
| 197537 | 197887 | assert( nArg==0 ); |
| 197538 | 197888 | UNUSED_PARAM2(nArg, apUnused); |
| 197539 | | - sqlite3_result_text(pCtx, "fts5: 2017-02-13 16:02:40 ada05cfa86ad7f5645450ac7a2a21c9aa6e57d2c", -1, SQLITE_TRANSIENT); |
| 197889 | + sqlite3_result_text(pCtx, "fts5: 2017-02-20 13:11:07 ff213f2ef5bf96754a2264685d25546d8b5ccf0a", -1, SQLITE_TRANSIENT); |
| 197540 | 197890 | } |
| 197541 | 197891 | |
| 197542 | 197892 | static int fts5Init(sqlite3 *db){ |
| 197543 | 197893 | static const sqlite3_module fts5Mod = { |
| 197544 | 197894 | /* iVersion */ 2, |
| 197545 | 197895 | |