0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a . In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d sing:.**.** M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 nd not evil..**
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 give others..**
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 de in this file
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66 implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64 s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 e of a prepared
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73 Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63 scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 e file in order
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73 n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76 , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66 ed files. The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20 ormatting.** of
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66 file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20 ore, important.
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65 See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66 nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64 If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72 o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63 om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69 dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65 g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70 ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67 rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73 the cell. This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20 macro verifies
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70 that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c isused. A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74 ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69 copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69 nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20 ng or blob, not
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 the content. If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74 e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20 ill in use, the
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67 ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69 r the copy. Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20 like that ever
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64 happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 is incremented
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72 every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53 ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20 eekXX, OP_Next,
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a es. The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20 procedures use
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61 tly. This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20 le is positive,
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 sInterrupted.**
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69 ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 his facility is
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 purposes only.
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 bal variable is
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 xecuted. The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 on to make sure
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 that.** sorting
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 is occurring or
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 es. This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 as been used by
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 a VDBE opcode.
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 res.** use this
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 tionality.** is
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 y. This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 .** help verify
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 rary..*/.#ifdef
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 SQLITE_TEST.int
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 . if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 obsize ){. sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d ze = p->n;. }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 .#endif../*.** T
0c60: 68 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 he next global v
0c70: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 ariable is incre
0c80: 6d 65 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65 mented each time
0c90: 20 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 the OP_Found op
0ca0: 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 code.** is execu
0cb0: 74 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 ted. This is use
0cc0: 64 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 d to test whethe
0cd0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 r or not the for
0ce0: 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 eign key.** oper
0cf0: 61 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 ation implemente
0d00: 64 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a d using OP_FkIsZ
0d10: 65 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 ero is working.
0d20: 54 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a This variable.**
0d30: 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e has no function
0d40: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 other than to h
0d50: 65 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 elp verify the c
0d60: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e orrect operation
0d70: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 of the.** libra
0d80: 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 ry..*/.#ifdef SQ
0d90: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 LITE_TEST.int sq
0da0: 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e lite3_found_coun
0db0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f t = 0;.#endif../
0dc0: 2a 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 *.** Test a regi
0dd0: 73 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 ster to see if i
0de0: 74 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 t exceeds the cu
0df0: 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c rrent maximum bl
0e00: 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 ob size..** If i
0e10: 74 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 t does, record t
0e20: 68 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 he new maximum b
0e30: 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 lob size..*/.#if
0e40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
0e50: 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 TEST) && !define
0e60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 d(SQLITE_OMIT_BU
0e70: 49 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 ILTIN_TEST).# de
0e80: 66 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f fine UPDATE_MAX_
0e90: 42 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 BLOBSIZE(P) upd
0ea0: 61 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 ateMaxBlobsize(P
0eb0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 ).#else.# define
0ec0: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 UPDATE_MAX_BLOB
0ed0: 53 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a SIZE(P).#endif..
0ee0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 /*.** Invoke the
0ef0: 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 VDBE coverage c
0f00: 61 6c 6c 62 61 63 6b 2c 20 69 66 20 74 68 61 74 allback, if that
0f10: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 callback is def
0f20: 69 6e 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 ined. This.** f
0f30: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 66 eature is used f
0f40: 6f 72 20 74 65 73 74 20 73 75 69 74 65 20 76 61 or test suite va
0f50: 6c 69 64 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e lidation only an
0f60: 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 d does not appea
0f70: 72 20 61 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 r an.** producti
0f80: 6f 6e 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a on builds..**.**
0f90: 20 4d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 M is an integer
0fa0: 2c 20 32 20 6f 72 20 33 2c 20 74 68 61 74 20 69 , 2 or 3, that i
0fb0: 6e 64 69 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 ndices how many
0fc0: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 different ways t
0fd0: 68 65 0a 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e he.** branch can
0fe0: 20 67 6f 2e 20 20 49 74 20 69 73 20 75 73 75 61 go. It is usua
0ff0: 6c 6c 79 20 32 2e 20 20 22 49 22 20 69 73 20 74 lly 2. "I" is t
1000: 68 65 20 64 69 72 65 63 74 69 6f 6e 20 74 68 65 he direction the
1010: 20 62 72 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e branch.** goes.
1020: 20 20 30 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 0 means falls
1030: 74 68 72 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e through. 1 mean
1040: 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 s branch is take
1050: 6e 2e 20 20 32 20 6d 65 61 6e 73 20 74 68 65 0a n. 2 means the.
1060: 2a 2a 20 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e ** second altern
1070: 61 74 69 76 65 20 62 72 61 6e 63 68 20 69 73 20 ative branch is
1080: 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 taken..**.** iSr
1090: 63 4c 69 6e 65 20 69 73 20 74 68 65 20 73 6f 75 cLine is the sou
10a0: 72 63 65 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 rce code line (f
10b0: 72 6f 6d 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f rom the __LINE__
10c0: 20 6d 61 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 macro) that.**
10d0: 67 65 6e 65 72 61 74 65 64 20 74 68 65 20 56 44 generated the VD
10e0: 42 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 BE instruction.
10f0: 20 54 68 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 This instrument
1100: 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 ation assumes th
1110: 61 74 20 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 at all.** source
1120: 20 63 6f 64 65 20 69 73 20 69 6e 20 61 20 73 69 code is in a si
1130: 6e 67 6c 65 20 66 69 6c 65 20 28 74 68 65 20 61 ngle file (the a
1140: 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 malgamation). S
1150: 70 65 63 69 61 6c 20 76 61 6c 75 65 73 20 31 0a pecial values 1.
1160: 2a 2a 20 61 6e 64 20 32 20 66 6f 72 20 74 68 65 ** and 2 for the
1170: 20 69 53 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 iSrcLine parame
1180: 74 65 72 20 6d 65 61 6e 20 74 68 61 74 20 74 68 ter mean that th
1190: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 62 72 is particular br
11a0: 61 6e 63 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 anch is.** alway
11b0: 73 20 74 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 s taken or never
11c0: 20 74 61 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 taken, respecti
11d0: 76 65 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 vely..*/.#if !de
11e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 56 44 42 fined(SQLITE_VDB
11f0: 45 5f 43 4f 56 45 52 41 47 45 29 0a 23 20 64 65 E_COVERAGE).# de
1200: 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68 54 fine VdbeBranchT
1210: 61 6b 65 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a aken(I,M).#else.
1220: 23 20 64 65 66 69 6e 65 20 56 64 62 65 42 72 61 # define VdbeBra
1230: 6e 63 68 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 nchTaken(I,M) vd
1240: 62 65 54 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 beTakeBranch(pOp
1250: 2d 3e 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a ->iSrcLine,I,M).
1260: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 static void vd
1270: 62 65 54 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 beTakeBranch(int
1280: 20 69 53 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c iSrcLine, u8 I,
1290: 20 75 38 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 u8 M){. if(
12a0: 69 53 72 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 iSrcLine<=2 && A
12b0: 4c 57 41 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 LWAYS(iSrcLine>0
12c0: 29 20 29 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 ) ){. M = i
12d0: 53 72 63 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f SrcLine;. /
12e0: 2a 20 41 73 73 65 72 74 20 74 68 65 20 74 72 75 * Assert the tru
12f0: 74 68 20 6f 66 20 56 64 62 65 43 6f 76 65 72 61 th of VdbeCovera
1300: 67 65 41 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 geAlwaysTaken()
1310: 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 and . ** Vd
1320: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 beCoverageNeverT
1330: 61 6b 65 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 aken() */.
1340: 61 73 73 65 72 74 28 20 28 4d 20 26 20 49 29 3d assert( (M & I)=
1350: 3d 49 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b =I );. }else{
1360: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
1370: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 e3GlobalConfig.x
1380: 56 64 62 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 VdbeBranch==0 )
1390: 72 65 74 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 return; /*NO_TE
13a0: 53 54 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 ST*/. sqlit
13b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 e3GlobalConfig.x
13c0: 56 64 62 65 42 72 61 6e 63 68 28 73 71 6c 69 74 VdbeBranch(sqlit
13d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 e3GlobalConfig.p
13e0: 56 64 62 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 VdbeBranchArg,.
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1410: 20 20 20 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c iSrcLine,I,
1420: 4d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 M);. }. }.#e
1430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 ndif../*.** Conv
1440: 65 72 74 20 74 68 65 20 67 69 76 65 6e 20 72 65 ert the given re
1450: 67 69 73 74 65 72 20 69 6e 74 6f 20 61 20 73 74 gister into a st
1460: 72 69 6e 67 20 69 66 20 69 74 20 69 73 6e 27 74 ring if it isn't
1470: 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e one.** already.
1480: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f Return non-zero
1490: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 if a malloc() f
14a0: 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 ails..*/.#define
14b0: 20 53 74 72 69 6e 67 69 66 79 28 50 2c 20 65 6e Stringify(P, en
14c0: 63 29 20 5c 0a 20 20 20 69 66 28 28 28 50 29 2d c) \. if(((P)-
14d0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c >flags&(MEM_Str|
14e0: 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 MEM_Blob))==0 &&
14f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
1500: 74 72 69 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 tringify(P,enc,0
1510: 29 29 20 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f )) \. { goto
1520: 20 6e 6f 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a no_mem; }../*.*
1530: 2a 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 * An ephemeral s
1540: 74 72 69 6e 67 20 76 61 6c 75 65 20 28 73 69 67 tring value (sig
1550: 6e 69 66 69 65 64 20 62 79 20 74 68 65 20 4d 45 nified by the ME
1560: 4d 5f 45 70 68 65 6d 20 66 6c 61 67 29 20 63 6f M_Ephem flag) co
1570: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e ntains.** a poin
1580: 74 65 72 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 ter to a dynamic
1590: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 ally allocated s
15a0: 74 72 69 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 tring where some
15b0: 20 6f 74 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a other entity.**
15c0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 is responsible
15d0: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 for deallocating
15e0: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 42 that string. B
15f0: 65 63 61 75 73 65 20 74 68 65 20 72 65 67 69 73 ecause the regis
1600: 74 65 72 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 ter.** does not
1610: 63 6f 6e 74 72 6f 6c 20 74 68 65 20 73 74 72 69 control the stri
1620: 6e 67 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 ng, it might be
1630: 64 65 6c 65 74 65 64 20 77 69 74 68 6f 75 74 20 deleted without
1640: 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 the register.**
1650: 6b 6e 6f 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a knowing it..**.*
1660: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 * This routine c
1670: 6f 6e 76 65 72 74 73 20 61 6e 20 65 70 68 65 6d onverts an ephem
1680: 65 72 61 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f eral string into
1690: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 a dynamically a
16a0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 llocated.** stri
16b0: 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 67 69 ng that the regi
16c0: 73 74 65 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 ster itself cont
16d0: 72 6f 6c 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 rols. In other
16e0: 77 6f 72 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e words, it.** con
16f0: 76 65 72 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 verts an MEM_Eph
1700: 65 6d 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 em string into a
1710: 20 73 74 72 69 6e 67 20 77 69 74 68 20 50 2e 7a string with P.z
1720: 3d 3d 50 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a ==P.zMalloc..*/.
1730: 23 64 65 66 69 6e 65 20 44 65 65 70 68 65 6d 65 #define Deepheme
1740: 72 61 6c 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 ralize(P) \. i
1750: 66 28 20 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d f( ((P)->flags&M
1760: 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 EM_Ephem)!=0 \.
1770: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 && sqlite3
1780: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 VdbeMemMakeWrite
1790: 61 62 6c 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 able(P) ){ goto
17a0: 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 no_mem;}../* Ret
17b0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 urn true if the
17c0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 cursor was opene
17d0: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f d using the OP_O
17e0: 70 65 6e 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 penSorter opcode
17f0: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 . */.#define isS
1800: 6f 72 74 65 72 28 78 29 20 28 28 78 29 2d 3e 70 orter(x) ((x)->p
1810: 53 6f 72 74 65 72 21 3d 30 29 0a 0a 2f 2a 0a 2a Sorter!=0)../*.*
1820: 2a 20 41 6c 6c 6f 63 61 74 65 20 56 64 62 65 43 * Allocate VdbeC
1830: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 43 75 ursor number iCu
1840: 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 r. Return a poi
1850: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52 65 74 nter to it. Ret
1860: 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77 urn NULL.** if w
1870: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d e run out of mem
1880: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 56 ory..*/.static V
1890: 64 62 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f 63 dbeCursor *alloc
18a0: 61 74 65 43 75 72 73 6f 72 28 0a 20 20 56 64 62 ateCursor(. Vdb
18b0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 e *p,
18c0: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 /* The virtua
18d0: 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 l machine */. i
18e0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 nt iCur,
18f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 /* Index of
1900: 20 74 68 65 20 6e 65 77 20 56 64 62 65 43 75 72 the new VdbeCur
1910: 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 sor */. int nFi
1920: 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f eld, /
1930: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c * Number of fiel
1940: 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 ds in the table
1950: 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e or index */. in
1960: 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 t iDb,
1970: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
1980: 74 68 65 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e the cursor belon
1990: 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f 0a gs to, or -1 */.
19a0: 20 20 69 6e 74 20 69 73 42 74 72 65 65 43 75 72 int isBtreeCur
19b0: 73 6f 72 20 20 20 20 20 2f 2a 20 54 72 75 65 20 sor /* True
19c0: 66 6f 72 20 42 2d 54 72 65 65 2e 20 20 46 61 6c for B-Tree. Fal
19d0: 73 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74 61 se for pseudo-ta
19e0: 62 6c 65 20 6f 72 20 76 74 61 62 20 2a 2f 0a 29 ble or vtab */.)
19f0: 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 {. /* Find the
1a00: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 memory cell that
1a10: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f will be used to
1a20: 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62 20 store the blob
1a30: 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 of memory. ** r
1a40: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 equired for this
1a50: 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72 75 VdbeCursor stru
1a60: 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f 6e cture. It is con
1a70: 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20 61 venient to use a
1a80: 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d 6f . ** vdbe memo
1a90: 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61 67 ry cell to manag
1aa0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c e the memory all
1ab0: 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 ocation required
1ac0: 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62 65 for a. ** Vdbe
1ad0: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 Cursor structure
1ae0: 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 for the followi
1af0: 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a 2a ng reasons:. **
1b00: 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74 69 . ** * Someti
1b10: 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 mes cursor numbe
1b20: 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 rs are used for
1b30: 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 a couple of diff
1b40: 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20 70 erent. ** p
1b50: 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64 62 urposes in a vdb
1b60: 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20 64 e program. The d
1b70: 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d 69 ifferent uses mi
1b80: 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a 2a ght require. **
1b90: 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20 73 different s
1ba0: 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 ized allocations
1bb0: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 70 . Memory cells p
1bc0: 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65 0a rovide growable.
1bd0: 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61 74 ** allocat
1be0: 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 ions.. **. **
1bf0: 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20 45 * When using E
1c00: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e NABLE_MEMORY_MAN
1c10: 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79 20 AGEMENT, memory
1c20: 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61 6e cell buffers can
1c30: 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72 65 . ** be fre
1c40: 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74 68 ed lazily via th
1c50: 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 e sqlite3_releas
1c60: 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e 20 e_memory() API.
1c70: 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d 69 This. ** mi
1c80: 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d 62 nimizes the numb
1c90: 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61 6c er of malloc cal
1ca0: 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 73 ls made by the s
1cb0: 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a ystem.. **. **
1cc0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f Memory cells fo
1cd0: 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 61 6c r cursors are al
1ce0: 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 74 located at the t
1cf0: 6f 70 20 6f 66 20 74 68 65 20 61 64 64 72 65 73 op of the addres
1d00: 73 0a 20 20 2a 2a 20 73 70 61 63 65 2e 20 4d 65 s. ** space. Me
1d10: 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d mory cell (p->nM
1d20: 65 6d 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 em) corresponds
1d30: 74 6f 20 63 75 72 73 6f 72 20 30 2e 20 53 70 61 to cursor 0. Spa
1d40: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 63 75 72 73 ce for. ** curs
1d50: 6f 72 20 31 20 69 73 20 6d 61 6e 61 67 65 64 20 or 1 is managed
1d60: 62 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 by memory cell (
1d70: 70 2d 3e 6e 4d 65 6d 2d 31 29 2c 20 65 74 63 2e p->nMem-1), etc.
1d80: 0a 20 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 . */. Mem *pMe
1d90: 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e m = &p->aMem[p->
1da0: 6e 4d 65 6d 2d 69 43 75 72 5d 3b 0a 0a 20 20 69 nMem-iCur];.. i
1db0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 nt nByte;. Vdbe
1dc0: 43 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b Cursor *pCx = 0;
1dd0: 0a 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 . nByte = .
1de0: 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 ROUND8(sizeof(
1df0: 56 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 VdbeCursor)) + 2
1e00: 2a 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 *sizeof(u32)*nFi
1e10: 65 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 69 73 eld + . (is
1e20: 42 74 72 65 65 43 75 72 73 6f 72 3f 73 71 6c 69 BtreeCursor?sqli
1e30: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 te3BtreeCursorSi
1e40: 7a 65 28 29 3a 30 29 3b 0a 0a 20 20 61 73 73 65 ze():0);.. asse
1e50: 72 74 28 20 69 43 75 72 3c 70 2d 3e 6e 43 75 72 rt( iCur<p->nCur
1e60: 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e sor );. if( p->
1e70: 61 70 43 73 72 5b 69 43 75 72 5d 20 29 7b 0a 20 apCsr[iCur] ){.
1e80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 sqlite3VdbeFr
1e90: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 eeCursor(p, p->a
1ea0: 70 43 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 pCsr[iCur]);.
1eb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 p->apCsr[iCur]
1ec0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 = 0;. }. if( S
1ed0: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 QLITE_OK==sqlite
1ee0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 3VdbeMemClearAnd
1ef0: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 Resize(pMem, nBy
1f00: 74 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 te) ){. p->ap
1f10: 43 73 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 Csr[iCur] = pCx
1f20: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 = (VdbeCursor*)p
1f30: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 Mem->z;. mems
1f40: 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65 6f et(pCx, 0, sizeo
1f50: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 3b 0a f(VdbeCursor));.
1f60: 20 20 20 20 70 43 78 2d 3e 69 44 62 20 3d 20 69 pCx->iDb = i
1f70: 44 62 3b 0a 20 20 20 20 70 43 78 2d 3e 6e 46 69 Db;. pCx->nFi
1f80: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 eld = nField;.
1f90: 20 20 70 43 78 2d 3e 61 4f 66 66 73 65 74 20 3d pCx->aOffset =
1fa0: 20 26 70 43 78 2d 3e 61 54 79 70 65 5b 6e 46 69 &pCx->aType[nFi
1fb0: 65 6c 64 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 eld];. if( is
1fc0: 42 74 72 65 65 43 75 72 73 6f 72 20 29 7b 0a 20 BtreeCursor ){.
1fd0: 20 20 20 20 20 70 43 78 2d 3e 70 43 75 72 73 6f pCx->pCurso
1fe0: 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29 0a r = (BtCursor*).
1ff0: 20 20 20 20 20 20 20 20 20 20 26 70 4d 65 6d 2d &pMem-
2000: 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 >z[ROUND8(sizeof
2010: 28 56 64 62 65 43 75 72 73 6f 72 29 29 2b 32 2a (VdbeCursor))+2*
2020: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65 sizeof(u32)*nFie
2030: 6c 64 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 ld];. sqlit
2040: 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 e3BtreeCursorZer
2050: 6f 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b o(pCx->pCursor);
2060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
2070: 75 72 6e 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a 2a urn pCx;.}../*.*
2080: 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 * Try to convert
2090: 20 61 20 76 61 6c 75 65 20 69 6e 74 6f 20 61 20 a value into a
20a0: 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e numeric represen
20b0: 74 61 74 69 6f 6e 20 69 66 20 77 65 20 63 61 6e tation if we can
20c0: 0a 2a 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f 75 .** do so withou
20d0: 74 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d t loss of inform
20e0: 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 ation. In other
20f0: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 73 words, if the s
2100: 74 72 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20 6c tring.** looks l
2110: 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 63 6f ike a number, co
2120: 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61 20 nvert it into a
2130: 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 20 64 number. If it d
2140: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b 20 oes not.** look
2150: 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 6c like a number, l
2160: 65 61 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a 2a eave it alone..*
2170: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 54 72 79 *.** If the bTry
2180: 46 6f 72 49 6e 74 20 66 6c 61 67 20 69 73 20 74 ForInt flag is t
2190: 72 75 65 2c 20 74 68 65 6e 20 65 78 74 72 61 20 rue, then extra
21a0: 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 effort is made t
21b0: 6f 20 67 69 76 65 0a 2a 2a 20 61 6e 20 69 6e 74 o give.** an int
21c0: 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 eger representat
21d0: 69 6f 6e 2e 20 20 53 74 72 69 6e 67 73 20 74 68 ion. Strings th
21e0: 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 66 6c 6f at look like flo
21f0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 ating point.** v
2200: 61 6c 75 65 73 20 62 75 74 20 77 68 69 63 68 20 alues but which
2210: 68 61 76 65 20 6e 6f 20 66 72 61 63 74 69 6f 6e have no fraction
2220: 61 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20 28 65 78 al component (ex
2230: 61 6d 70 6c 65 3a 20 27 34 38 2e 30 30 27 29 0a ample: '48.00').
2240: 2a 2a 20 77 69 6c 6c 20 68 61 76 65 20 61 20 4d ** will have a M
2250: 45 4d 5f 49 6e 74 20 72 65 70 72 65 73 65 6e 74 EM_Int represent
2260: 61 74 69 6f 6e 20 77 68 65 6e 20 62 54 72 79 46 ation when bTryF
2270: 6f 72 49 6e 74 20 69 73 20 74 72 75 65 2e 0a 2a orInt is true..*
2280: 2a 0a 2a 2a 20 49 66 20 62 54 72 79 46 6f 72 49 *.** If bTryForI
2290: 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 nt is false, the
22a0: 6e 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 73 n if the input s
22b0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 tring contains a
22c0: 20 64 65 63 69 6d 61 6c 0a 2a 2a 20 70 6f 69 6e decimal.** poin
22d0: 74 20 6f 72 20 65 78 70 6f 6e 65 6e 74 69 61 6c t or exponential
22e0: 20 6e 6f 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 notation, the r
22f0: 65 73 75 6c 74 20 69 73 20 6f 6e 6c 79 20 4d 45 esult is only ME
2300: 4d 5f 52 65 61 6c 2c 20 65 76 65 6e 0a 2a 2a 20 M_Real, even.**
2310: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 if there is an e
2320: 78 61 63 74 20 69 6e 74 65 67 65 72 20 72 65 70 xact integer rep
2330: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 resentation of t
2340: 68 65 20 71 75 61 6e 74 69 74 79 2e 0a 2a 2f 0a he quantity..*/.
2350: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c static void appl
2360: 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 yNumericAffinity
2370: 28 4d 65 6d 20 2a 70 52 65 63 2c 20 69 6e 74 20 (Mem *pRec, int
2380: 62 54 72 79 46 6f 72 49 6e 74 29 7b 0a 20 20 64 bTryForInt){. d
2390: 6f 75 62 6c 65 20 72 56 61 6c 75 65 3b 0a 20 20 ouble rValue;.
23a0: 69 36 34 20 69 56 61 6c 75 65 3b 0a 20 20 75 38 i64 iValue;. u8
23b0: 20 65 6e 63 20 3d 20 70 52 65 63 2d 3e 65 6e 63 enc = pRec->enc
23c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 ;. assert( (pRe
23d0: 63 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f c->flags & (MEM_
23e0: 53 74 72 7c 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f Str|MEM_Int|MEM_
23f0: 52 65 61 6c 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 Real))==MEM_Str
2400: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 );. if( sqlite3
2410: 41 74 6f 46 28 70 52 65 63 2d 3e 7a 2c 20 26 72 AtoF(pRec->z, &r
2420: 56 61 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 Value, pRec->n,
2430: 65 6e 63 29 3d 3d 30 20 29 20 72 65 74 75 72 6e enc)==0 ) return
2440: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 ;. if( 0==sqlit
2450: 65 33 41 74 6f 69 36 34 28 70 52 65 63 2d 3e 7a e3Atoi64(pRec->z
2460: 2c 20 26 69 56 61 6c 75 65 2c 20 70 52 65 63 2d , &iValue, pRec-
2470: 3e 6e 2c 20 65 6e 63 29 20 29 7b 0a 20 20 20 20 >n, enc) ){.
2480: 70 52 65 63 2d 3e 75 2e 69 20 3d 20 69 56 61 6c pRec->u.i = iVal
2490: 75 65 3b 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c ue;. pRec->fl
24a0: 61 67 73 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a ags |= MEM_Int;.
24b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 }else{. pRe
24c0: 63 2d 3e 75 2e 72 20 3d 20 72 56 61 6c 75 65 3b c->u.r = rValue;
24d0: 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 . pRec->flags
24e0: 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 |= MEM_Real;.
24f0: 20 20 69 66 28 20 62 54 72 79 46 6f 72 49 6e 74 if( bTryForInt
2500: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e ) sqlite3VdbeIn
2510: 74 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 tegerAffinity(pR
2520: 65 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a ec);. }.}../*.*
2530: 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 69 73 20 * Processing is
2540: 64 65 74 65 72 6d 69 6e 65 20 62 79 20 74 68 65 determine by the
2550: 20 61 66 66 69 6e 69 74 79 20 70 61 72 61 6d 65 affinity parame
2560: 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 ter:.**.** SQLIT
2570: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a E_AFF_INTEGER:.*
2580: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 * SQLITE_AFF_REA
2590: 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 L:.** SQLITE_AFF
25a0: 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 _NUMERIC:.**
25b0: 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 Try to convert p
25c0: 52 65 63 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 Rec to an intege
25d0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e r representation
25e0: 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f or a .** flo
25f0: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 ating-point repr
2600: 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e esentation if an
2610: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 integer represe
2620: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 ntation.** is
2630: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 not possible.
2640: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 69 6e Note that the in
2650: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 teger representa
2660: 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c tion is.** al
2670: 77 61 79 73 20 70 72 65 66 65 72 72 65 64 2c 20 ways preferred,
2680: 65 76 65 6e 20 69 66 20 74 68 65 20 61 66 66 69 even if the affi
2690: 6e 69 74 79 20 69 73 20 52 45 41 4c 2c 20 62 65 nity is REAL, be
26a0: 63 61 75 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 cause.** an i
26b0: 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 nteger represent
26c0: 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 ation is more sp
26d0: 61 63 65 20 65 66 66 69 63 69 65 6e 74 20 6f 6e ace efficient on
26e0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c disk..**.** SQL
26f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a ITE_AFF_TEXT:.**
2700: 20 20 20 20 43 6f 6e 76 65 72 74 20 70 52 65 63 Convert pRec
2710: 20 74 6f 20 61 20 74 65 78 74 20 72 65 70 72 65 to a text repre
2720: 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a sentation..**.**
2730: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 SQLITE_AFF_BLOB
2740: 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 :.** No-op.
2750: 70 52 65 63 20 69 73 20 75 6e 63 68 61 6e 67 65 pRec is unchange
2760: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 d..*/.static voi
2770: 64 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 d applyAffinity(
2780: 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 . Mem *pRec,
2790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 /* The va
27a0: 6c 75 65 20 74 6f 20 61 70 70 6c 79 20 61 66 66 lue to apply aff
27b0: 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 inity to */. ch
27c0: 61 72 20 61 66 66 69 6e 69 74 79 2c 20 20 20 20 ar affinity,
27d0: 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74 /* The affinit
27e0: 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64 20 y to be applied
27f0: 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20 20 20 20 */. u8 enc
2800: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 /* Use
2810: 74 68 69 73 20 74 65 78 74 20 65 6e 63 6f 64 69 this text encodi
2820: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 ng */.){. if( a
2830: 66 66 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f ffinity>=SQLITE_
2840: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 AFF_NUMERIC ){.
2850: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 69 6e assert( affin
2860: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f ity==SQLITE_AFF_
2870: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 69 6e INTEGER || affin
2880: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f ity==SQLITE_AFF_
2890: 52 45 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 REAL.
28a0: 20 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 || affinity==S
28b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 QLITE_AFF_NUMERI
28c0: 43 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 52 C );. if( (pR
28d0: 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f ec->flags & MEM_
28e0: 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 Int)==0 ){.
28f0: 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 if( (pRec->flag
2900: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 s & MEM_Real)==0
2910: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
2920: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pRec->flags & ME
2930: 4d 5f 53 74 72 20 29 20 61 70 70 6c 79 4e 75 6d M_Str ) applyNum
2940: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 52 65 ericAffinity(pRe
2950: 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 c,1);. }els
2960: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 e{. sqlit
2970: 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 e3VdbeIntegerAff
2980: 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20 20 inity(pRec);.
2990: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c }. }. }el
29a0: 73 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 3d se if( affinity=
29b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 =SQLITE_AFF_TEXT
29c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 ){. /* Only
29d0: 61 74 74 65 6d 70 74 20 74 68 65 20 63 6f 6e 76 attempt the conv
29e0: 65 72 73 69 6f 6e 20 74 6f 20 54 45 58 54 20 69 ersion to TEXT i
29f0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e f there is an in
2a00: 74 65 67 65 72 20 6f 72 20 72 65 61 6c 0a 20 20 teger or real.
2a10: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 ** representat
2a20: 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64 20 4e 55 ion (blob and NU
2a30: 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74 20 63 6f LL do not get co
2a40: 6e 76 65 72 74 65 64 29 20 62 75 74 20 6e 6f 20 nverted) but no
2a50: 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 string. ** re
2a60: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 presentation..
2a70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d */. if( 0==
2a80: 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d (pRec->flags&MEM
2a90: 5f 53 74 72 29 20 26 26 20 28 70 52 65 63 2d 3e _Str) && (pRec->
2aa0: 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61 6c 7c flags&(MEM_Real|
2ab0: 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20 20 20 MEM_Int)) ){.
2ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
2ad0: 6d 53 74 72 69 6e 67 69 66 79 28 70 52 65 63 2c mStringify(pRec,
2ae0: 20 65 6e 63 2c 20 31 29 3b 0a 20 20 20 20 7d 0a enc, 1);. }.
2af0: 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 pRec->flags
2b00: 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 &= ~(MEM_Real|ME
2b10: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f M_Int);. }.}../
2b20: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 *.** Try to conv
2b30: 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 ert the type of
2b40: 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d a function argum
2b50: 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74 20 ent or a result
2b60: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 column.** into a
2b70: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65 numeric represe
2b80: 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65 69 ntation. Use ei
2b90: 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72 20 ther INTEGER or
2ba0: 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a 2a REAL whichever.*
2bb0: 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 * is appropriate
2bc0: 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74 . But only do t
2bd0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 he conversion if
2be0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 it is possible
2bf0: 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 without.** loss
2c00: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 of information a
2c10: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 nd return the re
2c20: 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74 68 vised type of th
2c30: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 e argument..*/.i
2c40: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 nt sqlite3_value
2c50: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71 _numeric_type(sq
2c60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 lite3_value *pVa
2c70: 6c 29 7b 0a 20 20 69 6e 74 20 65 54 79 70 65 20 l){. int eType
2c80: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f = sqlite3_value_
2c90: 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 69 66 type(pVal);. if
2ca0: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f ( eType==SQLITE_
2cb0: 54 45 58 54 20 29 7b 0a 20 20 20 20 4d 65 6d 20 TEXT ){. Mem
2cc0: 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 *pMem = (Mem*)pV
2cd0: 61 6c 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d al;. applyNum
2ce0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65 ericAffinity(pMe
2cf0: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 54 79 70 65 m, 0);. eType
2d00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 = sqlite3_value
2d10: 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 7d _type(pVal);. }
2d20: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b . return eType;
2d30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 .}../*.** Export
2d40: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 ed version of ap
2d50: 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54 plyAffinity(). T
2d60: 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e his one works on
2d70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c sqlite3_value*,
2d80: 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 .** not the int
2d90: 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e ernal Mem* type.
2da0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
2db0: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 ValueApplyAffini
2dc0: 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 ty(. sqlite3_va
2dd0: 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 lue *pVal, . u8
2de0: 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 affinity, . u8
2df0: 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 enc.){. applyA
2e00: 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 ffinity((Mem *)p
2e10: 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 Val, affinity, e
2e20: 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d nc);.}../*.** pM
2e30: 65 6d 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c em currently onl
2e40: 79 20 68 6f 6c 64 73 20 61 20 73 74 72 69 6e 67 y holds a string
2e50: 20 74 79 70 65 20 28 6f 72 20 6d 61 79 62 65 20 type (or maybe
2e60: 61 20 42 4c 4f 42 20 74 68 61 74 20 77 65 20 63 a BLOB that we c
2e70: 61 6e 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 20 an.** interpret
2e80: 61 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 77 as a string if w
2e90: 65 20 77 61 6e 74 20 74 6f 29 2e 20 20 43 6f 6d e want to). Com
2ea0: 70 75 74 65 20 69 74 73 20 63 6f 72 72 65 73 70 pute its corresp
2eb0: 6f 6e 64 69 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 onding.** numeri
2ec0: 63 20 74 79 70 65 2c 20 69 66 20 68 61 73 20 6f c type, if has o
2ed0: 6e 65 2e 20 20 53 65 74 20 74 68 65 20 70 4d 65 ne. Set the pMe
2ee0: 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d m->u.r and pMem-
2ef0: 3e 75 2e 69 20 66 69 65 6c 64 73 0a 2a 2a 20 61 >u.i fields.** a
2f00: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 ccordingly..*/.s
2f10: 74 61 74 69 63 20 75 31 36 20 53 51 4c 49 54 45 tatic u16 SQLITE
2f20: 5f 4e 4f 49 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 _NOINLINE comput
2f30: 65 4e 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d eNumericType(Mem
2f40: 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 *pMem){. asser
2f50: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 t( (pMem->flags
2f60: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 & (MEM_Int|MEM_R
2f70: 65 61 6c 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 eal))==0 );. as
2f80: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 sert( (pMem->fla
2f90: 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 gs & (MEM_Str|ME
2fa0: 4d 5f 42 6c 6f 62 29 29 21 3d 30 20 29 3b 0a 20 M_Blob))!=0 );.
2fb0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46 if( sqlite3AtoF
2fc0: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d (pMem->z, &pMem-
2fd0: 3e 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 >u.r, pMem->n, p
2fe0: 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a Mem->enc)==0 ){.
2ff0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
3000: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 }. if( sqlite3A
3010: 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 toi64(pMem->z, &
3020: 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d pMem->u.i, pMem-
3030: 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d >n, pMem->enc)==
3040: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
3050: 20 72 65 74 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b return MEM_Int;
3060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4d 45 . }. return ME
3070: 4d 5f 52 65 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a M_Real;.}../*.**
3080: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 Return the nume
3090: 72 69 63 20 74 79 70 65 20 66 6f 72 20 70 4d 65 ric type for pMe
30a0: 6d 2c 20 65 69 74 68 65 72 20 4d 45 4d 5f 49 6e m, either MEM_In
30b0: 74 20 6f 72 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 t or MEM_Real or
30c0: 20 62 6f 74 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 both or.** none
30d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 . .**.** Unlike
30e0: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 applyNumericAff
30f0: 69 6e 69 74 79 28 29 2c 20 74 68 69 73 20 72 6f inity(), this ro
3100: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d utine does not m
3110: 6f 64 69 66 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 odify pMem->flag
3120: 73 2e 0a 2a 2a 20 42 75 74 20 69 74 20 64 6f 65 s..** But it doe
3130: 73 20 73 65 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 s set pMem->u.r
3140: 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 and pMem->u.i ap
3150: 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a propriately..*/.
3160: 73 74 61 74 69 63 20 75 31 36 20 6e 75 6d 65 72 static u16 numer
3170: 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d icType(Mem *pMem
3180: 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 ){. if( pMem->f
3190: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c lags & (MEM_Int|
31a0: 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 MEM_Real) ){.
31b0: 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c return pMem->fl
31c0: 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d ags & (MEM_Int|M
31d0: 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 EM_Real);. }.
31e0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 if( pMem->flags
31f0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 & (MEM_Str|MEM_B
3200: 6c 6f 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 lob) ){. retu
3210: 72 6e 20 63 6f 6d 70 75 74 65 4e 75 6d 65 72 69 rn computeNumeri
3220: 63 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20 20 7d cType(pMem);. }
3230: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a . return 0;.}..
3240: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
3250: 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 BUG./*.** Write
3260: 61 20 6e 69 63 65 20 73 74 72 69 6e 67 20 72 65 a nice string re
3270: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 presentation of
3280: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 the contents of
3290: 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 cell pMem.** int
32a0: 6f 20 62 75 66 66 65 72 20 7a 42 75 66 2c 20 6c o buffer zBuf, l
32b0: 65 6e 67 74 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 ength nBuf..*/.v
32c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d oid sqlite3VdbeM
32d0: 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 4d 65 emPrettyPrint(Me
32e0: 6d 20 2a 70 4d 65 6d 2c 20 63 68 61 72 20 2a 7a m *pMem, char *z
32f0: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 Buf){. char *zC
3300: 73 72 20 3d 20 7a 42 75 66 3b 0a 20 20 69 6e 74 sr = zBuf;. int
3310: 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 f = pMem->flags
3320: 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 ;.. static cons
3330: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 65 6e t char *const en
3340: 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 22 28 58 29 cnames[] = {"(X)
3350: 22 2c 20 22 28 38 29 22 2c 20 22 28 31 36 4c 45 ", "(8)", "(16LE
3360: 29 22 2c 20 22 28 31 36 42 45 29 22 7d 3b 0a 0a )", "(16BE)"};..
3370: 20 20 69 66 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 if( f&MEM_Blob
3380: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
3390: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 69 char c;. i
33a0: 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29 f( f & MEM_Dyn )
33b0: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 7a 27 3b {. c = 'z';
33c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 . assert( (
33d0: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c f & (MEM_Static|
33e0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 MEM_Ephem))==0 )
33f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
3400: 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 f & MEM_Static )
3410: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 74 27 3b {. c = 't';
3420: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 . assert( (
3430: 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d f & (MEM_Dyn|MEM
3440: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 _Ephem))==0 );.
3450: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 }else if( f &
3460: 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 MEM_Ephem ){.
3470: 20 20 20 20 63 20 3d 20 27 65 27 3b 0a 20 20 20 c = 'e';.
3480: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20 assert( (f &
3490: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f (MEM_Static|MEM_
34a0: 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 Dyn))==0 );.
34b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 20 3d }else{. c =
34c0: 20 27 73 27 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 's';. }..
34d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
34e0: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 63 f(100, zCsr, "%c
34f0: 22 2c 20 63 29 3b 0a 20 20 20 20 7a 43 73 72 20 ", c);. zCsr
3500: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e += sqlite3Strlen
3510: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 73 71 30(zCsr);. sq
3520: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 lite3_snprintf(1
3530: 30 30 2c 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c 00, zCsr, "%d[",
3540: 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a pMem->n);. z
3550: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 Csr += sqlite3St
3560: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 rlen30(zCsr);.
3570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 for(i=0; i<16
3580: 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b && i<pMem->n; i+
3590: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 +){. sqlite
35a0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 3_snprintf(100,
35b0: 7a 43 73 72 2c 20 22 25 30 32 58 22 2c 20 28 28 zCsr, "%02X", ((
35c0: 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 int)pMem->z[i] &
35d0: 20 30 78 46 46 29 29 3b 0a 20 20 20 20 20 20 7a 0xFF));. z
35e0: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 Csr += sqlite3St
35f0: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 rlen30(zCsr);.
3600: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b }. for(i=0;
3610: 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d i<16 && i<pMem-
3620: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 >n; i++){.
3630: 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a char z = pMem->z
3640: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a [i];. if( z
3650: 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a <32 || z>126 ) *
3660: 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 zCsr++ = '.';.
3670: 20 20 20 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b else *zCsr++
3680: 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = z;. }..
3690: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
36a0: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 5d 25 f(100, zCsr, "]%
36b0: 73 22 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 s", encnames[pMe
36c0: 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 7a 43 m->enc]);. zC
36d0: 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 sr += sqlite3Str
36e0: 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 len30(zCsr);.
36f0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65 72 if( f & MEM_Zer
3700: 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 o ){. sqlit
3710: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c e3_snprintf(100,
3720: 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 zCsr,"+%dz",pMe
3730: 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 m->u.nZero);.
3740: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 zCsr += sqlit
3750: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 e3Strlen30(zCsr)
3760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 ;. }. *zCs
3770: 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 r = '\0';. }els
3780: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 e if( f & MEM_St
3790: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 r ){. int j,
37a0: 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d k;. zBuf[0] =
37b0: 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66 20 ' ';. if( f
37c0: 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 & MEM_Dyn ){.
37d0: 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27 zBuf[1] = 'z'
37e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
37f0: 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 (f & (MEM_Static
3800: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 |MEM_Ephem))==0
3810: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
3820: 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 20 f & MEM_Static
3830: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d ){. zBuf[1]
3840: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73 = 't';. as
3850: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f sert( (f & (MEM_
3860: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d Dyn|MEM_Ephem))=
3870: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 =0 );. }else
3880: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 if( f & MEM_Ephe
3890: 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b m ){. zBuf[
38a0: 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 1] = 'e';.
38b0: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 assert( (f & (ME
38c0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e M_Static|MEM_Dyn
38d0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c ))==0 );. }el
38e0: 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 se{. zBuf[1
38f0: 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 20 ] = 's';. }.
3900: 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73 71 k = 2;. sq
3910: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 lite3_snprintf(1
3920: 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 00, &zBuf[k], "%
3930: 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 d", pMem->n);.
3940: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 k += sqlite3St
3950: 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 rlen30(&zBuf[k])
3960: 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 ;. zBuf[k++]
3970: 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28 6a = '[';. for(j
3980: 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70 4d =0; j<15 && j<pM
3990: 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 em->n; j++){.
39a0: 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d 3e u8 c = pMem->
39b0: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 z[j];. if(
39c0: 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78 37 c>=0x20 && c<0x7
39d0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 f ){. zBu
39e0: 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 f[k++] = c;.
39f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
3a00: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 zBuf[k++] = '.'
3a10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
3a20: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 zBuf[k++] =
3a30: 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 ']';. sqlite3
3a40: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26 7a _snprintf(100,&z
3a50: 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 Buf[k], encnames
3a60: 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 [pMem->enc]);.
3a70: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 k += sqlite3St
3a80: 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 rlen30(&zBuf[k])
3a90: 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 ;. zBuf[k++]
3aa0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 = 0;. }.}.#endi
3ab0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
3ac0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 _DEBUG./*.** Pri
3ad0: 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 nt the value of
3ae0: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 a register for t
3af0: 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73 3a racing purposes:
3b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
3b10: 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 4d 65 memTracePrint(Me
3b20: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e m *p){. if( p->
3b30: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 55 6e 64 65 flags & MEM_Unde
3b40: 66 69 6e 65 64 20 29 7b 0a 20 20 20 20 70 72 69 fined ){. pri
3b50: 6e 74 66 28 22 20 75 6e 64 65 66 69 6e 65 64 22 ntf(" undefined"
3b60: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 );. }else if( p
3b70: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 ->flags & MEM_Nu
3b80: 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 ll ){. printf
3b90: 28 22 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c (" NULL");. }el
3ba0: 73 65 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 se if( (p->flags
3bb0: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f & (MEM_Int|MEM_
3bc0: 53 74 72 29 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c Str))==(MEM_Int|
3bd0: 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20 20 20 MEM_Str) ){.
3be0: 70 72 69 6e 74 66 28 22 20 73 69 3a 25 6c 6c 64 printf(" si:%lld
3bf0: 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 ", p->u.i);. }e
3c00: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 lse if( p->flags
3c10: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 & MEM_Int ){.
3c20: 20 20 70 72 69 6e 74 66 28 22 20 69 3a 25 6c 6c printf(" i:%ll
3c30: 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 d", p->u.i);.#if
3c40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
3c50: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a _FLOATING_POINT.
3c60: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 }else if( p->f
3c70: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 lags & MEM_Real
3c80: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 ){. printf("
3c90: 72 3a 25 67 22 2c 20 70 2d 3e 75 2e 72 29 3b 0a r:%g", p->u.r);.
3ca0: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 #endif. }else i
3cb0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 f( p->flags & ME
3cc0: 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 M_RowSet ){.
3cd0: 70 72 69 6e 74 66 28 22 20 28 72 6f 77 73 65 74 printf(" (rowset
3ce0: 29 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 )");. }else{.
3cf0: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d char zBuf[200]
3d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 ;. sqlite3Vdb
3d10: 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 eMemPrettyPrint(
3d20: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 70 72 p, zBuf);. pr
3d30: 69 6e 74 66 28 22 20 25 73 22 2c 20 7a 42 75 66 intf(" %s", zBuf
3d40: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 );. }.}.static
3d50: 76 6f 69 64 20 72 65 67 69 73 74 65 72 54 72 61 void registerTra
3d60: 63 65 28 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d ce(int iReg, Mem
3d70: 20 2a 70 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 *p){. printf("
3d80: 52 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 REG[%d] = ", iRe
3d90: 67 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 g);. memTracePr
3da0: 69 6e 74 28 70 29 3b 0a 20 20 70 72 69 6e 74 66 int(p);. printf
3db0: 28 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 ("\n");.}.#endif
3dc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
3dd0: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20 DEBUG.# define
3de0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52 REGISTER_TRACE(R
3df0: 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c 61 67 73 ,M) if(db->flags
3e00: 26 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 &SQLITE_VdbeTrac
3e10: 65 29 72 65 67 69 73 74 65 72 54 72 61 63 65 28 e)registerTrace(
3e20: 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 R,M).#else.# de
3e30: 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 fine REGISTER_TR
3e40: 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a ACE(R,M).#endif.
3e50: 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 ..#ifdef VDBE_PR
3e60: 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 OFILE../* .** hw
3e70: 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20 time.h contains
3e80: 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 72 inline assembler
3e90: 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d code for implem
3ea0: 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d enting .** high-
3eb0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69 performance timi
3ec0: 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a ng routines..*/.
3ed0: 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d 65 #include "hwtime
3ee0: 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 .h"..#endif..#if
3ef0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a ndef NDEBUG./*.*
3f00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
3f10: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 is only called f
3f20: 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 61 73 rom within an as
3f30: 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f sert() expressio
3f40: 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b 73 20 n. It.** checks
3f50: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 that the sqlite3
3f60: 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 76 61 .nTransaction va
3f70: 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72 65 63 riable is correc
3f80: 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 tly set to.** th
3f90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d e number of non-
3fa0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 transaction save
3fb0: 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 points currently
3fc0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b in the .** link
3fd0: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 ed list starting
3fe0: 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53 61 76 at sqlite3.pSav
3ff0: 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 epoint..** .** U
4000: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 sage:.**.**
4010: 61 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76 assert( checkSav
4020: 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 epointCount(db)
4030: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 );.*/.static int
4040: 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 checkSavepointC
4050: 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 ount(sqlite3 *db
4060: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a ){. int n = 0;.
4070: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a Savepoint *p;.
4080: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53 61 76 for(p=db->pSav
4090: 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e epoint; p; p=p->
40a0: 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 pNext) n++;. as
40b0: 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 sert( n==(db->nS
40c0: 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 avepoint + db->i
40d0: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 sTransactionSave
40e0: 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65 74 75 point) );. retu
40f0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a rn 1;.}.#endif..
4100: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
4110: 20 72 65 67 69 73 74 65 72 20 6f 66 20 70 4f 70 register of pOp
4120: 2d 3e 70 32 20 61 66 74 65 72 20 66 69 72 73 74 ->p2 after first
4130: 20 70 72 65 70 61 72 69 6e 67 20 69 74 20 74 6f preparing it to
4140: 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 be.** overwritt
4150: 65 6e 20 77 69 74 68 20 61 6e 20 69 6e 74 65 67 en with an integ
4160: 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 er value..*/.sta
4170: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c tic SQLITE_NOINL
4180: 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32 50 72 65 INE Mem *out2Pre
4190: 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72 releaseWithClear
41a0: 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a 20 20 73 (Mem *pOut){. s
41b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 qlite3VdbeMemSet
41c0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 70 4f Null(pOut);. pO
41d0: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f ut->flags = MEM_
41e0: 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f Int;. return pO
41f0: 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20 4d 65 6d ut;.}.static Mem
4200: 20 2a 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 *out2Prerelease
4210: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 4f 70 (Vdbe *p, VdbeOp
4220: 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d 20 2a 70 *pOp){. Mem *p
4230: 4f 75 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 Out;. assert( p
4240: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73 Op->p2>0 );. as
4250: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 sert( pOp->p2<=(
4260: 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 p->nMem-p->nCurs
4270: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 or) );. pOut =
4280: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 &p->aMem[pOp->p2
4290: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 ];. memAboutToC
42a0: 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a hange(p, pOut);.
42b0: 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e if( VdbeMemDyn
42c0: 61 6d 69 63 28 70 4f 75 74 29 20 29 7b 0a 20 20 amic(pOut) ){.
42d0: 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72 65 return out2Pre
42e0: 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72 releaseWithClear
42f0: 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b (pOut);. }else{
4300: 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 . pOut->flags
4310: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
4320: 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20 7d return pOut;. }
4330: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 .}.../*.** Execu
4340: 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61 20 te as much of a
4350: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73 20 VDBE program as
4360: 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73 20 we can..** This
4370: 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20 73 is the core of s
4380: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 qlite3_step().
4390: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
43a0: 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65 20 dbeExec(. Vdbe
43b0: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *p
43c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 /* The VDB
43d0: 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61 4f E */.){. Op *aO
43e0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20 p = p->aOp;
43f0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 /* Copy of
4400: 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a p->aOp */. Op *
4410: 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20 20 pOp = aOp;
4420: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e /* Curren
4430: 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 t operation */.#
4440: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
4450: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 E_DEBUG) || defi
4460: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 ned(VDBE_PROFILE
4470: 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70 3b ). Op *pOrigOp;
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
4490: 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20 61 * Value of pOp a
44a0: 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 t the top of the
44b0: 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a loop */.#endif.
44c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
44d0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20 E_OK; /*
44e0: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 Value to return
44f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 */. sqlite3 *db
4500: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 = p->db;
4510: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 /* The database
4520: 2a 2f 0a 20 20 75 38 20 72 65 73 65 74 53 63 68 */. u8 resetSch
4530: 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30 3b 20 emaOnFault = 0;
4540: 2f 2a 20 52 65 73 65 74 20 73 63 68 65 6d 61 20 /* Reset schema
4550: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 after an error i
4560: 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 f positive */.
4570: 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20 45 4e u8 encoding = EN
4580: 43 28 64 62 29 3b 20 20 20 20 20 2f 2a 20 54 68 C(db); /* Th
4590: 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 e database encod
45a0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f ing */. int iCo
45b0: 6d 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20 mpare = 0;
45c0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 /* Result of
45d0: 20 6c 61 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65 last OP_Compare
45e0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 operation */.
45f0: 75 6e 73 69 67 6e 65 64 20 6e 56 6d 53 74 65 70 unsigned nVmStep
4600: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 = 0; /* Nu
4610: 6d 62 65 72 20 6f 66 20 76 69 72 74 75 61 6c 20 mber of virtual
4620: 6d 61 63 68 69 6e 65 20 73 74 65 70 73 20 2a 2f machine steps */
4630: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
4640: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 OMIT_PROGRESS_CA
4650: 4c 4c 42 41 43 4b 0a 20 20 75 6e 73 69 67 6e 65 LLBACK. unsigne
4660: 64 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 d nProgressLimit
4670: 20 3d 20 30 3b 2f 2a 20 49 6e 76 6f 6b 65 20 78 = 0;/* Invoke x
4680: 50 72 6f 67 72 65 73 73 28 29 20 77 68 65 6e 20 Progress() when
4690: 6e 56 6d 53 74 65 70 20 72 65 61 63 68 65 73 20 nVmStep reaches
46a0: 74 68 69 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 this */.#endif.
46b0: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e Mem *aMem = p->
46c0: 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 43 aMem; /* C
46d0: 6f 70 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a opy of p->aMem *
46e0: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 /. Mem *pIn1 =
46f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0; /
4700: 2a 20 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72 * 1st input oper
4710: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 and */. Mem *pI
4720: 6e 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 n2 = 0;
4730: 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74 /* 2nd input
4740: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 operand */. Me
4750: 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20 m *pIn3 = 0;
4760: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20 /* 3rd
4770: 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f input operand */
4780: 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30 . Mem *pOut = 0
4790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
47a0: 20 4f 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20 Output operand
47b0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 */. int *aPermu
47c0: 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 te = 0;
47d0: 2f 2a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 6f /* Permutation o
47e0: 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 4f 50 f columns for OP
47f0: 5f 43 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 36 _Compare */. i6
4800: 34 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62 4 lastRowid = db
4810: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 20 20 2f 2a ->lastRowid; /*
4820: 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 Saved value of
4830: 74 68 65 20 6c 61 73 74 20 69 6e 73 65 72 74 20 the last insert
4840: 52 4f 57 49 44 20 2a 2f 0a 23 69 66 64 65 66 20 ROWID */.#ifdef
4850: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 75 VDBE_PROFILE. u
4860: 36 34 20 73 74 61 72 74 3b 20 20 20 20 20 20 20 64 start;
4870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 50 55 /* CPU
4880: 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61 74 20 clock count at
4890: 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65 20 start of opcode
48a0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a 2a */.#endif. /***
48b0: 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20 55 4e INSERT STACK UN
48c0: 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a 20 ION HERE ***/..
48d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 assert( p->magi
48e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 c==VDBE_MAGIC_RU
48f0: 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 N ); /* sqlite3
4900: 5f 73 74 65 70 28 29 20 76 65 72 69 66 69 65 73 _step() verifies
4910: 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74 this */. sqlit
4920: 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a e3VdbeEnter(p);.
4930: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c if( p->rc==SQL
4940: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 ITE_NOMEM ){.
4950: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 /* This happens
4960: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 if a malloc() i
4970: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 nside a call to
4980: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
4990: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 ext() or. **
49a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
49b0: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 ext16() failed.
49c0: 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f */. goto no_
49d0: 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 mem;. }. asser
49e0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 t( p->rc==SQLITE
49f0: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 _OK || (p->rc&0x
4a00: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 ff)==SQLITE_BUSY
4a10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
4a20: 3e 62 49 73 52 65 61 64 65 72 20 7c 7c 20 70 2d >bIsReader || p-
4a30: 3e 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a >readOnly!=0 );.
4a40: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 p->rc = SQLITE
4a50: 5f 4f 4b 3b 0a 20 20 70 2d 3e 69 43 75 72 72 65 _OK;. p->iCurre
4a60: 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 61 73 ntTime = 0;. as
4a70: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e sert( p->explain
4a80: 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73 ==0 );. p->pRes
4a90: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64 62 ultSet = 0;. db
4aa0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 ->busyHandler.nB
4ab0: 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 usy = 0;. if( d
4ac0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 b->u1.isInterrup
4ad0: 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 ted ) goto abort
4ae0: 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 _due_to_interrup
4af0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 t;. sqlite3Vdbe
4b00: 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23 IOTraceSql(p);.#
4b10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
4b20: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c IT_PROGRESS_CALL
4b30: 42 41 43 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78 BACK. if( db->x
4b40: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 Progress ){.
4b50: 75 33 32 20 69 50 72 69 6f 72 20 3d 20 70 2d 3e u32 iPrior = p->
4b60: 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f aCounter[SQLITE_
4b70: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 STMTSTATUS_VM_ST
4b80: 45 50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 EP];. assert(
4b90: 20 30 20 3c 20 64 62 2d 3e 6e 50 72 6f 67 72 65 0 < db->nProgre
4ba0: 73 73 4f 70 73 20 29 3b 0a 20 20 20 20 6e 50 72 ssOps );. nPr
4bb0: 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 64 62 ogressLimit = db
4bc0: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d ->nProgressOps -
4bd0: 20 28 69 50 72 69 6f 72 20 25 20 64 62 2d 3e 6e (iPrior % db->n
4be0: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20 ProgressOps);.
4bf0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 }.#endif.#ifdef
4c00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 SQLITE_DEBUG. s
4c10: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 qlite3BeginBenig
4c20: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 nMalloc();. if(
4c30: 20 70 2d 3e 70 63 3d 3d 30 0a 20 20 20 26 26 20 p->pc==0. &&
4c40: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 (p->db->flags &
4c50: 28 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 (SQLITE_VdbeList
4c60: 69 6e 67 7c 53 51 4c 49 54 45 5f 56 64 62 65 45 ing|SQLITE_VdbeE
4c70: 51 50 7c 53 51 4c 49 54 45 5f 56 64 62 65 54 72 QP|SQLITE_VdbeTr
4c80: 61 63 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 ace))!=0. ){.
4c90: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 int i;. int
4ca0: 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 73 once = 1;. s
4cb0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 qlite3VdbePrintS
4cc0: 71 6c 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 ql(p);. if( p
4cd0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 ->db->flags & SQ
4ce0: 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 LITE_VdbeListing
4cf0: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 ){. printf
4d00: 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c ("VDBE Program L
4d10: 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 isting:\n");.
4d20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d for(i=0; i<p-
4d30: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nOp; i++){.
4d40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 sqlite3VdbeP
4d50: 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 rintOp(stdout, i
4d60: 2c 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 , &aOp[i]);.
4d70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 }. }. if
4d80: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 ( p->db->flags &
4d90: 20 53 51 4c 49 54 45 5f 56 64 62 65 45 51 50 20 SQLITE_VdbeEQP
4da0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 ){. for(i=0
4db0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 ; i<p->nOp; i++)
4dc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4f {. if( aO
4dd0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f p[i].opcode==OP_
4de0: 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 Explain ){.
4df0: 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 20 if( once )
4e00: 70 72 69 6e 74 66 28 22 56 44 42 45 20 51 75 65 printf("VDBE Que
4e10: 72 79 20 50 6c 61 6e 3a 5c 6e 22 29 3b 0a 20 20 ry Plan:\n");.
4e20: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 printf("
4e30: 25 73 5c 6e 22 2c 20 61 4f 70 5b 69 5d 2e 70 34 %s\n", aOp[i].p4
4e40: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f .z);. o
4e50: 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 nce = 0;.
4e60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
4e70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e . if( p->db->
4e80: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 flags & SQLITE_V
4e90: 64 62 65 54 72 61 63 65 20 29 20 20 70 72 69 6e dbeTrace ) prin
4ea0: 74 66 28 22 56 44 42 45 20 54 72 61 63 65 3a 5c tf("VDBE Trace:\
4eb0: 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 n");. }. sqlit
4ec0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f e3EndBenignMallo
4ed0: 63 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f c();.#endif. fo
4ee0: 72 28 70 4f 70 3d 26 61 4f 70 5b 70 2d 3e 70 63 r(pOp=&aOp[p->pc
4ef0: 5d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b ]; rc==SQLITE_OK
4f00: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 61 73 ; pOp++){. as
4f10: 73 65 72 74 28 20 70 4f 70 3e 3d 61 4f 70 20 26 sert( pOp>=aOp &
4f20: 26 20 70 4f 70 3c 26 61 4f 70 5b 70 2d 3e 6e 4f & pOp<&aOp[p->nO
4f30: 70 5d 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d p]);. if( db-
4f40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 >mallocFailed )
4f50: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 23 69 66 goto no_mem;.#if
4f60: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 def VDBE_PROFILE
4f70: 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c . start = sql
4f80: 69 74 65 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 ite3Hwtime();.#e
4f90: 6e 64 69 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 ndif. nVmStep
4fa0: 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 ++;.#ifdef SQLIT
4fb0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 E_ENABLE_STMT_SC
4fc0: 41 4e 53 54 41 54 55 53 0a 20 20 20 20 69 66 28 ANSTATUS. if(
4fd0: 20 70 2d 3e 61 6e 45 78 65 63 20 29 20 70 2d 3e p->anExec ) p->
4fe0: 61 6e 45 78 65 63 5b 28 69 6e 74 29 28 70 4f 70 anExec[(int)(pOp
4ff0: 2d 61 4f 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 -aOp)]++;.#endif
5000: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c .. /* Only al
5010: 6c 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 low tracing if S
5020: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 QLITE_DEBUG is d
5030: 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 efined.. */.#
5040: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
5050: 55 47 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 UG. if( db->f
5060: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 lags & SQLITE_Vd
5070: 62 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 beTrace ){.
5080: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e sqlite3VdbePrin
5090: 74 4f 70 28 73 74 64 6f 75 74 2c 20 28 69 6e 74 tOp(stdout, (int
50a0: 29 28 70 4f 70 20 2d 20 61 4f 70 29 2c 20 70 4f )(pOp - aOp), pO
50b0: 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 p);. }.#endif
50c0: 0a 20 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 . .. /*
50d0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 Check to see if
50e0: 77 65 20 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c we need to simul
50f0: 61 74 65 20 61 6e 20 69 6e 74 65 72 72 75 70 74 ate an interrupt
5100: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 . This only hap
5110: 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20 77 pens. ** if w
5120: 65 20 68 61 76 65 20 61 20 73 70 65 63 69 61 6c e have a special
5130: 20 74 65 73 74 20 62 75 69 6c 64 2e 0a 20 20 20 test build..
5140: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 */.#ifdef SQLIT
5150: 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 73 E_TEST. if( s
5160: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 qlite3_interrupt
5170: 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 _count>0 ){.
5180: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 sqlite3_interr
5190: 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 upt_count--;.
51a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 if( sqlite3_i
51b0: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d nterrupt_count==
51c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 0 ){. sql
51d0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 ite3_interrupt(d
51e0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 b);. }.
51f0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
5200: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 Sanity checking
5210: 20 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61 6e on other operan
5220: 64 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c ds */.#ifdef SQL
5230: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 61 73 ITE_DEBUG. as
5240: 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 66 6c 61 sert( pOp->opfla
5250: 67 73 3d 3d 73 71 6c 69 74 65 33 4f 70 63 6f 64 gs==sqlite3Opcod
5260: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f eProperty[pOp->o
5270: 70 63 6f 64 65 5d 20 29 3b 0a 20 20 20 20 69 66 pcode] );. if
5280: 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 ( (pOp->opflags
5290: 26 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 & OPFLG_IN1)!=0
52a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ){. assert(
52b0: 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 pOp->p1>0 );.
52c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d assert( pOp-
52d0: 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d >p1<=(p->nMem-p-
52e0: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 >nCursor) );.
52f0: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 assert( memIs
5300: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d Valid(&aMem[pOp-
5310: 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 >p1]) );. a
5320: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 ssert( sqlite3Vd
5330: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 beCheckMemInvari
5340: 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e ants(&aMem[pOp->
5350: 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 52 45 p1]) );. RE
5360: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 GISTER_TRACE(pOp
5370: 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d ->p1, &aMem[pOp-
5380: 3e 70 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 >p1]);. }.
5390: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 if( (pOp->opfla
53a0: 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21 gs & OPFLG_IN2)!
53b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 =0 ){. asse
53c0: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b rt( pOp->p2>0 );
53d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
53e0: 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d Op->p2<=(p->nMem
53f0: 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a -p->nCursor) );.
5400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 assert( me
5410: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 mIsValid(&aMem[p
5420: 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 Op->p2]) );.
5430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
5440: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 3VdbeCheckMemInv
5450: 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f ariants(&aMem[pO
5460: 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 p->p2]) );.
5470: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 REGISTER_TRACE(
5480: 70 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 pOp->p2, &aMem[p
5490: 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 7d 0a Op->p2]);. }.
54a0: 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 if( (pOp->op
54b0: 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e flags & OPFLG_IN
54c0: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 3)!=0 ){. a
54d0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 ssert( pOp->p3>0
54e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 );. assert
54f0: 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e ( pOp->p3<=(p->n
5500: 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 Mem-p->nCursor)
5510: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 );. assert(
5520: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 memIsValid(&aMe
5530: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 m[pOp->p3]) );.
5540: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c assert( sql
5550: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d ite3VdbeCheckMem
5560: 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d Invariants(&aMem
5570: 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 [pOp->p3]) );.
5580: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 REGISTER_TRA
5590: 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 CE(pOp->p3, &aMe
55a0: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 m[pOp->p3]);.
55b0: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d }. if( (pOp-
55c0: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 >opflags & OPFLG
55d0: 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 _OUT2)!=0 ){.
55e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e assert( pOp->
55f0: 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 p2>0 );. as
5600: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 sert( pOp->p2<=(
5610: 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 p->nMem-p->nCurs
5620: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d or) );. mem
5630: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c AboutToChange(p,
5640: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 &aMem[pOp->p2])
5650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
5660: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 (pOp->opflags &
5670: 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d 30 20 29 OPFLG_OUT3)!=0 )
5680: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 {. assert(
5690: 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 pOp->p3>0 );.
56a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e assert( pOp->
56b0: 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e p3<=(p->nMem-p->
56c0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 nCursor) );.
56d0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e memAboutToChan
56e0: 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d ge(p, &aMem[pOp-
56f0: 3e 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e >p3]);. }.#en
5700: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
5710: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c SQLITE_DEBUG) ||
5720: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 defined(VDBE_PR
5730: 4f 46 49 4c 45 29 0a 20 20 20 20 70 4f 72 69 67 OFILE). pOrig
5740: 4f 70 20 3d 20 70 4f 70 3b 0a 23 65 6e 64 69 66 Op = pOp;.#endif
5750: 0a 20 20 0a 20 20 20 20 73 77 69 74 63 68 28 20 . . switch(
5760: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a pOp->opcode ){..
5770: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
57c0: 2a 20 57 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 * What follows i
57d0: 73 20 61 20 6d 61 73 73 69 76 65 20 73 77 69 74 s a massive swit
57e0: 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77 68 65 ch statement whe
57f0: 72 65 20 65 61 63 68 20 63 61 73 65 20 69 6d 70 re each case imp
5800: 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 73 65 70 lements a.** sep
5810: 61 72 61 74 65 20 69 6e 73 74 72 75 63 74 69 6f arate instructio
5820: 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c n in the virtual
5830: 20 6d 61 63 68 69 6e 65 2e 20 20 49 66 20 77 65 machine. If we
5840: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 75 73 75 61 follow the usua
5850: 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61 74 69 6f 6e l.** indentation
5860: 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2c 20 65 61 conventions, ea
5870: 63 68 20 63 61 73 65 20 73 68 6f 75 6c 64 20 62 ch case should b
5880: 65 20 69 6e 64 65 6e 74 65 64 20 62 79 20 36 20 e indented by 6
5890: 73 70 61 63 65 73 2e 20 20 42 75 74 0a 2a 2a 20 spaces. But.**
58a0: 74 68 61 74 20 69 73 20 61 20 6c 6f 74 20 6f 66 that is a lot of
58b0: 20 77 61 73 74 65 64 20 73 70 61 63 65 20 6f 6e wasted space on
58c0: 20 74 68 65 20 6c 65 66 74 20 6d 61 72 67 69 6e the left margin
58d0: 2e 20 20 53 6f 20 74 68 65 20 63 6f 64 65 20 77 . So the code w
58e0: 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 73 77 69 ithin.** the swi
58f0: 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77 69 tch statement wi
5900: 6c 6c 20 62 72 65 61 6b 20 77 69 74 68 20 63 6f ll break with co
5910: 6e 76 65 6e 74 69 6f 6e 20 61 6e 64 20 62 65 20 nvention and be
5920: 66 6c 75 73 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 flush-left. Anot
5930: 68 65 72 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 her.** big comme
5940: 6e 74 20 28 73 69 6d 69 6c 61 72 20 74 6f 20 74 nt (similar to t
5950: 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 his one) will ma
5960: 72 6b 20 74 68 65 20 70 6f 69 6e 74 20 69 6e 20 rk the point in
5970: 74 68 65 20 63 6f 64 65 20 77 68 65 72 65 0a 2a the code where.*
5980: 2a 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 * we transition
5990: 62 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 back to normal i
59a0: 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a ndentation..**.*
59b0: 2a 20 54 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 * The formatting
59c0: 20 6f 66 20 65 61 63 68 20 63 61 73 65 20 69 73 of each case is
59d0: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 important. The
59e0: 20 6d 61 6b 65 66 69 6c 65 20 66 6f 72 20 53 51 makefile for SQ
59f0: 4c 69 74 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 Lite.** generate
5a00: 73 20 74 77 6f 20 43 20 66 69 6c 65 73 20 22 6f s two C files "o
5a10: 70 63 6f 64 65 73 2e 68 22 20 61 6e 64 20 22 6f pcodes.h" and "o
5a20: 70 63 6f 64 65 73 2e 63 22 20 62 79 20 73 63 61 pcodes.c" by sca
5a30: 6e 6e 69 6e 67 20 74 68 69 73 0a 2a 2a 20 66 69 nning this.** fi
5a40: 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c le looking for l
5a50: 69 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 ines that begin
5a60: 77 69 74 68 20 22 63 61 73 65 20 4f 50 5f 22 2e with "case OP_".
5a70: 20 20 54 68 65 20 6f 70 63 6f 64 65 73 2e 68 20 The opcodes.h
5a80: 66 69 6c 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 files.** will be
5a90: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 23 64 65 filled with #de
5aa0: 66 69 6e 65 73 20 74 68 61 74 20 67 69 76 65 20 fines that give
5ab0: 75 6e 69 71 75 65 20 69 6e 74 65 67 65 72 20 76 unique integer v
5ac0: 61 6c 75 65 73 20 74 6f 20 65 61 63 68 0a 2a 2a alues to each.**
5ad0: 20 6f 70 63 6f 64 65 20 61 6e 64 20 74 68 65 20 opcode and the
5ae0: 6f 70 63 6f 64 65 73 2e 63 20 66 69 6c 65 20 69 opcodes.c file i
5af0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 61 6e s filled with an
5b00: 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 array of string
5b10: 73 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 s where.** each
5b20: 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 73 79 string is the sy
5b30: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 mbolic name for
5b40: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e the correspondin
5b50: 67 20 6f 70 63 6f 64 65 2e 20 20 49 66 20 74 68 g opcode. If th
5b60: 65 0a 2a 2a 20 63 61 73 65 20 73 74 61 74 65 6d e.** case statem
5b70: 65 6e 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 ent is followed
5b80: 62 79 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 by a comment of
5b90: 74 68 65 20 66 6f 72 6d 20 22 2f 23 20 73 61 6d the form "/# sam
5ba0: 65 20 61 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 e as ... #/".**
5bb0: 74 68 61 74 20 63 6f 6d 6d 65 6e 74 20 69 73 20 that comment is
5bc0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e used to determin
5bd0: 65 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 e the particular
5be0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 value of the op
5bf0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 code..**.** Othe
5c00: 72 20 6b 65 79 77 6f 72 64 73 20 69 6e 20 74 68 r keywords in th
5c10: 65 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74 20 66 e comment that f
5c20: 6f 6c 6c 6f 77 73 20 65 61 63 68 20 63 61 73 65 ollows each case
5c30: 20 61 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 are used to.**
5c40: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 4f 50 construct the OP
5c50: 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 FLG_INITIALIZER
5c60: 76 61 6c 75 65 20 74 68 61 74 20 69 6e 69 74 69 value that initi
5c70: 61 6c 69 7a 65 73 20 6f 70 63 6f 64 65 50 72 6f alizes opcodePro
5c80: 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 perty[]..** Keyw
5c90: 6f 72 64 73 20 69 6e 63 6c 75 64 65 3a 20 69 6e ords include: in
5ca0: 31 2c 20 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 1, in2, in3, out
5cb0: 32 2c 20 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 2, out3. See.**
5cc0: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 the mkopcodeh.a
5cd0: 77 6b 20 73 63 72 69 70 74 20 66 6f 72 20 61 64 wk script for ad
5ce0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 ditional informa
5cf0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 tion..**.** Docu
5d00: 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 mentation about
5d10: 56 44 42 45 20 6f 70 63 6f 64 65 73 20 69 73 20 VDBE opcodes is
5d20: 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 63 61 generated by sca
5d30: 6e 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 0a nning this file.
5d40: 2a 2a 20 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 ** for lines of
5d50: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 that contain "Op
5d60: 63 6f 64 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 code:". That li
5d70: 6e 65 20 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 ne and all subse
5d80: 71 75 65 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 quent.** comment
5d90: 20 6c 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 lines are used
5da0: 69 6e 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f in the generatio
5db0: 6e 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e n of the opcode.
5dc0: 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 html documentati
5dd0: 6f 6e 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a on.** file..**.*
5de0: 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a * SUMMARY:.**.**
5df0: 20 20 20 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 Formatting
5e00: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 is important to
5e10: 73 63 72 69 70 74 73 20 74 68 61 74 20 73 63 61 scripts that sca
5e20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 n this file..**
5e30: 20 20 20 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 Do not devia
5e40: 74 65 20 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d te from the form
5e50: 61 74 74 69 6e 67 20 73 74 79 6c 65 20 63 75 72 atting style cur
5e60: 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a rently in use..*
5e70: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *.**************
5e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
5ec0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f ../* Opcode: Go
5ed0: 74 6f 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a to * P2 * * *.**
5ee0: 0a 2a 2a 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 .** An unconditi
5ef0: 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 onal jump to add
5f00: 72 65 73 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 ress P2..** The
5f10: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e next instruction
5f20: 20 65 78 65 63 75 74 65 64 20 77 69 6c 6c 20 62 executed will b
5f30: 65 20 0a 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 e .** the one at
5f40: 20 69 6e 64 65 78 20 50 32 20 66 72 6f 6d 20 74 index P2 from t
5f50: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a he beginning of.
5f60: 2a 2a 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a ** the program..
5f70: 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 70 61 72 **.** The P1 par
5f80: 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 61 63 ameter is not ac
5f90: 74 75 61 6c 6c 79 20 75 73 65 64 20 62 79 20 74 tually used by t
5fa0: 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 48 6f 77 his opcode. How
5fb0: 65 76 65 72 2c 20 69 74 0a 2a 2a 20 69 73 20 73 ever, it.** is s
5fc0: 6f 6d 65 74 69 6d 65 73 20 73 65 74 20 74 6f 20 ometimes set to
5fd0: 31 20 69 6e 73 74 65 61 64 20 6f 66 20 30 20 61 1 instead of 0 a
5fe0: 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 s a hint to the
5ff0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 command-line she
6000: 6c 6c 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 ll.** that this
6010: 47 6f 74 6f 20 69 73 20 74 68 65 20 62 6f 74 74 Goto is the bott
6020: 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 61 6e 64 om of a loop and
6030: 20 74 68 61 74 20 74 68 65 20 6c 69 6e 65 73 20 that the lines
6040: 66 72 6f 6d 20 50 32 20 64 6f 77 6e 0a 2a 2a 20 from P2 down.**
6050: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c to the current l
6060: 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e ine should be in
6070: 64 65 6e 74 65 64 20 66 6f 72 20 45 58 50 4c 41 dented for EXPLA
6080: 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 IN output..*/.ca
6090: 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 se OP_Goto: {
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d /* jum
60b0: 70 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 5f p */.jump_to_p2_
60c0: 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e and_check_for_in
60d0: 74 65 72 72 75 70 74 3a 0a 20 20 70 4f 70 20 3d terrupt:. pOp =
60e0: 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 &aOp[pOp->p2 -
60f0: 31 5d 3b 0a 0a 20 20 2f 2a 20 4f 70 63 6f 64 65 1];.. /* Opcode
6100: 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 s that are used
6110: 61 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 as the bottom of
6120: 20 61 20 6c 6f 6f 70 20 28 4f 50 5f 4e 65 78 74 a loop (OP_Next
6130: 2c 20 4f 50 5f 50 72 65 76 2c 0a 20 20 2a 2a 20 , OP_Prev,. **
6140: 4f 50 5f 56 4e 65 78 74 2c 20 4f 50 5f 52 6f 77 OP_VNext, OP_Row
6150: 53 65 74 4e 65 78 74 2c 20 6f 72 20 4f 50 5f 53 SetNext, or OP_S
6160: 6f 72 74 65 72 4e 65 78 74 29 20 61 6c 6c 20 6a orterNext) all j
6170: 75 6d 70 20 68 65 72 65 20 75 70 6f 6e 0a 20 20 ump here upon.
6180: 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 ** completion.
6190: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 Check to see if
61a0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 sqlite3_interrup
61b0: 74 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c t() has been cal
61c0: 6c 65 64 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 led. ** or if t
61d0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c he progress call
61e0: 62 61 63 6b 20 6e 65 65 64 73 20 74 6f 20 62 65 back needs to be
61f0: 20 69 6e 76 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a invoked. . **.
6200: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 75 ** This code u
6210: 73 65 73 20 75 6e 73 74 72 75 63 74 75 72 65 64 ses unstructured
6220: 20 22 67 6f 74 6f 22 20 73 74 61 74 65 6d 65 6e "goto" statemen
6230: 74 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 ts and does not
6240: 6c 6f 6f 6b 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a look clean.. **
6250: 20 42 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 But that is not
6260: 20 64 75 65 20 74 6f 20 73 6c 6f 70 70 79 20 63 due to sloppy c
6270: 6f 64 69 6e 67 20 68 61 62 69 74 73 2e 20 54 68 oding habits. Th
6280: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 e code is writte
6290: 6e 20 74 68 69 73 0a 20 20 2a 2a 20 77 61 79 20 n this. ** way
62a0: 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c for performance,
62b0: 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 to avoid having
62c0: 20 74 6f 20 72 75 6e 20 74 68 65 20 69 6e 74 65 to run the inte
62d0: 72 72 75 70 74 20 61 6e 64 20 70 72 6f 67 72 65 rrupt and progre
62e0: 73 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 6f ss. ** checks o
62f0: 6e 20 65 76 65 72 79 20 6f 70 63 6f 64 65 2e 20 n every opcode.
6300: 20 54 68 69 73 20 68 65 6c 70 73 20 73 71 6c 69 This helps sqli
6310: 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 75 te3_step() to ru
6320: 6e 20 61 62 6f 75 74 20 31 2e 35 25 0a 20 20 2a n about 1.5%. *
6330: 2a 20 66 61 73 74 65 72 20 61 63 63 6f 72 64 69 * faster accordi
6340: 6e 67 20 74 6f 20 22 76 61 6c 67 72 69 6e 64 20 ng to "valgrind
6350: 2d 2d 74 6f 6f 6c 3d 63 61 63 68 65 67 72 69 6e --tool=cachegrin
6360: 64 22 20 2a 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f d" */.check_for_
6370: 69 6e 74 65 72 72 75 70 74 3a 0a 20 20 69 66 28 interrupt:. if(
6380: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 db->u1.isInterr
6390: 75 70 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f upted ) goto abo
63a0: 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 rt_due_to_interr
63b0: 75 70 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c upt;.#ifndef SQL
63c0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 ITE_OMIT_PROGRES
63d0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 S_CALLBACK. /*
63e0: 43 61 6c 6c 20 74 68 65 20 70 72 6f 67 72 65 73 Call the progres
63f0: 73 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 69 74 s callback if it
6400: 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 is configured a
6410: 6e 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 nd the required
6420: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 56 number. ** of V
6430: 44 42 45 20 6f 70 73 20 68 61 76 65 20 62 65 65 DBE ops have bee
6440: 6e 20 65 78 65 63 75 74 65 64 20 28 65 69 74 68 n executed (eith
6450: 65 72 20 73 69 6e 63 65 20 74 68 69 73 20 69 6e er since this in
6460: 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a vocation of. **
6470: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 sqlite3VdbeExec
6480: 28 29 20 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 () or since last
6490: 20 74 69 6d 65 20 74 68 65 20 70 72 6f 67 72 65 time the progre
64a0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 ss callback was
64b0: 63 61 6c 6c 65 64 29 2e 0a 20 20 2a 2a 20 49 66 called).. ** If
64c0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 the progress ca
64d0: 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e llback returns n
64e0: 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 on-zero, exit th
64f0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e e virtual machin
6500: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 e with. ** a re
6510: 74 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 turn code SQLITE
6520: 5f 41 42 4f 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 _ABORT.. */. i
6530: 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 f( db->xProgress
6540: 21 3d 30 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d !=0 && nVmStep>=
6550: 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 29 nProgressLimit )
6560: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 {. assert( db
6570: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 21 3d ->nProgressOps!=
6580: 30 20 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 0 );. nProgre
6590: 73 73 4c 69 6d 69 74 20 3d 20 6e 56 6d 53 74 65 ssLimit = nVmSte
65a0: 70 20 2b 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 p + db->nProgres
65b0: 73 4f 70 73 20 2d 20 28 6e 56 6d 53 74 65 70 25 sOps - (nVmStep%
65c0: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 db->nProgressOps
65d0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78 );. if( db->x
65e0: 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70 50 72 Progress(db->pPr
65f0: 6f 67 72 65 73 73 41 72 67 29 20 29 7b 0a 20 20 ogressArg) ){.
6600: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
6610: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20 INTERRUPT;.
6620: 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 goto vdbe_error
6630: 5f 68 61 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d _halt;. }. }
6640: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65 .#endif. . bre
6650: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 ak;.}../* Opcode
6660: 3a 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a : Gosub P1 P2 *
6670: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 * *.**.** Write
6680: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 the current add
6690: 72 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 ress onto regist
66a0: 65 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 er P1.** and the
66b0: 6e 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 n jump to addres
66c0: 73 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 s P2..*/.case OP
66d0: 5f 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 _Gosub: {
66e0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a /* jump */.
66f0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
6700: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 1>0 && pOp->p1<=
6710: 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 (p->nMem-p->nCur
6720: 73 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31 20 3d sor) );. pIn1 =
6730: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b &aMem[pOp->p1];
6740: 0a 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d . assert( VdbeM
6750: 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d emDynamic(pIn1)=
6760: 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 =0 );. memAbout
6770: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 ToChange(p, pIn1
6780: 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 );. pIn1->flags
6790: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 = MEM_Int;. pI
67a0: 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 n1->u.i = (int)(
67b0: 70 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45 47 49 pOp-aOp);. REGI
67c0: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e STER_TRACE(pOp->
67d0: 70 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20 2f 2a p1, pIn1);.. /*
67e0: 20 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65 72 61 Most jump opera
67f0: 74 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74 6f 20 tions do a goto
6800: 74 6f 20 74 68 69 73 20 73 70 6f 74 20 69 6e 20 to this spot in
6810: 6f 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 0a order to update.
6820: 20 20 2a 2a 20 74 68 65 20 70 4f 70 20 70 6f 69 ** the pOp poi
6830: 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f 74 6f nter. */.jump_to
6840: 5f 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f _p2:. pOp = &aO
6850: 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a p[pOp->p2 - 1];.
6860: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f break;.}../* O
6870: 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 pcode: Return P
6880: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 1 * * * *.**.**
6890: 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 Jump to the next
68a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 instruction aft
68b0: 65 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69 er the address i
68c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 n register P1.
68d0: 41 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 75 6d After.** the jum
68e0: 70 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62 p, register P1 b
68f0: 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64 ecomes undefined
6900: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 ..*/.case OP_Ret
6910: 75 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 urn: {
6920: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e /* in1 */. pIn
6930: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 1 = &aMem[pOp->p
6940: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 1];. assert( pI
6950: 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 n1->flags==MEM_I
6960: 6e 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 nt );. pOp = &a
6970: 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 Op[pIn1->u.i];.
6980: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d pIn1->flags = M
6990: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 EM_Undefined;.
69a0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
69b0: 6f 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 ode: InitCorouti
69c0: 6e 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a ne P1 P2 P3 * *.
69d0: 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72 65 67 **.** Set up reg
69e0: 69 73 74 65 72 20 50 31 20 73 6f 20 74 68 61 74 ister P1 so that
69f0: 20 69 74 20 77 69 6c 6c 20 59 69 65 6c 64 20 74 it will Yield t
6a00: 6f 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 0a o the coroutine.
6a10: 2a 2a 20 6c 6f 63 61 74 65 64 20 61 74 20 61 64 ** located at ad
6a20: 64 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 dress P3..**.**
6a30: 49 66 20 50 32 21 3d 30 20 74 68 65 6e 20 74 68 If P2!=0 then th
6a40: 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c e coroutine impl
6a50: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d 65 64 ementation immed
6a60: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 0a 2a iately follows.*
6a70: 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 * this opcode.
6a80: 53 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 So jump over the
6a90: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 coroutine imple
6aa0: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 mentation to.**
6ab0: 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 0a 2a address P2..**.*
6ac0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e 64 43 * See also: EndC
6ad0: 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 oroutine.*/.case
6ae0: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e OP_InitCoroutin
6af0: 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75 6d 70 e: { /* jump
6b00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f */. assert( pO
6b10: 70 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f 70 2d p->p1>0 && pOp-
6b20: 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d >p1<=(p->nMem-p-
6b30: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 >nCursor) );. a
6b40: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d ssert( pOp->p2>=
6b50: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 0 && pOp->p2<p->
6b60: 6e 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 nOp );. assert(
6b70: 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20 70 pOp->p3>=0 && p
6b80: 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 4f 70 20 29 3b Op->p3<p->nOp );
6b90: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b . pOut = &aMem[
6ba0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 pOp->p1];. asse
6bb0: 72 74 28 20 21 56 64 62 65 4d 65 6d 44 79 6e 61 rt( !VdbeMemDyna
6bc0: 6d 69 63 28 70 4f 75 74 29 20 29 3b 0a 20 20 70 mic(pOut) );. p
6bd0: 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e Out->u.i = pOp->
6be0: 70 33 20 2d 20 31 3b 0a 20 20 70 4f 75 74 2d 3e p3 - 1;. pOut->
6bf0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
6c00: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 . if( pOp->p2 )
6c10: 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 goto jump_to_p2
6c20: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a ;. break;.}../*
6c30: 20 4f 70 63 6f 64 65 3a 20 20 45 6e 64 43 6f 72 Opcode: EndCor
6c40: 6f 75 74 69 6e 65 20 50 31 20 2a 20 2a 20 2a 20 outine P1 * * *
6c50: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 73 74 *.**.** The inst
6c60: 72 75 63 74 69 6f 6e 20 61 74 20 74 68 65 20 61 ruction at the a
6c70: 64 64 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 ddress in regist
6c80: 65 72 20 50 31 20 69 73 20 61 20 59 69 65 6c 64 er P1 is a Yield
6c90: 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 ..** Jump to the
6ca0: 20 50 32 20 70 61 72 61 6d 65 74 65 72 20 6f 66 P2 parameter of
6cb0: 20 74 68 61 74 20 59 69 65 6c 64 2e 0a 2a 2a 20 that Yield..**
6cc0: 41 66 74 65 72 20 74 68 65 20 6a 75 6d 70 2c 20 After the jump,
6cd0: 72 65 67 69 73 74 65 72 20 50 31 20 62 65 63 6f register P1 beco
6ce0: 6d 65 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a mes undefined..*
6cf0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 *.** See also: I
6d00: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a nitCoroutine.*/.
6d10: 63 61 73 65 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 case OP_EndCorou
6d20: 74 69 6e 65 3a 20 7b 20 20 20 20 20 20 20 20 20 tine: {
6d30: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 56 64 /* in1 */. Vd
6d40: 62 65 4f 70 20 2a 70 43 61 6c 6c 65 72 3b 0a 20 beOp *pCaller;.
6d50: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f pIn1 = &aMem[pO
6d60: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 p->p1];. assert
6d70: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d ( pIn1->flags==M
6d80: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 EM_Int );. asse
6d90: 72 74 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 3d 30 rt( pIn1->u.i>=0
6da0: 20 26 26 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 2d && pIn1->u.i<p-
6db0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 43 61 6c 6c 65 >nOp );. pCalle
6dc0: 72 20 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 r = &aOp[pIn1->u
6dd0: 2e 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 .i];. assert( p
6de0: 43 61 6c 6c 65 72 2d 3e 6f 70 63 6f 64 65 3d 3d Caller->opcode==
6df0: 4f 50 5f 59 69 65 6c 64 20 29 3b 0a 20 20 61 73 OP_Yield );. as
6e00: 73 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 70 sert( pCaller->p
6e10: 32 3e 3d 30 20 26 26 20 70 43 61 6c 6c 65 72 2d 2>=0 && pCaller-
6e20: 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 >p2<p->nOp );.
6e30: 70 4f 70 20 3d 20 26 61 4f 70 5b 70 43 61 6c 6c pOp = &aOp[pCall
6e40: 65 72 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 70 er->p2 - 1];. p
6e50: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d In1->flags = MEM
6e60: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 _Undefined;. br
6e70: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 eak;.}../* Opcod
6e80: 65 3a 20 20 59 69 65 6c 64 20 50 31 20 50 32 20 e: Yield P1 P2
6e90: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 * * *.**.** Swap
6ea0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 the program cou
6eb0: 6e 74 65 72 20 77 69 74 68 20 74 68 65 20 76 61 nter with the va
6ec0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 lue in register
6ed0: 50 31 2e 20 20 54 68 69 73 0a 2a 2a 20 68 61 73 P1. This.** has
6ee0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 79 the effect of y
6ef0: 69 65 6c 64 69 6e 67 20 74 6f 20 61 20 63 6f 72 ielding to a cor
6f00: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 outine..**.** If
6f10: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 the coroutine t
6f20: 68 61 74 20 69 73 20 6c 61 75 6e 63 68 65 64 20 hat is launched
6f30: 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 by this instruct
6f40: 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a ion ends with.**
6f50: 20 59 69 65 6c 64 20 6f 72 20 52 65 74 75 72 6e Yield or Return
6f60: 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 74 then continue t
6f70: 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 o the next instr
6f80: 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a uction. But if.
6f90: 2a 2a 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 ** the coroutine
6fa0: 20 6c 61 75 6e 63 68 65 64 20 62 79 20 74 68 69 launched by thi
6fb0: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e s instruction en
6fc0: 64 73 20 77 69 74 68 0a 2a 2a 20 45 6e 64 43 6f ds with.** EndCo
6fd0: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 6a 75 routine, then ju
6fe0: 6d 70 20 74 6f 20 50 32 20 72 61 74 68 65 72 20 mp to P2 rather
6ff0: 74 68 61 6e 20 63 6f 6e 74 69 6e 75 69 6e 67 20 than continuing
7000: 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 65 78 74 with the.** next
7010: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a instruction..**
7020: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 6e .** See also: In
7030: 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 itCoroutine.*/.c
7040: 61 73 65 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 ase OP_Yield: {
7050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e /* in
7060: 31 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 1, jump */. int
7070: 20 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20 pcDest;. pIn1
7080: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d = &aMem[pOp->p1]
7090: 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64 62 65 ;. assert( Vdbe
70a0: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 MemDynamic(pIn1)
70b0: 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 ==0 );. pIn1->f
70c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
70d0: 20 20 70 63 44 65 73 74 20 3d 20 28 69 6e 74 29 pcDest = (int)
70e0: 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70 49 6e pIn1->u.i;. pIn
70f0: 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70 1->u.i = (int)(p
7100: 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 52 45 47 Op - aOp);. REG
7110: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d ISTER_TRACE(pOp-
7120: 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 4f >p1, pIn1);. pO
7130: 70 20 3d 20 26 61 4f 70 5b 70 63 44 65 73 74 5d p = &aOp[pcDest]
7140: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a ;. break;.}../*
7150: 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 Opcode: HaltIf
7160: 4e 75 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50 Null P1 P2 P3 P
7170: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 4 P5.** Synopsis
7180: 3a 20 20 69 66 20 72 5b 50 33 5d 3d 6e 75 6c 6c : if r[P3]=null
7190: 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 43 68 65 63 halt.**.** Chec
71a0: 6b 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 k the value in r
71b0: 65 67 69 73 74 65 72 20 50 33 2e 20 20 49 66 20 egister P3. If
71c0: 69 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 it is NULL then
71d0: 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 70 61 Halt using.** pa
71e0: 72 61 6d 65 74 65 72 20 50 31 2c 20 50 32 2c 20 rameter P1, P2,
71f0: 61 6e 64 20 50 34 20 61 73 20 69 66 20 74 68 69 and P4 as if thi
7200: 73 20 77 65 72 65 20 61 20 48 61 6c 74 20 69 6e s were a Halt in
7210: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 struction. If t
7220: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 he.** value in r
7230: 65 67 69 73 74 65 72 20 50 33 20 69 73 20 6e 6f egister P3 is no
7240: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 t NULL, then thi
7250: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e s routine is a n
7260: 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 50 35 20 o-op..** The P5
7270: 70 61 72 61 6d 65 74 65 72 20 73 68 6f 75 6c 64 parameter should
7280: 20 62 65 20 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f be 1..*/.case O
7290: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20 P_HaltIfNull: {
72a0: 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 /* in3 */.
72b0: 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f pIn3 = &aMem[pO
72c0: 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 p->p3];. if( (p
72d0: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d In3->flags & MEM
72e0: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 _Null)==0 ) brea
72f0: 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 k;. /* Fall thr
7300: 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c ough into OP_Hal
7310: 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 t */.}../* Opcod
7320: 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32 20 2a e: Halt P1 P2 *
7330: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 69 P4 P5.**.** Exi
7340: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 t immediately.
7350: 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 All open cursors
7360: 2c 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65 64 , etc are closed
7370: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c .** automaticall
7380: 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 y..**.** P1 is t
7390: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 72 he result code r
73a0: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 eturned by sqlit
73b0: 65 33 5f 65 78 65 63 28 29 2c 20 73 71 6c 69 74 e3_exec(), sqlit
73c0: 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f e3_reset(),.** o
73d0: 72 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 r sqlite3_finali
73e0: 7a 65 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 ze(). For a nor
73f0: 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69 73 20 73 mal halt, this s
7400: 68 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45 5f hould be SQLITE_
7410: 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 OK (0)..** For e
7420: 72 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62 65 rrors, it can be
7430: 20 73 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 some other valu
7440: 65 2e 20 20 49 66 20 50 31 21 3d 30 20 74 68 65 e. If P1!=0 the
7450: 6e 20 50 32 20 77 69 6c 6c 20 64 65 74 65 72 6d n P2 will determ
7460: 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f ine.** whether o
7470: 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 r not to rollbac
7480: 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 k the current tr
7490: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e ansaction. Do n
74a0: 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 ot rollback.** i
74b0: 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 f P2==OE_Fail. D
74c0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 o the rollback i
74d0: 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 f P2==OE_Rollbac
74e0: 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 k. If P2==OE_Ab
74f0: 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 ort,.** then bac
7500: 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 k out all change
7510: 73 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 s that have occu
7520: 72 72 65 64 20 64 75 72 69 6e 67 20 74 68 69 73 rred during this
7530: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 execution of th
7540: 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74 20 64 e.** VDBE, but d
7550: 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 o not rollback t
7560: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 he transaction.
7570: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 .**.** If P4 is
7580: 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 not null then it
7590: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 is an error mes
75a0: 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a sage string..**.
75b0: 2a 2a 20 50 35 20 69 73 20 61 20 76 61 6c 75 65 ** P5 is a value
75c0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 34 between 0 and 4
75d0: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 74 68 61 , inclusive, tha
75e0: 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 50 t modifies the P
75f0: 34 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4 string..**.**
7600: 20 20 20 30 3a 20 20 28 6e 6f 20 63 68 61 6e 67 0: (no chang
7610: 65 29 0a 2a 2a 20 20 20 20 31 3a 20 20 4e 4f 54 e).** 1: NOT
7620: 20 4e 55 4c 4c 20 63 6f 6e 74 72 61 69 6e 74 20 NULL contraint
7630: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 failed: P4.**
7640: 20 32 3a 20 20 55 4e 49 51 55 45 20 63 6f 6e 73 2: UNIQUE cons
7650: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 traint failed: P
7660: 34 0a 2a 2a 20 20 20 20 33 3a 20 20 43 48 45 43 4.** 3: CHEC
7670: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 K constraint fai
7680: 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 34 3a led: P4.** 4:
7690: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f FOREIGN KEY co
76a0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a nstraint failed:
76b0: 20 50 34 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 P4.**.** If P5
76c0: 69 73 20 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 is not zero and
76d0: 50 34 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e P4 is NULL, then
76e0: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 everything afte
76f0: 72 20 74 68 65 20 22 3a 22 20 69 73 0a 2a 2a 20 r the ":" is.**
7700: 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 omitted..**.** T
7710: 68 65 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 here is an impli
7720: 65 64 20 22 48 61 6c 74 20 30 20 30 20 30 22 20 ed "Halt 0 0 0"
7730: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 instruction inse
7740: 72 74 65 64 20 61 74 20 74 68 65 20 76 65 72 79 rted at the very
7750: 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 end of.** every
7760: 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 program. So a
7770: 6a 75 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61 jump past the la
7780: 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f st instruction o
7790: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a f the program.**
77a0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 is the same as
77b0: 65 78 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a executing Halt..
77c0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a */.case OP_Halt:
77d0: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 {. const char
77e0: 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 *zType;. const
77f0: 63 68 61 72 20 2a 7a 4c 6f 67 46 6d 74 3b 0a 20 char *zLogFmt;.
7800: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 VdbeFrame *pFra
7810: 6d 65 3b 0a 20 20 69 6e 74 20 70 63 78 3b 0a 0a me;. int pcx;..
7820: 20 20 70 63 78 20 3d 20 28 69 6e 74 29 28 70 4f pcx = (int)(pO
7830: 70 20 2d 20 61 4f 70 29 3b 0a 20 20 69 66 28 20 p - aOp);. if(
7840: 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f pOp->p1==SQLITE_
7850: 4f 4b 20 26 26 20 70 2d 3e 70 46 72 61 6d 65 20 OK && p->pFrame
7860: 29 7b 0a 20 20 20 20 2f 2a 20 48 61 6c 74 20 74 ){. /* Halt t
7870: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 he sub-program.
7880: 52 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 Return control t
7890: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 o the parent fra
78a0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 46 72 61 6d me. */. pFram
78b0: 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 e = p->pFrame;.
78c0: 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 p->pFrame = p
78d0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 0a Frame->pParent;.
78e0: 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d 2d 3b p->nFrame--;
78f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
7900: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 SetChanges(db, p
7910: 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 ->nChange);.
7920: 70 63 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 pcx = sqlite3Vdb
7930: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 eFrameRestore(pF
7940: 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61 73 74 52 rame);. lastR
7950: 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52 owid = db->lastR
7960: 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 4f owid;. if( pO
7970: 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65 p->p2==OE_Ignore
7980: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 ){. /* Ins
7990: 74 72 75 63 74 69 6f 6e 20 70 63 78 20 69 73 20 truction pcx is
79a0: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74 the OP_Program t
79b0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 hat invoked the
79c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20 sub-program .
79d0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 ** currently
79e0: 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20 49 66 being halted. If
79f0: 20 74 68 65 20 70 32 20 69 6e 73 74 72 75 63 74 the p2 instruct
7a00: 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50 5f 48 ion of this OP_H
7a10: 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 alt. ** ins
7a20: 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65 74 20 truction is set
7a30: 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68 to OE_Ignore, th
7a40: 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 en the sub-progr
7a50: 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67 0a 20 am is throwing.
7a60: 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 ** an IGNOR
7a70: 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20 E exception. In
7a80: 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70 20 74 this case jump t
7a90: 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70 o the address sp
7aa0: 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 2a 2a ecified. **
7ab0: 20 61 73 20 74 68 65 20 70 32 20 6f 66 20 74 68 as the p2 of th
7ac0: 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f e calling OP_Pro
7ad0: 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 gram. */.
7ae0: 70 63 78 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 78 pcx = p->aOp[pcx
7af0: 5d 2e 70 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 ].p2-1;. }.
7b00: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a aOp = p->aOp;.
7b10: 20 20 20 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d aMem = p->aM
7b20: 65 6d 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 em;. pOp = &a
7b30: 4f 70 5b 70 63 78 5d 3b 0a 20 20 20 20 62 72 65 Op[pcx];. bre
7b40: 61 6b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 ak;. }. p->rc
7b50: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e = pOp->p1;. p->
7b60: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28 75 errorAction = (u
7b70: 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 8)pOp->p2;. p->
7b80: 70 63 20 3d 20 70 63 78 3b 0a 20 20 69 66 28 20 pc = pcx;. if(
7b90: 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 69 66 28 p->rc ){. if(
7ba0: 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 pOp->p5 ){.
7bb0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
7bc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 har * const azTy
7bd0: 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e 55 pe[] = { "NOT NU
7be0: 4c 4c 22 2c 20 22 55 4e 49 51 55 45 22 2c 20 22 LL", "UNIQUE", "
7bf0: 43 48 45 43 4b 22 2c 0a 20 20 20 20 20 20 20 20 CHECK",.
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c20: 20 20 20 20 20 22 46 4f 52 45 49 47 4e 20 4b 45 "FOREIGN KE
7c30: 59 22 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 Y" };. asse
7c40: 72 74 28 20 70 4f 70 2d 3e 70 35 3e 3d 31 20 26 rt( pOp->p5>=1 &
7c50: 26 20 70 4f 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a & pOp->p5<=4 );.
7c60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
7c70: 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 pOp->p5==1 );.
7c80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f testcase( pO
7c90: 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20 20 20 20 p->p5==2 );.
7ca0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d testcase( pOp-
7cb0: 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 >p5==3 );.
7cc0: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 testcase( pOp->p
7cd0: 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 7a 54 5==4 );. zT
7ce0: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 4f 70 ype = azType[pOp
7cf0: 2d 3e 70 35 2d 31 5d 3b 0a 20 20 20 20 7d 65 6c ->p5-1];. }el
7d00: 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 se{. zType
7d10: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 = 0;. }. a
7d20: 73 73 65 72 74 28 20 7a 54 79 70 65 21 3d 30 20 ssert( zType!=0
7d30: 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 || pOp->p4.z!=0
7d40: 29 3b 0a 20 20 20 20 7a 4c 6f 67 46 6d 74 20 3d );. zLogFmt =
7d50: 20 22 61 62 6f 72 74 20 61 74 20 25 64 20 69 6e "abort at %d in
7d60: 20 5b 25 73 5d 3a 20 25 73 22 3b 0a 20 20 20 20 [%s]: %s";.
7d70: 69 66 28 20 7a 54 79 70 65 20 26 26 20 70 4f 70 if( zType && pOp
7d80: 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 20 20 ->p4.z ){.
7d90: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 sqlite3VdbeError
7da0: 28 70 2c 20 22 25 73 20 63 6f 6e 73 74 72 61 69 (p, "%s constrai
7db0: 6e 74 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 nt failed: %s",
7dc0: 7a 54 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 7a zType, pOp->p4.z
7dd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
7de0: 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 pOp->p4.z ){.
7df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 sqlite3VdbeE
7e00: 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 70 4f rror(p, "%s", pO
7e10: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 65 p->p4.z);. }e
7e20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 lse{. sqlit
7e30: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 e3VdbeError(p, "
7e40: 25 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 %s constraint fa
7e50: 69 6c 65 64 22 2c 20 7a 54 79 70 65 29 3b 0a 20 iled", zType);.
7e60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
7e70: 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 7a 4c _log(pOp->p1, zL
7e80: 6f 67 46 6d 74 2c 20 70 63 78 2c 20 70 2d 3e 7a ogFmt, pcx, p->z
7e90: 53 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 Sql, p->zErrMsg)
7ea0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c ;. }. rc = sql
7eb0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b ite3VdbeHalt(p);
7ec0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 . assert( rc==S
7ed0: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 QLITE_BUSY || rc
7ee0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 ==SQLITE_OK || r
7ef0: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 c==SQLITE_ERROR
7f00: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c );. if( rc==SQL
7f10: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 ITE_BUSY ){.
7f20: 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c p->rc = rc = SQL
7f30: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 ITE_BUSY;. }els
7f40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 e{. assert( r
7f50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 c==SQLITE_OK ||
7f60: 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 (p->rc&0xff)==SQ
7f70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
7f80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 );. assert( r
7f90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 c==SQLITE_OK ||
7fa0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e db->nDeferredCon
7fb0: 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 s>0 || db->nDefe
7fc0: 72 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b rredImmCons>0 );
7fd0: 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 . rc = p->rc
7fe0: 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a ? SQLITE_ERROR :
7ff0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 SQLITE_DONE;.
8000: 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 }. goto vdbe_re
8010: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f turn;.}../* Opco
8020: 64 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50 de: Integer P1 P
8030: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 2 * * *.** Synop
8040: 73 69 73 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a sis: r[P2]=P1.**
8050: 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20 69 .** The 32-bit i
8060: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 31 20 nteger value P1
8070: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 is written into
8080: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a register P2..*/.
8090: 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a case OP_Integer:
80a0: 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 { /* ou
80b0: 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f t2 */. pOut = o
80c0: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c ut2Prerelease(p,
80d0: 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 pOp);. pOut->u
80e0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 .i = pOp->p1;.
80f0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
8100: 6f 64 65 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 ode: Int64 * P2
8110: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 * P4 *.** Synops
8120: 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a is: r[P2]=P4.**.
8130: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 ** P4 is a point
8140: 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 er to a 64-bit i
8150: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a nteger value..**
8160: 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 Write that valu
8170: 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 e into register
8180: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 P2..*/.case OP_I
8190: 6e 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 nt64: {
81a0: 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 /* out2 */. p
81b0: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c Out = out2Prerel
81c0: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 ease(p, pOp);.
81d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e assert( pOp->p4.
81e0: 70 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 pI64!=0 );. pOu
81f0: 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 t->u.i = *pOp->p
8200: 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 4.pI64;. break;
8210: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 .}..#ifndef SQLI
8220: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 TE_OMIT_FLOATING
8230: 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 _POINT./* Opcode
8240: 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 : Real * P2 * P4
8250: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
8260: 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 r[P2]=P4.**.** P
8270: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 4 is a pointer t
8280: 6f 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 o a 64-bit float
8290: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e ing point value.
82a0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 .** Write that v
82b0: 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 alue into regist
82c0: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f er P2..*/.case O
82d0: 50 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 P_Real: {
82e0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 /* same as
82f0: 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 20 2a TK_FLOAT, out2 *
8300: 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 /. pOut = out2P
8310: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 rerelease(p, pOp
8320: 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 );. pOut->flags
8330: 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 = MEM_Real;. a
8340: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 ssert( !sqlite3I
8350: 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 sNaN(*pOp->p4.pR
8360: 65 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e eal) );. pOut->
8370: 75 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 u.r = *pOp->p4.p
8380: 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d Real;. break;.}
8390: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f .#endif../* Opco
83a0: 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50 32 de: String8 * P2
83b0: 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 * P4 *.** Synop
83c0: 73 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 0a sis: r[P2]='P4'.
83d0: 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 **.** P4 points
83e0: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 to a nul termina
83f0: 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 ted UTF-8 string
8400: 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 . This opcode is
8410: 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a transformed .**
8420: 20 69 6e 74 6f 20 61 20 53 74 72 69 6e 67 20 6f into a String o
8430: 70 63 6f 64 65 20 62 65 66 6f 72 65 20 69 74 20 pcode before it
8440: 69 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 is executed for
8450: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 20 the first time.
8460: 20 44 75 72 69 6e 67 0a 2a 2a 20 74 68 69 73 20 During.** this
8470: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 transformation,
8480: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 the length of st
8490: 72 69 6e 67 20 50 34 20 69 73 20 63 6f 6d 70 75 ring P4 is compu
84a0: 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a ted and stored.*
84b0: 2a 20 61 73 20 74 68 65 20 50 31 20 70 61 72 61 * as the P1 para
84c0: 6d 65 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f meter..*/.case O
84d0: 50 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 P_String8: {
84e0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 /* same as
84f0: 54 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 20 TK_STRING, out2
8500: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 */. assert( pOp
8510: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 ->p4.z!=0 );. p
8520: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c Out = out2Prerel
8530: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 ease(p, pOp);.
8540: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 pOp->opcode = OP
8550: 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e _String;. pOp->
8560: 70 31 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c p1 = sqlite3Strl
8570: 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b en30(pOp->p4.z);
8580: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
8590: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 _OMIT_UTF16. if
85a0: 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51 4c 49 ( encoding!=SQLI
85b0: 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 72 TE_UTF8 ){. r
85c0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d c = sqlite3VdbeM
85d0: 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 emSetStr(pOut, p
85e0: 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 Op->p4.z, -1, SQ
85f0: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 LITE_UTF8, SQLIT
8600: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 E_STATIC);. i
8610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f f( rc==SQLITE_TO
8620: 4f 42 49 47 20 29 20 67 6f 74 6f 20 74 6f 6f 5f OBIG ) goto too_
8630: 62 69 67 3b 0a 20 20 20 20 69 66 28 20 53 51 4c big;. if( SQL
8640: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 ITE_OK!=sqlite3V
8650: 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e dbeChangeEncodin
8660: 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 g(pOut, encoding
8670: 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b ) ) goto no_mem;
8680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 . assert( pOu
8690: 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 t->szMalloc>0 &&
86a0: 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d pOut->zMalloc==
86b0: 70 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 pOut->z );. a
86c0: 73 73 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 ssert( VdbeMemDy
86d0: 6e 61 6d 69 63 28 70 4f 75 74 29 3d 3d 30 20 29 namic(pOut)==0 )
86e0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 ;. pOut->szMa
86f0: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f lloc = 0;. pO
8700: 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d ut->flags |= MEM
8710: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 69 66 28 _Static;. if(
8720: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 pOp->p4type==P4
8730: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 _DYNAMIC ){.
8740: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
8750: 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a db, pOp->p4.z);.
8760: 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 }. pOp->p
8770: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 4type = P4_DYNAM
8780: 49 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e IC;. pOp->p4.
8790: 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 z = pOut->z;.
87a0: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d pOp->p1 = pOut-
87b0: 3e 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 >n;. }.#endif.
87c0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d if( pOp->p1>db-
87d0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c >aLimit[SQLITE_L
87e0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a IMIT_LENGTH] ){.
87f0: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 goto too_big
8800: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20 ;. }. /* Fall
8810: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e through to the n
8820: 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72 ext case, OP_Str
8830: 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f ing */.}. ./* O
8840: 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31 pcode: String P1
8850: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 P2 P3 P4 P5.**
8860: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d Synopsis: r[P2]=
8870: 27 50 34 27 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 'P4' (len=P1).**
8880: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 76 .** The string v
8890: 61 6c 75 65 20 50 34 20 6f 66 20 6c 65 6e 67 74 alue P4 of lengt
88a0: 68 20 50 31 20 28 62 79 74 65 73 29 20 69 73 20 h P1 (bytes) is
88b0: 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 stored in regist
88c0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 er P2..**.** If
88d0: 50 35 21 3d 30 20 61 6e 64 20 74 68 65 20 63 6f P5!=0 and the co
88e0: 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 ntent of registe
88f0: 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 r P3 is greater
8900: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 0a than zero, then.
8910: 2a 2a 20 74 68 65 20 64 61 74 61 74 79 70 65 20 ** the datatype
8920: 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 of the register
8930: 50 32 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 P2 is converted
8940: 74 6f 20 42 4c 4f 42 2e 20 20 54 68 65 20 63 6f to BLOB. The co
8950: 6e 74 65 6e 74 20 69 73 0a 2a 2a 20 74 68 65 20 ntent is.** the
8960: 73 61 6d 65 20 73 65 71 75 65 6e 63 65 20 6f 66 same sequence of
8970: 20 62 79 74 65 73 2c 20 69 74 20 69 73 20 6d 65 bytes, it is me
8980: 72 65 6c 79 20 69 6e 74 65 72 70 72 65 74 65 64 rely interpreted
8990: 20 61 73 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 as a BLOB inste
89a0: 61 64 0a 2a 2a 20 6f 66 20 61 20 73 74 72 69 6e ad.** of a strin
89b0: 67 2c 20 61 73 20 69 66 20 69 74 20 68 61 64 20 g, as if it had
89c0: 62 65 65 6e 20 43 41 53 54 2e 0a 2a 2f 0a 63 61 been CAST..*/.ca
89d0: 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b 20 se OP_String: {
89e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 /* out2
89f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f */. assert( pO
8a00: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 p->p4.z!=0 );.
8a10: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 pOut = out2Prere
8a20: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 lease(p, pOp);.
8a30: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d pOut->flags = M
8a40: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 EM_Str|MEM_Stati
8a50: 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f c|MEM_Term;. pO
8a60: 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e ut->z = pOp->p4.
8a70: 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 z;. pOut->n = p
8a80: 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e Op->p1;. pOut->
8a90: 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a enc = encoding;.
8aa0: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f UPDATE_MAX_BLO
8ab0: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 69 BSIZE(pOut);. i
8ac0: 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 f( pOp->p5 ){.
8ad0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
8ae0: 33 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 3>0 );. asser
8af0: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e t( pOp->p3<=(p->
8b00: 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 nMem-p->nCursor)
8b10: 20 29 3b 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 );. pIn3 = &
8b20: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 aMem[pOp->p3];.
8b30: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d assert( pIn3-
8b40: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 >flags & MEM_Int
8b50: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 33 );. if( pIn3
8b60: 2d 3e 75 2e 69 20 29 20 70 4f 75 74 2d 3e 66 6c ->u.i ) pOut->fl
8b70: 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d ags = MEM_Blob|M
8b80: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 EM_Static|MEM_Te
8b90: 72 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b rm;. }. break;
8ba0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e .}../* Opcode: N
8bb0: 75 6c 6c 20 50 31 20 50 32 20 50 33 20 2a 20 2a ull P1 P2 P3 * *
8bc0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 72 .** Synopsis: r
8bd0: 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a [P2..P3]=NULL.**
8be0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e 55 4c 4c .** Write a NULL
8bf0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 into registers
8c00: 50 32 2e 20 20 49 66 20 50 33 20 67 72 65 61 74 P2. If P3 great
8c10: 65 72 20 74 68 61 6e 20 50 32 2c 20 74 68 65 6e er than P2, then
8c20: 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 4e also write.** N
8c30: 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 ULL into registe
8c40: 72 20 50 33 20 61 6e 64 20 65 76 65 72 79 20 72 r P3 and every r
8c50: 65 67 69 73 74 65 72 20 69 6e 20 62 65 74 77 65 egister in betwe
8c60: 65 6e 20 50 32 20 61 6e 64 20 50 33 2e 20 20 49 en P2 and P3. I
8c70: 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73 73 20 f P3.** is less
8c80: 74 68 61 6e 20 50 32 20 28 74 79 70 69 63 61 6c than P2 (typical
8c90: 6c 79 20 50 33 20 69 73 20 7a 65 72 6f 29 20 74 ly P3 is zero) t
8ca0: 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73 74 65 hen only registe
8cb0: 72 20 50 32 20 69 73 0a 2a 2a 20 73 65 74 20 74 r P2 is.** set t
8cc0: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 o NULL..**.** If
8cd0: 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 73 the P1 value is
8ce0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 non-zero, then
8cf0: 61 6c 73 6f 20 73 65 74 20 74 68 65 20 4d 45 4d also set the MEM
8d00: 5f 43 6c 65 61 72 65 64 20 66 6c 61 67 20 73 6f _Cleared flag so
8d10: 20 74 68 61 74 0a 2a 2a 20 4e 55 4c 4c 20 76 61 that.** NULL va
8d20: 6c 75 65 73 20 77 69 6c 6c 20 6e 6f 74 20 63 6f lues will not co
8d30: 6d 70 61 72 65 20 65 71 75 61 6c 20 65 76 65 6e mpare equal even
8d40: 20 69 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 if SQLITE_NULLE
8d50: 51 20 69 73 20 73 65 74 20 6f 6e 0a 2a 2a 20 4f Q is set on.** O
8d60: 50 5f 4e 65 20 6f 72 20 4f 50 5f 45 71 2e 0a 2a P_Ne or OP_Eq..*
8d70: 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 /.case OP_Null:
8d80: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f { /* o
8d90: 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 ut2 */. int cnt
8da0: 3b 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67 ;. u16 nullFlag
8db0: 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 ;. pOut = out2P
8dc0: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 rerelease(p, pOp
8dd0: 29 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e );. cnt = pOp->
8de0: 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 p3-pOp->p2;. as
8df0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 sert( pOp->p3<=(
8e00: 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 p->nMem-p->nCurs
8e10: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 or) );. pOut->f
8e20: 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 20 lags = nullFlag
8e30: 3d 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45 4d = pOp->p1 ? (MEM
8e40: 5f 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72 65 _Null|MEM_Cleare
8e50: 64 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 d) : MEM_Null;.
8e60: 20 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b while( cnt>0 ){
8e70: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 . pOut++;.
8e80: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 memAboutToChang
8e90: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 e(p, pOut);.
8ea0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
8eb0: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 tNull(pOut);.
8ec0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e pOut->flags = n
8ed0: 75 6c 6c 46 6c 61 67 3b 0a 20 20 20 20 63 6e 74 ullFlag;. cnt
8ee0: 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b --;. }. break;
8ef0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 .}../* Opcode: S
8f00: 6f 66 74 4e 75 6c 6c 20 50 31 20 2a 20 2a 20 2a oftNull P1 * * *
8f10: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
8f20: 20 72 5b 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a r[P1]=NULL.**.*
8f30: 2a 20 53 65 74 20 72 65 67 69 73 74 65 72 20 50 * Set register P
8f40: 31 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 61 1 to have the va
8f50: 6c 75 65 20 4e 55 4c 4c 20 61 73 20 73 65 65 6e lue NULL as seen
8f60: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 by the OP_MakeR
8f70: 65 63 6f 72 64 0a 2a 2a 20 69 6e 73 74 72 75 63 ecord.** instruc
8f80: 74 69 6f 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 tion, but do not
8f90: 20 66 72 65 65 20 61 6e 79 20 73 74 72 69 6e 67 free any string
8fa0: 20 6f 72 20 62 6c 6f 62 20 6d 65 6d 6f 72 79 20 or blob memory
8fb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a associated with.
8fc0: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 2c ** the register,
8fd0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 so that if the
8fe0: 76 61 6c 75 65 20 77 61 73 20 61 20 73 74 72 69 value was a stri
8ff0: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 20 ng or blob that
9000: 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c was.** previousl
9010: 79 20 63 6f 70 69 65 64 20 75 73 69 6e 67 20 4f y copied using O
9020: 50 5f 53 43 6f 70 79 2c 20 74 68 65 20 63 6f 70 P_SCopy, the cop
9030: 69 65 73 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 ies will continu
9040: 65 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 0a 2a e to be valid..*
9050: 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 66 74 4e 75 /.case OP_SoftNu
9060: 6c 6c 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 ll: {. assert(
9070: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 pOp->p1>0 && pOp
9080: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 ->p1<=(p->nMem-p
9090: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 ->nCursor) );.
90a0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 pOut = &aMem[pOp
90b0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66 ->p1];. pOut->f
90c0: 6c 61 67 73 20 3d 20 28 70 4f 75 74 2d 3e 66 6c lags = (pOut->fl
90d0: 61 67 73 7c 4d 45 4d 5f 4e 75 6c 6c 29 26 7e 4d ags|MEM_Null)&~M
90e0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 EM_Undefined;.
90f0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
9100: 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20 50 32 20 ode: Blob P1 P2
9110: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 * P4 *.** Synops
9120: 69 73 3a 20 72 5b 50 32 5d 3d 50 34 20 28 6c 65 is: r[P2]=P4 (le
9130: 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 50 34 20 70 n=P1).**.** P4 p
9140: 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f 62 20 oints to a blob
9150: 6f 66 20 64 61 74 61 20 50 31 20 62 79 74 65 73 of data P1 bytes
9160: 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20 74 68 long. Store th
9170: 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20 72 65 is.** blob in re
9180: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 gister P2..*/.ca
9190: 73 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20 20 20 se OP_Blob: {
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
91b0: 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 out2 */. assert
91c0: 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53 51 4c ( pOp->p1 <= SQL
91d0: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 ITE_MAX_LENGTH )
91e0: 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 ;. pOut = out2P
91f0: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 rerelease(p, pOp
9200: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
9210: 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 MemSetStr(pOut,
9220: 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e pOp->p4.z, pOp->
9230: 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 75 p1, 0, 0);. pOu
9240: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e t->enc = encodin
9250: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f g;. UPDATE_MAX_
9260: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a BLOBSIZE(pOut);.
9270: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f break;.}../* O
9280: 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c 65 20 pcode: Variable
9290: 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 P1 P2 * P4 *.**
92a0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d Synopsis: r[P2]=
92b0: 70 61 72 61 6d 65 74 65 72 28 50 31 2c 50 34 29 parameter(P1,P4)
92c0: 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 .**.** Transfer
92d0: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f the values of bo
92e0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 50 31 und parameter P1
92f0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 into register P
9300: 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2.**.** If the p
9310: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61 6d 65 arameter is name
9320: 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61 6d 65 d, then its name
9330: 20 61 70 70 65 61 72 73 20 69 6e 20 50 34 2e 0a appears in P4..
9340: 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 ** The P4 value
9350: 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 is used by sqlit
9360: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 e3_bind_paramete
9370: 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63 61 73 r_name()..*/.cas
9380: 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a 20 7b e OP_Variable: {
9390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f /* o
93a0: 75 74 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 ut2 */. Mem *pV
93b0: 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c ar; /* Val
93c0: 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73 66 65 ue being transfe
93d0: 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 rred */.. asser
93e0: 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 t( pOp->p1>0 &&
93f0: 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61 72 pOp->p1<=p->nVar
9400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f );. assert( pO
9410: 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f p->p4.z==0 || pO
9420: 70 2d 3e 70 34 2e 7a 3d 3d 70 2d 3e 61 7a 56 61 p->p4.z==p->azVa
9430: 72 5b 70 4f 70 2d 3e 70 31 2d 31 5d 20 29 3b 0a r[pOp->p1-1] );.
9440: 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61 pVar = &p->aVa
9450: 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a r[pOp->p1 - 1];.
9460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 if( sqlite3Vdb
9470: 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29 eMemTooBig(pVar)
9480: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f ){. goto too
9490: 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 _big;. }. pOut
94a0: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 = out2Prereleas
94b0: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73 71 6c e(p, pOp);. sql
94c0: 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c ite3VdbeMemShall
94d0: 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 owCopy(pOut, pVa
94e0: 72 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a r, MEM_Static);.
94f0: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f UPDATE_MAX_BLO
9500: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 BSIZE(pOut);. b
9510: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f reak;.}../* Opco
9520: 64 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50 de: Move P1 P2 P
9530: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 3 * *.** Synopsi
9540: 73 3a 20 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50 s: r[P2@P3]=r[P
9550: 31 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 1@P3].**.** Move
9560: 20 74 68 65 20 50 33 20 76 61 6c 75 65 73 20 69 the P3 values i
9570: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50 n register P1..P
9580: 31 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 1+P3-1 over into
9590: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 50 32 .** registers P2
95a0: 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 ..P2+P3-1. Regi
95b0: 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d sters P1..P1+P3-
95c0: 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 1 are.** left ho
95d0: 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 lding a NULL. I
95e0: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f t is an error fo
95f0: 72 20 72 65 67 69 73 74 65 72 20 72 61 6e 67 65 r register range
9600: 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 s.** P1..P1+P3-1
9610: 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 and P2..P2+P3-1
9620: 20 74 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74 to overlap. It
9630: 20 69 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 is an error.**
9640: 66 6f 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73 for P3 to be les
9650: 73 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 s than 1..*/.cas
9660: 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 e OP_Move: {. i
9670: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 nt n;
9680: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 /* Number of reg
9690: 69 73 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 isters left to c
96a0: 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b opy */. int p1;
96b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 /* Reg
96c0: 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 ister to copy fr
96d0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 om */. int p2;
96e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 /* Regi
96f0: 73 74 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 ster to copy to
9700: 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 */.. n = pOp->p
9710: 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 3;. p1 = pOp->p
9720: 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 1;. p2 = pOp->p
9730: 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 2;. assert( n>0
9740: 20 26 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 && p1>0 && p2>0
9750: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 );. assert( p1
9760: 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d +n<=p2 || p2+n<=
9770: 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 p1 );.. pIn1 =
9780: 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 &aMem[p1];. pOu
9790: 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 t = &aMem[p2];.
97a0: 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 do{. assert(
97b0: 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d pOut<=&aMem[(p-
97c0: 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 >nMem-p->nCursor
97d0: 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 )] );. assert
97e0: 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 28 70 ( pIn1<=&aMem[(p
97f0: 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f ->nMem-p->nCurso
9800: 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 r)] );. asser
9810: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 t( memIsValid(pI
9820: 6e 31 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 n1) );. memAb
9830: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 outToChange(p, p
9840: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 Out);. sqlite
9850: 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 3VdbeMemMove(pOu
9860: 74 2c 20 70 49 6e 31 29 3b 0a 23 69 66 64 65 66 t, pIn1);.#ifdef
9870: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
9880: 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f if( pOut->pSco
9890: 70 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 pyFrom>=&aMem[p1
98a0: 5d 20 26 26 20 70 4f 75 74 2d 3e 70 53 63 6f 70 ] && pOut->pScop
98b0: 79 46 72 6f 6d 3c 70 4f 75 74 20 29 7b 0a 20 20 yFrom<pOut ){.
98c0: 20 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 pOut->pScopy
98d0: 46 72 6f 6d 20 2b 3d 20 70 4f 70 2d 3e 70 32 20 From += pOp->p2
98e0: 2d 20 70 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 - p1;. }.#end
98f0: 69 66 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 if. Deephemer
9900: 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 20 alize(pOut);.
9910: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 REGISTER_TRACE(
9920: 70 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 p2++, pOut);.
9930: 20 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 pIn1++;. pOu
9940: 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d t++;. }while( -
9950: 2d 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d -n );. break;.}
9960: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70 ../* Opcode: Cop
9970: 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a y P1 P2 P3 * *.*
9980: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 * Synopsis: r[P2
9990: 40 50 33 2b 31 5d 3d 72 5b 50 31 40 50 33 2b 31 @P3+1]=r[P1@P3+1
99a0: 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 ].**.** Make a c
99b0: 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 opy of registers
99c0: 20 50 31 2e 2e 50 31 2b 50 33 20 69 6e 74 6f 20 P1..P1+P3 into
99d0: 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32 registers P2..P2
99e0: 2b 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 +P3..**.** This
99f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 instruction make
9a00: 73 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 s a deep copy of
9a10: 20 74 68 65 20 76 61 6c 75 65 2e 20 20 41 20 64 the value. A d
9a20: 75 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20 6d uplicate.** is m
9a30: 61 64 65 20 6f 66 20 61 6e 79 20 73 74 72 69 6e ade of any strin
9a40: 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74 61 g or blob consta
9a50: 6e 74 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f 50 nt. See also OP
9a60: 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 _SCopy..*/.case
9a70: 4f 50 5f 43 6f 70 79 3a 20 7b 0a 20 20 69 6e 74 OP_Copy: {. int
9a80: 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e n;.. n = pOp->
9a90: 70 33 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d p3;. pIn1 = &aM
9aa0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 em[pOp->p1];. p
9ab0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d Out = &aMem[pOp-
9ac0: 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 >p2];. assert(
9ad0: 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 pOut!=pIn1 );.
9ae0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 while( 1 ){.
9af0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 sqlite3VdbeMemSh
9b00: 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 allowCopy(pOut,
9b10: 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 pIn1, MEM_Ephem)
9b20: 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 ;. Deephemera
9b30: 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 23 69 66 64 lize(pOut);.#ifd
9b40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
9b50: 20 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 pOut->pScopy
9b60: 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 From = 0;.#endif
9b70: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 . REGISTER_TR
9b80: 41 43 45 28 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d ACE(pOp->p2+pOp-
9b90: 3e 70 33 2d 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 >p3-n, pOut);.
9ba0: 20 20 69 66 28 20 28 6e 2d 2d 29 3d 3d 30 20 29 if( (n--)==0 )
9bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 75 74 break;. pOut
9bc0: 2b 2b 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a ++;. pIn1++;.
9bd0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a }. break;.}..
9be0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70 79 /* Opcode: SCopy
9bf0: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 P1 P2 * * *.**
9c00: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d Synopsis: r[P2]=
9c10: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 r[P1].**.** Make
9c20: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 a shallow copy
9c30: 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 of register P1 i
9c40: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e nto register P2.
9c50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 .**.** This inst
9c60: 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 ruction makes a
9c70: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 shallow copy of
9c80: 74 68 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 the value. If t
9c90: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 he value.** is a
9ca0: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c string or blob,
9cb0: 20 74 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 then the copy i
9cc0: 73 20 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 s only a pointer
9cd0: 20 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 to the.** origi
9ce0: 6e 61 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 nal and hence if
9cf0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 the original ch
9d00: 61 6e 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 anges so will th
9d10: 65 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 e copy..** Worse
9d20: 2c 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 , if the origina
9d30: 6c 20 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 l is deallocated
9d40: 2c 20 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d , the copy becom
9d50: 65 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 es invalid..** T
9d60: 68 75 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 hus the program
9d70: 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 must guarantee t
9d80: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c hat the original
9d90: 20 77 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 will not change
9da0: 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c .** during the l
9db0: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 ifetime of the c
9dc0: 6f 70 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 opy. Use OP_Cop
9dd0: 79 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 y to make a comp
9de0: 6c 65 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f lete.** copy..*/
9df0: 0a 63 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 .case OP_SCopy:
9e00: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 { /*
9e10: 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d out2 */. pIn1 =
9e20: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b &aMem[pOp->p1];
9e30: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b . pOut = &aMem[
9e40: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 pOp->p2];. asse
9e50: 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 rt( pOut!=pIn1 )
9e60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d ;. sqlite3VdbeM
9e70: 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f emShallowCopy(pO
9e80: 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 ut, pIn1, MEM_Ep
9e90: 68 65 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c hem);.#ifdef SQL
9ea0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 ITE_DEBUG. if(
9eb0: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d pOut->pScopyFrom
9ec0: 3d 3d 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f ==0 ) pOut->pSco
9ed0: 70 79 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 pyFrom = pIn1;.#
9ee0: 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d endif. break;.}
9ef0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 ../* Opcode: Int
9f00: 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a Copy P1 P2 * * *
9f10: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b .** Synopsis: r[
9f20: 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 P2]=r[P1].**.**
9f30: 54 72 61 6e 73 66 65 72 20 74 68 65 20 69 6e 74 Transfer the int
9f40: 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 eger value held
9f50: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 in register P1 i
9f60: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e nto register P2.
9f70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 .**.** This is a
9f80: 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 n optimized vers
9f90: 69 6f 6e 20 6f 66 20 53 43 6f 70 79 20 74 68 61 ion of SCopy tha
9fa0: 74 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 t works only for
9fb0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 integer.** valu
9fc0: 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 es..*/.case OP_I
9fd0: 6e 74 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 ntCopy: {
9fe0: 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a /* out2 */.
9ff0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 pIn1 = &aMem[p
a000: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 Op->p1];. asser
a010: 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 t( (pIn1->flags
a020: 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b & MEM_Int)!=0 );
a030: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b . pOut = &aMem[
a040: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 pOp->p2];. sqli
a050: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 te3VdbeMemSetInt
a060: 36 34 28 70 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 64(pOut, pIn1->u
a070: 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a .i);. break;.}.
a080: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 ./* Opcode: Resu
a090: 6c 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 ltRow P1 P2 * *
a0a0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 *.** Synopsis:
a0b0: 6f 75 74 70 75 74 3d 72 5b 50 31 40 50 32 5d 0a output=r[P1@P2].
a0c0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 **.** The regist
a0d0: 65 72 73 20 50 31 20 74 68 72 6f 75 67 68 20 50 ers P1 through P
a0e0: 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61 1+P2-1 contain a
a0f0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a single row of.*
a100: 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69 73 20 * results. This
a110: 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20 74 68 opcode causes th
a120: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 e sqlite3_step()
a130: 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61 call to termina
a140: 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53 51 te.** with an SQ
a150: 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72 6e 20 LITE_ROW return
a160: 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65 74 73 code and it sets
a170: 20 75 70 20 74 68 65 20 73 71 6c 69 74 65 33 5f up the sqlite3_
a180: 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 stmt.** structur
a190: 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 63 63 e to provide acc
a1a0: 65 73 73 20 74 6f 20 74 68 65 20 72 28 50 31 29 ess to the r(P1)
a1b0: 2e 2e 72 28 50 31 2b 50 32 2d 31 29 20 76 61 6c ..r(P1+P2-1) val
a1c0: 75 65 73 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 ues as.** the re
a1d0: 73 75 6c 74 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 sult row..*/.cas
a1e0: 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20 e OP_ResultRow:
a1f0: 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 {. Mem *pMem;.
a200: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 int i;. assert
a210: 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d ( p->nResColumn=
a220: 3d 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73 =pOp->p2 );. as
a230: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 sert( pOp->p1>0
a240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 );. assert( pOp
a250: 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d 28 70 ->p1+pOp->p2<=(p
a260: 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f ->nMem-p->nCurso
a270: 72 29 2b 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 r)+1 );..#ifndef
a280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f SQLITE_OMIT_PRO
a290: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 GRESS_CALLBACK.
a2a0: 20 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 67 /* Run the prog
a2b0: 72 65 73 73 20 63 6f 75 6e 74 65 72 20 6a 75 73 ress counter jus
a2c0: 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 t before returni
a2d0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 ng.. */. if( d
a2e0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 0a b->xProgress!=0.
a2f0: 20 20 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e && nVmStep>=n
a300: 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 0a 20 20 ProgressLimit.
a310: 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 && db->xProgres
a320: 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 s(db->pProgressA
a330: 72 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 rg)!=0. ){.
a340: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 rc = SQLITE_INTE
a350: 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 RRUPT;. goto
a360: 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b vdbe_error_halt;
a370: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f . }.#endif.. /
a380: 2a 20 49 66 20 74 68 69 73 20 73 74 61 74 65 6d * If this statem
a390: 65 6e 74 20 68 61 73 20 76 69 6f 6c 61 74 65 64 ent has violated
a3a0: 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 immediate forei
a3b0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e gn key constrain
a3c0: 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 ts, do. ** not
a3d0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 return the numbe
a3e0: 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69 66 69 r of rows modifi
a3f0: 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52 ed. And do not R
a400: 45 4c 45 41 53 45 20 74 68 65 20 73 74 61 74 65 ELEASE the state
a410: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 ment. ** transa
a420: 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20 ction. It needs
a430: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 to be rolled bac
a440: 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c k. */. if( SQL
a450: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 ITE_OK!=(rc = sq
a460: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b lite3VdbeCheckFk
a470: 28 70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 61 (p, 0)) ){. a
a480: 73 73 65 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 ssert( db->flags
a490: 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 &SQLITE_CountRow
a4a0: 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 s );. assert(
a4b0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 p->usesStmtJour
a4c0: 6e 61 6c 20 29 3b 0a 20 20 20 20 62 72 65 61 6b nal );. break
a4d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 ;. }.. /* If t
a4e0: 68 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 he SQLITE_CountR
a4f0: 6f 77 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 ows flag is set
a500: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 in sqlite3.flags
a510: 20 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a mask, then . *
a520: 2a 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 * DML statements
a530: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 invoke this opc
a540: 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68 ode to return th
a550: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 e number of rows
a560: 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 . ** modified
a570: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 to the user. Thi
a580: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 s is the only wa
a590: 79 20 74 68 61 74 20 61 20 56 4d 20 74 68 61 74 y that a VM that
a5a0: 0a 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 . ** opens a st
a5b0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 atement transact
a5c0: 69 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 ion may invoke t
a5d0: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a his opcode.. **
a5e0: 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 . ** In case th
a5f0: 69 73 20 69 73 20 73 75 63 68 20 61 20 73 74 61 is is such a sta
a600: 74 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e tement, close an
a610: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e y statement tran
a620: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 saction. ** ope
a630: 6e 65 64 20 62 79 20 74 68 69 73 20 56 4d 20 62 ned by this VM b
a640: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 efore returning
a650: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 control to the u
a660: 73 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a ser. This is to.
a670: 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 ** ensure that
a680: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 statement-trans
a690: 61 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 actions are alwa
a6a0: 79 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f ys nested, not o
a6b0: 76 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a verlapping.. **
a6c0: 20 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61 If the open sta
a6d0: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 tement-transacti
a6e0: 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 on is not closed
a6f0: 20 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20 here, then the
a700: 75 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 user. ** may st
a710: 65 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 ep another VM th
a720: 61 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e at opens its own
a730: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 statement trans
a740: 61 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a action. This. *
a750: 2a 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 * may lead to ov
a760: 65 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d erlapping statem
a770: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 ent transactions
a780: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 .. **. ** The
a790: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 statement transa
a7a0: 63 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 ction is never a
a7b0: 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 top-level trans
a7c0: 61 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 action. Hence.
a7d0: 20 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20 ** the RELEASE
a7e0: 63 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e call below can n
a7f0: 65 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a ever fail.. */.
a800: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 assert( p->iSt
a810: 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 atement==0 || db
a820: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 ->flags&SQLITE_C
a830: 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 ountRows );. rc
a840: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c = sqlite3VdbeCl
a850: 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 oseStatement(p,
a860: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
a870: 45 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 E);. if( NEVER(
a880: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 rc!=SQLITE_OK) )
a890: 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d {. break;. }
a8a0: 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 .. /* Invalidat
a8b0: 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20 e all ephemeral
a8c0: 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63 68 65 cursor row cache
a8d0: 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43 s */. p->cacheC
a8e0: 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65 43 74 tr = (p->cacheCt
a8f0: 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 r + 2)|1;.. /*
a900: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 Make sure the re
a910: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 75 72 sults of the cur
a920: 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c 30 30 rent row are \00
a930: 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a 0 terminated. *
a940: 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20 61 73 * and have an as
a950: 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20 54 68 signed type. Th
a960: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 65 e results are de
a970: 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64 20 61 -ephemeralized a
a980: 73 0a 20 20 2a 2a 20 61 20 73 69 64 65 20 65 66 s. ** a side ef
a990: 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 fect.. */. pMe
a9a0: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 m = p->pResultSe
a9b0: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 t = &aMem[pOp->p
a9c0: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 1];. for(i=0; i
a9d0: 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a <pOp->p2; i++){.
a9e0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 assert( memI
a9f0: 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69 5d 29 sValid(&pMem[i])
aa00: 20 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65 );. Deepheme
aa10: 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 ralize(&pMem[i])
aa20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 ;. assert( (p
aa30: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d Mem[i].flags & M
aa40: 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20 20 20 EM_Ephem)==0.
aa50: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 65 || (pMe
aa60: 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 4d 45 m[i].flags & (ME
aa70: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 M_Str|MEM_Blob))
aa80: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 ==0 );. sqlit
aa90: 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d e3VdbeMemNulTerm
aaa0: 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b inate(&pMem[i]);
aab0: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 . REGISTER_TR
aac0: 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 ACE(pOp->p1+i, &
aad0: 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 pMem[i]);. }.
aae0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 if( db->mallocFa
aaf0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d iled ) goto no_m
ab00: 65 6d 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e em;.. /* Return
ab10: 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f SQLITE_ROW. */
ab20: 0a 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 . p->pc = (int)
ab30: 28 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b (pOp - aOp) + 1;
ab40: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 . rc = SQLITE_R
ab50: 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f OW;. goto vdbe_
ab60: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 return;.}../* Op
ab70: 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 code: Concat P1
ab80: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e P2 P3 * *.** Syn
ab90: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 opsis: r[P3]=r[P
aba0: 32 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41 2]+r[P1].**.** A
abb0: 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 dd the text in r
abc0: 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 egister P1 onto
abd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 the end of the t
abe0: 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 ext in.** regist
abf0: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 er P2 and store
ac00: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 the result in re
ac10: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 gister P3..** If
ac20: 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f either the P1 o
ac30: 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 r P2 text are NU
ac40: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 LL then store NU
ac50: 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 LL in P3..**.**
ac60: 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a P3 = P2 || P1.
ac70: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 **.** It is ille
ac80: 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 gal for P1 and P
ac90: 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 3 to be the same
aca0: 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 register. Somet
acb0: 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 imes,.** if P3 i
acc0: 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 s the same regis
acd0: 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 ter as P2, the i
ace0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 mplementation is
acf0: 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 able.** to avoi
ad00: 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f d a memcpy()..*/
ad10: 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a .case OP_Concat:
ad20: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 { /*
ad30: 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 same as TK_CONCA
ad40: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 T, in1, in2, out
ad50: 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3 */. i64 nByte
ad60: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 ;.. pIn1 = &aMe
ad70: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 m[pOp->p1];. pI
ad80: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e n2 = &aMem[pOp->
ad90: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 p2];. pOut = &a
ada0: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 Mem[pOp->p3];.
adb0: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f assert( pIn1!=pO
adc0: 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e ut );. if( (pIn
add0: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 1->flags | pIn2-
ade0: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 >flags) & MEM_Nu
adf0: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 ll ){. sqlite
ae00: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 3VdbeMemSetNull(
ae10: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b pOut);. break
ae20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61 ;. }. if( Expa
ae30: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 ndBlob(pIn1) ||
ae40: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 ExpandBlob(pIn2)
ae50: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a ) goto no_mem;.
ae60: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 Stringify(pIn1
ae70: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 , encoding);. S
ae80: 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 tringify(pIn2, e
ae90: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 ncoding);. nByt
aea0: 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 e = pIn1->n + pI
aeb0: 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 n2->n;. if( nBy
aec0: 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 te>db->aLimit[SQ
aed0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 LITE_LIMIT_LENGT
aee0: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 H] ){. goto t
aef0: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66 oo_big;. }. if
af00: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d ( sqlite3VdbeMem
af10: 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 Grow(pOut, (int)
af20: 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70 nByte+2, pOut==p
af30: 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f In2) ){. goto
af40: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 4d no_mem;. }. M
af50: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f emSetTypeFlag(pO
af60: 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 ut, MEM_Str);.
af70: 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 if( pOut!=pIn2 )
af80: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 {. memcpy(pOu
af90: 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 t->z, pIn2->z, p
afa0: 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d In2->n);. }. m
afb0: 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 emcpy(&pOut->z[p
afc0: 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a In2->n], pIn1->z
afd0: 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f , pIn1->n);. pO
afe0: 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a ut->z[nByte]=0;.
aff0: 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b pOut->z[nByte+
b000: 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 1] = 0;. pOut->
b010: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 flags |= MEM_Ter
b020: 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 m;. pOut->n = (
b030: 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 int)nByte;. pOu
b040: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e t->enc = encodin
b050: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f g;. UPDATE_MAX_
b060: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a BLOBSIZE(pOut);.
b070: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f break;.}../* O
b080: 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32 pcode: Add P1 P2
b090: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 P3 * *.** Synop
b0a0: 73 69 73 3a 20 20 72 5b 50 33 5d 3d 72 5b 50 31 sis: r[P3]=r[P1
b0b0: 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 ]+r[P2].**.** Ad
b0c0: 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 d the value in r
b0d0: 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 egister P1 to th
b0e0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 e value in regis
b0f0: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 ter P2.** and st
b100: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 ore the result i
b110: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a n register P3..*
b120: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 * If either inpu
b130: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 t is NULL, the r
b140: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a esult is NULL..*
b150: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c /./* Opcode: Mul
b160: 74 69 70 6c 79 20 50 31 20 50 32 20 50 33 20 2a tiply P1 P2 P3 *
b170: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
b180: 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50 r[P3]=r[P1]*r[P
b190: 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 2].**.**.** Mult
b1a0: 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65 20 69 iply the value i
b1b0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 n register P1 by
b1c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 the value in re
b1d0: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 gister P2.** and
b1e0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c store the resul
b1f0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 t in register P3
b200: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 ..** If either i
b210: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 nput is NULL, th
b220: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c e result is NULL
b230: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ..*/./* Opcode:
b240: 53 75 62 74 72 61 63 74 20 50 31 20 50 32 20 50 Subtract P1 P2 P
b250: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 3 * *.** Synopsi
b260: 73 3a 20 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d s: r[P3]=r[P2]-
b270: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74 r[P1].**.** Subt
b280: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 ract the value i
b290: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 66 72 n register P1 fr
b2a0: 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 om the value in
b2b0: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 register P2.** a
b2c0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 nd store the res
b2d0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 ult in register
b2e0: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 P3..** If either
b2f0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 input is NULL,
b300: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 the result is NU
b310: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 LL..*/./* Opcode
b320: 3a 20 44 69 76 69 64 65 20 50 31 20 50 32 20 50 : Divide P1 P2 P
b330: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 3 * *.** Synopsi
b340: 73 3a 20 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2f s: r[P3]=r[P2]/
b350: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76 69 r[P1].**.** Divi
b360: 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 de the value in
b370: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74 register P1 by t
b380: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 he value in regi
b390: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 ster P2.** and s
b3a0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 tore the result
b3b0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 28 in register P3 (
b3c0: 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74 68 P3=P2/P1). If th
b3d0: 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 e value in .** r
b3e0: 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a 65 egister P1 is ze
b3f0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 ro, then the res
b400: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20 ult is NULL. If
b410: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 either input is
b420: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 .** NULL, the re
b430: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f sult is NULL..*/
b440: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61 ./* Opcode: Rema
b450: 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20 2a inder P1 P2 P3 *
b460: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
b470: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50 r[P3]=r[P2]%r[P
b480: 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 1].**.** Compute
b490: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61 the remainder a
b4a0: 66 74 65 72 20 69 6e 74 65 67 65 72 20 72 65 67 fter integer reg
b4b0: 69 73 74 65 72 20 50 32 20 69 73 20 64 69 76 69 ister P2 is divi
b4c0: 64 65 64 20 62 79 20 0a 2a 2a 20 72 65 67 69 73 ded by .** regis
b4d0: 74 65 72 20 50 31 20 61 6e 64 20 73 74 6f 72 65 ter P1 and store
b4e0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 the result in r
b4f0: 65 67 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20 egister P3. .**
b500: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 If the value in
b510: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a register P1 is z
b520: 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69 ero the result i
b530: 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 s NULL..** If ei
b540: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 ther operand is
b550: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 NULL, the result
b560: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 is NULL..*/.cas
b570: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 e OP_Add:
b580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
b590: 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20 ame as TK_PLUS,
b5a0: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a in1, in2, out3 *
b5b0: 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 /.case OP_Subtra
b5c0: 63 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 ct:
b5d0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d /* same as TK_M
b5e0: 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 INUS, in1, in2,
b5f0: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f out3 */.case OP_
b600: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20 Multiply:
b610: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 /* same a
b620: 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20 s TK_STAR, in1,
b630: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 in2, out3 */.cas
b640: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20 e OP_Divide:
b650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
b660: 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c ame as TK_SLASH,
b670: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 in1, in2, out3
b680: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69 */.case OP_Remai
b690: 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 nder: {
b6a0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f /* same as TK_
b6b0: 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f REM, in1, in2, o
b6c0: 75 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62 49 ut3 */. char bI
b6d0: 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72 ntint; /* Star
b6e0: 74 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20 69 ted out as two i
b6f0: 6e 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73 20 nteger operands
b700: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 20 */. u16 flags;
b710: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 /* Combined
b720: 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f MEM_* flags fro
b730: 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f m both inputs */
b740: 0a 20 20 75 31 36 20 74 79 70 65 31 3b 20 20 20 . u16 type1;
b750: 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 /* Numeric ty
b760: 70 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 pe of left opera
b770: 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 nd */. u16 type
b780: 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 2; /* Numer
b790: 69 63 20 74 79 70 65 20 6f 66 20 72 69 67 68 74 ic type of right
b7a0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36 operand */. i6
b7b0: 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 4 iA; /*
b7c0: 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f Integer value o
b7d0: 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a f left operand *
b7e0: 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20 20 /. i64 iB;
b7f0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 /* Integer v
b800: 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70 alue of right op
b810: 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c erand */. doubl
b820: 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52 65 e rA; /* Re
b830: 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 al value of left
b840: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f operand */. do
b850: 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f 2a uble rB; /*
b860: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 72 Real value of r
b870: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a ight operand */.
b880: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b . pIn1 = &aMem[
b890: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79 70 65 pOp->p1];. type
b8a0: 31 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28 1 = numericType(
b8b0: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 pIn1);. pIn2 =
b8c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a &aMem[pOp->p2];.
b8d0: 20 20 74 79 70 65 32 20 3d 20 6e 75 6d 65 72 69 type2 = numeri
b8e0: 63 54 79 70 65 28 70 49 6e 32 29 3b 0a 20 20 70 cType(pIn2);. p
b8f0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d Out = &aMem[pOp-
b900: 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 >p3];. flags =
b910: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 pIn1->flags | pI
b920: 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 n2->flags;. if(
b930: 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 (flags & MEM_Nu
b940: 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f 20 61 72 ll)!=0 ) goto ar
b950: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f ithmetic_result_
b960: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 28 is_null;. if( (
b970: 74 79 70 65 31 20 26 20 74 79 70 65 32 20 26 20 type1 & type2 &
b980: 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 MEM_Int)!=0 ){.
b990: 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e iA = pIn1->u.
b9a0: 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32 i;. iB = pIn2
b9b0: 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e 74 69 ->u.i;. bInti
b9c0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73 77 69 74 nt = 1;. swit
b9d0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 ch( pOp->opcode
b9e0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 ){. case OP
b9f0: 5f 41 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 _Add: if(
ba00: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 sqlite3AddInt64(
ba10: 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 &iB,iA) ) goto f
ba20: 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a p_math; break;.
ba30: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 case OP_Su
ba40: 62 74 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c btract: if( sql
ba50: 69 74 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 ite3SubInt64(&iB
ba60: 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d ,iA) ) goto fp_m
ba70: 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 ath; break;.
ba80: 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 case OP_Multi
ba90: 70 6c 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 ply: if( sqlite
baa0: 33 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 3MulInt64(&iB,iA
bab0: 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 ) ) goto fp_math
bac0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 ; break;.
bad0: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 case OP_Divide:
bae0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 {. if( iA
baf0: 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 ==0 ) goto arith
bb00: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f metic_result_is_
bb10: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 null;. if
bb20: 28 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d ( iA==-1 && iB==
bb30: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 SMALLEST_INT64 )
bb40: 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 goto fp_math;.
bb50: 20 20 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b iB /= iA;
bb60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
bb70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 }. de
bb80: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 fault: {.
bb90: 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 if( iA==0 ) got
bba0: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 o arithmetic_res
bbb0: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 ult_is_null;.
bbc0: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 if( iA==-1
bbd0: 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 ) iA = 1;.
bbe0: 20 20 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 iB %= iA;.
bbf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
bc00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 }. }. pOu
bc10: 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 t->u.i = iB;.
bc20: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 MemSetTypeFlag(
bc30: 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a pOut, MEM_Int);.
bc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 49 6e }else{. bIn
bc50: 74 69 6e 74 20 3d 20 30 3b 0a 66 70 5f 6d 61 74 tint = 0;.fp_mat
bc60: 68 3a 0a 20 20 20 20 72 41 20 3d 20 73 71 6c 69 h:. rA = sqli
bc70: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 te3VdbeRealValue
bc80: 28 70 49 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d (pIn1);. rB =
bc90: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c sqlite3VdbeReal
bca0: 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 Value(pIn2);.
bcb0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 switch( pOp->op
bcc0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 code ){. ca
bcd0: 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 se OP_Add:
bce0: 20 20 20 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 rB += rA;
bcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
bd00: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 case OP_Subtract
bd10: 3a 20 20 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 : rB -= rA;
bd20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
bd30: 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 case OP_Multip
bd40: 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20 72 41 3b ly: rB *= rA;
bd50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
bd60: 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 case OP_Divi
bd70: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a de: {. /*
bd80: 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 (double)0 In ca
bd90: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 se of SQLITE_OMI
bda0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 T_FLOATING_POINT
bdb0: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 ... */. i
bdc0: 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 f( rA==(double)0
bdd0: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 ) goto arithmet
bde0: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c ic_result_is_nul
bdf0: 6c 3b 0a 20 20 20 20 20 20 20 20 72 42 20 2f 3d l;. rB /=
be00: 20 72 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 rA;. bre
be10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
be20: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 default: {.
be30: 20 20 20 20 20 69 41 20 3d 20 28 69 36 34 29 72 iA = (i64)r
be40: 41 3b 0a 20 20 20 20 20 20 20 20 69 42 20 3d 20 A;. iB =
be50: 28 69 36 34 29 72 42 3b 0a 20 20 20 20 20 20 20 (i64)rB;.
be60: 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 if( iA==0 ) got
be70: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 o arithmetic_res
be80: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 ult_is_null;.
be90: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 if( iA==-1
bea0: 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 ) iA = 1;.
beb0: 20 20 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 rB = (double)(
bec0: 69 42 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 iB % iA);.
bed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
bee0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 . }.#ifdef SQ
bef0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 LITE_OMIT_FLOATI
bf00: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 NG_POINT. pOu
bf10: 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 t->u.i = rB;.
bf20: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 MemSetTypeFlag(
bf30: 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a pOut, MEM_Int);.
bf40: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 #else. if( sq
bf50: 6c 69 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 lite3IsNaN(rB) )
bf60: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 {. goto ari
bf70: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 thmetic_result_i
bf80: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 s_null;. }.
bf90: 20 20 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 72 42 pOut->u.r = rB
bfa0: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 ;. MemSetType
bfb0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 Flag(pOut, MEM_R
bfc0: 65 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 28 eal);. if( ((
bfd0: 74 79 70 65 31 7c 74 79 70 65 32 29 26 4d 45 4d type1|type2)&MEM
bfe0: 5f 52 65 61 6c 29 3d 3d 30 20 26 26 20 21 62 49 _Real)==0 && !bI
bff0: 6e 74 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 ntint ){. s
c000: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 qlite3VdbeIntege
c010: 72 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b rAffinity(pOut);
c020: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
c030: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 }. break;..arit
c040: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 hmetic_result_is
c050: 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 _null:. sqlite3
c060: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 VdbeMemSetNull(p
c070: 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d Out);. break;.}
c080: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c ../* Opcode: Col
c090: 6c 53 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a lSeq P1 * * P4.*
c0a0: 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 *.** P4 is a poi
c0b0: 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65 nter to a CollSe
c0c0: 71 20 73 74 72 75 63 74 2e 20 49 66 20 74 68 65 q struct. If the
c0d0: 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20 next call to a
c0e0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a user function.**
c0f0: 20 6f 72 20 61 67 67 72 65 67 61 74 65 20 63 61 or aggregate ca
c100: 6c 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46 75 lls sqlite3GetFu
c110: 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69 ncCollSeq(), thi
c120: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 s collation sequ
c130: 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 ence will.** be
c140: 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69 returned. This i
c150: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 75 s used by the bu
c160: 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 ilt-in min(), ma
c170: 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 x() and nullif()
c180: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a .** functions..*
c190: 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f *.** If P1 is no
c1a0: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 t zero, then it
c1b0: 69 73 20 61 20 72 65 67 69 73 74 65 72 20 74 68 is a register th
c1c0: 61 74 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 at a subsequent
c1d0: 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28 min() or.** max(
c1e0: 29 20 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c ) aggregate will
c1f0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 set to 1 if the
c200: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 current row is
c210: 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 not the minimum
c220: 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20 or.** maximum.
c230: 54 68 65 20 50 31 20 72 65 67 69 73 74 65 72 20 The P1 register
c240: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 is initialized t
c250: 6f 20 30 20 62 79 20 74 68 69 73 20 69 6e 73 74 o 0 by this inst
c260: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 ruction..**.** T
c270: 68 65 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 he interface use
c280: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 d by the impleme
c290: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 ntation of the a
c2a0: 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 forementioned fu
c2b0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 nctions.** to re
c2c0: 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 trieve the colla
c2d0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65 tion sequence se
c2e0: 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 t by this opcode
c2f0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c is not availabl
c300: 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2e 20 20 e.** publicly.
c310: 4f 6e 6c 79 20 62 75 69 6c 74 2d 69 6e 20 66 75 Only built-in fu
c320: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 61 63 63 nctions have acc
c330: 65 73 73 20 74 6f 20 74 68 69 73 20 66 65 61 74 ess to this feat
c340: 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ure..*/.case OP_
c350: 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 CollSeq: {. ass
c360: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 ert( pOp->p4type
c370: 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a ==P4_COLLSEQ );.
c380: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b if( pOp->p1 ){
c390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
c3a0: 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 MemSetInt64(&aMe
c3b0: 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a m[pOp->p1], 0);.
c3c0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a }. break;.}..
c3d0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e 63 74 /* Opcode: Funct
c3e0: 69 6f 6e 30 20 50 31 20 50 32 20 50 33 20 50 34 ion0 P1 P2 P3 P4
c3f0: 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a P5.** Synopsis:
c400: 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72 5b 50 32 r[P3]=func(r[P2
c410: 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f @P5]).**.** Invo
c420: 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 ke a user functi
c430: 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69 6e on (P4 is a poin
c440: 74 65 72 20 74 6f 20 61 20 46 75 6e 63 44 65 66 ter to a FuncDef
c450: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 object that.**
c460: 64 65 66 69 6e 65 73 20 74 68 65 20 66 75 6e 63 defines the func
c470: 74 69 6f 6e 29 20 77 69 74 68 20 50 35 20 61 72 tion) with P5 ar
c480: 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e 20 66 72 guments taken fr
c490: 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61 om register P2 a
c4a0: 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 nd.** successors
c4b0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 . The result of
c4c0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 the function is
c4d0: 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 stored in regis
c4e0: 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65 67 69 73 ter P3..** Regis
c4f0: 74 65 72 20 50 33 20 6d 75 73 74 20 6e 6f 74 20 ter P3 must not
c500: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 75 be one of the fu
c510: 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a nction inputs..*
c520: 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 33 32 2d *.** P1 is a 32-
c530: 62 69 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 bit bitmask indi
c540: 63 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 6f cating whether o
c550: 72 20 6e 6f 74 20 65 61 63 68 20 61 72 67 75 6d r not each argum
c560: 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 ent to the .** f
c570: 75 6e 63 74 69 6f 6e 20 77 61 73 20 64 65 74 65 unction was dete
c580: 72 6d 69 6e 65 64 20 74 6f 20 62 65 20 63 6f 6e rmined to be con
c590: 73 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 stant at compile
c5a0: 20 74 69 6d 65 2e 20 49 66 20 74 68 65 20 66 69 time. If the fi
c5b0: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 rst.** argument
c5c0: 77 61 73 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 was constant the
c5d0: 6e 20 62 69 74 20 30 20 6f 66 20 50 31 20 69 73 n bit 0 of P1 is
c5e0: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75 73 set. This is us
c5f0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a ed to determine.
c600: 2a 2a 20 77 68 65 74 68 65 72 20 6d 65 74 61 20 ** whether meta
c610: 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 data associated
c620: 77 69 74 68 20 61 20 75 73 65 72 20 66 75 6e 63 with a user func
c630: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 75 73 tion argument us
c640: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 ing the.** sqlit
c650: 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 e3_set_auxdata()
c660: 20 41 50 49 20 6d 61 79 20 62 65 20 73 61 66 65 API may be safe
c670: 6c 79 20 72 65 74 61 69 6e 65 64 20 75 6e 74 69 ly retained unti
c680: 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e l the next.** in
c690: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 vocation of this
c6a0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 opcode..**.** S
c6b0: 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63 74 69 6f ee also: Functio
c6c0: 6e 2c 20 41 67 67 53 74 65 70 2c 20 41 67 67 46 n, AggStep, AggF
c6d0: 69 6e 61 6c 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 inal.*/./* Opcod
c6e0: 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50 31 20 50 e: Function P1 P
c6f0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 2 P3 P4 P5.** Sy
c700: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 66 75 nopsis: r[P3]=fu
c710: 6e 63 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a nc(r[P2@P5]).**.
c720: 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73 65 72 ** Invoke a user
c730: 20 66 75 6e 63 74 69 6f 6e 20 28 50 34 20 69 73 function (P4 is
c740: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e a pointer to an
c750: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 sqlite3_context
c760: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 object that.**
c770: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 contains a point
c780: 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 er to the functi
c790: 6f 6e 20 74 6f 20 62 65 20 72 75 6e 29 20 77 69 on to be run) wi
c7a0: 74 68 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 th P5 arguments
c7b0: 74 61 6b 65 6e 0a 2a 2a 20 66 72 6f 6d 20 72 65 taken.** from re
c7c0: 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73 75 gister P2 and su
c7d0: 63 63 65 73 73 6f 72 73 2e 20 20 54 68 65 20 72 ccessors. The r
c7e0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e esult of the fun
c7f0: 63 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 0a ction is stored.
c800: 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 ** in register P
c810: 33 2e 20 20 52 65 67 69 73 74 65 72 20 50 33 20 3. Register P3
c820: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65 20 must not be one
c830: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 of the function
c840: 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 31 inputs..**.** P1
c850: 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69 74 is a 32-bit bit
c860: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 mask indicating
c870: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 65 whether or not e
c880: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 ach argument to
c890: 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e the .** function
c8a0: 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 was determined
c8b0: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 61 to be constant a
c8c0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20 t compile time.
c8d0: 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 If the first.**
c8e0: 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f 6e argument was con
c8f0: 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20 30 stant then bit 0
c900: 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20 54 of P1 is set. T
c910: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 his is used to d
c920: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 etermine.** whet
c930: 68 65 72 20 6d 65 74 61 20 64 61 74 61 20 61 73 her meta data as
c940: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 sociated with a
c950: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 user function ar
c960: 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68 65 gument using the
c970: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f .** sqlite3_set_
c980: 61 75 78 64 61 74 61 28 29 20 41 50 49 20 6d 61 auxdata() API ma
c990: 79 20 62 65 20 73 61 66 65 6c 79 20 72 65 74 61 y be safely reta
c9a0: 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20 6e ined until the n
c9b0: 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f ext.** invocatio
c9c0: 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 n of this opcode
c9d0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 ..**.** SQL func
c9e0: 74 69 6f 6e 73 20 61 72 65 20 69 6e 69 74 69 61 tions are initia
c9f0: 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 4f 50 5f lly coded as OP_
ca00: 46 75 6e 63 74 69 6f 6e 30 20 77 69 74 68 20 50 Function0 with P
ca10: 34 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 4 pointing.** to
ca20: 20 61 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 a FuncDef objec
ca30: 74 2e 20 20 42 75 74 20 6f 6e 20 66 69 72 73 74 t. But on first
ca40: 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20 74 68 65 evaluation, the
ca50: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 0a 2a P4 operand is.*
ca60: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 * automatically
ca70: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 converted into a
ca80: 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 n sqlite3_contex
ca90: 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 65 t object and the
caa0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 68 operation.** ch
cab0: 61 6e 67 65 64 20 74 6f 20 74 68 69 73 20 4f 50 anged to this OP
cac0: 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 _Function opcode
cad0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 . In this way,
cae0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 the initializati
caf0: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 73 71 6c on of.** the sql
cb00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a ite3_context obj
cb10: 65 63 74 20 6f 63 63 75 72 73 20 6f 6e 6c 79 20 ect occurs only
cb20: 6f 6e 63 65 2c 20 72 61 74 68 65 72 20 74 68 61 once, rather tha
cb30: 6e 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a n once for each.
cb40: 2a 2a 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 ** evaluation of
cb50: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a the function..*
cb60: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 *.** See also: F
cb70: 75 6e 63 74 69 6f 6e 30 2c 20 41 67 67 53 74 65 unction0, AggSte
cb80: 70 2c 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63 p, AggFinal.*/.c
cb90: 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 ase OP_Function0
cba0: 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 : {. int n;. s
cbb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a qlite3_context *
cbc0: 70 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 pCtx;.. assert(
cbd0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 pOp->p4type==P4
cbe0: 5f 46 55 4e 43 44 45 46 20 29 3b 0a 20 20 6e 20 _FUNCDEF );. n
cbf0: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 = pOp->p5;. ass
cc00: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 ert( pOp->p3>0 &
cc10: 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e & pOp->p3<=(p->n
cc20: 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 Mem-p->nCursor)
cc30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d );. assert( n==
cc40: 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 0 || (pOp->p2>0
cc50: 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 && pOp->p2+n<=(p
cc60: 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f ->nMem-p->nCurso
cc70: 72 29 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 r)+1) );. asser
cc80: 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e t( pOp->p3<pOp->
cc90: 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 p2 || pOp->p3>=p
cca0: 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 43 Op->p2+n );. pC
ccb0: 74 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 tx = sqlite3DbMa
ccc0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 llocRaw(db, size
ccd0: 6f 66 28 2a 70 43 74 78 29 20 2b 20 28 6e 2d 31 of(*pCtx) + (n-1
cce0: 29 2a 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 )*sizeof(sqlite3
ccf0: 5f 76 61 6c 75 65 2a 29 29 3b 0a 20 20 69 66 28 _value*));. if(
cd00: 20 70 43 74 78 3d 3d 30 20 29 20 67 6f 74 6f 20 pCtx==0 ) goto
cd10: 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 74 78 2d 3e no_mem;. pCtx->
cd20: 70 4f 75 74 20 3d 20 30 3b 0a 20 20 70 43 74 78 pOut = 0;. pCtx
cd30: 2d 3e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 ->pFunc = pOp->p
cd40: 34 2e 70 46 75 6e 63 3b 0a 20 20 70 43 74 78 2d 4.pFunc;. pCtx-
cd50: 3e 69 4f 70 20 3d 20 28 69 6e 74 29 28 70 4f 70 >iOp = (int)(pOp
cd60: 20 2d 20 61 4f 70 29 3b 0a 20 20 70 43 74 78 2d - aOp);. pCtx-
cd70: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 43 >pVdbe = p;. pC
cd80: 74 78 2d 3e 61 72 67 63 20 3d 20 6e 3b 0a 20 20 tx->argc = n;.
cd90: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 pOp->p4type = P4
cda0: 5f 46 55 4e 43 43 54 58 3b 0a 20 20 70 4f 70 2d _FUNCCTX;. pOp-
cdb0: 3e 70 34 2e 70 43 74 78 20 3d 20 70 43 74 78 3b >p4.pCtx = pCtx;
cdc0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d . pOp->opcode =
cdd0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 OP_Function;.
cde0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 /* Fall through
cdf0: 69 6e 74 6f 20 4f 50 5f 46 75 6e 63 74 69 6f 6e into OP_Function
ce00: 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f 46 75 */.}.case OP_Fu
ce10: 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 nction: {. int
ce20: 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e i;. sqlite3_con
ce30: 74 65 78 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 text *pCtx;.. a
ce40: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 ssert( pOp->p4ty
ce50: 70 65 3d 3d 50 34 5f 46 55 4e 43 43 54 58 20 29 pe==P4_FUNCCTX )
ce60: 3b 0a 20 20 70 43 74 78 20 3d 20 70 4f 70 2d 3e ;. pCtx = pOp->
ce70: 70 34 2e 70 43 74 78 3b 0a 0a 20 20 2f 2a 20 49 p4.pCtx;.. /* I
ce80: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 f this function
ce90: 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20 74 is inside of a t
cea0: 72 69 67 67 65 72 2c 20 74 68 65 20 72 65 67 69 rigger, the regi
ceb0: 73 74 65 72 20 61 72 72 61 79 20 69 6e 20 61 4d ster array in aM
cec0: 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20 em[]. ** might
ced0: 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20 change from one
cee0: 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68 evaluation to th
cef0: 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65 78 e next. The nex
cf00: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a t block of code.
cf10: 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73 ** checks to s
cf20: 65 65 20 69 66 20 74 68 65 20 72 65 67 69 73 74 ee if the regist
cf30: 65 72 20 61 72 72 61 79 20 68 61 73 20 63 68 61 er array has cha
cf40: 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 nged, and if so
cf50: 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69 61 it. ** reinitia
cf60: 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76 61 lizes the relava
cf70: 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 nt parts of the
cf80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 sqlite3_context
cf90: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 4f 75 74 object */. pOut
cfa0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 = &aMem[pOp->p3
cfb0: 5d 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 ];. if( pCtx->p
cfc0: 4f 75 74 20 21 3d 20 70 4f 75 74 20 29 7b 0a 20 Out != pOut ){.
cfd0: 20 20 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 pCtx->pOut =
cfe0: 70 4f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d pOut;. for(i=
cff0: 70 43 74 78 2d 3e 61 72 67 63 2d 31 3b 20 69 3e pCtx->argc-1; i>
d000: 3d 30 3b 20 69 2d 2d 29 20 70 43 74 78 2d 3e 61 =0; i--) pCtx->a
d010: 72 67 76 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 rgv[i] = &aMem[p
d020: 4f 70 2d 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a Op->p2+i];. }..
d030: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e memAboutToChan
d040: 67 65 28 70 2c 20 70 43 74 78 2d 3e 70 4f 75 74 ge(p, pCtx->pOut
d050: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
d060: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 _DEBUG. for(i=0
d070: 3b 20 69 3c 70 43 74 78 2d 3e 61 72 67 63 3b 20 ; i<pCtx->argc;
d080: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 i++){. assert
d090: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 43 74 ( memIsValid(pCt
d0a0: 78 2d 3e 61 72 67 76 5b 69 5d 29 20 29 3b 0a 20 x->argv[i]) );.
d0b0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 REGISTER_TRAC
d0c0: 45 28 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 43 74 E(pOp->p2+i, pCt
d0d0: 78 2d 3e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d x->argv[i]);. }
d0e0: 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d 53 65 74 .#endif. MemSet
d0f0: 54 79 70 65 46 6c 61 67 28 70 43 74 78 2d 3e 70 TypeFlag(pCtx->p
d100: 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a Out, MEM_Null);.
d110: 20 20 70 43 74 78 2d 3e 66 45 72 72 6f 72 4f 72 pCtx->fErrorOr
d120: 41 75 78 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c Aux = 0;. db->l
d130: 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 astRowid = lastR
d140: 6f 77 69 64 3b 0a 20 20 28 2a 70 43 74 78 2d 3e owid;. (*pCtx->
d150: 70 46 75 6e 63 2d 3e 78 46 75 6e 63 29 28 70 43 pFunc->xFunc)(pC
d160: 74 78 2c 20 70 43 74 78 2d 3e 61 72 67 63 2c 20 tx, pCtx->argc,
d170: 70 43 74 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 pCtx->argv); /*
d180: 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 IMP: R-24505-232
d190: 33 30 20 2a 2f 0a 20 20 6c 61 73 74 52 6f 77 69 30 */. lastRowi
d1a0: 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 d = db->lastRowi
d1b0: 64 3b 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 d; /* Remember
d1c0: 72 6f 77 69 64 20 63 68 61 6e 67 65 73 20 6d 61 rowid changes ma
d1d0: 64 65 20 62 79 20 78 46 75 6e 63 20 2a 2f 0a 0a de by xFunc */..
d1e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63 /* If the func
d1f0: 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e tion returned an
d200: 20 65 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e error, throw an
d210: 20 65 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 exception */.
d220: 69 66 28 20 70 43 74 78 2d 3e 66 45 72 72 6f 72 if( pCtx->fError
d230: 4f 72 41 75 78 20 29 7b 0a 20 20 20 20 69 66 28 OrAux ){. if(
d240: 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 29 pCtx->isError )
d250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 {. sqlite3V
d260: 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22 dbeError(p, "%s"
d270: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f , sqlite3_value_
d280: 74 65 78 74 28 70 43 74 78 2d 3e 70 4f 75 74 29 text(pCtx->pOut)
d290: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 );. rc = pC
d2a0: 74 78 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 tx->isError;.
d2b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 }. sqlite3Vd
d2c0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 beDeleteAuxData(
d2d0: 70 2c 20 70 43 74 78 2d 3e 69 4f 70 2c 20 70 4f p, pCtx->iOp, pO
d2e0: 70 2d 3e 70 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f p->p1);. }.. /
d2f0: 2a 20 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c * Copy the resul
d300: 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f t of the functio
d310: 6e 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 n into register
d320: 50 33 20 2a 2f 0a 20 20 69 66 28 20 70 4f 75 74 P3 */. if( pOut
d330: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 ->flags & (MEM_S
d340: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a tr|MEM_Blob) ){.
d350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 sqlite3VdbeC
d360: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 43 hangeEncoding(pC
d370: 74 78 2d 3e 70 4f 75 74 2c 20 65 6e 63 6f 64 69 tx->pOut, encodi
d380: 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c ng);. if( sql
d390: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 ite3VdbeMemTooBi
d3a0: 67 28 70 43 74 78 2d 3e 70 4f 75 74 29 20 29 20 g(pCtx->pOut) )
d3b0: 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 goto too_big;.
d3c0: 7d 0a 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 }.. REGISTER_TR
d3d0: 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 43 74 ACE(pOp->p3, pCt
d3e0: 78 2d 3e 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 x->pOut);. UPDA
d3f0: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 TE_MAX_BLOBSIZE(
d400: 70 43 74 78 2d 3e 70 4f 75 74 29 3b 0a 20 20 62 pCtx->pOut);. b
d410: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f reak;.}../* Opco
d420: 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20 50 32 de: BitAnd P1 P2
d430: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 P3 * *.** Synop
d440: 73 69 73 3a 20 20 72 5b 50 33 5d 3d 72 5b 50 31 sis: r[P3]=r[P1
d450: 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 ]&r[P2].**.** Ta
d460: 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65 20 ke the bit-wise
d470: 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75 65 AND of the value
d480: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 s in register P1
d490: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 and P2 and.** s
d4a0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 tore the result
d4b0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a in register P3..
d4c0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 ** If either inp
d4d0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 ut is NULL, the
d4e0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a result is NULL..
d4f0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 */./* Opcode: Bi
d500: 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a tOr P1 P2 P3 * *
d510: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 72 .** Synopsis: r
d520: 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32 5d [P3]=r[P1]|r[P2]
d530: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 .**.** Take the
d540: 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20 74 bit-wise OR of t
d550: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 he values in reg
d560: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 ister P1 and P2
d570: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 and.** store the
d580: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 result in regis
d590: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 ter P3..** If ei
d5a0: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 ther input is NU
d5b0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 LL, the result i
d5c0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 s NULL..*/./* Op
d5d0: 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74 20 code: ShiftLeft
d5e0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 P1 P2 P3 * *.**
d5f0: 53 79 6e 6f 70 73 69 73 3a 20 20 72 5b 50 33 5d Synopsis: r[P3]
d600: 3d 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a =r[P2]<<r[P1].**
d610: 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e .** Shift the in
d620: 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 teger value in r
d630: 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 egister P2 to th
d640: 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a 2a e left by the.**
d650: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 number of bits
d660: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 specified by the
d670: 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 integer in regi
d680: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 ster P1..** Stor
d690: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 e the result in
d6a0: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 register P3..**
d6b0: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 If either input
d6c0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 is NULL, the res
d6d0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a ult is NULL..*/.
d6e0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 /* Opcode: Shift
d6f0: 52 69 67 68 74 20 50 31 20 50 32 20 50 33 20 2a Right P1 P2 P3 *
d700: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
d710: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72 5b r[P3]=r[P2]>>r[
d720: 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 P1].**.** Shift
d730: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 the integer valu
d740: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 e in register P2
d750: 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 62 79 to the right by
d760: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f the.** number o
d770: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64 f bits specified
d780: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 by the integer
d790: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a in register P1..
d7a0: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 ** Store the res
d7b0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 ult in register
d7c0: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 P3..** If either
d7d0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 input is NULL,
d7e0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 the result is NU
d7f0: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 LL..*/.case OP_B
d800: 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 itAnd:
d810: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 /* same a
d820: 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 s TK_BITAND, in1
d830: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 , in2, out3 */.c
d840: 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 ase OP_BitOr:
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
d860: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 * same as TK_BIT
d870: 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 OR, in1, in2, ou
d880: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 t3 */.case OP_Sh
d890: 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20 iftLeft:
d8a0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 /* same as
d8b0: 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c TK_LSHIFT, in1,
d8c0: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 in2, out3 */.ca
d8d0: 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 se OP_ShiftRight
d8e0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a : { /*
d8f0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 same as TK_RSHI
d900: 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 FT, in1, in2, ou
d910: 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a t3 */. i64 iA;.
d920: 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20 u64 uA;. i64
d930: 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20 iB;. u8 op;..
d940: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 pIn1 = &aMem[pOp
d950: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 ->p1];. pIn2 =
d960: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a &aMem[pOp->p2];.
d970: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 pOut = &aMem[p
d980: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 Op->p3];. if( (
d990: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 pIn1->flags | pI
d9a0: 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d n2->flags) & MEM
d9b0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c _Null ){. sql
d9c0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 ite3VdbeMemSetNu
d9d0: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 ll(pOut);. br
d9e0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20 eak;. }. iA =
d9f0: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 sqlite3VdbeIntVa
da00: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20 lue(pIn2);. iB
da10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 = sqlite3VdbeInt
da20: 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f Value(pIn1);. o
da30: 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b p = pOp->opcode;
da40: 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 . if( op==OP_Bi
da50: 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26 tAnd ){. iA &
da60: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 = iB;. }else if
da70: 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 ( op==OP_BitOr )
da80: 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a {. iA |= iB;.
da90: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d }else if( iB!=
daa0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0 ){. assert(
dab0: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 op==OP_ShiftRig
dac0: 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 ht || op==OP_Shi
dad0: 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f ftLeft );.. /
dae0: 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20 62 79 * If shifting by
daf0: 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75 a negative amou
db00: 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65 nt, shift in the
db10: 20 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e other direction
db20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30 */. if( iB<0
db30: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 ){. assert
db40: 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d ( OP_ShiftRight=
db50: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20 =OP_ShiftLeft+1
db60: 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a );. op = 2*
db70: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31 OP_ShiftLeft + 1
db80: 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20 - op;. iB
db90: 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42 = iB>(-64) ? -iB
dba0: 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20 : 64;. }..
dbb0: 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a if( iB>=64 ){.
dbc0: 20 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d iA = (iA>=
dbd0: 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 0 || op==OP_Shif
dbe0: 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b tLeft) ? 0 : -1;
dbf0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
dc00: 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69 memcpy(&uA, &i
dc10: 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a A, sizeof(uA));.
dc20: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50 if( op==OP
dc30: 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20 _ShiftLeft ){.
dc40: 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b uA <<= iB;
dc50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
dc60: 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b uA >>= iB;
dc70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e . /* Sign
dc80: 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67 -extend on a rig
dc90: 68 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65 ht shift of a ne
dca0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f gative number */
dcb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3c . if( iA<
dcc0: 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36 0 ) uA |= ((((u6
dcd0: 34 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33 4)0xffffffff)<<3
dce0: 32 29 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c 2)|0xffffffff) <
dcf0: 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20 < (64-iB);.
dd00: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 }. memcpy(
dd10: 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66 &iA, &uA, sizeof
dd20: 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d (iA));. }. }
dd30: 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 . pOut->u.i = i
dd40: 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 A;. MemSetTypeF
dd50: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e lag(pOut, MEM_In
dd60: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a t);. break;.}..
dd70: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d /* Opcode: AddIm
dd80: 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a m P1 P2 * * *.*
dd90: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 72 5b 50 * Synopsis: r[P
dda0: 31 5d 3d 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a 1]=r[P1]+P2.** .
ddb0: 2a 2a 20 41 64 64 20 74 68 65 20 63 6f 6e 73 74 ** Add the const
ddc0: 61 6e 74 20 50 32 20 74 6f 20 74 68 65 20 76 61 ant P2 to the va
ddd0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 lue in register
dde0: 50 31 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c P1..** The resul
ddf0: 74 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 69 t is always an i
de00: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f nteger..**.** To
de10: 20 66 6f 72 63 65 20 61 6e 79 20 72 65 67 69 73 force any regis
de20: 74 65 72 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 ter to be an int
de30: 65 67 65 72 2c 20 6a 75 73 74 20 61 64 64 20 30 eger, just add 0
de40: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 ..*/.case OP_Add
de50: 49 6d 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 Imm: {
de60: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 /* in1 */. pI
de70: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e n1 = &aMem[pOp->
de80: 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 p1];. memAboutT
de90: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 oChange(p, pIn1)
dea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d ;. sqlite3VdbeM
deb0: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e emIntegerify(pIn
dec0: 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 1);. pIn1->u.i
ded0: 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72 += pOp->p2;. br
dee0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 eak;.}../* Opcod
def0: 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20 e: MustBeInt P1
df00: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 P2 * * *.** .**
df10: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 Force the value
df20: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 in register P1 t
df30: 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e o be an integer.
df40: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a If the value.*
df50: 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61 * in P1 is not a
df60: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61 n integer and ca
df70: 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 nnot be converte
df80: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 d into an intege
df90: 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74 r.** without dat
dfa0: 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d a loss, then jum
dfb0: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f p immediately to
dfc0: 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30 P2, or if P2==0
dfd0: 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c .** raise an SQL
dfe0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63 ITE_MISMATCH exc
dff0: 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 eption..*/.case
e000: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20 OP_MustBeInt: {
e010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 /* ju
e020: 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e mp, in1 */. pIn
e030: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 1 = &aMem[pOp->p
e040: 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 1];. if( (pIn1-
e050: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 >flags & MEM_Int
e060: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c )==0 ){. appl
e070: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 yAffinity(pIn1,
e080: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 SQLITE_AFF_NUMER
e090: 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 IC, encoding);.
e0a0: 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b VdbeBranchTak
e0b0: 65 6e 28 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 en((pIn1->flags&
e0c0: 4d 45 4d 5f 49 6e 74 29 3d 3d 30 2c 20 32 29 3b MEM_Int)==0, 2);
e0d0: 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e . if( (pIn1->
e0e0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 flags & MEM_Int)
e0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 ==0 ){. if(
e100: 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 pOp->p2==0 ){.
e110: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
e120: 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 TE_MISMATCH;.
e130: 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f goto abort_
e140: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 due_to_error;.
e150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
e160: 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f goto jump_to_
e170: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 p2;. }.
e180: 7d 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 }. }. MemSetTy
e190: 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d peFlag(pIn1, MEM
e1a0: 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a _Int);. break;.
e1b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 }..#ifndef SQLIT
e1c0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f E_OMIT_FLOATING_
e1d0: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a POINT./* Opcode:
e1e0: 20 52 65 61 6c 41 66 66 69 6e 69 74 79 20 50 31 RealAffinity P1
e1f0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 * * * *.**.** I
e200: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 68 6f f register P1 ho
e210: 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 lds an integer c
e220: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 20 72 onvert it to a r
e230: 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a eal value..**.**
e240: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 This opcode is
e250: 75 73 65 64 20 77 68 65 6e 20 65 78 74 72 61 63 used when extrac
e260: 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ting information
e270: 20 66 72 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 from a column t
e280: 68 61 74 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20 hat.** has REAL
e290: 61 66 66 69 6e 69 74 79 2e 20 20 53 75 63 68 20 affinity. Such
e2a0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61 column values ma
e2b0: 79 20 73 74 69 6c 6c 20 62 65 20 73 74 6f 72 65 y still be store
e2c0: 64 20 61 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73 d as.** integers
e2d0: 2c 20 66 6f 72 20 73 70 61 63 65 20 65 66 66 69 , for space effi
e2e0: 63 69 65 6e 63 79 2c 20 62 75 74 20 61 66 74 65 ciency, but afte
e2f0: 72 20 65 78 74 72 61 63 74 69 6f 6e 20 77 65 20 r extraction we
e300: 77 61 6e 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 want them.** to
e310: 68 61 76 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c have only a real
e320: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 value..*/.case
e330: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 3a OP_RealAffinity:
e340: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {
e350: 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 /* in1 */.
e360: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 pIn1 = &aMem[pOp
e370: 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e ->p1];. if( pIn
e380: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 1->flags & MEM_I
e390: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 nt ){. sqlite
e3a0: 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 3VdbeMemRealify(
e3b0: 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 pIn1);. }. bre
e3c0: 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 ak;.}.#endif..#i
e3d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
e3e0: 54 5f 43 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 T_CAST./* Opcode
e3f0: 3a 20 43 61 73 74 20 50 31 20 50 32 20 2a 20 2a : Cast P1 P2 * *
e400: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
e410: 61 66 66 69 6e 69 74 79 28 72 5b 50 31 5d 29 0a affinity(r[P1]).
e420: 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 **.** Force the
e430: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 value in registe
e440: 72 20 50 31 20 74 6f 20 62 65 20 74 68 65 20 74 r P1 to be the t
e450: 79 70 65 20 64 65 66 69 6e 65 64 20 62 79 20 50 ype defined by P
e460: 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2..** .** <ul>.*
e470: 2a 20 3c 6c 69 20 76 61 6c 75 65 3d 22 39 37 22 * <li value="97"
e480: 3e 20 54 45 58 54 0a 2a 2a 20 3c 6c 69 20 76 61 > TEXT.** <li va
e490: 6c 75 65 3d 22 39 38 22 3e 20 42 4c 4f 42 0a 2a lue="98"> BLOB.*
e4a0: 2a 20 3c 6c 69 20 76 61 6c 75 65 3d 22 39 39 22 * <li value="99"
e4b0: 3e 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c 69 > NUMERIC.** <li
e4c0: 20 76 61 6c 75 65 3d 22 31 30 30 22 3e 20 49 4e value="100"> IN
e4d0: 54 45 47 45 52 0a 2a 2a 20 3c 6c 69 20 76 61 6c TEGER.** <li val
e4e0: 75 65 3d 22 31 30 31 22 3e 20 52 45 41 4c 0a 2a ue="101"> REAL.*
e4f0: 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 * </ul>.**.** A
e500: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f NULL value is no
e510: 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 t changed by thi
e520: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 s routine. It r
e530: 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a emains NULL..*/.
e540: 63 61 73 65 20 4f 50 5f 43 61 73 74 3a 20 7b 20 case OP_Cast: {
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e560: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 /* in1 */. ass
e570: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 ert( pOp->p2>=SQ
e580: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 26 26 LITE_AFF_BLOB &&
e590: 20 70 4f 70 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 pOp->p2<=SQLITE
e5a0: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 74 _AFF_REAL );. t
e5b0: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 estcase( pOp->p2
e5c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 ==SQLITE_AFF_TEX
e5d0: 54 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 T );. testcase(
e5e0: 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 pOp->p2==SQLITE
e5f0: 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 _AFF_BLOB );. t
e600: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 estcase( pOp->p2
e610: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d ==SQLITE_AFF_NUM
e620: 45 52 49 43 20 29 3b 0a 20 20 74 65 73 74 63 61 ERIC );. testca
e630: 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c se( pOp->p2==SQL
e640: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 ITE_AFF_INTEGER
e650: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 );. testcase( p
e660: 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 Op->p2==SQLITE_A
e670: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 70 49 6e FF_REAL );. pIn
e680: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 1 = &aMem[pOp->p
e690: 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 1];. memAboutTo
e6a0: 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b Change(p, pIn1);
e6b0: 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c . rc = ExpandBl
e6c0: 6f 62 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 ob(pIn1);. sqli
e6d0: 74 65 33 56 64 62 65 4d 65 6d 43 61 73 74 28 70 te3VdbeMemCast(p
e6e0: 49 6e 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 65 6e In1, pOp->p2, en
e6f0: 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 coding);. UPDAT
e700: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 E_MAX_BLOBSIZE(p
e710: 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d In1);. break;.}
e720: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
e730: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a E_OMIT_CAST */..
e740: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31 /* Opcode: Lt P1
e750: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 P2 P3 P4 P5.**
e760: 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 Synopsis: if r[P
e770: 31 5d 3c 72 5b 50 33 5d 20 67 6f 74 6f 20 50 32 1]<r[P3] goto P2
e780: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 .**.** Compare t
e790: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 he values in reg
e7a0: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e ister P1 and P3.
e7b0: 20 20 49 66 20 72 65 67 28 50 33 29 3c 72 65 67 If reg(P3)<reg
e7c0: 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d (P1) then.** jum
e7d0: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e p to address P2.
e7e0: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 .**.** If the
e7f0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c SQLITE_JUMPIFNUL
e800: 4c 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 L bit of P5 is s
e810: 65 74 20 61 6e 64 20 65 69 74 68 65 72 20 72 65 et and either re
e820: 67 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28 g(P1) or.** reg(
e830: 50 33 29 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e P3) is NULL then
e840: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 take the jump.
e850: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a If the SQLITE_J
e860: 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 UMPIFNULL .** bi
e870: 74 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 t is clear then
e880: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 fall through if
e890: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 either operand i
e8a0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 s NULL..**.** Th
e8b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 e SQLITE_AFF_MAS
e8c0: 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 K portion of P5
e8d0: 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e must be an affin
e8e0: 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a ity character -.
e8f0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 ** SQLITE_AFF_TE
e900: 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 XT, SQLITE_AFF_I
e910: 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 NTEGER, and so f
e920: 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 orth. An attempt
e930: 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 is made .** to
e940: 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 coerce both inpu
e950: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 ts according to
e960: 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 this affinity be
e970: 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 fore the.** comp
e980: 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 arison is made.
e990: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 If the SQLITE_AF
e9a0: 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 F_MASK is 0x00,
e9b0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 then numeric.**
e9c0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 affinity is used
e9d0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 . Note that the
e9e0: 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 affinity convers
e9f0: 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a ions are stored.
ea00: 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 ** back into the
ea10: 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 input registers
ea20: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 P1 and P3. So
ea30: 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 this opcode can
ea40: 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 cause.** persist
ea50: 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 ent changes to r
ea60: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 egisters P1 and
ea70: 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 P3..**.** Once a
ea80: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 ny conversions h
ea90: 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c ave taken place,
eaa0: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c and neither val
eab0: 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 ue is NULL, .**
eac0: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 the values are c
ead0: 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 ompared. If both
eae0: 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 values are blob
eaf0: 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 s then memcmp()
eb00: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 is.** used to de
eb10: 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 termine the resu
eb20: 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 lts of the compa
eb30: 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 rison. If both
eb40: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 values.** are te
eb50: 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 xt, then the app
eb60: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 ropriate collati
eb70: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 ng function spec
eb80: 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 ified in.** P4 i
eb90: 73 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 s used to do th
eba0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 e comparison. I
ebb0: 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 f P4 is not spec
ebc0: 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 ified then.** me
ebd0: 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 mcmp() is used t
ebe0: 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 o compare text s
ebf0: 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 tring. If both
ec00: 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 values are.** nu
ec10: 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 meric, then a nu
ec20: 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e meric comparison
ec30: 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 is used. If the
ec40: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 two values.** a
ec50: 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 re of different
ec60: 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 types, then numb
ec70: 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 ers are consider
ec80: 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 ed less than.**
ec90: 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 strings and stri
eca0: 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 ngs are consider
ecb0: 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f ed less than blo
ecc0: 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 bs..**.** If the
ecd0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 SQLITE_STOREP2
ece0: 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65 74 bit of P5 is set
ecf0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 75 , then do not ju
ed00: 6d 70 2e 20 20 49 6e 73 74 65 61 64 2c 0a 2a 2a mp. Instead,.**
ed10: 20 73 74 6f 72 65 20 61 20 62 6f 6f 6c 65 61 6e store a boolean
ed20: 20 72 65 73 75 6c 74 20 28 65 69 74 68 65 72 20 result (either
ed30: 30 2c 20 6f 72 20 31 2c 20 6f 72 20 4e 55 4c 4c 0, or 1, or NULL
ed40: 29 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 ) in register P2
ed50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 ..**.** If the S
ed60: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 62 69 74 QLITE_NULLEQ bit
ed70: 20 69 73 20 73 65 74 20 69 6e 20 50 35 2c 20 74 is set in P5, t
ed80: 68 65 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 hen NULL values
ed90: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a are considered.*
eda0: 2a 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 * equal to one a
edb0: 6e 6f 74 68 65 72 2c 20 70 72 6f 76 69 64 65 64 nother, provided
edc0: 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f that they do no
edd0: 74 20 68 61 76 65 20 74 68 65 69 72 20 4d 45 4d t have their MEM
ede0: 5f 43 6c 65 61 72 65 64 0a 2a 2a 20 62 69 74 20 _Cleared.** bit
edf0: 73 65 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 set..*/./* Opcod
ee00: 65 3a 20 4e 65 20 50 31 20 50 32 20 50 33 20 50 e: Ne P1 P2 P3 P
ee10: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 4 P5.** Synopsis
ee20: 3a 20 69 66 20 72 5b 50 31 5d 21 3d 72 5b 50 33 : if r[P1]!=r[P3
ee30: 5d 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 ] goto P2.**.**
ee40: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 This works just
ee50: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f like the Lt opco
ee60: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 de except that t
ee70: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e he jump is taken
ee80: 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 if.** the opera
ee90: 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 nds in registers
eea0: 20 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e P1 and P3 are n
eeb0: 6f 74 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 ot equal. See t
eec0: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 he Lt opcode for
eed0: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 .** additional i
eee0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a nformation..**.*
eef0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c * If SQLITE_NULL
ef00: 45 51 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 EQ is set in P5
ef10: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 then the result
ef20: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 of comparison is
ef30: 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a always either.*
ef40: 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 * true or false
ef50: 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c and is never NUL
ef60: 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 L. If both oper
ef70: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 ands are NULL th
ef80: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a en the result.**
ef90: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 of comparison i
efa0: 73 20 66 61 6c 73 65 2e 20 20 49 66 20 65 69 74 s false. If eit
efb0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e her operand is N
efc0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 ULL then the res
efd0: 75 6c 74 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 ult is true..**
efe0: 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61 If neither opera
eff0: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 nd is NULL the r
f000: 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d esult is the sam
f010: 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 e as it would be
f020: 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 if.** the SQLIT
f030: 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 E_NULLEQ flag we
f040: 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 re omitted from
f050: 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 P5..*/./* Opcode
f060: 3a 20 45 71 20 50 31 20 50 32 20 50 33 20 50 34 : Eq P1 P2 P3 P4
f070: 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a P5.** Synopsis:
f080: 20 69 66 20 72 5b 50 31 5d 3d 3d 72 5b 50 33 5d if r[P1]==r[P3]
f090: 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 goto P2.**.** T
f0a0: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c his works just l
f0b0: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 ike the Lt opcod
f0c0: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 e except that th
f0d0: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 e jump is taken
f0e0: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e if.** the operan
f0f0: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 ds in registers
f100: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 65 71 P1 and P3 are eq
f110: 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 ual..** See the
f120: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 Lt opcode for ad
f130: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 ditional informa
f140: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 tion..**.** If S
f150: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 QLITE_NULLEQ is
f160: 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74 set in P5 then t
f170: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d he result of com
f180: 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 parison is alway
f190: 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 s either.** true
f1a0: 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73 or false and is
f1b0: 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 never NULL. If
f1c0: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 both operands a
f1d0: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 re NULL then the
f1e0: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f result.** of co
f1f0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65 mparison is true
f200: 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 . If either ope
f210: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 rand is NULL the
f220: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 n the result is
f230: 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 false..** If nei
f240: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 ther operand is
f250: 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20 NULL the result
f260: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 is the same as i
f270: 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a t would be if.**
f280: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c the SQLITE_NULL
f290: 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 EQ flag were omi
f2a0: 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2f tted from P5..*/
f2b0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 ./* Opcode: Le P
f2c0: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 1 P2 P3 P4 P5.**
f2d0: 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b Synopsis: if r[
f2e0: 50 31 5d 3c 3d 72 5b 50 33 5d 20 67 6f 74 6f 20 P1]<=r[P3] goto
f2f0: 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f P2.**.** This wo
f300: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 rks just like th
f310: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 e Lt opcode exce
f320: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 pt that the jump
f330: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 is taken if.**
f340: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 the content of r
f350: 65 67 69 73 74 65 72 20 50 33 20 69 73 20 6c 65 egister P3 is le
f360: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c ss than or equal
f370: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 to the content
f380: 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 of.** register P
f390: 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 1. See the Lt o
f3a0: 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 pcode for additi
f3b0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e onal information
f3c0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ..*/./* Opcode:
f3d0: 47 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 Gt P1 P2 P3 P4 P
f3e0: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 5.** Synopsis: i
f3f0: 66 20 72 5b 50 31 5d 3e 72 5b 50 33 5d 20 67 6f f r[P1]>r[P3] go
f400: 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 to P2.**.** This
f410: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 works just like
f420: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 the Lt opcode e
f430: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a xcept that the j
f440: 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a ump is taken if.
f450: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f ** the content o
f460: 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 f register P3 is
f470: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 greater than th
f480: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 e content of.**
f490: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 register P1. Se
f4a0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 e the Lt opcode
f4b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 for additional i
f4c0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f nformation..*/./
f4d0: 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 * Opcode: Ge P1
f4e0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 P2 P3 P4 P5.** S
f4f0: 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 ynopsis: if r[P1
f500: 5d 3e 3d 72 5b 50 33 5d 20 67 6f 74 6f 20 50 32 ]>=r[P3] goto P2
f510: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b .**.** This work
f520: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 s just like the
f530: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 Lt opcode except
f540: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 that the jump i
f550: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 s taken if.** th
f560: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 e content of reg
f570: 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65 61 ister P3 is grea
f580: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 ter than or equa
f590: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 l to the content
f5a0: 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 of.** register
f5b0: 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 P1. See the Lt
f5c0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 opcode for addit
f5d0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f ional informatio
f5e0: 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71 n..*/.case OP_Eq
f5f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 :
f600: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 51 /* same as TK_EQ
f610: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 , jump, in1, in3
f620: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20 */.case OP_Ne:
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
f640: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20 same as TK_NE,
f650: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a jump, in1, in3 *
f660: 2f 0a 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 /.case OP_Lt:
f670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
f680: 61 6d 65 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 ame as TK_LT, ju
f690: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a mp, in1, in3 */.
f6a0: 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20 case OP_Le:
f6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d /* sam
f6c0: 65 20 61 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 e as TK_LE, jump
f6d0: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 , in1, in3 */.ca
f6e0: 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 20 20 20 se OP_Gt:
f6f0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 /* same
f700: 61 73 20 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 as TK_GT, jump,
f710: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 in1, in3 */.case
f720: 20 4f 50 5f 47 65 3a 20 7b 20 20 20 20 20 20 20 OP_Ge: {
f730: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 /* same as
f740: 20 54 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e TK_GE, jump, in
f750: 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 1, in3 */. int
f760: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 res;
f770: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 /* Result of the
f780: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 comparison of p
f790: 49 6e 31 20 61 67 61 69 6e 73 74 20 70 49 6e 33 In1 against pIn3
f7a0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e */. char affin
f7b0: 69 74 79 3b 20 20 20 20 20 20 2f 2a 20 41 66 66 ity; /* Aff
f7c0: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 66 6f 72 inity to use for
f7d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 comparison */.
f7e0: 20 75 31 36 20 66 6c 61 67 73 31 3b 20 20 20 20 u16 flags1;
f7f0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 /* Copy of
f800: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 initial value of
f810: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a pIn1->flags */.
f820: 20 20 75 31 36 20 66 6c 61 67 73 33 3b 20 20 20 u16 flags3;
f830: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 /* Copy of
f840: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f initial value o
f850: 66 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f f pIn3->flags */
f860: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d .. pIn1 = &aMem
f870: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e [pOp->p1];. pIn
f880: 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 3 = &aMem[pOp->p
f890: 33 5d 3b 0a 20 20 66 6c 61 67 73 31 20 3d 20 70 3];. flags1 = p
f8a0: 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 6c In1->flags;. fl
f8b0: 61 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 ags3 = pIn3->fla
f8c0: 67 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 gs;. if( (flags
f8d0: 31 20 7c 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 1 | flags3)&MEM_
f8e0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 4f Null ){. /* O
f8f0: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 70 65 72 61 ne or both opera
f900: 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a nds are NULL */.
f910: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 if( pOp->p5
f920: 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 & SQLITE_NULLEQ
f930: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 53 ){. /* If S
f940: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 QLITE_NULLEQ is
f950: 73 65 74 20 28 77 68 69 63 68 20 77 69 6c 6c 20 set (which will
f960: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 only happen if t
f970: 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 20 he operator is.
f980: 20 20 20 20 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 ** OP_Eq or
f990: 20 4f 50 5f 4e 65 29 20 74 68 65 6e 20 74 61 6b OP_Ne) then tak
f9a0: 65 20 74 68 65 20 6a 75 6d 70 20 6f 72 20 6e 6f e the jump or no
f9b0: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 t depending on w
f9c0: 68 65 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 hether. **
f9d0: 6f 72 20 6e 6f 74 20 62 6f 74 68 20 6f 70 65 72 or not both oper
f9e0: 61 6e 64 73 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 ands are null..
f9f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 */. as
fa00: 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 sert( pOp->opcod
fa10: 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20 70 4f 70 2d e==OP_Eq || pOp-
fa20: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 >opcode==OP_Ne )
fa30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
fa40: 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 43 6c (flags1 & MEM_Cl
fa50: 65 61 72 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 eared)==0 );.
fa60: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d assert( (pOp-
fa70: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d >p5 & SQLITE_JUM
fa80: 50 49 46 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 PIFNULL)==0 );.
fa90: 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 if( (flags1
faa0: 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 &MEM_Null)!=0.
fab0: 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26 && (flags3&
fac0: 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 MEM_Null)!=0.
fad0: 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26 4d && (flags3&M
fae0: 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a 20 EM_Cleared)==0.
faf0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 ){.
fb00: 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 52 65 73 res = 0; /* Res
fb10: 75 6c 74 73 20 61 72 65 20 65 71 75 61 6c 20 2a ults are equal *
fb20: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 /. }else{.
fb30: 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 20 res = 1;
fb40: 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72 65 20 /* Results are
fb50: 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 not equal */.
fb60: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a }. }else{.
fb70: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f /* SQLITE_
fb80: 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 NULLEQ is clear
fb90: 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 and at least one
fba0: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c operand is NULL
fbb0: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 ,. ** then
fbc0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c the result is al
fbd0: 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 ways NULL..
fbe0: 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 ** The jump is
fbf0: 74 61 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c taken if the SQL
fc00: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 ITE_JUMPIFNULL b
fc10: 69 74 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 it is set..
fc20: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f */. if( pO
fc30: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 p->p5 & SQLITE_S
fc40: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 TOREP2 ){.
fc50: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 pOut = &aMem[p
fc60: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 Op->p2];.
fc70: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 MemSetTypeFlag(
fc80: 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b pOut, MEM_Null);
fc90: 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 . REGISTE
fca0: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c R_TRACE(pOp->p2,
fcb0: 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 pOut);. }e
fcc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 lse{. Vdb
fcd0: 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 eBranchTaken(2,3
fce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 );. if( p
fcf0: 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f Op->p5 & SQLITE_
fd00: 4a 55 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 JUMPIFNULL ){.
fd10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d goto jum
fd20: 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 p_to_p2;.
fd30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }. }.
fd40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
fd50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 }else{. /* Ne
fd60: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 ither operand is
fd70: 20 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d NULL. Do a com
fd80: 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 parison. */.
fd90: 61 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e affinity = pOp->
fda0: 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f p5 & SQLITE_AFF_
fdb0: 4d 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 MASK;. if( af
fdc0: 66 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 finity>=SQLITE_A
fdd0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 FF_NUMERIC ){.
fde0: 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 if( (pIn1->f
fdf0: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c lags & (MEM_Int|
fe00: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 MEM_Real|MEM_Str
fe10: 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 ))==MEM_Str ){.
fe20: 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 applyNume
fe30: 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 31 ricAffinity(pIn1
fe40: 2c 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ,0);. }.
fe50: 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c if( (pIn3->fl
fe60: 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d ags & (MEM_Int|M
fe70: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 EM_Real|MEM_Str)
fe80: 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 )==MEM_Str ){.
fe90: 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 applyNumer
fea0: 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c icAffinity(pIn3,
feb0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0);. }.
fec0: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69 }else if( affini
fed0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 ty==SQLITE_AFF_T
fee0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 EXT ){. if(
fef0: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 (pIn1->flags &
ff00: 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 MEM_Str)==0 && (
ff10: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 28 4d pIn1->flags & (M
ff20: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 EM_Int|MEM_Real)
ff30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )!=0 ){.
ff40: 74 65 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e testcase( pIn1->
ff50: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 flags & MEM_Int
ff60: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 );. testc
ff70: 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 ase( pIn1->flags
ff80: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 & MEM_Real );.
ff90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
ffa0: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 beMemStringify(p
ffb0: 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 In1, encoding, 1
ffc0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 );. testc
ffd0: 61 73 65 28 20 28 66 6c 61 67 73 31 26 4d 45 4d ase( (flags1&MEM
ffe0: 5f 44 79 6e 29 20 21 3d 20 28 70 49 6e 31 2d 3e _Dyn) != (pIn1->
fff0: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 flags&MEM_Dyn) )
10000 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 31 ;. flags1
10010 20 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 = (pIn1->flags
10020 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 & ~MEM_TypeMask)
10030 20 7c 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d | (flags1 & MEM
10040 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 _TypeMask);.
10050 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 }. if( (p
10060 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d In3->flags & MEM
10070 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 70 49 6e _Str)==0 && (pIn
10080 33 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 3->flags & (MEM_
10090 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d Int|MEM_Real))!=
100a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 0 ){. tes
100b0 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61 tcase( pIn3->fla
100c0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a gs & MEM_Int );.
100d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
100e0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 ( pIn3->flags &
100f0 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 MEM_Real );.
10100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
10110 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e 33 emStringify(pIn3
10120 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a , encoding, 1);.
10130 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
10140 28 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44 79 ( (flags3&MEM_Dy
10150 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 n) != (pIn3->fla
10160 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 gs&MEM_Dyn) );.
10170 20 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 flags3 =
10180 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 7e (pIn3->flags & ~
10190 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 MEM_TypeMask) |
101a0 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54 79 (flags3 & MEM_Ty
101b0 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d peMask);. }
101c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 . }. asser
101d0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d t( pOp->p4type==
101e0 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f P4_COLLSEQ || pO
101f0 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 p->p4.pColl==0 )
10200 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 31 2d 3e ;. if( pIn1->
10210 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f flags & MEM_Zero
10220 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
10230 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 3VdbeMemExpandBl
10240 6f 62 28 70 49 6e 31 29 3b 0a 20 20 20 20 20 20 ob(pIn1);.
10250 66 6c 61 67 73 31 20 26 3d 20 7e 4d 45 4d 5f 5a flags1 &= ~MEM_Z
10260 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ero;. }. i
10270 66 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 f( pIn3->flags &
10280 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 MEM_Zero ){.
10290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
102a0 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 mExpandBlob(pIn3
102b0 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 33 20 );. flags3
102c0 26 3d 20 7e 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 &= ~MEM_Zero;.
102d0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e }. if( db->
102e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 mallocFailed ) g
102f0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 oto no_mem;.
10300 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d res = sqlite3Mem
10310 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 Compare(pIn3, pI
10320 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c n1, pOp->p4.pCol
10330 6c 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 l);. }. switch
10340 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b ( pOp->opcode ){
10350 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a . case OP_Eq:
10360 20 20 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 res = res==0
10370 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 ; break;.
10380 20 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 case OP_Ne:
10390 72 65 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 res = res!=0;
103a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
103b0 65 20 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 e OP_Lt: res
103c0 3d 20 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 = res<0; br
103d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 eak;. case OP
103e0 5f 4c 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65 _Le: res = re
103f0 73 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b s<=0; break;
10400 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a . case OP_Gt:
10410 20 20 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b res = res>0;
10420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
10430 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 default:
10440 72 65 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 res = res>=0;
10450 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 break;. }..
10460 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61 6e /* Undo any chan
10470 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70 6c ges made by appl
10480 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20 74 yAffinity() to t
10490 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 he input registe
104a0 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 rs. */. assert(
104b0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 (pIn1->flags &
104c0 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61 MEM_Dyn) == (fla
104d0 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 gs1 & MEM_Dyn) )
104e0 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 ;. pIn1->flags
104f0 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73 73 65 = flags1;. asse
10500 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 rt( (pIn3->flags
10510 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 & MEM_Dyn) == (
10520 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44 79 6e flags3 & MEM_Dyn
10530 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61 ) );. pIn3->fla
10540 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a 20 20 gs = flags3;..
10550 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 if( pOp->p5 & SQ
10560 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a LITE_STOREP2 ){.
10570 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d pOut = &aMem
10580 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 6d [pOp->p2];. m
10590 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 emAboutToChange(
105a0 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 p, pOut);. Me
105b0 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 mSetTypeFlag(pOu
105c0 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 t, MEM_Int);.
105d0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 pOut->u.i = res
105e0 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 ;. REGISTER_T
105f0 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f RACE(pOp->p2, pO
10600 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 ut);. }else{.
10610 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 VdbeBranchTake
10620 6e 28 72 65 73 21 3d 30 2c 20 28 70 4f 70 2d 3e n(res!=0, (pOp->
10630 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c p5 & SQLITE_NULL
10640 45 51 29 3f 32 3a 33 29 3b 0a 20 20 20 20 69 66 EQ)?2:3);. if
10650 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 67 ( res ){. g
10660 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a oto jump_to_p2;.
10670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 }. }. brea
10680 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a k;.}../* Opcode:
10690 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a Permutation * *
106a0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 * P4 *.**.** Se
106b0 74 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f t the permutatio
106c0 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 n used by the OP
106d0 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 6f _Compare operato
106e0 72 20 74 6f 20 62 65 20 74 68 65 20 61 72 72 61 r to be the arra
106f0 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 y.** of integers
10700 20 69 6e 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 in P4..**.** Th
10710 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 e permutation is
10720 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 only valid unti
10730 6c 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 43 6f l the next OP_Co
10740 6d 70 61 72 65 20 74 68 61 74 20 68 61 73 0a 2a mpare that has.*
10750 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52 * the OPFLAG_PER
10760 4d 55 54 45 20 62 69 74 20 73 65 74 20 69 6e 20 MUTE bit set in
10770 50 35 2e 20 54 79 70 69 63 61 6c 6c 79 20 74 68 P5. Typically th
10780 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e e OP_Permutation
10790 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 6f 63 63 75 should .** occu
107a0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 r immediately pr
107b0 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f ior to the OP_Co
107c0 6d 70 61 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f mpare..*/.case O
107d0 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b P_Permutation: {
107e0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e . assert( pOp->
107f0 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 p4type==P4_INTAR
10800 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 RAY );. assert(
10810 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 pOp->p4.ai );.
10820 20 61 50 65 72 6d 75 74 65 20 3d 20 70 4f 70 2d aPermute = pOp-
10830 3e 70 34 2e 61 69 3b 0a 20 20 62 72 65 61 6b 3b >p4.ai;. break;
10840 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 .}../* Opcode: C
10850 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50 33 20 ompare P1 P2 P3
10860 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 P4 P5.** Synopsi
10870 73 3a 20 72 5b 50 31 40 50 33 5d 20 3c 2d 3e 20 s: r[P1@P3] <->
10880 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 43 r[P2@P3].**.** C
10890 6f 6d 70 61 72 65 20 74 77 6f 20 76 65 63 74 6f ompare two vecto
108a0 72 73 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 rs of registers
108b0 69 6e 20 72 65 67 28 50 31 29 2e 2e 72 65 67 28 in reg(P1)..reg(
108c0 50 31 2b 50 33 2d 31 29 20 28 63 61 6c 6c 20 74 P1+P3-1) (call t
108d0 68 69 73 0a 2a 2a 20 76 65 63 74 6f 72 20 22 41 his.** vector "A
108e0 22 29 20 61 6e 64 20 69 6e 20 72 65 67 28 50 32 ") and in reg(P2
108f0 29 2e 2e 72 65 67 28 50 32 2b 50 33 2d 31 29 20 )..reg(P2+P3-1)
10900 28 22 42 22 29 2e 20 20 53 61 76 65 20 74 68 65 ("B"). Save the
10910 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74 68 result of.** th
10920 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f 72 e comparison for
10930 20 75 73 65 20 62 79 20 74 68 65 20 6e 65 78 74 use by the next
10940 20 4f 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75 63 OP_Jump instruc
10950 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 t..**.** If P5 h
10960 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 as the OPFLAG_PE
10970 52 4d 55 54 45 20 62 69 74 20 73 65 74 2c 20 74 RMUTE bit set, t
10980 68 65 6e 20 74 68 65 20 6f 72 64 65 72 20 6f 66 hen the order of
10990 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 0a 2a comparison is.*
109a0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 * determined by
109b0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 the most recent
109c0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 6f OP_Permutation o
109d0 70 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68 65 perator. If the
109e0 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 .** OPFLAG_PERMU
109f0 54 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c TE bit is clear,
10a00 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 61 then register a
10a10 72 65 20 63 6f 6d 70 61 72 65 64 20 69 6e 20 73 re compared in s
10a20 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 6f 72 64 equential.** ord
10a30 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 er..**.** P4 is
10a40 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 a KeyInfo struct
10a50 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 ure that defines
10a60 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 collating seque
10a70 6e 63 65 73 20 61 6e 64 20 73 6f 72 74 0a 2a 2a nces and sort.**
10a80 20 6f 72 64 65 72 73 20 66 6f 72 20 74 68 65 20 orders for the
10a90 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 comparison. The
10aa0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 70 70 permutation app
10ab0 6c 69 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 lies to register
10ac0 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65 20 s.** only. The
10ad0 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65 6e 74 73 KeyInfo elements
10ae0 20 61 72 65 20 75 73 65 64 20 73 65 71 75 65 6e are used sequen
10af0 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 tially..**.** Th
10b00 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 e comparison is
10b10 61 20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73 6f a sort compariso
10b20 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d 70 n, so NULLs comp
10b30 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e 55 are equal,.** NU
10b40 4c 4c 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 LLs are less tha
10b50 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75 6d 62 65 n numbers, numbe
10b60 72 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e rs are less than
10b70 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e 64 strings,.** and
10b80 20 73 74 72 69 6e 67 73 20 61 72 65 20 6c 65 73 strings are les
10b90 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f s than blobs..*/
10ba0 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70 61 72 65 .case OP_Compare
10bb0 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 : {. int n;. i
10bc0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70 31 3b 0a nt i;. int p1;.
10bd0 20 20 69 6e 74 20 70 32 3b 0a 20 20 63 6f 6e 73 int p2;. cons
10be0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 t KeyInfo *pKeyI
10bf0 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a nfo;. int idx;.
10c00 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c CollSeq *pColl
10c10 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e ; /* Collatin
10c20 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73 g sequence to us
10c30 65 20 6f 6e 20 74 68 69 73 20 74 65 72 6d 20 2a e on this term *
10c40 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 /. int bRev;
10c50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 /* True f
10c60 6f 72 20 44 45 53 43 45 4e 44 49 4e 47 20 73 6f or DESCENDING so
10c70 72 74 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 69 rt order */.. i
10c80 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 f( (pOp->p5 & OP
10c90 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3d 3d 30 FLAG_PERMUTE)==0
10ca0 20 29 20 61 50 65 72 6d 75 74 65 20 3d 20 30 3b ) aPermute = 0;
10cb0 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a . n = pOp->p3;.
10cc0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 pKeyInfo = pOp
10cd0 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 ->p4.pKeyInfo;.
10ce0 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a assert( n>0 );.
10cf0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e assert( pKeyIn
10d00 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 fo!=0 );. p1 =
10d10 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 pOp->p1;. p2 =
10d20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51 4c pOp->p2;.#if SQL
10d30 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 ITE_DEBUG. if(
10d40 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 aPermute ){.
10d50 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 int k, mx = 0;.
10d60 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b for(k=0; k<n;
10d70 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 k++) if( aPermu
10d80 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 te[k]>mx ) mx =
10d90 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 aPermute[k];.
10da0 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 assert( p1>0 &&
10db0 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d p1+mx<=(p->nMem
10dc0 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 -p->nCursor)+1 )
10dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 ;. assert( p2
10de0 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 28 70 2d >0 && p2+mx<=(p-
10df0 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 >nMem-p->nCursor
10e00 29 2b 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a )+1 );. }else{.
10e10 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 assert( p1>0
10e20 20 26 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d && p1+n<=(p->nM
10e30 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 em-p->nCursor)+1
10e40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
10e50 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 28 70 p2>0 && p2+n<=(p
10e60 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f ->nMem-p->nCurso
10e70 72 29 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 r)+1 );. }.#end
10e80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 if /* SQLITE_DEB
10e90 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b UG */. for(i=0;
10ea0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 i<n; i++){.
10eb0 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f idx = aPermute ?
10ec0 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69 aPermute[i] : i
10ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 ;. assert( me
10ee0 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 mIsValid(&aMem[p
10ef0 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61 1+idx]) );. a
10f00 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 ssert( memIsVali
10f10 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 d(&aMem[p2+idx])
10f20 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 );. REGISTER
10f30 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26 _TRACE(p1+idx, &
10f40 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 aMem[p1+idx]);.
10f50 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 REGISTER_TRAC
10f60 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b E(p2+idx, &aMem[
10f70 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73 p2+idx]);. as
10f80 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f sert( i<pKeyInfo
10f90 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 20 20 ->nField );.
10fa0 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f pColl = pKeyInfo
10fb0 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 ->aColl[i];.
10fc0 62 52 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d bRev = pKeyInfo-
10fd0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a >aSortOrder[i];.
10fe0 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 73 iCompare = s
10ff0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 qlite3MemCompare
11000 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 (&aMem[p1+idx],
11010 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 &aMem[p2+idx], p
11020 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 Coll);. if( i
11030 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20 20 20 Compare ){.
11040 20 69 66 28 20 62 52 65 76 20 29 20 69 43 6f 6d if( bRev ) iCom
11050 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65 pare = -iCompare
11060 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
11070 20 20 20 7d 0a 20 20 7d 0a 20 20 61 50 65 72 6d }. }. aPerm
11080 75 74 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b ute = 0;. break
11090 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ;.}../* Opcode:
110a0 4a 75 6d 70 20 50 31 20 50 32 20 50 33 20 2a 20 Jump P1 P2 P3 *
110b0 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 *.**.** Jump to
110c0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 the instruction
110d0 61 74 20 61 64 64 72 65 73 73 20 50 31 2c 20 50 at address P1, P
110e0 32 2c 20 6f 72 20 50 33 20 64 65 70 65 6e 64 69 2, or P3 dependi
110f0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a ng on whether.**
11100 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 in the most rec
11110 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69 ent OP_Compare i
11120 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 50 nstruction the P
11130 31 20 76 65 63 74 6f 72 20 77 61 73 20 6c 65 73 1 vector was les
11140 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 s than.** equal
11150 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 to, or greater t
11160 68 61 6e 20 74 68 65 20 50 32 20 76 65 63 74 6f han the P2 vecto
11170 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e r, respectively.
11180 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70 .*/.case OP_Jump
11190 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 : {
111a0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 /* jump */. if(
111b0 20 69 43 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20 iCompare<0 ){.
111c0 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b VdbeBranchTak
111d0 65 6e 28 30 2c 33 29 3b 20 70 4f 70 20 3d 20 26 en(0,3); pOp = &
111e0 61 4f 70 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d aOp[pOp->p1 - 1]
111f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 ;. }else if( iC
11200 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 ompare==0 ){.
11210 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e VdbeBranchTaken
11220 28 31 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f (1,3); pOp = &aO
11230 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a p[pOp->p2 - 1];.
11240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 }else{. Vdb
11250 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 eBranchTaken(2,3
11260 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f ); pOp = &aOp[pO
11270 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a 20 20 7d 0a p->p3 - 1];. }.
11280 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f break;.}../* O
11290 70 63 6f 64 65 3a 20 41 6e 64 20 50 31 20 50 32 pcode: And P1 P2
112a0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 P3 * *.** Synop
112b0 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50 31 sis: r[P3]=(r[P1
112c0 5d 20 26 26 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a ] && r[P2]).**.*
112d0 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 * Take the logic
112e0 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 al AND of the va
112f0 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 lues in register
11300 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a s P1 and P2 and.
11310 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65 73 ** write the res
11320 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 ult into registe
11330 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 r P3..**.** If e
11340 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69 ither P1 or P2 i
11350 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e s 0 (false) then
11360 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 the result is 0
11370 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 even if.** the
11380 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e other input is N
11390 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 ULL. A NULL and
113a0 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c true or two NUL
113b0 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c Ls give.** a NUL
113c0 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20 L output..*/./*
113d0 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32 Opcode: Or P1 P2
113e0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 P3 * *.** Synop
113f0 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50 31 sis: r[P3]=(r[P1
11400 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a ] || r[P2]).**.*
11410 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 * Take the logic
11420 61 6c 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c al OR of the val
11430 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 ues in register
11440 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a P1 and P2 and.**
11450 20 73 74 6f 72 65 20 74 68 65 20 61 6e 73 77 65 store the answe
11460 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 r in register P3
11470 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 ..**.** If eithe
11480 72 20 50 31 20 6f 72 20 50 32 20 69 73 20 6e 6f r P1 or P2 is no
11490 6e 7a 65 72 6f 20 28 74 72 75 65 29 20 74 68 65 nzero (true) the
114a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 n the result is
114b0 31 20 28 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 1 (true).** even
114c0 20 69 66 20 74 68 65 20 6f 74 68 65 72 20 69 6e if the other in
114d0 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 put is NULL. A
114e0 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f NULL and false o
114f0 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 r two NULLs.** g
11500 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 ive a NULL outpu
11510 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e t..*/.case OP_An
11520 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d:
11530 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e /* same as TK_AN
11540 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 D, in1, in2, out
11550 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 3 */.case OP_Or:
11560 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f { /
11570 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c * same as TK_OR,
11580 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 in1, in2, out3
11590 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20 20 20 20 */. int v1;
115a0 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 3a /* Left operand:
115b0 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 0==FALSE, 1==T
115c0 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 RUE, 2==UNKNOWN
115d0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 or NULL */. int
115e0 20 76 32 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 v2; /* Right
115f0 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41 4c operand: 0==FAL
11600 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d SE, 1==TRUE, 2==
11610 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 UNKNOWN or NULL
11620 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d */.. pIn1 = &aM
11630 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 em[pOp->p1];. i
11640 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 f( pIn1->flags &
11650 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 MEM_Null ){.
11660 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 v1 = 2;. }else
11670 7b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 {. v1 = sqlit
11680 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 e3VdbeIntValue(p
11690 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 In1)!=0;. }. p
116a0 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d In2 = &aMem[pOp-
116b0 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 32 >p2];. if( pIn2
116c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 ->flags & MEM_Nu
116d0 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 ll ){. v2 = 2
116e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 ;. }else{. v
116f0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 2 = sqlite3VdbeI
11700 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 21 3d 30 ntValue(pIn2)!=0
11710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d ;. }. if( pOp-
11720 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 >opcode==OP_And
11730 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f ){. static co
11740 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
11750 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 r and_logic[] =
11760 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c { 0, 0, 0, 0, 1,
11770 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 2, 0, 2, 2 };.
11780 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 v1 = and_logi
11790 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 c[v1*3+v2];. }e
117a0 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 lse{. static
117b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
117c0 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d har or_logic[] =
117d0 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 { 0, 1, 2, 1, 1
117e0 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a , 1, 2, 1, 2 };.
117f0 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 v1 = or_logi
11800 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a c[v1*3+v2];. }.
11810 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 pOut = &aMem[p
11820 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 Op->p3];. if( v
11830 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 1==2 ){. MemS
11840 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c etTypeFlag(pOut,
11850 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 MEM_Null);. }e
11860 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 lse{. pOut->u
11870 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d .i = v1;. Mem
11880 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 SetTypeFlag(pOut
11890 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a , MEM_Int);. }.
118a0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f break;.}../* O
118b0 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32 pcode: Not P1 P2
118c0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 * * *.** Synops
118d0 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72 5b 50 31 is: r[P2]= !r[P1
118e0 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 ].**.** Interpre
118f0 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 t the value in r
11900 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61 20 egister P1 as a
11910 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 boolean value.
11920 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f 6f Store the.** boo
11930 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 lean complement
11940 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 in register P2.
11950 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e If the value in
11960 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 register P1 is
11970 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 .** NULL, then a
11980 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64 20 NULL is stored
11990 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f in P2..*/.case O
119a0 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 P_Not: {
119b0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 /* same
119c0 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c 20 as TK_NOT, in1,
119d0 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d out2 */. pIn1 =
119e0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b &aMem[pOp->p1];
119f0 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b . pOut = &aMem[
11a00 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 pOp->p2];. sqli
11a10 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c te3VdbeMemSetNul
11a20 6c 28 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 l(pOut);. if( (
11a30 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pIn1->flags & ME
11a40 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 M_Null)==0 ){.
11a50 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 pOut->flags =
11a60 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 MEM_Int;. pOu
11a70 74 2d 3e 75 2e 69 20 3d 20 21 73 71 6c 69 74 65 t->u.i = !sqlite
11a80 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 3VdbeIntValue(pI
11a90 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b n1);. }. break
11aa0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ;.}../* Opcode:
11ab0 42 69 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a BitNot P1 P2 * *
11ac0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
11ad0 72 5b 50 31 5d 3d 20 7e 72 5b 50 31 5d 0a 2a 2a r[P1]= ~r[P1].**
11ae0 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 .** Interpret th
11af0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 e content of reg
11b00 69 73 74 65 72 20 50 31 20 61 73 20 61 6e 20 69 ister P1 as an i
11b10 6e 74 65 67 65 72 2e 20 20 53 74 6f 72 65 20 74 nteger. Store t
11b20 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f 6d 70 6c he.** ones-compl
11b30 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 50 31 20 ement of the P1
11b40 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 value into regis
11b50 74 65 72 20 50 32 2e 20 20 49 66 20 50 31 20 68 ter P2. If P1 h
11b60 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 olds.** a NULL t
11b70 68 65 6e 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c hen store a NULL
11b80 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 in P2..*/.case
11b90 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20 20 20 20 OP_BitNot: {
11ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 /* same
11bb0 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54 2c 20 69 as TK_BITNOT, i
11bc0 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 n1, out2 */. pI
11bd0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e n1 = &aMem[pOp->
11be0 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 p1];. pOut = &a
11bf0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 Mem[pOp->p2];.
11c00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
11c10 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69 tNull(pOut);. i
11c20 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 f( (pIn1->flags
11c30 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 & MEM_Null)==0 )
11c40 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 {. pOut->flag
11c50 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 s = MEM_Int;.
11c60 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 7e 73 71 pOut->u.i = ~sq
11c70 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 lite3VdbeIntValu
11c80 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 e(pIn1);. }. b
11c90 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f reak;.}../* Opco
11ca0 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32 20 2a de: Once P1 P2 *
11cb0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b * *.**.** Check
11cc0 20 74 68 65 20 22 6f 6e 63 65 22 20 66 6c 61 67 the "once" flag
11cd0 20 6e 75 6d 62 65 72 20 50 31 2e 20 49 66 20 69 number P1. If i
11ce0 74 20 69 73 20 73 65 74 2c 20 6a 75 6d 70 20 74 t is set, jump t
11cf0 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 o instruction P2
11d00 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c . .** Otherwise,
11d10 20 73 65 74 20 74 68 65 20 66 6c 61 67 20 61 6e set the flag an
11d20 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 d fall through t
11d30 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 o the next instr
11d40 75 63 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 uction..** In ot
11d50 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 20 her words, this
11d60 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20 61 6c opcode causes al
11d70 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 63 6f l following opco
11d80 64 65 73 20 75 70 20 74 68 72 6f 75 67 68 20 50 des up through P
11d90 32 0a 2a 2a 20 28 62 75 74 20 6e 6f 74 20 69 6e 2.** (but not in
11da0 63 6c 75 64 69 6e 67 20 50 32 29 20 74 6f 20 72 cluding P2) to r
11db0 75 6e 20 6a 75 73 74 20 6f 6e 63 65 20 61 6e 64 un just once and
11dc0 20 74 6f 20 62 65 20 73 6b 69 70 70 65 64 20 6f to be skipped o
11dd0 6e 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 n subsequent.**
11de0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 times through th
11df0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c e loop..**.** Al
11e00 6c 20 22 6f 6e 63 65 22 20 66 6c 61 67 73 20 61 l "once" flags a
11e10 72 65 20 69 6e 69 74 69 61 6c 6c 79 20 63 6c 65 re initially cle
11e20 61 72 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 ared whenever a
11e30 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
11e40 6e 74 0a 2a 2a 20 66 69 72 73 74 20 62 65 67 69 nt.** first begi
11e50 6e 73 20 74 6f 20 72 75 6e 2e 0a 2a 2f 0a 63 61 ns to run..*/.ca
11e60 73 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 se OP_Once: {
11e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d /* jum
11e80 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 p */. assert( p
11e90 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 4f 6e 63 65 46 Op->p1<p->nOnceF
11ea0 6c 61 67 20 29 3b 0a 20 20 56 64 62 65 42 72 61 lag );. VdbeBra
11eb0 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 61 4f 6e 63 nchTaken(p->aOnc
11ec0 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 31 5d 21 3d eFlag[pOp->p1]!=
11ed0 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 2d 3e 0, 2);. if( p->
11ee0 61 4f 6e 63 65 46 6c 61 67 5b 70 4f 70 2d 3e 70 aOnceFlag[pOp->p
11ef0 31 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 1] ){. goto j
11f00 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c ump_to_p2;. }el
11f10 73 65 7b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 se{. p->aOnce
11f20 46 6c 61 67 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 Flag[pOp->p1] =
11f30 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 1;. }. break;.
11f40 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 }../* Opcode: If
11f50 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a P1 P2 P3 * *.**
11f60 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 .** Jump to P2 i
11f70 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 f the value in r
11f80 65 67 69 73 74 65 72 20 50 31 20 69 73 20 74 72 egister P1 is tr
11f90 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a ue. The value.*
11fa0 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 * is considered
11fb0 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 75 true if it is nu
11fc0 6d 65 72 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 meric and non-ze
11fd0 72 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 ro. If the valu
11fe0 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 e.** in P1 is NU
11ff0 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 LL then take the
12000 20 6a 75 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c jump if and onl
12010 79 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a y if P3 is non-z
12020 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 ero..*/./* Opcod
12030 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32 20 50 e: IfNot P1 P2 P
12040 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 3 * *.**.** Jump
12050 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 to P2 if the va
12060 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 lue in register
12070 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20 54 68 P1 is False. Th
12080 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f e value.** is co
12090 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65 20 69 nsidered false i
120a0 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d 65 72 f it has a numer
120b0 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f ic value of zero
120c0 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a . If the value.
120d0 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c ** in P1 is NULL
120e0 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a then take the j
120f0 75 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 ump if and only
12100 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 if P3 is non-zer
12110 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 o..*/.case OP_If
12120 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 :
12130 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a /* jump, in1 *
12140 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a /.case OP_IfNot:
12150 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a { /*
12160 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 jump, in1 */.
12170 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20 3d 20 int c;. pIn1 =
12180 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a &aMem[pOp->p1];.
12190 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 if( pIn1->flag
121a0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a s & MEM_Null ){.
121b0 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b c = pOp->p3;
121c0 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 . }else{.#ifdef
121d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f SQLITE_OMIT_FLO
121e0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 ATING_POINT.
121f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 c = sqlite3VdbeI
12200 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 ntValue(pIn1)!=0
12210 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20 3d 20 ;.#else. c =
12220 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 sqlite3VdbeRealV
12230 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e 30 3b alue(pIn1)!=0.0;
12240 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 .#endif. if(
12250 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f pOp->opcode==OP_
12260 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63 3b 0a IfNot ) c = !c;.
12270 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 }. VdbeBranch
12280 54 61 6b 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a Taken(c!=0, 2);.
12290 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 67 if( c ){. g
122a0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a oto jump_to_p2;.
122b0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a }. break;.}..
122c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c /* Opcode: IsNul
122d0 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a l P1 P2 * * *.**
122e0 20 53 79 6e 6f 70 73 69 73 3a 20 20 69 66 20 72 Synopsis: if r
122f0 5b 50 31 5d 3d 3d 4e 55 4c 4c 20 67 6f 74 6f 20 [P1]==NULL goto
12300 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f P2.**.** Jump to
12310 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 P2 if the value
12320 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 in register P1
12330 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 is NULL..*/.case
12340 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 OP_IsNull: {
12350 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 /* same
12360 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a as TK_ISNULL, j
12370 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 ump, in1 */. pI
12380 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e n1 = &aMem[pOp->
12390 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 p1];. VdbeBranc
123a0 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66 hTaken( (pIn1->f
123b0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 lags & MEM_Null)
123c0 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 28 !=0, 2);. if( (
123d0 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pIn1->flags & ME
123e0 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 M_Null)!=0 ){.
123f0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 goto jump_to_p
12400 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 2;. }. break;.
12410 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f }../* Opcode: No
12420 74 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 tNull P1 P2 * *
12430 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 *.** Synopsis: i
12440 66 20 72 5b 50 31 5d 21 3d 4e 55 4c 4c 20 67 6f f r[P1]!=NULL go
12450 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 to P2.**.** Jump
12460 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 to P2 if the va
12470 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 lue in register
12480 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 P1 is not NULL.
12490 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 .*/.case OP_Not
124a0 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 Null: {
124b0 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b /* same as TK
124c0 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 _NOTNULL, jump,
124d0 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 in1 */. pIn1 =
124e0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a &aMem[pOp->p1];.
124f0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 VdbeBranchTake
12500 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 n( (pIn1->flags
12510 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c 20 & MEM_Null)==0,
12520 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 2);. if( (pIn1-
12530 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c >flags & MEM_Nul
12540 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 l)==0 ){. got
12550 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 o jump_to_p2;.
12560 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a }. break;.}../*
12570 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 Opcode: Column
12580 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a P1 P2 P3 P4 P5.*
12590 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 72 5b 50 * Synopsis: r[P
125a0 33 5d 3d 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 3]=PX.**.** Inte
125b0 72 70 72 65 74 20 74 68 65 20 64 61 74 61 20 74 rpret the data t
125c0 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f hat cursor P1 po
125d0 69 6e 74 73 20 74 6f 20 61 73 20 61 20 73 74 72 ints to as a str
125e0 75 63 74 75 72 65 20 62 75 69 6c 74 20 75 73 69 ucture built usi
125f0 6e 67 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 ng.** the MakeRe
12600 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e cord instruction
12610 2e 20 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65 . (See the Make
12620 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f Record opcode fo
12630 72 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 r additional.**
12640 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 information abou
12650 74 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 t the format of
12660 74 68 65 20 64 61 74 61 2e 29 20 20 45 78 74 72 the data.) Extr
12670 61 63 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f act the P2-th co
12680 6c 75 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 lumn.** from thi
12690 73 20 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68 s record. If th
126a0 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 ere are less tha
126b0 74 20 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c t (P2+1) .** val
126c0 75 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 ues in the recor
126d0 64 2c 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c d, extract a NUL
126e0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c L..**.** The val
126f0 75 65 20 65 78 74 72 61 63 74 65 64 20 69 73 20 ue extracted is
12700 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 stored in regist
12710 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 er P3..**.** If
12720 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 the column conta
12730 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 50 ins fewer than P
12740 32 20 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 2 fields, then e
12750 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 xtract a NULL.
12760 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 Or,.** if the P4
12770 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50 argument is a P
12780 34 5f 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61 4_MEM use the va
12790 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 61 72 lue of the P4 ar
127a0 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 gument as.** the
127b0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 result..**.** I
127c0 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 f the OPFLAG_CLE
127d0 41 52 43 41 43 48 45 20 62 69 74 20 69 73 20 73 ARCACHE bit is s
127e0 65 74 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 et on P5 and P1
127f0 69 73 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c is a pseudo-tabl
12800 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 e cursor,.** the
12810 6e 20 74 68 65 20 63 61 63 68 65 20 6f 66 20 74 n the cache of t
12820 68 65 20 63 75 72 73 6f 72 20 69 73 20 72 65 73 he cursor is res
12830 65 74 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72 et prior to extr
12840 61 63 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d acting the colum
12850 6e 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 n..** The first
12860 4f 50 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 OP_Column agains
12870 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 t a pseudo-table
12880 20 61 66 74 65 72 20 74 68 65 20 76 61 6c 75 65 after the value
12890 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a of the content.
128a0 2a 2a 20 72 65 67 69 73 74 65 72 20 68 61 73 20 ** register has
128b0 63 68 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 changed should h
128c0 61 76 65 20 74 68 69 73 20 62 69 74 20 73 65 74 ave this bit set
128d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f ..**.** If the O
128e0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 PFLAG_LENGTHARG
128f0 61 6e 64 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f and OPFLAG_TYPEO
12900 46 41 52 47 20 62 69 74 73 20 61 72 65 20 73 65 FARG bits are se
12910 74 20 6f 6e 20 50 35 20 77 68 65 6e 0a 2a 2a 20 t on P5 when.**
12920 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 the result is gu
12930 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 aranteed to only
12940 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 be used as the
12950 61 72 67 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 argument of a le
12960 6e 67 74 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 ngth().** or typ
12970 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 eof() function,
12980 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 respectively. T
12990 68 65 20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 he loading of la
129a0 72 67 65 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 rge blobs can be
129b0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 66 6f 72 20 .** skipped for
129c0 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 61 6c 6c length() and all
129d0 20 63 6f 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 content loading
129e0 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 20 can be skipped
129f0 66 6f 72 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f for typeof()..*/
12a00 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a .case OP_Column:
12a10 20 7b 0a 20 20 69 36 34 20 70 61 79 6c 6f 61 64 {. i64 payload
12a20 53 69 7a 65 36 34 3b 20 2f 2a 20 4e 75 6d 62 65 Size64; /* Numbe
12a30 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 r of bytes in th
12a40 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e e record */. in
12a50 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 t p2;
12a60 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 /* column numbe
12a70 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f r to retrieve */
12a80 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 . VdbeCursor *p
12a90 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 C; /* The VDB
12aa0 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 42 74 E cursor */. Bt
12ab0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 20 20 Cursor *pCrsr;
12ac0 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 63 75 /* The BTree cu
12ad0 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20 2a 61 rsor */. u32 *a
12ae0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 Offset; /*
12af0 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20 6f 66 aOffset[i] is of
12b00 66 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f 66 fset to start of
12b10 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68 20 63 data for i-th c
12b20 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c olumn */. int l
12b30 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a en; /*
12b40 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 The length of t
12b50 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 he serialized da
12b60 74 61 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d ta for the colum
12b70 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 n */. int i;
12b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f /* Loo
12b90 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4d p counter */. M
12ba0 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20 20 20 em *pDest;
12bb0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 /* Where to wr
12bc0 69 74 65 20 74 68 65 20 65 78 74 72 61 63 74 65 ite the extracte
12bd0 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d d value */. Mem
12be0 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 sMem;
12bf0 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 /* For storing t
12c00 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 he record being
12c10 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e decoded */. con
12c20 73 74 20 75 38 20 2a 7a 44 61 74 61 3b 20 20 20 st u8 *zData;
12c30 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65 20 72 /* Part of the r
12c40 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f ecord being deco
12c50 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 ded */. const u
12c60 38 20 2a 7a 48 64 72 3b 20 20 20 20 2f 2a 20 4e 8 *zHdr; /* N
12c70 65 78 74 20 75 6e 70 61 72 73 65 64 20 62 79 74 ext unparsed byt
12c80 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 e of the header
12c90 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a */. const u8 *z
12ca0 45 6e 64 48 64 72 3b 20 2f 2a 20 50 6f 69 6e 74 EndHdr; /* Point
12cb0 65 72 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 er to first byte
12cc0 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 after the heade
12cd0 72 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 r */. u32 offse
12ce0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 t; /* Off
12cf0 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 set into the dat
12d00 61 20 2a 2f 0a 20 20 75 36 34 20 6f 66 66 73 65 a */. u64 offse
12d10 74 36 34 3b 20 20 20 20 20 20 2f 2a 20 36 34 2d t64; /* 64-
12d20 62 69 74 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 bit offset */.
12d30 75 33 32 20 61 76 61 69 6c 3b 20 20 20 20 20 20 u32 avail;
12d40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
12d50 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 bytes of availab
12d60 6c 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 le data */. u32
12d70 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
12d80 2f 2a 20 41 20 74 79 70 65 20 63 6f 64 65 20 66 /* A type code f
12d90 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 68 rom the record h
12da0 65 61 64 65 72 20 2a 2f 0a 20 20 75 31 36 20 66 eader */. u16 f
12db0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a x; /*
12dc0 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 76 61 pDest->flags va
12dd0 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 lue */. Mem *pR
12de0 65 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 eg; /* P
12df0 73 65 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74 seudoTable input
12e00 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 register */..
12e10 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 p2 = pOp->p2;.
12e20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e assert( pOp->p3>
12e30 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 0 && pOp->p3<=(p
12e40 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f ->nMem-p->nCurso
12e50 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 r) );. pDest =
12e60 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a &aMem[pOp->p3];.
12e70 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e memAboutToChan
12e80 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 ge(p, pDest);.
12e90 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e assert( pOp->p1>
12ea0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d =0 && pOp->p1<p-
12eb0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 >nCursor );. pC
12ec0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d = p->apCsr[pOp-
12ed0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 >p1];. assert(
12ee0 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 pC!=0 );. asser
12ef0 74 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65 6c 64 t( p2<pC->nField
12f00 20 29 3b 0a 20 20 61 4f 66 66 73 65 74 20 3d 20 );. aOffset =
12f10 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 23 69 66 pC->aOffset;.#if
12f20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
12f30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 _VIRTUALTABLE.
12f40 61 73 73 65 72 74 28 20 70 43 2d 3e 70 56 74 61 assert( pC->pVta
12f50 62 43 75 72 73 6f 72 3d 3d 30 20 29 3b 20 2f 2a bCursor==0 ); /*
12f60 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6e 65 76 65 72 OP_Column never
12f70 20 63 61 6c 6c 65 64 20 6f 6e 20 76 69 72 74 75 called on virtu
12f80 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 23 65 6e 64 al table */.#end
12f90 69 66 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d if. pCrsr = pC-
12fa0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 >pCursor;. asse
12fb0 72 74 28 20 70 43 72 73 72 21 3d 30 20 7c 7c 20 rt( pCrsr!=0 ||
12fc0 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 pC->pseudoTableR
12fd0 65 67 3e 30 20 29 3b 20 2f 2a 20 70 43 72 73 72 eg>0 ); /* pCrsr
12fe0 20 4e 55 4c 4c 20 6f 6e 20 50 73 65 75 64 6f 54 NULL on PseudoT
12ff0 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 ables */. asser
13000 74 28 20 70 43 72 73 72 21 3d 30 20 7c 7c 20 70 t( pCrsr!=0 || p
13010 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 20 20 20 C->nullRow );
13020 20 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e 6e 75 /* pC->nu
13030 6c 6c 52 6f 77 20 6f 6e 20 50 73 65 75 64 6f 54 llRow on PseudoT
13040 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 ables */.. /* I
13050 66 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 63 f the cursor cac
13060 68 65 20 69 73 20 73 74 61 6c 65 2c 20 62 72 69 he is stale, bri
13070 6e 67 20 69 74 20 75 70 2d 74 6f 2d 64 61 74 65 ng it up-to-date
13080 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 */. rc = sqlit
13090 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 e3VdbeCursorMove
130a0 74 6f 28 70 43 29 3b 0a 20 20 69 66 28 20 72 63 to(pC);. if( rc
130b0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 ) goto abort_du
130c0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 e_to_error;. if
130d0 28 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 ( pC->cacheStatu
130e0 73 21 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 s!=p->cacheCtr )
130f0 7b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 {. if( pC->nu
13100 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 llRow ){. i
13110 66 28 20 70 43 72 73 72 3d 3d 30 20 29 7b 0a 20 f( pCrsr==0 ){.
13120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
13130 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 C->pseudoTableRe
13140 67 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 g>0 );. p
13150 52 65 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e Reg = &aMem[pC->
13160 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 5d 3b pseudoTableReg];
13170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
13180 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26 20 4d pReg->flags & M
13190 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 EM_Blob );.
131a0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 assert( memIs
131b0 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b 0a 20 Valid(pReg) );.
131c0 20 20 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f pC->paylo
131d0 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 73 7a 52 adSize = pC->szR
131e0 6f 77 20 3d 20 61 76 61 69 6c 20 3d 20 70 52 65 ow = avail = pRe
131f0 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 g->n;. pC
13200 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 70 52 ->aRow = (u8*)pR
13210 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c eg->z;. }el
13220 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 se{. sqli
13230 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c te3VdbeMemSetNul
13240 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 l(pDest);.
13250 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e goto op_column
13260 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 _out;. }.
13270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 }else{. a
13280 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a ssert( pCrsr );.
13290 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 if( pC->is
132a0 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 Table==0 ){.
132b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 assert( sqli
132c0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 te3BtreeCursorIs
132d0 56 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a Valid(pCrsr) );.
132e0 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 VVA_ONLY
132f0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 (rc =) sqlite3Bt
13300 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72 reeKeySize(pCrsr
13310 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 , &payloadSize64
13320 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 );. asser
13330 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b t( rc==SQLITE_OK
13340 20 29 3b 20 2f 2a 20 54 72 75 65 20 62 65 63 61 ); /* True beca
13350 75 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 use of CursorMov
13360 65 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 eto() call above
13370 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 */. /* s
13380 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 qlite3BtreeParse
13390 43 65 6c 6c 50 74 72 28 29 20 75 73 65 73 20 67 CellPtr() uses g
133a0 65 74 56 61 72 69 6e 74 33 32 28 29 20 74 6f 20 etVarint32() to
133b0 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 20 20 extract the.
133c0 20 20 20 20 2a 2a 20 70 61 79 6c 6f 61 64 20 73 ** payload s
133d0 69 7a 65 2c 20 73 6f 20 69 74 20 69 73 20 69 6d ize, so it is im
133e0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 70 61 79 possible for pay
133f0 6c 6f 61 64 53 69 7a 65 36 34 20 74 6f 20 62 65 loadSize64 to be
13400 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 . ** larg
13410 65 72 20 74 68 61 6e 20 33 32 20 62 69 74 73 2e er than 32 bits.
13420 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 */. asse
13430 72 74 28 20 28 70 61 79 6c 6f 61 64 53 69 7a 65 rt( (payloadSize
13440 36 34 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 64 & SQLITE_MAX_
13450 55 33 32 29 3d 3d 28 75 36 34 29 70 61 79 6c 6f U32)==(u64)paylo
13460 61 64 53 69 7a 65 36 34 20 29 3b 0a 20 20 20 20 adSize64 );.
13470 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 73 pC->aRow = s
13480 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 qlite3BtreeKeyFe
13490 74 63 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 tch(pCrsr, &avai
134a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e l);. pC->
134b0 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 28 75 payloadSize = (u
134c0 33 32 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 32)payloadSize64
134d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
134e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 assert( s
134f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
13500 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 rIsValid(pCrsr)
13510 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f );. VVA_O
13520 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 NLY(rc =) sqlite
13530 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 3BtreeDataSize(p
13540 43 72 73 72 2c 20 26 70 43 2d 3e 70 61 79 6c 6f Crsr, &pC->paylo
13550 61 64 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 adSize);.
13560 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
13570 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f 2a 20 44 ITE_OK ); /* D
13580 61 74 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 ataSize() cannot
13590 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20 20 20 20 fail */.
135a0 20 70 43 2d 3e 61 52 6f 77 20 3d 20 73 71 6c 69 pC->aRow = sqli
135b0 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 te3BtreeDataFetc
135c0 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29 h(pCrsr, &avail)
135d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
135e0 61 73 73 65 72 74 28 20 61 76 61 69 6c 3c 3d 36 assert( avail<=6
135f0 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d 61 78 69 5536 ); /* Maxi
13600 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 20 69 73 mum page size is
13610 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20 20 20 20 64KiB */.
13620 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 if( pC->payloadS
13630 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76 61 69 ize <= (u32)avai
13640 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 2d l ){. pC-
13650 3e 73 7a 52 6f 77 20 3d 20 70 43 2d 3e 70 61 79 >szRow = pC->pay
13660 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 loadSize;.
13670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 }else{. p
13680 43 2d 3e 73 7a 52 6f 77 20 3d 20 61 76 61 69 6c C->szRow = avail
13690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
136a0 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 if( pC->payloadS
136b0 69 7a 65 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 ize > (u32)db->a
136c0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d Limit[SQLITE_LIM
136d0 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 IT_LENGTH] ){.
136e0 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 goto too_b
136f0 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ig;. }.
13700 7d 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 }. pC->cacheS
13710 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63 68 65 tatus = p->cache
13720 43 74 72 3b 0a 20 20 20 20 70 43 2d 3e 69 48 64 Ctr;. pC->iHd
13730 72 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 rOffset = getVar
13740 69 6e 74 33 32 28 70 43 2d 3e 61 52 6f 77 2c 20 int32(pC->aRow,
13750 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 70 43 2d offset);. pC-
13760 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b >nHdrParsed = 0;
13770 0a 20 20 20 20 61 4f 66 66 73 65 74 5b 30 5d 20 . aOffset[0]
13780 3d 20 6f 66 66 73 65 74 3b 0a 0a 0a 20 20 20 20 = offset;...
13790 69 66 28 20 61 76 61 69 6c 3c 6f 66 66 73 65 74 if( avail<offset
137a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d ){. /* pC-
137b0 3e 61 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68 >aRow does not h
137c0 61 76 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ave to hold the
137d0 65 6e 74 69 72 65 20 72 6f 77 2c 20 62 75 74 20 entire row, but
137e0 69 74 20 64 6f 65 73 20 61 74 20 6c 65 61 73 74 it does at least
137f0 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 . ** need t
13800 6f 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 o cover the head
13810 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 er of the record
13820 2e 20 20 49 66 20 70 43 2d 3e 61 52 6f 77 20 64 . If pC->aRow d
13830 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a oes not contain.
13840 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d ** the com
13850 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 74 68 plete header, th
13860 65 6e 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 en set it to zer
13870 6f 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 68 o, forcing the h
13880 65 61 64 65 72 20 74 6f 20 62 65 0a 20 20 20 20 eader to be.
13890 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 ** dynamically
138a0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 allocated. */.
138b0 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 pC->aRow =
138c0 30 3b 0a 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 0;. pC->szR
138d0 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f ow = 0;.. /
138e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f * Make sure a co
138f0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 68 rrupt database h
13900 61 73 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 as not given us
13910 61 6e 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64 an oversize head
13920 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20 er.. ** Do
13930 74 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 this now to avoi
13940 64 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 d an oversize me
13950 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e mory allocation.
13960 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 . **.
13970 2a 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 ** Type entries
13980 63 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 can be between 1
13990 20 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 and 5 bytes eac
139a0 68 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 h. But 4 and 5
139b0 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 79 byte. ** ty
139c0 70 65 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20 pes use so much
139d0 64 61 74 61 20 73 70 61 63 65 20 74 68 61 74 20 data space that
139e0 74 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 there can only b
139f0 65 20 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66 e 4096 and 32 of
13a00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 . ** them,
13a10 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 53 respectively. S
13a20 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 o the maximum he
13a30 61 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73 75 ader length resu
13a40 6c 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20 20 lts from a.
13a50 20 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20 ** 3-byte type
13a60 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 for each of the
13a70 6d 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 maximum of 32768
13a80 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 columns plus th
13a90 72 65 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 ree. ** ext
13aa0 72 61 20 62 79 74 65 73 20 66 6f 72 20 74 68 65 ra bytes for the
13ab0 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69 header length i
13ac0 74 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 tself. 32768*3
13ad0 2b 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 + 3 = 98307..
13ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 */. if(
13af0 6f 66 66 73 65 74 20 3e 20 39 38 33 30 37 20 7c offset > 98307 |
13b00 7c 20 6f 66 66 73 65 74 20 3e 20 70 43 2d 3e 70 | offset > pC->p
13b10 61 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 ayloadSize ){.
13b20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
13b30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a E_CORRUPT_BKPT;.
13b40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f goto op_
13b50 63 6f 6c 75 6d 6e 5f 65 72 72 6f 72 3b 0a 20 20 column_error;.
13b60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
13b70 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e /* The followin
13b80 67 20 67 6f 74 6f 20 69 73 20 61 6e 20 6f 70 74 g goto is an opt
13b90 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 63 imization. It c
13ba0 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 6e an be omitted an
13bb0 64 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 74 68 d. ** everyth
13bc0 69 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 ing will still w
13bd0 6f 72 6b 2e 20 20 42 75 74 20 4f 50 5f 43 6f 6c ork. But OP_Col
13be0 75 6d 6e 20 69 73 20 6d 65 61 73 75 72 61 62 6c umn is measurabl
13bf0 79 20 66 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 y faster. **
13c00 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 by skipping the
13c10 73 75 62 73 65 71 75 65 6e 74 20 63 6f 6e 64 69 subsequent condi
13c20 74 69 6f 6e 61 6c 2c 20 77 68 69 63 68 20 69 73 tional, which is
13c30 20 61 6c 77 61 79 73 20 74 72 75 65 2e 0a 20 20 always true..
13c40 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 */. assert(
13c50 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c pC->nHdrParsed<
13c60 3d 70 32 20 29 3b 20 20 20 20 20 20 20 20 20 2f =p2 ); /
13c70 2a 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b * Conditional sk
13c80 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 67 6f 74 ipped */. got
13c90 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64 o op_column_read
13ca0 5f 68 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 _header;. }..
13cb0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 /* Make sure at
13cc0 6c 65 61 73 74 20 74 68 65 20 66 69 72 73 74 20 least the first
13cd0 70 32 2b 31 20 65 6e 74 72 69 65 73 20 6f 66 20 p2+1 entries of
13ce0 74 68 65 20 68 65 61 64 65 72 20 68 61 76 65 20 the header have
13cf0 62 65 65 6e 0a 20 20 2a 2a 20 70 61 72 73 65 64 been. ** parsed
13d00 20 61 6e 64 20 76 61 6c 69 64 20 69 6e 66 6f 72 and valid infor
13d10 6d 61 74 69 6f 6e 20 69 73 20 69 6e 20 61 4f 66 mation is in aOf
13d20 66 73 65 74 5b 5d 20 61 6e 64 20 70 43 2d 3e 61 fset[] and pC->a
13d30 54 79 70 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 Type[].. */. i
13d40 66 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 f( pC->nHdrParse
13d50 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20 2f 2a 20 d<=p2 ){. /*
13d60 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 If there is more
13d70 20 68 65 61 64 65 72 20 61 76 61 69 6c 61 62 6c header availabl
13d80 65 20 66 6f 72 20 70 61 72 73 69 6e 67 20 69 6e e for parsing in
13d90 20 74 68 65 20 72 65 63 6f 72 64 2c 20 74 72 79 the record, try
13da0 0a 20 20 20 20 2a 2a 20 74 6f 20 65 78 74 72 61 . ** to extra
13db0 63 74 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 ct additional fi
13dc0 65 6c 64 73 20 75 70 20 74 68 72 6f 75 67 68 20 elds up through
13dd0 74 68 65 20 70 32 2b 31 2d 74 68 20 66 69 65 6c the p2+1-th fiel
13de0 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6f 70 d . */. op
13df0 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 _column_read_hea
13e00 64 65 72 3a 0a 20 20 20 20 69 66 28 20 70 43 2d der:. if( pC-
13e10 3e 69 48 64 72 4f 66 66 73 65 74 3c 61 4f 66 66 >iHdrOffset<aOff
13e20 73 65 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 set[0] ){.
13e30 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 7a 44 61 /* Make sure zDa
13e40 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 65 6e 6f ta points to eno
13e50 75 67 68 20 6f 66 20 74 68 65 20 72 65 63 6f 72 ugh of the recor
13e60 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20 68 d to cover the h
13e70 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 eader. */.
13e80 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 if( pC->aRow==0
13e90 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 ){. memse
13ea0 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 t(&sMem, 0, size
13eb0 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 20 20 20 of(sMem));.
13ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 rc = sqlite3V
13ed0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 dbeMemFromBtree(
13ee0 70 43 72 73 72 2c 20 30 2c 20 61 4f 66 66 73 65 pCrsr, 0, aOffse
13ef0 74 5b 30 5d 2c 20 21 70 43 2d 3e 69 73 54 61 62 t[0], !pC->isTab
13f00 6c 65 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 le, &sMem);.
13f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
13f20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 6f 70 5f TE_OK ) goto op_
13f30 63 6f 6c 75 6d 6e 5f 65 72 72 6f 72 3b 0a 20 20 column_error;.
13f40 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28 75 zData = (u
13f50 38 2a 29 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20 8*)sMem.z;.
13f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
13f70 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77 zData = pC->aRow
13f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 ;. }. .
13f90 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 43 /* Fill in pC
13fa0 2d 3e 61 54 79 70 65 5b 69 5d 20 61 6e 64 20 61 ->aType[i] and a
13fb0 4f 66 66 73 65 74 5b 69 5d 20 76 61 6c 75 65 73 Offset[i] values
13fc0 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2d through the p2-
13fd0 74 68 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 th field. */.
13fe0 20 20 20 69 20 3d 20 70 43 2d 3e 6e 48 64 72 50 i = pC->nHdrP
13ff0 61 72 73 65 64 3b 0a 20 20 20 20 20 20 6f 66 66 arsed;. off
14000 73 65 74 36 34 20 3d 20 61 4f 66 66 73 65 74 5b set64 = aOffset[
14010 69 5d 3b 0a 20 20 20 20 20 20 7a 48 64 72 20 3d i];. zHdr =
14020 20 7a 44 61 74 61 20 2b 20 70 43 2d 3e 69 48 64 zData + pC->iHd
14030 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 7a rOffset;. z
14040 45 6e 64 48 64 72 20 3d 20 7a 44 61 74 61 20 2b EndHdr = zData +
14050 20 61 4f 66 66 73 65 74 5b 30 5d 3b 0a 20 20 20 aOffset[0];.
14060 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 32 assert( i<=p2
14070 20 26 26 20 7a 48 64 72 3c 7a 45 6e 64 48 64 72 && zHdr<zEndHdr
14080 20 29 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 );. do{.
14090 20 20 20 20 20 20 69 66 28 20 28 74 20 3d 20 7a if( (t = z
140a0 48 64 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a Hdr[0])<0x80 ){.
140b0 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b zHdr++
140c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 ;. offs
140d0 65 74 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 et64 += sqlite3V
140e0 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c dbeOneByteSerial
140f0 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 TypeLen(t);.
14100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
14110 20 20 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c zHdr += sql
14120 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 ite3GetVarint32(
14130 7a 48 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 zHdr, &t);.
14140 20 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d offset64 +=
14150 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
14160 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 alTypeLen(t);.
14170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
14180 70 43 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d pC->aType[i++] =
14190 20 74 3b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 t;. aOff
141a0 73 65 74 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f set[i] = (u32)(o
141b0 66 66 73 65 74 36 34 20 26 20 30 78 66 66 66 66 ffset64 & 0xffff
141c0 66 66 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68 ffff);. }wh
141d0 69 6c 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48 ile( i<=p2 && zH
141e0 64 72 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 20 20 dr<zEndHdr );.
141f0 20 20 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 pC->nHdrPars
14200 65 64 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 43 ed = i;. pC
14210 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 28 ->iHdrOffset = (
14220 75 33 32 29 28 7a 48 64 72 20 2d 20 7a 44 61 74 u32)(zHdr - zDat
14230 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 a);. if( pC
14240 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 ->aRow==0 ) sqli
14250 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
14260 65 28 26 73 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 e(&sMem);. .
14270 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 /* The record
14280 20 69 73 20 63 6f 72 72 75 70 74 20 69 66 20 61 is corrupt if a
14290 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ny of the follow
142a0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 ing are true:.
142b0 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65 20 62 ** (1) the b
142c0 79 74 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 ytes of the head
142d0 65 72 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 er extend past t
142e0 68 65 20 64 65 63 6c 61 72 65 64 20 68 65 61 64 he declared head
142f0 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a er size. **
14300 20 28 32 29 20 74 68 65 20 65 6e 74 69 72 65 20 (2) the entire
14310 68 65 61 64 65 72 20 77 61 73 20 75 73 65 64 20 header was used
14320 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61 but not all data
14330 20 77 61 73 20 75 73 65 64 0a 20 20 20 20 20 20 was used.
14340 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64 20 6f ** (3) the end o
14350 66 20 74 68 65 20 64 61 74 61 20 65 78 74 65 6e f the data exten
14360 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e ds beyond the en
14370 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e d of the record.
14380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 . */.
14390 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64 48 if( (zHdr>=zEndH
143a0 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e 64 dr && (zHdr>zEnd
143b0 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36 34 21 Hdr || offset64!
143c0 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 =pC->payloadSize
143d0 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 66 )). || (of
143e0 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70 61 79 fset64 > pC->pay
143f0 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20 loadSize).
14400 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
14410 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
14420 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 KPT;. got
14430 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 65 72 72 6f o op_column_erro
14440 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d r;. }. }
14450 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66 74 65 .. /* If afte
14460 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78 74 72 r trying to extr
14470 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65 73 20 act new entries
14480 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72 2c from the header,
14490 20 6e 48 64 72 50 61 72 73 65 64 20 69 73 0a 20 nHdrParsed is.
144a0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f 74 20 ** still not
144b0 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74 20 6d up to p2, that m
144c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 eans that the re
144d0 63 6f 72 64 20 68 61 73 20 66 65 77 65 72 20 74 cord has fewer t
144e0 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20 63 6f han p2. ** co
144f0 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65 20 72 lumns. So the r
14500 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 65 69 esult will be ei
14510 74 68 65 72 20 74 68 65 20 64 65 66 61 75 6c 74 ther the default
14520 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55 4c 4c value or a NULL
14530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 .. */. if(
14540 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c pC->nHdrParsed<
14550 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 =p2 ){. if(
14560 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 pOp->p4type==P4
14570 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 _MEM ){.
14580 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 sqlite3VdbeMemSh
14590 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c allowCopy(pDest,
145a0 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d pOp->p4.pMem, M
145b0 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 EM_Static);.
145c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
145d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
145e0 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 etNull(pDest);.
145f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 }. got
14600 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b o op_column_out;
14610 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a . }. }else{.
14620 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54 79 70 t = pC->aTyp
14630 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a e[p2];. }.. /*
14640 20 45 78 74 72 61 63 74 20 74 68 65 20 63 6f 6e Extract the con
14650 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70 32 2b tent for the p2+
14660 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 1-th column. Co
14670 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79 0a 20 ntrol can only.
14680 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73 20 70 ** reach this p
14690 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65 74 5b oint if aOffset[
146a0 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70 32 2b p2], aOffset[p2+
146b0 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54 79 70 1], and pC->aTyp
146c0 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a 20 61 e[p2] are. ** a
146d0 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f 0a 20 ll valid.. */.
146e0 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d 3e assert( p2<pC->
146f0 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a 20 20 nHdrParsed );.
14700 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 assert( rc==SQLI
14710 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 TE_OK );. asser
14720 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 t( sqlite3VdbeCh
14730 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 eckMemInvariants
14740 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69 66 28 (pDest) );. if(
14750 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 VdbeMemDynamic(
14760 70 44 65 73 74 29 20 29 20 73 71 6c 69 74 65 33 pDest) ) sqlite3
14770 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 VdbeMemSetNull(p
14780 44 65 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 Dest);. assert(
14790 20 74 3d 3d 70 43 2d 3e 61 54 79 70 65 5b 70 32 t==pC->aType[p2
147a0 5d 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 73 ] );. if( pC->s
147b0 7a 52 6f 77 3e 3d 61 4f 66 66 73 65 74 5b 70 32 zRow>=aOffset[p2
147c0 2b 31 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 +1] ){. /* Th
147d0 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e is is the common
147e0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 case where the
147f0 64 65 73 69 72 65 64 20 63 6f 6e 74 65 6e 74 20 desired content
14800 66 69 74 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 fits on the orig
14810 69 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 inal. ** page
14820 20 2d 20 77 68 65 72 65 20 74 68 65 20 63 6f 6e - where the con
14830 74 65 6e 74 20 69 73 20 6e 6f 74 20 6f 6e 20 61 tent is not on a
14840 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 n overflow page
14850 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 */. sqlite3Vd
14860 62 65 53 65 72 69 61 6c 47 65 74 28 70 43 2d 3e beSerialGet(pC->
14870 61 52 6f 77 2b 61 4f 66 66 73 65 74 5b 70 32 5d aRow+aOffset[p2]
14880 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d , t, pDest);. }
14890 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 else{. /* Thi
148a0 73 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e 73 s branch happens
148b0 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e 74 65 only when conte
148c0 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66 6c 6f nt is on overflo
148d0 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 69 w pages */. i
148e0 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 28 f( ((pOp->p5 & (
148f0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 OPFLAG_LENGTHARG
14900 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 |OPFLAG_TYPEOFAR
14910 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 G))!=0.
14920 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20 28 && ((t>=12 && (
14930 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f 70 t&1)==0) || (pOp
14940 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54 59 ->p5 & OPFLAG_TY
14950 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a 20 20 PEOFARG)!=0)).
14960 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73 71 6c || (len = sql
14970 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 ite3VdbeSerialTy
14980 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20 20 20 peLen(t))==0.
14990 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e ){. /* Con
149a0 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65 76 61 tent is irreleva
149b0 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 nt for. **
149c0 20 20 20 31 2e 20 74 68 65 20 74 79 70 65 6f 66 1. the typeof
149d0 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 20 () function,.
149e0 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68 65 20 ** 2. the
149f0 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63 74 69 length(X) functi
14a00 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62 6c 6f on if X is a blo
14a10 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 b, and. **
14a20 20 20 20 33 2e 20 69 66 20 74 68 65 20 63 6f 6e 3. if the con
14a30 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73 20 7a tent length is z
14a40 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f ero.. ** So
14a50 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c we might as wel
14a60 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f 6e 74 l use bogus cont
14a70 65 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 ent rather than
14a80 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a reading. **
14a90 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 content from di
14aa0 73 6b 2e 20 20 4e 55 4c 4c 20 77 69 6c 6c 20 77 sk. NULL will w
14ab0 6f 72 6b 20 66 6f 72 20 74 68 65 20 76 61 6c 75 ork for the valu
14ac0 65 20 66 6f 72 20 73 74 72 69 6e 67 73 0a 20 20 e for strings.
14ad0 20 20 20 20 2a 2a 20 61 6e 64 20 62 6c 6f 62 73 ** and blobs
14ae0 20 61 6e 64 20 77 68 61 74 65 76 65 72 20 69 73 and whatever is
14af0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 53 in the payloadS
14b00 69 7a 65 36 34 20 76 61 72 69 61 62 6c 65 0a 20 ize64 variable.
14b10 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 77 6f 72 ** will wor
14b20 6b 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 k for everything
14b30 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 else. */.
14b40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
14b50 6c 47 65 74 28 74 3c 3d 31 33 20 3f 20 28 75 38 lGet(t<=13 ? (u8
14b60 2a 29 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 *)&payloadSize64
14b70 20 3a 20 30 2c 20 74 2c 20 70 44 65 73 74 29 3b : 0, t, pDest);
14b80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
14b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 rc = sqlite3Vd
14ba0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 beMemFromBtree(p
14bb0 43 72 73 72 2c 20 61 4f 66 66 73 65 74 5b 70 32 Crsr, aOffset[p2
14bc0 5d 2c 20 6c 65 6e 2c 20 21 70 43 2d 3e 69 73 54 ], len, !pC->isT
14bd0 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 able,.
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14bf0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 29 3b pDest);
14c00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 . if( rc!=S
14c10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
14c20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 goto op_colu
14c30 6d 6e 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 mn_error;.
14c40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 }. sqlite3V
14c50 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 63 6f dbeSerialGet((co
14c60 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d 3e 7a nst u8*)pDest->z
14c70 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 , t, pDest);.
14c80 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 pDest->flags
14c90 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 &= ~MEM_Ephem;.
14ca0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 44 65 73 74 }. }. pDest
14cb0 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 ->enc = encoding
14cc0 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 ;..op_column_out
14cd0 3a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f :. /* If the co
14ce0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 61 6e lumn value is an
14cf0 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69 6e ephemeral strin
14d00 67 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 g, go ahead and
14d10 70 65 72 73 69 73 74 0a 20 20 2a 2a 20 74 68 61 persist. ** tha
14d20 74 20 73 74 72 69 6e 67 20 69 6e 20 63 61 73 65 t string in case
14d30 20 74 68 65 20 63 75 72 73 6f 72 20 6d 6f 76 65 the cursor move
14d40 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6c s before the col
14d50 75 6d 6e 20 76 61 6c 75 65 20 69 73 0a 20 20 2a umn value is. *
14d60 2a 20 75 73 65 64 2e 20 20 54 68 65 20 66 6f 6c * used. The fol
14d70 6c 6f 77 69 6e 67 20 63 6f 64 65 20 64 6f 65 73 lowing code does
14d80 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 the equivalent
14d90 6f 66 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a of Deephemeraliz
14da0 65 28 29 0a 20 20 2a 2a 20 62 75 74 20 64 6f 65 e(). ** but doe
14db0 73 20 69 74 20 66 61 73 74 65 72 2e 20 2a 2f 0a s it faster. */.
14dc0 20 20 69 66 28 20 28 70 44 65 73 74 2d 3e 66 6c if( (pDest->fl
14dd0 61 67 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 ags & MEM_Ephem)
14de0 21 3d 30 20 26 26 20 70 44 65 73 74 2d 3e 7a 20 !=0 && pDest->z
14df0 29 7b 0a 20 20 20 20 66 78 20 3d 20 70 44 65 73 ){. fx = pDes
14e00 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f t->flags & (MEM_
14e10 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 Str|MEM_Blob);.
14e20 20 20 20 61 73 73 65 72 74 28 20 66 78 21 3d 30 assert( fx!=0
14e30 20 29 3b 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 );. zData =
14e40 28 63 6f 6e 73 74 20 75 38 2a 29 70 44 65 73 74 (const u8*)pDest
14e50 2d 3e 7a 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 ->z;. len = p
14e60 44 65 73 74 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 Dest->n;. if(
14e70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 sqlite3VdbeMemC
14e80 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 44 learAndResize(pD
14e90 65 73 74 2c 20 6c 65 6e 2b 32 29 20 29 20 67 6f est, len+2) ) go
14ea0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 6d to no_mem;. m
14eb0 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 7a 2c 20 emcpy(pDest->z,
14ec0 7a 44 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 zData, len);.
14ed0 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d pDest->z[len] =
14ee0 20 30 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 0;. pDest->z
14ef0 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 [len+1] = 0;.
14f00 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20 pDest->flags =
14f10 66 78 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d fx|MEM_Term;. }
14f20 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 65 72 72 6f 72 .op_column_error
14f30 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 :. UPDATE_MAX_B
14f40 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a LOBSIZE(pDest);.
14f50 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 REGISTER_TRACE
14f60 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 (pOp->p3, pDest)
14f70 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a ;. break;.}../*
14f80 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e 69 74 Opcode: Affinit
14f90 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a y P1 P2 * P4 *.*
14fa0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69 * Synopsis: affi
14fb0 6e 69 74 79 28 72 5b 50 31 40 50 32 5d 29 0a 2a nity(r[P1@P2]).*
14fc0 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66 69 6e *.** Apply affin
14fd0 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e 67 65 ities to a range
14fe0 20 6f 66 20 50 32 20 72 65 67 69 73 74 65 72 73 of P2 registers
14ff0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 50 starting with P
15000 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 1..**.** P4 is a
15010 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 string that is
15020 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f P2 characters lo
15030 6e 67 2e 20 54 68 65 20 6e 74 68 20 63 68 61 72 ng. The nth char
15040 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 acter of the.**
15050 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 string indicates
15060 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 the column affi
15070 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 nity that should
15080 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 be used for the
15090 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 nth.** memory c
150a0 65 6c 6c 20 69 6e 20 74 68 65 20 72 61 6e 67 65 ell in the range
150b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 66 66 ..*/.case OP_Aff
150c0 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f 6e 73 74 inity: {. const
150d0 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 char *zAffinity
150e0 3b 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e ; /* The affin
150f0 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 ity to be applie
15100 64 20 2a 2f 0a 20 20 63 68 61 72 20 63 41 66 66 d */. char cAff
15110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
15120 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 68 61 72 /* A single char
15130 61 63 74 65 72 20 6f 66 20 61 66 66 69 6e 69 74 acter of affinit
15140 79 20 2a 2f 0a 0a 20 20 7a 41 66 66 69 6e 69 74 y */.. zAffinit
15150 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 y = pOp->p4.z;.
15160 20 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 assert( zAffini
15170 74 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 ty!=0 );. asser
15180 74 28 20 7a 41 66 66 69 6e 69 74 79 5b 70 4f 70 t( zAffinity[pOp
15190 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a 20 20 70 49 ->p2]==0 );. pI
151a0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e n1 = &aMem[pOp->
151b0 70 31 5d 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 p1];. while( (c
151c0 41 66 66 20 3d 20 2a 28 7a 41 66 66 69 6e 69 74 Aff = *(zAffinit
151d0 79 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 y++))!=0 ){.
151e0 61 73 73 65 72 74 28 20 70 49 6e 31 20 3c 3d 20 assert( pIn1 <=
151f0 26 70 2d 3e 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 &p->aMem[(p->nMe
15200 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 m-p->nCursor)] )
15210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 ;. assert( me
15220 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 mIsValid(pIn1) )
15230 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e ;. applyAffin
15240 69 74 79 28 70 49 6e 31 2c 20 63 41 66 66 2c 20 ity(pIn1, cAff,
15250 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 70 encoding);. p
15260 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 In1++;. }. bre
15270 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 ak;.}../* Opcode
15280 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50 31 20 : MakeRecord P1
15290 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 P2 P3 P4 *.** Sy
152a0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b nopsis: r[P3]=mk
152b0 72 65 63 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a rec(r[P1@P2]).**
152c0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72 .** Convert P2 r
152d0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 egisters beginni
152e0 6e 67 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20 ng with P1 into
152f0 74 68 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d the [record form
15300 61 74 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 at].** use as a
15310 64 61 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61 data record in a
15320 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 database table
15330 6f 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 or as a key.** i
15340 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 n an index. The
15350 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 OP_Column opcod
15360 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65 e can decode the
15370 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a record later..*
15380 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 *.** P4 may be a
15390 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 string that is
153a0 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f P2 characters lo
153b0 6e 67 2e 20 20 54 68 65 20 6e 74 68 20 63 68 61 ng. The nth cha
153c0 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a racter of the.**
153d0 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 string indicate
153e0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 s the column aff
153f0 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c inity that shoul
15400 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 d be used for th
15410 65 20 6e 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f e nth.** field o
15420 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e f the index key.
15430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 .**.** The mappi
15440 6e 67 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 ng from characte
15450 72 20 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 r to affinity is
15460 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 given by the SQ
15470 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 LITE_AFF_.** mac
15480 72 6f 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 ros defined in s
15490 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a qliteInt.h..**.*
154a0 2a 20 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 * If P4 is NULL
154b0 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 then all index f
154c0 69 65 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 ields have the a
154d0 66 66 69 6e 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f ffinity BLOB..*/
154e0 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 .case OP_MakeRec
154f0 6f 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 ord: {. u8 *zNe
15500 77 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 wRecord;
15510 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 /* A buffer to h
15520 6f 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 old the data for
15530 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 the new record
15540 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 */. Mem *pRec;
15550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
15560 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f he new record */
15570 0a 20 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 . u64 nData;
15580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
15590 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 ber of bytes of
155a0 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 data space */.
155b0 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 int nHdr;
155c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
155d0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 of bytes of hea
155e0 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 der space */. i
155f0 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 64 nByte;
15600 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 /* Data sp
15610 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 ace required for
15620 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a this record */.
15630 20 20 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20 i64 nZero;
15640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
15650 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 er of zero bytes
15660 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 at the end of t
15670 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 he record */. i
15680 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 nt nVarint;
15690 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
156a0 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 of bytes in a va
156b0 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 rint */. u32 se
156c0 72 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 rial_type;
156d0 20 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a /* Type field *
156e0 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b /. Mem *pData0;
156f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
15700 72 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 rst field to be
15710 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 combined into th
15720 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 e record */. Me
15730 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 m *pLast;
15740 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 /* Last fie
15750 6c 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 ld of the record
15760 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 */. int nField
15770 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
15780 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 Number of fields
15790 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a in the record *
157a0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e /. char *zAffin
157b0 69 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 ity; /* Th
157c0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e e affinity strin
157d0 67 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 g for the record
157e0 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 */. int file_f
157f0 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 ormat; /*
15800 46 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 File format to u
15810 73 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 se for encoding
15820 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 */. int i;
15830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
15840 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 pace used in zNe
15850 77 52 65 63 6f 72 64 5b 5d 20 68 65 61 64 65 72 wRecord[] header
15860 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 */. int j;
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
15880 53 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e Space used in zN
15890 65 77 52 65 63 6f 72 64 5b 5d 20 63 6f 6e 74 65 ewRecord[] conte
158a0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b nt */. u32 len;
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
158c0 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69 * Length of a fi
158d0 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 eld */.. /* Ass
158e0 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 uming the record
158f0 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c contains N fiel
15900 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66 ds, the record f
15910 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a ormat looks. **
15920 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a like this:. **
15930 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . ** ----------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
15980 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c ** | hdr-size |
15990 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31 type 0 | type 1
159a0 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d | ... | type N-
159b0 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 1 | data0 | ...
159c0 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 | data N-1 | .
159d0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ** -------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a -----------. **
15a20 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73 . ** Data(0) is
15a30 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 taken from regi
15a40 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31 ster P1. Data(1
15a50 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 ) comes from reg
15a60 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 ister P1+1. **
15a70 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 and so forth..
15a80 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70 **. ** Each typ
15a90 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72 e field is a var
15aa0 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 int representing
15ab0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 the serial type
15ac0 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f of the . ** co
15ad0 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 rresponding data
15ae0 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71 element (see sq
15af0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
15b00 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a ype()). The. **
15b10 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 hdr-size field
15b20 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 is also a varint
15b30 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66 which is the of
15b40 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 fset from the be
15b50 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 ginning. ** of
15b60 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61 the record to da
15b70 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 ta0.. */. nDat
15b80 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f a = 0; /
15b90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
15ba0 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 s of data space
15bb0 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20 */. nHdr = 0;
15bc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
15bd0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 r of bytes of he
15be0 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 ader space */.
15bf0 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 nZero = 0;
15c00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
15c10 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 zero bytes at th
15c20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 e end of the rec
15c30 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 ord */. nField
15c40 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 = pOp->p1;. zAf
15c50 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 finity = pOp->p4
15c60 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 .z;. assert( nF
15c70 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70 ield>0 && pOp->p
15c80 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 2>0 && pOp->p2+n
15c90 46 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d Field<=(p->nMem-
15ca0 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b p->nCursor)+1 );
15cb0 0a 20 20 70 44 61 74 61 30 20 3d 20 26 61 4d 65 . pData0 = &aMe
15cc0 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 m[nField];. nFi
15cd0 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 eld = pOp->p2;.
15ce0 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30 pLast = &pData0
15cf0 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 [nField-1];. fi
15d00 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d le_format = p->m
15d10 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 inWriteFileForma
15d20 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 t;.. /* Identif
15d30 79 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 y the output reg
15d40 69 73 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 ister */. asser
15d50 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e t( pOp->p3<pOp->
15d60 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 p1 || pOp->p3>=p
15d70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 Op->p1+pOp->p2 )
15d80 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d ;. pOut = &aMem
15d90 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d [pOp->p3];. mem
15da0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c AboutToChange(p,
15db0 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 41 70 pOut);.. /* Ap
15dc0 70 6c 79 20 74 68 65 20 72 65 71 75 65 73 74 65 ply the requeste
15dd0 64 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 6c d affinity to al
15de0 6c 20 69 6e 70 75 74 73 0a 20 20 2a 2f 0a 20 20 l inputs. */.
15df0 61 73 73 65 72 74 28 20 70 44 61 74 61 30 3c 3d assert( pData0<=
15e00 70 4c 61 73 74 20 29 3b 0a 20 20 69 66 28 20 7a pLast );. if( z
15e10 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 Affinity ){.
15e20 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 pRec = pData0;.
15e30 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 70 70 do{. app
15e40 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 63 2b lyAffinity(pRec+
15e50 2b 2c 20 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b +, *(zAffinity++
15e60 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 ), encoding);.
15e70 20 20 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 assert( zAff
15e80 69 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70 inity[0]==0 || p
15e90 52 65 63 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 Rec<=pLast );.
15ea0 20 20 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e }while( zAffin
15eb0 69 74 79 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 20 ity[0] );. }..
15ec0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 /* Loop through
15ed0 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 the elements th
15ee0 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 at will make up
15ef0 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69 the record to fi
15f00 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f gure. ** out ho
15f10 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 w much space is
15f20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 required for the
15f30 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a new record.. *
15f40 2f 0a 20 20 70 52 65 63 20 3d 20 70 4c 61 73 74 /. pRec = pLast
15f50 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 ;. do{. asse
15f60 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 rt( memIsValid(p
15f70 52 65 63 29 20 29 3b 0a 20 20 20 20 70 52 65 63 Rec) );. pRec
15f80 2d 3e 75 54 65 6d 70 20 3d 20 73 65 72 69 61 6c ->uTemp = serial
15f90 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 _type = sqlite3V
15fa0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 dbeSerialType(pR
15fb0 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c ec, file_format,
15fc0 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 &len);. if(
15fd0 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pRec->flags & ME
15fe0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 M_Zero ){.
15ff0 69 66 28 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 if( nData ){.
16000 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 if( sqlite3
16010 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f VdbeMemExpandBlo
16020 62 28 70 52 65 63 29 20 29 20 67 6f 74 6f 20 6e b(pRec) ) goto n
16030 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c o_mem;. }el
16040 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 5a 65 72 se{. nZer
16050 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 o += pRec->u.nZe
16060 72 6f 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 ro;. len
16070 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f -= pRec->u.nZero
16080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
16090 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e nData += len
160a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 ;. testcase(
160b0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37 serial_type==127
160c0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 );. testcase
160d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 ( serial_type==1
160e0 32 38 20 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 28 );. nHdr +
160f0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31 = serial_type<=1
16100 32 37 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 27 ? 1 : sqlite3
16110 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c VarintLen(serial
16120 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 _type);. }while
16130 28 20 28 2d 2d 70 52 65 63 29 3e 3d 70 44 61 74 ( (--pRec)>=pDat
16140 61 30 20 29 3b 0a 0a 20 20 2f 2a 20 45 56 49 44 a0 );.. /* EVID
16150 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 35 36 34 ENCE-OF: R-22564
16160 2d 31 31 36 34 37 20 54 68 65 20 68 65 61 64 65 -11647 The heade
16170 72 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 r begins with a
16180 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 0a 20 20 single varint.
16190 2a 2a 20 77 68 69 63 68 20 64 65 74 65 72 6d 69 ** which determi
161a0 6e 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 nes the total nu
161b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
161c0 20 74 68 65 20 68 65 61 64 65 72 2e 20 54 68 65 the header. The
161d0 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 76 61 6c varint. ** val
161e0 75 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f ue is the size o
161f0 66 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 f the header in
16200 62 79 74 65 73 20 69 6e 63 6c 75 64 69 6e 67 20 bytes including
16210 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e 74 0a the size varint.
16220 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 2a 2f 0a ** itself. */.
16230 20 20 74 65 73 74 63 61 73 65 28 20 6e 48 64 72 testcase( nHdr
16240 3d 3d 31 32 36 20 29 3b 0a 20 20 74 65 73 74 63 ==126 );. testc
16250 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 37 20 29 ase( nHdr==127 )
16260 3b 0a 20 20 69 66 28 20 6e 48 64 72 3c 3d 31 32 ;. if( nHdr<=12
16270 36 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6 ){. /* The
16280 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 common case */.
16290 20 20 20 6e 48 64 72 20 2b 3d 20 31 3b 0a 20 20 nHdr += 1;.
162a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 61 }else{. /* Ra
162b0 72 65 20 63 61 73 65 20 6f 66 20 61 20 72 65 61 re case of a rea
162c0 6c 6c 79 20 6c 61 72 67 65 20 68 65 61 64 65 72 lly large header
162d0 20 2a 2f 0a 20 20 20 20 6e 56 61 72 69 6e 74 20 */. nVarint
162e0 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c = sqlite3VarintL
162f0 65 6e 28 6e 48 64 72 29 3b 0a 20 20 20 20 6e 48 en(nHdr);. nH
16300 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 3b 0a 20 dr += nVarint;.
16310 20 20 20 69 66 28 20 6e 56 61 72 69 6e 74 3c 73 if( nVarint<s
16320 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 qlite3VarintLen(
16330 6e 48 64 72 29 20 29 20 6e 48 64 72 2b 2b 3b 0a nHdr) ) nHdr++;.
16340 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6e 48 }. nByte = nH
16350 64 72 2b 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 dr+nData;. if(
16360 6e 42 79 74 65 2b 6e 5a 65 72 6f 3e 64 62 2d 3e nByte+nZero>db->
16370 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 aLimit[SQLITE_LI
16380 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 MIT_LENGTH] ){.
16390 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b goto too_big;
163a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 . }.. /* Make
163b0 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 sure the output
163c0 72 65 67 69 73 74 65 72 20 68 61 73 20 61 20 62 register has a b
163d0 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 uffer large enou
163e0 67 68 20 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a gh to store . *
163f0 2a 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 * the new record
16400 2e 20 54 68 65 20 6f 75 74 70 75 74 20 72 65 67 . The output reg
16410 69 73 74 65 72 20 28 70 4f 70 2d 3e 70 33 29 20 ister (pOp->p3)
16420 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 is not allowed t
16430 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 o. ** be one of
16440 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 the input regis
16450 74 65 72 73 20 28 62 65 63 61 75 73 65 20 74 68 ters (because th
16460 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c e following call
16470 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 to. ** sqlite3
16480 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 VdbeMemClearAndR
16490 65 73 69 7a 65 28 29 20 63 6f 75 6c 64 20 63 6c esize() could cl
164a0 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75 65 20 obber the value
164b0 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 before it is use
164c0 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 d).. */. if( s
164d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 qlite3VdbeMemCle
164e0 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4f 75 74 arAndResize(pOut
164f0 2c 20 28 69 6e 74 29 6e 42 79 74 65 29 20 29 7b , (int)nByte) ){
16500 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d . goto no_mem
16510 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f ;. }. zNewReco
16520 72 64 20 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d rd = (u8 *)pOut-
16530 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 >z;.. /* Write
16540 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 the record */.
16550 69 20 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 i = putVarint32(
16560 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e 48 64 72 zNewRecord, nHdr
16570 29 3b 0a 20 20 6a 20 3d 20 6e 48 64 72 3b 0a 20 );. j = nHdr;.
16580 20 61 73 73 65 72 74 28 20 70 44 61 74 61 30 3c assert( pData0<
16590 3d 70 4c 61 73 74 20 29 3b 0a 20 20 70 52 65 63 =pLast );. pRec
165a0 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 64 6f 7b = pData0;. do{
165b0 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 . serial_type
165c0 20 3d 20 70 52 65 63 2d 3e 75 54 65 6d 70 3b 0a = pRec->uTemp;.
165d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d /* EVIDENCE-
165e0 4f 46 3a 20 52 2d 30 36 35 32 39 2d 34 37 33 36 OF: R-06529-4736
165f0 32 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 2 Following the
16600 73 69 7a 65 20 76 61 72 69 6e 74 20 61 72 65 20 size varint are
16610 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 one or more.
16620 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 ** additional va
16630 72 69 6e 74 73 2c 20 6f 6e 65 20 70 65 72 20 63 rints, one per c
16640 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69 20 olumn. */. i
16650 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 += putVarint32(&
16660 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20 73 zNewRecord[i], s
16670 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 20 20 20 erial_type);
16680 20 20 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61 /* seria
16690 6c 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a l type */. /*
166a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d EVIDENCE-OF: R-
166b0 36 34 35 33 36 2d 35 31 37 32 38 20 54 68 65 20 64536-51728 The
166c0 76 61 6c 75 65 73 20 66 6f 72 20 65 61 63 68 20 values for each
166d0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 column in the re
166e0 63 6f 72 64 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 cord. ** imme
166f0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 diately follow t
16700 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 he header. */.
16710 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 j += sqlite3Vd
16720 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e 65 beSerialPut(&zNe
16730 77 52 65 63 6f 72 64 5b 6a 5d 2c 20 70 52 65 63 wRecord[j], pRec
16740 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 , serial_type);
16750 2f 2a 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 /* content */.
16760 7d 77 68 69 6c 65 28 20 28 2b 2b 70 52 65 63 29 }while( (++pRec)
16770 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 61 73 73 <=pLast );. ass
16780 65 72 74 28 20 69 3d 3d 6e 48 64 72 20 29 3b 0a ert( i==nHdr );.
16790 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 42 79 assert( j==nBy
167a0 74 65 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 te );.. assert(
167b0 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f pOp->p3>0 && pO
167c0 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d p->p3<=(p->nMem-
167d0 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 p->nCursor) );.
167e0 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 pOut->n = (int)
167f0 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 nByte;. pOut->f
16800 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b lags = MEM_Blob;
16810 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a . if( nZero ){.
16820 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 pOut->u.nZer
16830 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 o = nZero;. p
16840 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 Out->flags |= ME
16850 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 70 4f M_Zero;. }. pO
16860 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 ut->enc = SQLITE
16870 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 _UTF8; /* In ca
16880 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 se the blob is e
16890 76 65 72 20 63 6f 6e 76 65 72 74 65 64 20 74 6f ver converted to
168a0 20 74 65 78 74 20 2a 2f 0a 20 20 52 45 47 49 53 text */. REGIS
168b0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 TER_TRACE(pOp->p
168c0 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 3, pOut);. UPDA
168d0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 TE_MAX_BLOBSIZE(
168e0 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a pOut);. break;.
168f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f }../* Opcode: Co
16900 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a unt P1 P2 * * *.
16910 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 ** Synopsis: r[P
16920 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a 2a 2a 2]=count().**.**
16930 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62 65 Store the numbe
16940 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61 6e r of entries (an
16950 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 20 integer value)
16960 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 in the table or
16970 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65 64 index .** opened
16980 20 62 79 20 63 75 72 73 6f 72 20 50 31 20 69 6e by cursor P1 in
16990 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f 0a register P2.*/.
169a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
169b0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 63 MIT_BTREECOUNT.c
169c0 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b 20 ase OP_Count: {
169d0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 /* out2
169e0 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79 3b */. i64 nEntry;
169f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 . BtCursor *pCr
16a00 73 72 3b 0a 0a 20 20 70 43 72 73 72 20 3d 20 70 sr;.. pCrsr = p
16a10 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d ->apCsr[pOp->p1]
16a20 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 ->pCursor;. ass
16a30 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 ert( pCrsr );.
16a40 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 nEntry = 0; /*
16a50 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c Not needed. Onl
16a60 79 20 75 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 y used to silenc
16a70 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a e a warning. */.
16a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
16a90 72 65 65 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 reeCount(pCrsr,
16aa0 26 6e 45 6e 74 72 79 29 3b 0a 20 20 70 4f 75 74 &nEntry);. pOut
16ab0 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 = out2Prereleas
16ac0 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 e(p, pOp);. pOu
16ad0 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79 3b t->u.i = nEntry;
16ae0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 . break;.}.#end
16af0 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 if../* Opcode: S
16b00 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a 20 avepoint P1 * *
16b10 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c P4 *.**.** Open,
16b20 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c release or roll
16b30 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f 69 back the savepoi
16b40 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72 61 nt named by para
16b50 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e 64 meter P4, depend
16b60 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76 61 ing.** on the va
16b70 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f 70 lue of P1. To op
16b80 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69 en a new savepoi
16b90 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72 65 nt, P1==0. To re
16ba0 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 lease (commit) a
16bb0 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 n.** existing sa
16bc0 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c 20 vepoint, P1==1,
16bd0 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 or to rollback a
16be0 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70 n existing savep
16bf0 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63 oint P1==2..*/.c
16c00 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 ase OP_Savepoint
16c10 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 : {. int p1;
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c30 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f /* Value o
16c40 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a f P1 operand */.
16c50 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 char *zName;
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61 76 /* Name of sav
16c80 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 epoint */. int
16c90 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f 69 nName;. Savepoi
16ca0 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76 65 nt *pNew;. Save
16cb0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e point *pSavepoin
16cc0 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a t;. Savepoint *
16cd0 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61 76 pTmp;. int iSav
16ce0 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69 69 epoint;. int ii
16cf0 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 ;.. p1 = pOp->p
16d00 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f 70 1;. zName = pOp
16d10 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73 ->p4.z;.. /* As
16d20 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70 31 sert that the p1
16d30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76 61 parameter is va
16d40 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20 69 lid. Also that i
16d50 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 f there is no op
16d60 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 en. ** transact
16d70 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65 20 ion, then there
16d80 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73 61 cannot be any sa
16d90 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a vepoints. . */.
16da0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53 assert( db->pS
16db0 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64 avepoint==0 || d
16dc0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 b->autoCommit==0
16dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 );. assert( p1
16de0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 ==SAVEPOINT_BEGI
16df0 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 N||p1==SAVEPOINT
16e00 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53 41 _RELEASE||p1==SA
16e10 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b VEPOINT_ROLLBACK
16e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 );. assert( db
16e30 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c 20 ->pSavepoint ||
16e40 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f db->isTransactio
16e50 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b nSavepoint==0 );
16e60 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b . assert( check
16e70 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 SavepointCount(d
16e80 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 b) );. assert(
16e90 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a p->bIsReader );.
16ea0 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 . if( p1==SAVEP
16eb0 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20 20 OINT_BEGIN ){.
16ec0 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 57 if( db->nVdbeW
16ed0 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 rite>0 ){.
16ee0 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f 69 /* A new savepoi
16ef0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72 65 nt cannot be cre
16f00 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61 72 ated if there ar
16f10 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20 0a e active write .
16f20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 ** stateme
16f30 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20 72 nts (i.e. open r
16f40 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65 6d ead/write increm
16f50 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64 6c ental blob handl
16f60 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 es).. */.
16f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 sqlite3VdbeE
16f80 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 rror(p, "cannot
16f90 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d open savepoint -
16fa0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 SQL statements
16fb0 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 in progress");.
16fc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
16fd0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 _BUSY;. }else
16fe0 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 {. nName =
16ff0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
17000 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66 zName);..#ifndef
17010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 SQLITE_OMIT_VIR
17020 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 TUALTABLE.
17030 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 /* This call is
17040 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 Ok even if this
17050 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 savepoint is act
17060 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63 74 ually a transact
17070 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 ion. ** sav
17080 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65 72 epoint (and ther
17090 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 efore should not
170a0 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f 69 prompt xSavepoi
170b0 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e nt()) callbacks.
170c0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 . ** If thi
170d0 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 s is a transacti
170e0 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 on savepoint bei
170f0 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69 73 ng opened, it is
17100 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20 20 guaranteed.
17110 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64 62 ** that the db
17120 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 ->aVTrans[] arra
17130 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a y is empty. */.
17140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 assert( db
17150 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 ->autoCommit==0
17160 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d || db->nVTrans==
17170 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 0 );. rc =
17180 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 sqlite3VtabSavep
17190 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 oint(db, SAVEPOI
171a0 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20 20 NT_BEGIN,.
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
171c0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 db->nS
171d0 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 tatement+db->nSa
171e0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 vepoint);.
171f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
17200 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 K ) goto abort_d
17210 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e ue_to_error;.#en
17220 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 dif.. /* Cr
17230 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65 70 eate a new savep
17240 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 oint structure.
17250 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 */. pNew =
17260 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 sqlite3DbMallocR
17270 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 61 aw(db, sizeof(Sa
17280 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 vepoint)+nName+1
17290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 );. if( pNe
172a0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 w ){. pNe
172b0 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 w->zName = (char
172c0 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 *)&pNew[1];.
172d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 memcpy(pNew
172e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 ->zName, zName,
172f0 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20 nName+1);. .
17300 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 /* If the
17310 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72 re is no open tr
17320 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 ansaction, then
17330 6d 61 72 6b 20 74 68 69 73 20 61 73 20 61 20 73 mark this as a s
17340 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a pecial. *
17350 2a 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 * "transaction s
17360 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 avepoint". */.
17370 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 if( db->au
17380 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 toCommit ){.
17390 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f db->autoCo
173a0 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 mmit = 0;.
173b0 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 db->isTransa
173c0 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d ctionSavepoint =
173d0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 1;. }els
173e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d e{. db-
173f0 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 >nSavepoint++;.
17400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 }. .
17410 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 /* Link th
17420 65 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 e new savepoint
17430 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 into the databas
17440 65 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e e handle's list.
17450 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 */. pNew
17460 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 ->pNext = db->pS
17470 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 avepoint;.
17480 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 db->pSavepoint
17490 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 = pNew;.
174a0 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 pNew->nDeferred
174b0 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 Cons = db->nDefe
174c0 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 rredCons;.
174d0 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 pNew->nDeferre
174e0 64 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e dImmCons = db->n
174f0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b DeferredImmCons;
17500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
17510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 }else{. iSav
17520 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 epoint = 0;..
17530 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d /* Find the nam
17540 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 ed savepoint. If
17550 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 there is no suc
17560 68 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 h savepoint, the
17570 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 n an. ** an e
17580 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 rror is returned
17590 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a to the user. *
175a0 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 /. for(.
175b0 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 pSavepoint = db
175c0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 ->pSavepoint; .
175d0 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 pSavepoint
175e0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d && sqlite3StrICm
175f0 70 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e p(pSavepoint->zN
17600 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 ame, zName);.
17610 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 pSavepoint =
17620 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 pSavepoint->pNex
17630 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 t. ){. i
17640 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 Savepoint++;.
17650 20 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 }. if( !pSav
17660 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 epoint ){.
17670 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 sqlite3VdbeError
17680 28 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 (p, "no such sav
17690 65 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 epoint: %s", zNa
176a0 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 me);. rc =
176b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 SQLITE_ERROR;.
176c0 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e }else if( db->
176d0 6e 56 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 nVdbeWrite>0 &&
176e0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 p1==SAVEPOINT_RE
176f0 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f LEASE ){. /
17700 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 * It is not poss
17710 69 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 ible to release
17720 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 (commit) a savep
17730 6f 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 oint if there ar
17740 65 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 e . ** acti
17750 76 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 ve write stateme
17760 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 nts.. */.
17770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 sqlite3VdbeE
17780 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 rror(p, "cannot
17790 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e release savepoin
177a0 74 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 t - ".
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
177c0 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 "SQL statements
177d0 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 in progress");.
177e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
177f0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 _BUSY;. }else
17800 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 {.. /* Dete
17810 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 rmine whether or
17820 20 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 not this is a t
17830 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 ransaction savep
17840 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 oint. If so,.
17850 20 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 ** and this i
17860 73 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d s a RELEASE comm
17870 61 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 and, then the cu
17880 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f rrent transactio
17890 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 n . ** is c
178a0 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 ommitted. .
178b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 */. int is
178c0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 Transaction = pS
178d0 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d avepoint->pNext=
178e0 3d 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e =0 && db->isTran
178f0 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 sactionSavepoint
17900 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 ;. if( isTr
17910 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d ansaction && p1=
17920 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 =SAVEPOINT_RELEA
17930 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 SE ){. if
17940 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 ( (rc = sqlite3V
17950 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 dbeCheckFk(p, 1)
17960 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a )!=SQLITE_OK ){.
17970 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 goto v
17980 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 dbe_return;.
17990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 }. db
179a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 ->autoCommit = 1
179b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 ;. if( sq
179c0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 lite3VdbeHalt(p)
179d0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b ==SQLITE_BUSY ){
179e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 . p->pc
179f0 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 = (int)(pOp - a
17a00 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 Op);. d
17a10 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 b->autoCommit =
17a20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 0;. p->
17a30 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = rc = SQLITE
17a40 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 _BUSY;.
17a50 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 goto vdbe_retur
17a60 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 n;. }.
17a70 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 db->isTrans
17a80 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 actionSavepoint
17a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 = 0;. rc
17aa0 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d = p->rc;. }
17ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e else{. in
17ac0 74 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 t isSchemaChange
17ad0 3b 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70 ;. iSavep
17ae0 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 oint = db->nSave
17af0 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 point - iSavepoi
17b00 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 nt - 1;.
17b10 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e if( p1==SAVEPOIN
17b20 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 T_ROLLBACK ){.
17b30 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 isSchema
17b40 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c Change = (db->fl
17b50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 ags & SQLITE_Int
17b60 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 3b 0a ernChanges)!=0;.
17b70 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 for(ii
17b80 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 =0; ii<db->nDb;
17b90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 ii++){.
17ba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 rc = sqlite3B
17bb0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f treeTripAllCurso
17bc0 72 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 rs(db->aDb[ii].p
17bd0 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 Bt,.
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17bf0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 SQLIT
17c00 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b E_ABORT_ROLLBACK
17c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c30 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d isSchem
17c40 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20 20 aChange==0);.
17c50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 if( rc!
17c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 =SQLITE_OK ) got
17c70 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 o abort_due_to_e
17c80 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 rror;.
17c90 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }. }else{
17ca0 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 63 68 . isSch
17cb0 65 6d 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 emaChange = 0;.
17cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
17cd0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 for(ii=0; ii<db
17ce0 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 ->nDb; ii++){.
17cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
17d00 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 ite3BtreeSavepoi
17d10 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 nt(db->aDb[ii].p
17d20 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 Bt, p1, iSavepoi
17d30 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 nt);. i
17d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
17d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
17d60 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 goto abort_due_t
17d70 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 o_error;.
17d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
17d90 20 20 20 20 20 20 20 69 66 28 20 69 73 53 63 68 if( isSch
17da0 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 emaChange ){.
17db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 sqlite3Ex
17dc0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 pirePreparedStat
17dd0 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 ements(db);.
17de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 sqlite3Res
17df0 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f etAllSchemasOfCo
17e00 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 nnection(db);.
17e10 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 db->flag
17e20 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c s = (db->flags |
17e30 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 SQLITE_InternCh
17e40 61 6e 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20 anges);.
17e50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 }. }. .
17e60 20 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 /* Regardless
17e70 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 69 73 of whether this
17e80 20 69 73 20 61 20 52 45 4c 45 41 53 45 20 6f 72 is a RELEASE or
17e90 20 52 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72 ROLLBACK, destr
17ea0 6f 79 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a oy all . **
17eb0 20 73 61 76 65 70 6f 69 6e 74 73 20 6e 65 73 74 savepoints nest
17ec0 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 ed inside of the
17ed0 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 savepoint being
17ee0 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f operated on. */
17ef0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 . while( db
17f00 2d 3e 70 53 61 76 65 70 6f 69 6e 74 21 3d 70 53 ->pSavepoint!=pS
17f10 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 avepoint ){.
17f20 20 20 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70 pTmp = db->p
17f30 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 Savepoint;.
17f40 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e db->pSavepoin
17f50 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b t = pTmp->pNext;
17f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
17f70 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 DbFree(db, pTmp)
17f80 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 ;. db->nS
17f90 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 avepoint--;.
17fa0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 }.. /* If
17fb0 20 69 74 20 69 73 20 61 20 52 45 4c 45 41 53 45 it is a RELEASE
17fc0 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74 , then destroy t
17fd0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 he savepoint bei
17fe0 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a ng operated on .
17ff0 20 20 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66 ** too. If
18000 20 69 74 20 69 73 20 61 20 52 4f 4c 4c 42 41 43 it is a ROLLBAC
18010 4b 20 54 4f 2c 20 74 68 65 6e 20 73 65 74 20 74 K TO, then set t
18020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 he number of def
18030 65 72 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 erred . **
18040 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 constraint viola
18050 74 69 6f 6e 73 20 70 72 65 73 65 6e 74 20 69 6e tions present in
18060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f the database to
18070 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 the value store
18080 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 d. ** when
18090 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 61 the savepoint wa
180a0 73 20 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 s created. */.
180b0 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56 if( p1==SAV
180c0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 EPOINT_RELEASE )
180d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 {. assert
180e0 28 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62 ( pSavepoint==db
180f0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a ->pSavepoint );.
18100 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 db->pSav
18110 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f epoint = pSavepo
18120 69 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 int->pNext;.
18130 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
18140 65 28 64 62 2c 20 70 53 61 76 65 70 6f 69 6e 74 e(db, pSavepoint
18150 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 );. if( !
18160 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b isTransaction ){
18170 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e . db->n
18180 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 Savepoint--;.
18190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c }. }el
181a0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e se{. db->
181b0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 nDeferredCons =
181c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 pSavepoint->nDef
181d0 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 erredCons;.
181e0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 db->nDeferred
181f0 49 6d 6d 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 ImmCons = pSavep
18200 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 49 oint->nDeferredI
18210 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a mmCons;. }.
18220 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72 . if( !isTr
18230 61 6e 73 61 63 74 69 6f 6e 20 7c 7c 20 70 31 3d ansaction || p1=
18240 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 =SAVEPOINT_ROLLB
18250 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 ACK ){. r
18260 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 c = sqlite3VtabS
18270 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c avepoint(db, p1,
18280 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 iSavepoint);.
18290 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
182a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 LITE_OK ) goto a
182b0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f bort_due_to_erro
182c0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d r;. }. }
182d0 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d . }.. break;.}
182e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74 ../* Opcode: Aut
182f0 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a 20 oCommit P1 P2 *
18300 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 * *.**.** Set th
18310 65 20 64 61 74 61 62 61 73 65 20 61 75 74 6f 2d e database auto-
18320 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 commit flag to P
18330 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20 50 1 (1 or 0). If P
18340 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2 is true, roll.
18350 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72 72 ** back any curr
18360 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74 72 ently active btr
18370 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e ee transactions.
18380 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e If there are an
18390 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 y active.** VMs
183a0 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73 (apart from this
183b0 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52 4f one), then a RO
183c0 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20 41 LLBACK fails. A
183d0 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69 66 COMMIT fails if
183e0 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 63 .** there are ac
183f0 74 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d 73 tive writing VMs
18400 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20 74 or active VMs t
18410 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 hat use shared c
18420 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 ache..**.** This
18430 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75 instruction cau
18440 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61 ses the VM to ha
18450 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 lt..*/.case OP_A
18460 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 utoCommit: {. i
18470 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f nt desiredAutoCo
18480 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c mmit;. int iRol
18490 6c 62 61 63 6b 3b 0a 20 20 69 6e 74 20 74 75 72 lback;. int tur
184a0 6e 4f 6e 41 43 3b 0a 0a 20 20 64 65 73 69 72 65 nOnAC;.. desire
184b0 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f dAutoCommit = pO
184c0 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 p->p1;. iRollba
184d0 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 ck = pOp->p2;.
184e0 74 75 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69 72 turnOnAC = desir
184f0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 edAutoCommit &&
18500 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b !db->autoCommit;
18510 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 . assert( desir
18520 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 edAutoCommit==1
18530 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f || desiredAutoCo
18540 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 mmit==0 );. ass
18550 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f ert( desiredAuto
18560 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f Commit==1 || iRo
18570 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 llback==0 );. a
18580 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 ssert( db->nVdbe
18590 41 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a 20 Active>0 ); /*
185a0 41 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e At least this on
185b0 65 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a e VM is active *
185c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 /. assert( p->b
185d0 49 73 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 IsReader );.. i
185e0 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26 20 21 f( turnOnAC && !
185f0 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d iRollback && db-
18600 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b >nVdbeWrite>0 ){
18610 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 . /* If this
18620 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c instruction impl
18630 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20 ements a COMMIT
18640 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72 and other VMs ar
18650 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a e writing. **
18660 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 return an error
18670 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 indicating that
18680 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d the other VMs m
18690 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72 ust complete fir
186a0 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 st. . */.
186b0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 sqlite3VdbeError
186c0 28 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d (p, "cannot comm
186d0 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d it transaction -
186e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ".
186f0 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c 20 "SQL
18700 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 statements in pr
18710 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63 ogress");. rc
18720 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a = SQLITE_BUSY;.
18730 20 20 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69 }else if( desi
18740 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 redAutoCommit!=d
18750 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b b->autoCommit ){
18760 0a 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 . if( iRollba
18770 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 ck ){. asse
18780 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 rt( desiredAutoC
18790 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 ommit==1 );.
187a0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 sqlite3Rollbac
187b0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f kAll(db, SQLITE_
187c0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b ABORT_ROLLBACK);
187d0 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 . db->autoC
187e0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d ommit = 1;. }
187f0 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 else if( (rc = s
18800 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 qlite3VdbeCheckF
18810 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 k(p, 1))!=SQLITE
18820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 _OK ){. got
18830 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 o vdbe_return;.
18840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
18850 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d db->autoCommit =
18860 20 28 75 38 29 64 65 73 69 72 65 64 41 75 74 6f (u8)desiredAuto
18870 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 Commit;. }.
18880 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 if( sqlite3Vdb
18890 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 eHalt(p)==SQLITE
188a0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 _BUSY ){. p
188b0 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 ->pc = (int)(pOp
188c0 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64 - aOp);. d
188d0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 b->autoCommit =
188e0 28 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75 (u8)(1-desiredAu
188f0 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 toCommit);.
18900 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 p->rc = rc = SQ
18910 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 LITE_BUSY;.
18920 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 goto vdbe_retur
18930 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 n;. }. ass
18940 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d ert( db->nStatem
18950 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 ent==0 );. sq
18960 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f lite3CloseSavepo
18970 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 ints(db);. if
18980 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
18990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d OK ){. rc =
189a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 SQLITE_DONE;.
189b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 }else{. r
189c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 c = SQLITE_ERROR
189d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f ;. }. goto
189e0 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 vdbe_return;.
189f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 }else{. sqlit
18a00 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 e3VdbeError(p,.
18a10 20 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 (!desired
18a20 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e AutoCommit)?"can
18a30 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e not start a tran
18a40 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 saction within a
18a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a transaction":(.
18a60 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 (iRollba
18a70 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c ck)?"cannot roll
18a80 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 back - no transa
18a90 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 ction is active"
18aa0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 :.
18ab0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d "cannot com
18ac0 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 mit - no transac
18ad0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 tion is active")
18ae0 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 );. .
18af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 rc = SQLITE_ERR
18b00 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b OR;. }. break;
18b10 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 .}../* Opcode: T
18b20 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 ransaction P1 P2
18b30 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 P3 P4 P5.**.**
18b40 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 Begin a transact
18b50 69 6f 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 ion on database
18b60 50 31 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 P1 if a transact
18b70 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 ion is not alrea
18b80 64 79 0a 2a 2a 20 61 63 74 69 76 65 2e 0a 2a 2a dy.** active..**
18b90 20 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 If P2 is non-ze
18ba0 72 6f 2c 20 74 68 65 6e 20 61 20 77 72 69 74 65 ro, then a write
18bb0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 -transaction is
18bc0 73 74 61 72 74 65 64 2c 20 6f 72 20 69 66 20 61 started, or if a
18bd0 20 0a 2a 2a 20 72 65 61 64 2d 74 72 61 6e 73 61 .** read-transa
18be0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 ction is already
18bf0 20 61 63 74 69 76 65 2c 20 69 74 20 69 73 20 75 active, it is u
18c00 70 67 72 61 64 65 64 20 74 6f 20 61 20 77 72 69 pgraded to a wri
18c10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a te-transaction..
18c20 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f ** If P2 is zero
18c30 2c 20 74 68 65 6e 20 61 20 72 65 61 64 2d 74 72 , then a read-tr
18c40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 ansaction is sta
18c50 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 rted..**.** P1 i
18c60 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 s the index of t
18c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
18c80 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 74 72 on which the tr
18c90 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 ansaction is.**
18ca0 73 74 61 72 74 65 64 2e 20 20 49 6e 64 65 78 20 started. Index
18cb0 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 0 is the main da
18cc0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 tabase file and
18cd0 69 6e 64 65 78 20 31 20 69 73 20 74 68 65 0a 2a index 1 is the.*
18ce0 2a 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 * file used for
18cf0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 temporary tables
18d00 2e 20 20 49 6e 64 69 63 65 73 20 6f 66 20 32 20 . Indices of 2
18d10 6f 72 20 6d 6f 72 65 20 61 72 65 20 75 73 65 64 or more are used
18d20 20 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65 64 for.** attached
18d30 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a databases..**.*
18d40 2a 20 49 66 20 61 20 77 72 69 74 65 2d 74 72 61 * If a write-tra
18d50 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 nsaction is star
18d60 74 65 64 20 61 6e 64 20 74 68 65 20 56 64 62 65 ted and the Vdbe
18d70 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c .usesStmtJournal
18d80 20 66 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75 65 flag is.** true
18d90 20 28 74 68 69 73 20 66 6c 61 67 20 69 73 20 73 (this flag is s
18da0 65 74 20 69 66 20 74 68 65 20 56 64 62 65 20 6d et if the Vdbe m
18db0 61 79 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20 74 ay modify more t
18dc0 68 61 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64 20 han one row and
18dd0 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 may.** throw an
18de0 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 29 ABORT exception)
18df0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 , a statement tr
18e00 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 61 6c ansaction may al
18e10 73 6f 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a so be opened..**
18e20 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c More specifical
18e30 6c 79 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 ly, a statement
18e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f transaction is o
18e50 70 65 6e 65 64 20 69 66 66 20 74 68 65 20 64 61 pened iff the da
18e60 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 tabase.** connec
18e70 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c tion is currentl
18e80 79 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d y not in autocom
18e90 6d 69 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20 mit mode, or if
18ea0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a there are other.
18eb0 2a 2a 20 61 63 74 69 76 65 20 73 74 61 74 65 6d ** active statem
18ec0 65 6e 74 73 2e 20 41 20 73 74 61 74 65 6d 65 6e ents. A statemen
18ed0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c t transaction al
18ee0 6c 6f 77 73 20 74 68 65 20 63 68 61 6e 67 65 73 lows the changes
18ef0 20 6d 61 64 65 20 62 79 20 74 68 69 73 0a 2a 2a made by this.**
18f00 20 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c VDBE to be roll
18f10 65 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e ed back after an
18f20 20 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68 error without h
18f30 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61 aving to roll ba
18f40 63 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 ck the.** entire
18f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 transaction. If
18f60 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63 no error is enc
18f70 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74 ountered, the st
18f80 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 atement transact
18f90 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f ion.** will auto
18fa0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 matically commit
18fb0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68 when the VDBE h
18fc0 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 alts..**.** If P
18fd0 35 21 3d 30 20 74 68 65 6e 20 74 68 69 73 20 6f 5!=0 then this o
18fe0 70 63 6f 64 65 20 61 6c 73 6f 20 63 68 65 63 6b pcode also check
18ff0 73 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f s the schema coo
19000 6b 69 65 20 61 67 61 69 6e 73 74 20 50 33 0a 2a kie against P3.*
19010 2a 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 * and the schema
19020 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e generation coun
19030 74 65 72 20 61 67 61 69 6e 73 74 20 50 34 2e 0a ter against P4..
19040 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 63 68 ** The cookie ch
19050 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75 65 20 anges its value
19060 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 whenever the dat
19070 61 62 61 73 65 20 73 63 68 65 6d 61 20 63 68 61 abase schema cha
19080 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 nges..** This op
19090 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 eration is used
190a0 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 to detect when t
190b0 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 68 hat the cookie h
190c0 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61 6e as changed.** an
190d0 64 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 d that the curre
190e0 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65 64 73 nt process needs
190f0 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 73 to reread the s
19100 63 68 65 6d 61 2e 20 20 49 66 20 74 68 65 20 73 chema. If the s
19110 63 68 65 6d 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 chema.** cookie
19120 69 6e 20 50 33 20 64 69 66 66 65 72 73 20 66 72 in P3 differs fr
19130 6f 6d 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f om the schema co
19140 6f 6b 69 65 20 69 6e 20 74 68 65 20 64 61 74 61 okie in the data
19150 62 61 73 65 20 68 65 61 64 65 72 20 6f 72 0a 2a base header or.*
19160 2a 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20 * if the schema
19170 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 generation count
19180 65 72 20 69 6e 20 50 34 20 64 69 66 66 65 72 73 er in P4 differs
19190 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e from the curren
191a0 74 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 t.** generation
191b0 63 6f 75 6e 74 65 72 2c 20 74 68 65 6e 20 61 6e counter, then an
191c0 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 SQLITE_SCHEMA e
191d0 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 20 61 rror is raised a
191e0 6e 64 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 nd execution.**
191f0 68 61 6c 74 73 2e 20 20 54 68 65 20 73 71 6c 69 halts. The sqli
19200 74 65 33 5f 73 74 65 70 28 29 20 77 72 61 70 70 te3_step() wrapp
19210 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 er function migh
19220 74 20 74 68 65 6e 20 72 65 70 72 65 70 61 72 65 t then reprepare
19230 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e the.** statemen
19240 74 20 61 6e 64 20 72 65 72 75 6e 20 69 74 20 66 t and rerun it f
19250 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e rom the beginnin
19260 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 g..*/.case OP_Tr
19270 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 ansaction: {. B
19280 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 tree *pBt;. int
19290 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 47 iMeta;. int iG
192a0 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 en;.. assert( p
192b0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 ->bIsReader );.
192c0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 assert( p->read
192d0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e Only==0 || pOp->
192e0 70 32 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 p2==0 );. asser
192f0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 t( pOp->p1>=0 &&
19300 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 pOp->p1<db->nDb
19310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 );. assert( Db
19320 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 MaskTest(p->btre
19330 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 eMask, pOp->p1)
19340 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 );. if( pOp->p2
19350 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 && (db->flags &
19360 20 53 51 4c 49 54 45 5f 51 75 65 72 79 4f 6e 6c SQLITE_QueryOnl
19370 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 y)!=0 ){. rc
19380 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c = SQLITE_READONL
19390 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 Y;. goto abor
193a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a t_due_to_error;.
193b0 20 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e }. pBt = db->
193c0 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 aDb[pOp->p1].pBt
193d0 3b 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a ;.. if( pBt ){.
193e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
193f0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 BtreeBeginTrans(
19400 70 42 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 pBt, pOp->p2);.
19410 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d testcase( rc=
19420 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 =SQLITE_BUSY_SNA
19430 50 53 48 4f 54 20 29 3b 0a 20 20 20 20 74 65 73 PSHOT );. tes
19440 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 tcase( rc==SQLIT
19450 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 20 E_BUSY_RECOVERY
19460 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 );. if( (rc&0
19470 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 xff)==SQLITE_BUS
19480 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 Y ){. p->pc
19490 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 = (int)(pOp - a
194a0 4f 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 Op);. p->rc
194b0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 67 6f 74 = rc;. got
194c0 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 o vdbe_return;.
194d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 }. if( rc!
194e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
194f0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 goto abort_d
19500 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 ue_to_error;.
19510 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d }.. if( pOp-
19520 3e 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 >p2 && p->usesSt
19530 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 mtJournal .
19540 26 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d && (db->autoComm
19550 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 64 it==0 || db->nVd
19560 62 65 52 65 61 64 3e 31 29 20 0a 20 20 20 20 29 beRead>1) . )
19570 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 {. assert(
19580 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e sqlite3BtreeIsIn
19590 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20 Trans(pBt) );.
195a0 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74 if( p->iStat
195b0 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 ement==0 ){.
195c0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e assert( db->
195d0 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26 nStatement>=0 &&
195e0 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e db->nSavepoint>
195f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 =0 );. db
19600 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20 ->nStatement++;
19610 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61 . p->iSta
19620 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 tement = db->nSa
19630 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53 vepoint + db->nS
19640 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20 tatement;.
19650 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 }.. rc = sq
19660 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 lite3VtabSavepoi
19670 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 nt(db, SAVEPOINT
19680 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74 _BEGIN, p->iStat
19690 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20 ement-1);.
196a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
196b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 K ){. rc
196c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 = sqlite3BtreeBe
196d0 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e ginStmt(pBt, p->
196e0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 iStatement);.
196f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 }.. /* S
19700 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 tore the current
19710 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 value of the da
19720 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 tabase handles d
19730 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 eferred constrai
19740 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e nt. ** coun
19750 74 65 72 2e 20 49 66 20 74 68 65 20 73 74 61 74 ter. If the stat
19760 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
19770 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f n needs to be ro
19780 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20 lled back,.
19790 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 ** the value of
197a0 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65 this counter ne
197b0 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 eds to be restor
197c0 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 ed too. */.
197d0 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e p->nStmtDefCon
197e0 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 s = db->nDeferre
197f0 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 70 2d 3e dCons;. p->
19800 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 20 nStmtDefImmCons
19810 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 = db->nDeferredI
19820 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 0a 20 mmCons;. }..
19830 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 /* Gather the
19840 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 schema version
19850 6e 75 6d 62 65 72 20 66 6f 72 20 63 68 65 63 6b number for check
19860 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 49 4d 50 4c ing:. ** IMPL
19870 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 EMENTATION-OF: R
19880 2d 33 32 31 39 35 2d 31 39 34 36 35 20 54 68 65 -32195-19465 The
19890 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 schema version
198a0 69 73 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 is used by SQLit
198b0 65 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 74 69 e. ** each ti
198c0 6d 65 20 61 20 71 75 65 72 79 20 69 73 20 65 78 me a query is ex
198d0 65 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 ecuted to ensure
198e0 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e that the intern
198f0 61 6c 20 63 61 63 68 65 20 6f 66 20 74 68 65 0a al cache of the.
19900 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 75 73 ** schema us
19910 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e ed when compilin
19920 67 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 g the SQL query
19930 6d 61 74 63 68 65 73 20 74 68 65 20 73 63 68 65 matches the sche
19940 6d 61 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a ma of the. **
19950 20 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 73 database agains
19960 74 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 t which the comp
19970 69 6c 65 64 20 71 75 65 72 79 20 69 73 20 61 63 iled query is ac
19980 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e tually executed.
19990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 . */. sqli
199a0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 te3BtreeGetMeta(
199b0 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48 45 4d pBt, BTREE_SCHEM
199c0 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33 32 20 A_VERSION, (u32
199d0 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 20 20 69 *)&iMeta);. i
199e0 47 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f Gen = db->aDb[pO
199f0 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d 3e p->p1].pSchema->
19a00 69 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20 20 7d iGeneration;. }
19a10 65 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e 20 3d else{. iGen =
19a20 20 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20 7d 0a iMeta = 0;. }.
19a30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
19a40 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 5==0 || pOp->p4t
19a50 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b ype==P4_INT32 );
19a60 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 . if( pOp->p5 &
19a70 26 20 28 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 & (iMeta!=pOp->p
19a80 33 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 3 || iGen!=pOp->
19a90 70 34 2e 69 29 20 29 7b 0a 20 20 20 20 73 71 6c p4.i) ){. sql
19aa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
19ab0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 ->zErrMsg);.
19ac0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c p->zErrMsg = sql
19ad0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c ite3DbStrDup(db,
19ae0 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d "database schem
19af0 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b a has changed");
19b00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 . /* If the s
19b10 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66 72 6f chema-cookie fro
19b20 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 m the database f
19b30 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 ile matches the
19b40 63 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a 20 73 cookie . ** s
19b50 74 6f 72 65 64 20 77 69 74 68 20 74 68 65 20 69 tored with the i
19b60 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 n-memory represe
19b70 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 ntation of the s
19b80 63 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20 2a 2a chema, do. **
19b90 20 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68 65 20 not reload the
19ba0 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20 schema from the
19bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 database file..
19bc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 **. ** If
19bd0 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 73 20 61 virtual-tables a
19be0 72 65 20 69 6e 20 75 73 65 2c 20 74 68 69 73 20 re in use, this
19bf0 69 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e 20 6f is not just an o
19c00 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 ptimization..
19c10 20 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74 61 62 ** Often, v-tab
19c20 6c 65 73 20 73 74 6f 72 65 20 74 68 65 69 72 20 les store their
19c30 64 61 74 61 20 69 6e 20 6f 74 68 65 72 20 53 51 data in other SQ
19c40 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 77 68 69 Lite tables, whi
19c50 63 68 0a 20 20 20 20 2a 2a 20 61 72 65 20 71 75 ch. ** are qu
19c60 65 72 69 65 64 20 66 72 6f 6d 20 77 69 74 68 69 eried from withi
19c70 6e 20 78 4e 65 78 74 28 29 20 61 6e 64 20 6f 74 n xNext() and ot
19c80 68 65 72 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 her v-table meth
19c90 6f 64 73 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a ods using. **
19ca0 20 70 72 65 70 61 72 65 64 20 71 75 65 72 69 65 prepared querie
19cb0 73 2e 20 49 66 20 73 75 63 68 20 61 20 71 75 65 s. If such a que
19cc0 72 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64 61 74 ry is out-of-dat
19cd0 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e e, we do not wan
19ce0 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 63 t to. ** disc
19cf0 61 72 64 20 74 68 65 20 64 61 74 61 62 61 73 65 ard the database
19d00 20 73 63 68 65 6d 61 2c 20 61 73 20 74 68 65 20 schema, as the
19d10 75 73 65 72 20 63 6f 64 65 20 69 6d 70 6c 65 6d user code implem
19d20 65 6e 74 69 6e 67 20 74 68 65 0a 20 20 20 20 2a enting the. *
19d30 2a 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c 64 20 * v-table would
19d40 68 61 76 65 20 74 6f 20 62 65 20 72 65 61 64 79 have to be ready
19d50 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 for the sqlite3
19d60 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 _vtab structure
19d70 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 74 6f itself. ** to
19d80 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 be invalidated
19d90 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 whenever sqlite3
19da0 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c 6c 65 _step() is calle
19db0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20 d from within .
19dc0 20 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c 65 20 ** a v-table
19dd0 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f 0a 20 method.. */.
19de0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 70 if( db->aDb[p
19df0 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61 2d Op->p1].pSchema-
19e00 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 21 3d >schema_cookie!=
19e10 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 iMeta ){. s
19e20 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 qlite3ResetOneSc
19e30 68 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 hema(db, pOp->p1
19e40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e );. }. p->
19e50 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 expired = 1;.
19e60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 rc = SQLITE_SCH
19e70 45 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b EMA;. }. break
19e80 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ;.}../* Opcode:
19e90 52 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 ReadCookie P1 P2
19ea0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 P3 * *.**.** Re
19eb0 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 ad cookie number
19ec0 20 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 P3 from databas
19ed0 65 20 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 e P1 and write i
19ee0 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 t into register
19ef0 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 P2..** P3==1 is
19f00 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 the schema versi
19f10 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68 on. P3==2 is th
19f20 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 e database forma
19f30 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 t..** P3==3 is t
19f40 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 he recommended p
19f50 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c ager cache size,
19f60 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 and so forth.
19f70 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 P1==0 is.** the
19f80 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 main database fi
19f90 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 le and P1==1 is
19fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
19fb0 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a e used to store.
19fc0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 ** temporary tab
19fd0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 les..**.** There
19fe0 20 6d 75 73 74 20 62 65 20 61 20 72 65 61 64 2d must be a read-
19ff0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 lock on the data
1a000 62 61 73 65 20 28 65 69 74 68 65 72 20 61 20 74 base (either a t
1a010 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 ransaction.** mu
1a020 73 74 20 62 65 20 73 74 61 72 74 65 64 20 6f 72 st be started or
1a030 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 there must be a
1a040 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62 n open cursor) b
1a050 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 efore.** executi
1a060 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 ng this instruct
1a070 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ion..*/.case OP_
1a080 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 ReadCookie: {
1a090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f /* o
1a0a0 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 ut2 */. int iMe
1a0b0 74 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 ta;. int iDb;.
1a0c0 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 int iCookie;..
1a0d0 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 assert( p->bIsR
1a0e0 65 61 64 65 72 20 29 3b 0a 20 20 69 44 62 20 3d eader );. iDb =
1a0f0 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f pOp->p1;. iCoo
1a100 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 kie = pOp->p3;.
1a110 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 assert( pOp->p3
1a120 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f <SQLITE_N_BTREE_
1a130 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 META );. assert
1a140 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c ( iDb>=0 && iDb<
1a150 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 db->nDb );. ass
1a160 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 ert( db->aDb[iDb
1a170 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 ].pBt!=0 );. as
1a180 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 sert( DbMaskTest
1a190 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 (p->btreeMask, i
1a1a0 44 62 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 Db) );.. sqlite
1a1b0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 3BtreeGetMeta(db
1a1c0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 ->aDb[iDb].pBt,
1a1d0 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 iCookie, (u32 *)
1a1e0 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 &iMeta);. pOut
1a1f0 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 = out2Prerelease
1a200 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 (p, pOp);. pOut
1a210 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 ->u.i = iMeta;.
1a220 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 break;.}../* Op
1a230 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 code: SetCookie
1a240 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a P1 P2 P3 * *.**.
1a250 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e ** Write the con
1a260 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 tent of register
1a270 20 50 33 20 28 69 6e 74 65 72 70 72 65 74 65 64 P3 (interpreted
1a280 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29 0a as an integer).
1a290 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e ** into cookie n
1a2a0 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74 61 umber P2 of data
1a2b0 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31 20 base P1. P2==1
1a2c0 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 is the schema ve
1a2d0 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d 3d rsion. .** P2==
1a2e0 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 2 is the databas
1a2f0 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33 20 e format. P2==3
1a300 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 is the recommend
1a310 65 64 20 70 61 67 65 72 20 63 61 63 68 65 20 0a ed pager cache .
1a320 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 ** size, and so
1a330 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 forth. P1==0 is
1a340 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 the main databa
1a350 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d se file and P1==
1a360 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61 74 1 is the .** dat
1a370 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 abase file used
1a380 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 to store tempora
1a390 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a ry tables..**.**
1a3a0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d A transaction m
1a3b0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 ust be started b
1a3c0 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67 20 efore executing
1a3d0 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a this opcode..*/.
1a3e0 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 case OP_SetCooki
1a3f0 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e e: { /* in
1a400 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 0a 3 */. Db *pDb;.
1a410 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
1a420 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 2<SQLITE_N_BTREE
1a430 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 _META );. asser
1a440 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 t( pOp->p1>=0 &&
1a450 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 pOp->p1<db->nDb
1a460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 );. assert( Db
1a470 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 MaskTest(p->btre
1a480 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 eMask, pOp->p1)
1a490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
1a4a0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 readOnly==0 );.
1a4b0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b pDb = &db->aDb[
1a4c0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 pOp->p1];. asse
1a4d0 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 rt( pDb->pBt!=0
1a4e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c );. assert( sql
1a4f0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 ite3SchemaMutexH
1a500 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c eld(db, pOp->p1,
1a510 20 30 29 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 0) );. pIn3 =
1a520 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a &aMem[pOp->p3];.
1a530 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
1a540 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 Integerify(pIn3)
1a550 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 ;. /* See note
1a560 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 about index shif
1a570 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 ting on OP_ReadC
1a580 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 ookie */. rc =
1a590 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 sqlite3BtreeUpda
1a5a0 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c teMeta(pDb->pBt,
1a5b0 20 70 4f 70 2d 3e 70 32 2c 20 28 69 6e 74 29 70 pOp->p2, (int)p
1a5c0 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 69 66 28 In3->u.i);. if(
1a5d0 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f pOp->p2==BTREE_
1a5e0 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 SCHEMA_VERSION )
1a5f0 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 {. /* When th
1a600 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 e schema cookie
1a610 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 changes, record
1a620 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 the new cookie i
1a630 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 nternally */.
1a640 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 pDb->pSchema->s
1a650 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28 chema_cookie = (
1a660 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 int)pIn3->u.i;.
1a670 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 db->flags |=
1a680 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 SQLITE_InternCha
1a690 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 nges;. }else if
1a6a0 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 ( pOp->p2==BTREE
1a6b0 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a _FILE_FORMAT ){.
1a6c0 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68 /* Record ch
1a6d0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c anges in the fil
1a6e0 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 e format */.
1a6f0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 pDb->pSchema->fi
1a700 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 le_format = (u8)
1a710 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 pIn3->u.i;. }.
1a720 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 if( pOp->p1==1
1a730 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 ){. /* Invali
1a740 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65 date all prepare
1a750 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65 d statements whe
1a760 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50 20 64 never the TEMP d
1a770 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 atabase. ** s
1a780 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64 chema is changed
1a790 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34 34 20 . Ticket #1644
1a7a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 */. sqlite3Ex
1a7b0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 pirePreparedStat
1a7c0 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 ements(db);.
1a7d0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a p->expired = 0;.
1a7e0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a }. break;.}..
1a7f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 /* Opcode: OpenR
1a800 65 61 64 20 50 31 20 50 32 20 50 33 20 50 34 20 ead P1 P2 P3 P4
1a810 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 P5.** Synopsis:
1a820 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a root=P2 iDb=P3.*
1a830 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 *.** Open a read
1a840 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 -only cursor for
1a850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 the database ta
1a860 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 ble whose root p
1a870 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 age is.** P2 in
1a880 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e a database file.
1a890 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 The database f
1a8a0 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 ile is determine
1a8b0 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d d by P3. .** P3=
1a8c0 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 =0 means the mai
1a8d0 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d n database, P3==
1a8e0 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 1 means the data
1a8f0 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a base used for .*
1a900 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c * temporary tabl
1a910 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 es, and P3>1 mea
1a920 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 ns used the corr
1a930 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 esponding attach
1a940 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 ed.** database.
1a950 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 Give the new cu
1a960 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 rsor an identifi
1a970 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 er of P1. The P
1a980 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 1.** values need
1a990 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f not be contiguo
1a9a0 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 us but all P1 va
1a9b0 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 lues should be s
1a9c0 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a mall integers..*
1a9d0 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 * It is an error
1a9e0 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 for P1 to be ne
1a9f0 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 gative..**.** If
1aa00 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20 P5!=0 then use
1aa10 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 the content of r
1aa20 65 67 69 73 74 65 72 20 50 32 20 61 73 20 74 68 egister P2 as th
1aa30 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74 e root page, not
1aa40 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 .** the value of
1aa50 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a P2 itself..**.*
1aa60 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 * There will be
1aa70 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 a read lock on t
1aa80 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65 6e he database when
1aa90 65 76 65 72 20 74 68 65 72 65 20 69 73 20 61 6e ever there is an
1aaa0 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e .** open cursor.
1aab0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 If the databas
1aac0 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 e was unlocked p
1aad0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73 rior to this ins
1aae0 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e truction.** then
1aaf0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 a read lock is
1ab00 61 63 71 75 69 72 65 64 20 61 73 20 70 61 72 74 acquired as part
1ab10 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 of this instruc
1ab20 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a tion. A read.**
1ab30 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 lock allows oth
1ab40 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 er processes to
1ab50 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 read the databas
1ab60 65 20 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a e but prohibits.
1ab70 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f ** any other pro
1ab80 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 cess from modify
1ab90 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 ing the database
1aba0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b . The read lock
1abb0 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 is.** released
1abc0 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 when all cursors
1abd0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 are closed. If
1abe0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f this instructio
1abf0 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f n attempts.** to
1ac00 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b get a read lock
1ac10 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20 but fails, the
1ac20 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65 script terminate
1ac30 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c s with an.** SQL
1ac40 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63 ITE_BUSY error c
1ac50 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 ode..**.** The P
1ac60 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 4 value may be e
1ac70 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 ither an integer
1ac80 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 (P4_INT32) or a
1ac90 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 pointer to.** a
1aca0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 KeyInfo structu
1acb0 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e re (P4_KEYINFO).
1acc0 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e If it is a poin
1acd0 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f ter to a KeyInfo
1ace0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 .** structure,
1acf0 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 then said struct
1ad00 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 ure defines the
1ad10 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c content and coll
1ad20 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e ating .** sequen
1ad30 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 ce of the index
1ad40 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 being opened. Ot
1ad50 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 herwise, if P4 i
1ad60 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a s an integer .**
1ad70 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 value, it is se
1ad80 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 t to the number
1ad90 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 of columns in th
1ada0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 e table..**.** S
1adb0 65 65 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69 ee also: OpenWri
1adc0 74 65 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f te, ReopenIdx.*/
1add0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70 ./* Opcode: Reop
1ade0 65 6e 49 64 78 20 50 31 20 50 32 20 50 33 20 50 enIdx P1 P2 P3 P
1adf0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 4 P5.** Synopsis
1ae00 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 : root=P2 iDb=P3
1ae10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 .**.** The Reope
1ae20 6e 49 64 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b nIdx opcode work
1ae30 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 52 s exactly like R
1ae40 65 61 64 4f 70 65 6e 20 65 78 63 65 70 74 20 74 eadOpen except t
1ae50 68 61 74 20 69 74 20 66 69 72 73 74 0a 2a 2a 20 hat it first.**
1ae60 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 checks to see if
1ae70 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 50 the cursor on P
1ae80 31 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 1 is already ope
1ae90 6e 20 77 69 74 68 20 61 20 72 6f 6f 74 20 70 61 n with a root pa
1aea0 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 ge.** number of
1aeb0 50 32 20 61 6e 64 20 69 66 20 69 74 20 69 73 20 P2 and if it is
1aec0 74 68 69 73 20 6f 70 63 6f 64 65 20 62 65 63 6f this opcode beco
1aed0 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e mes a no-op. In
1aee0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a other words,.**
1aef0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 if the cursor i
1af00 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 s already open,
1af10 64 6f 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74 do not reopen it
1af20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 ..**.** The Reop
1af30 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 6d 61 79 enIdx opcode may
1af40 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 only be used wi
1af50 74 68 20 50 35 3d 3d 30 20 61 6e 64 20 77 69 74 th P5==0 and wit
1af60 68 20 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61 20 h P4 being.** a
1af70 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65 63 P4_KEYINFO objec
1af80 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c t. Furthermore,
1af90 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75 the P3 value mu
1afa0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 st be the same a
1afb0 73 0a 2a 2a 20 65 76 65 72 79 20 6f 74 68 65 72 s.** every other
1afc0 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f 70 ReopenIdx or Op
1afd0 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65 20 73 enRead for the s
1afe0 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 ame cursor numbe
1aff0 72 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 r..**.** See the
1b000 20 4f 70 65 6e 52 65 61 64 20 6f 70 63 6f 64 65 OpenRead opcode
1b010 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
1b020 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e or additional in
1b030 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a formation..*/./*
1b040 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69 Opcode: OpenWri
1b050 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 te P1 P2 P3 P4 P
1b060 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5.** Synopsis: r
1b070 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a oot=P2 iDb=P3.**
1b080 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f .** Open a read/
1b090 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d write cursor nam
1b0a0 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62 ed P1 on the tab
1b0b0 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 le or index whos
1b0c0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 e root.** page i
1b0d0 73 20 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21 s P2. Or if P5!
1b0e0 3d 30 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 =0 use the conte
1b0f0 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 nt of register P
1b100 32 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 2 to find the.**
1b110 20 72 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a root page..**.*
1b120 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d * The P4 value m
1b130 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 ay be either an
1b140 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 integer (P4_INT3
1b150 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 2) or a pointer
1b160 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 to.** a KeyInfo
1b170 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 structure (P4_KE
1b180 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 YINFO). If it is
1b190 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a
1b1a0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 KeyInfo .** stru
1b1b0 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 cture, then said
1b1c0 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e structure defin
1b1d0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 es the content a
1b1e0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a nd collating .**
1b1f0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 sequence of the
1b200 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 index being ope
1b210 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ned. Otherwise,
1b220 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 if P4 is an inte
1b230 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 ger .** value, i
1b240 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 t is set to the
1b250 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e number of column
1b260 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 s in the table,
1b270 6f 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72 or to the.** lar
1b280 67 65 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e gest index of an
1b290 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 y column of the
1b2a0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 61 63 table that is ac
1b2b0 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a tually used..**.
1b2c0 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 ** This instruct
1b2d0 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c ion works just l
1b2e0 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63 ike OpenRead exc
1b2f0 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e ept that it open
1b300 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 s the cursor.**
1b310 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f in read/write mo
1b320 64 65 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e de. For a given
1b330 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61 table, there ca
1b340 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 n be one or more
1b350 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 read-only.** cu
1b360 72 73 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c rsors or a singl
1b370 65 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 e read/write cur
1b380 73 6f 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 sor but not both
1b390 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f ..**.** See also
1b3a0 20 4f 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61 OpenRead..*/.ca
1b3b0 73 65 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3a se OP_ReopenIdx:
1b3c0 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b {. int nField;
1b3d0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 . KeyInfo *pKey
1b3e0 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a Info;. int p2;.
1b3f0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 int iDb;. int
1b400 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 wrFlag;. Btree
1b410 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 *pX;. VdbeCurs
1b420 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a or *pCur;. Db *
1b430 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 pDb;.. assert(
1b440 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f pOp->p5==0 || pO
1b450 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 p->p5==OPFLAG_SE
1b460 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 EKEQ );. assert
1b470 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 ( pOp->p4type==P
1b480 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 70 4_KEYINFO );. p
1b490 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 Cur = p->apCsr[p
1b4a0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 Op->p1];. if( p
1b4b0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 70 67 6e Cur && pCur->pgn
1b4c0 6f 52 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70 2d oRoot==(u32)pOp-
1b4d0 3e 70 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 >p2 ){. asser
1b4e0 74 28 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70 4f t( pCur->iDb==pO
1b4f0 70 2d 3e 70 33 20 29 3b 20 20 20 20 20 20 2f 2a p->p3 ); /*
1b500 20 47 75 61 72 61 6e 74 65 65 64 20 62 79 20 74 Guaranteed by t
1b510 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f he code generato
1b520 72 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f 70 r */. goto op
1b530 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69 en_cursor_set_hi
1b540 6e 74 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 nts;. }. /* If
1b550 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e the cursor is n
1b560 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 ot currently ope
1b570 6e 20 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 n or is open on
1b580 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a a different. **
1b590 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 66 61 6c index, then fal
1b5a0 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f l through into O
1b5b0 50 5f 4f 70 65 6e 52 65 61 64 20 74 6f 20 66 6f P_OpenRead to fo
1b5c0 72 63 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f 0a rce a reopen */.
1b5d0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 case OP_OpenRead
1b5e0 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72 :.case OP_OpenWr
1b5f0 69 74 65 3a 0a 0a 20 20 61 73 73 65 72 74 28 20 ite:.. assert(
1b600 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f pOp->opcode==OP_
1b610 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70 OpenWrite || pOp
1b620 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e ->p5==0 || pOp->
1b630 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b 45 p5==OPFLAG_SEEKE
1b640 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 Q );. assert( p
1b650 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 ->bIsReader );.
1b660 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 assert( pOp->op
1b670 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 code==OP_OpenRea
1b680 64 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 d || pOp->opcode
1b690 3d 3d 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a 20 ==OP_ReopenIdx.
1b6a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 || p->r
1b6b0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 eadOnly==0 );..
1b6c0 20 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20 if( p->expired
1b6d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 ){. rc = SQLI
1b6e0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 TE_ABORT_ROLLBAC
1b6f0 4b 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 K;. break;.
1b700 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 30 3b }.. nField = 0;
1b710 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b . pKeyInfo = 0;
1b720 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b . p2 = pOp->p2;
1b730 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 . iDb = pOp->p3
1b740 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e ;. assert( iDb>
1b750 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 =0 && iDb<db->nD
1b760 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 b );. assert( D
1b770 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 bMaskTest(p->btr
1b780 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a eeMask, iDb) );.
1b790 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 pDb = &db->aDb
1b7a0 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44 [iDb];. pX = pD
1b7b0 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 b->pBt;. assert
1b7c0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28 ( pX!=0 );. if(
1b7d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 pOp->opcode==OP
1b7e0 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20 _OpenWrite ){.
1b7f0 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 assert( OPFLAG
1b800 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42 54 52 45 _FORDELETE==BTRE
1b810 45 5f 46 4f 52 44 45 4c 45 54 45 20 29 3b 0a 20 E_FORDELETE );.
1b820 20 20 20 77 72 46 6c 61 67 20 3d 20 42 54 52 45 wrFlag = BTRE
1b830 45 5f 57 52 43 53 52 20 7c 20 28 70 4f 70 2d 3e E_WRCSR | (pOp->
1b840 70 35 20 26 20 4f 50 46 4c 41 47 5f 46 4f 52 44 p5 & OPFLAG_FORD
1b850 45 4c 45 54 45 29 3b 0a 20 20 20 20 61 73 73 65 ELETE);. asse
1b860 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d rt( sqlite3Schem
1b870 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 aMutexHeld(db, i
1b880 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 Db, 0) );. if
1b890 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e ( pDb->pSchema->
1b8a0 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c 20 70 2d file_format < p-
1b8b0 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 >minWriteFileFor
1b8c0 6d 61 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e mat ){. p->
1b8d0 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d minWriteFileForm
1b8e0 61 74 20 3d 20 70 44 62 2d 3e 70 53 63 68 65 6d at = pDb->pSchem
1b8f0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a a->file_format;.
1b900 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 }. }else{.
1b910 20 20 20 77 72 46 6c 61 67 20 3d 20 30 3b 0a 20 wrFlag = 0;.
1b920 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 }. if( pOp->p5
1b930 20 26 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 & OPFLAG_P2ISRE
1b940 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 G ){. assert(
1b950 20 70 32 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 p2>0 );. ass
1b960 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e 6e 4d 65 ert( p2<=(p->nMe
1b970 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b m-p->nCursor) );
1b980 0a 20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 . pIn2 = &aMe
1b990 6d 5b 70 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 m[p2];. asser
1b9a0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 t( memIsValid(pI
1b9b0 6e 32 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 n2) );. asser
1b9c0 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 t( (pIn2->flags
1b9d0 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b & MEM_Int)!=0 );
1b9e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
1b9f0 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 MemIntegerify(pI
1ba00 6e 32 29 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 n2);. p2 = (i
1ba10 6e 74 29 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 nt)pIn2->u.i;.
1ba20 20 20 2f 2a 20 54 68 65 20 70 32 20 76 61 6c 75 /* The p2 valu
1ba30 65 20 61 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 e always comes f
1ba40 72 6f 6d 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 rom a prior OP_C
1ba50 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 reateTable opcod
1ba60 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 e and. ** tha
1ba70 74 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c t opcode will al
1ba80 77 61 79 73 20 73 65 74 20 74 68 65 20 70 32 20 ways set the p2
1ba90 76 61 6c 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f value to 2 or mo
1baa0 72 65 20 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e re or else fail.
1bab0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 . ** If there
1bac0 20 77 65 72 65 20 61 20 66 61 69 6c 75 72 65 2c were a failure,
1bad0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
1bae0 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 atement would ha
1baf0 76 65 20 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a ve halted. **
1bb00 20 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 before reaching
1bb10 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f this instructio
1bb20 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 n. */. if( NE
1bb30 56 45 52 28 70 32 3c 32 29 20 29 20 7b 0a 20 20 VER(p2<2) ) {.
1bb40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
1bb50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 CORRUPT_BKPT;.
1bb60 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 goto abort_d
1bb70 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 ue_to_error;.
1bb80 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 }. }. if( pOp
1bb90 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 ->p4type==P4_KEY
1bba0 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 INFO ){. pKey
1bbb0 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 Info = pOp->p4.p
1bbc0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 KeyInfo;. ass
1bbd0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 ert( pKeyInfo->e
1bbe0 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 nc==ENC(db) );.
1bbf0 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 assert( pKeyI
1bc00 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 nfo->db==db );.
1bc10 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 nField = pKey
1bc20 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 Info->nField+pKe
1bc30 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3b 0a yInfo->nXField;.
1bc40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d }else if( pOp-
1bc50 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 >p4type==P4_INT3
1bc60 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20 2 ){. nField
1bc70 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d = pOp->p4.i;. }
1bc80 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e . assert( pOp->
1bc90 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 p1>=0 );. asser
1bca0 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b 0a t( nField>=0 );.
1bcb0 20 20 74 65 73 74 63 61 73 65 28 20 6e 46 69 65 testcase( nFie
1bcc0 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61 62 ld==0 ); /* Tab
1bcd0 6c 65 20 77 69 74 68 20 49 4e 54 45 47 45 52 20 le with INTEGER
1bce0 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 PRIMARY KEY and
1bcf0 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f 0a nothing else */.
1bd00 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 pCur = allocat
1bd10 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e eCursor(p, pOp->
1bd20 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c p1, nField, iDb,
1bd30 20 31 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 1);. if( pCur=
1bd40 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d =0 ) goto no_mem
1bd50 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f ;. pCur->nullRo
1bd60 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 w = 1;. pCur->i
1bd70 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 sOrdered = 1;.
1bd80 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d pCur->pgnoRoot =
1bd90 20 70 32 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 p2;. rc = sqli
1bda0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 te3BtreeCursor(p
1bdb0 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c 20 70 X, p2, wrFlag, p
1bdc0 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e 70 KeyInfo, pCur->p
1bdd0 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75 72 2d Cursor);. pCur-
1bde0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 >pKeyInfo = pKey
1bdf0 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65 74 20 74 Info;. /* Set t
1be00 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69 73 he VdbeCursor.is
1be10 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65 2e 20 Table variable.
1be20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e Previous version
1be30 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 s of. ** SQLite
1be40 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 used to check i
1be50 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 f the root-page
1be60 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 flags were sane
1be70 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 at this point.
1be80 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 ** and report da
1be90 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f tabase corruptio
1bea0 6e 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e n if they were n
1beb0 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 ot, but this che
1bec0 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 ck has. ** sinc
1bed0 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 e moved into the
1bee0 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a btree layer. *
1bef0 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 / . pCur->isTa
1bf00 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 ble = pOp->p4typ
1bf10 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 0a e!=P4_KEYINFO;..
1bf20 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f open_cursor_set_
1bf30 68 69 6e 74 73 3a 0a 20 20 61 73 73 65 72 74 28 hints:. assert(
1bf40 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 3d OPFLAG_BULKCSR=
1bf50 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 =BTREE_BULKLOAD
1bf60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46 );. assert( OPF
1bf70 4c 41 47 5f 53 45 45 4b 45 51 3d 3d 42 54 52 45 LAG_SEEKEQ==BTRE
1bf80 45 5f 53 45 45 4b 5f 45 51 20 29 3b 0a 20 20 73 E_SEEK_EQ );. s
1bf90 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
1bfa0 72 48 69 6e 74 73 28 70 43 75 72 2d 3e 70 43 75 rHints(pCur->pCu
1bfb0 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 rsor,.
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bfd0 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c (pOp->p5 & (OPFL
1bfe0 41 47 5f 42 55 4c 4b 43 53 52 7c 4f 50 46 4c 41 AG_BULKCSR|OPFLA
1bff0 47 5f 53 45 45 4b 45 51 29 29 29 3b 0a 20 20 62 G_SEEKEQ)));. b
1c000 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f reak;.}../* Opco
1c010 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 de: OpenEphemera
1c020 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a l P1 P2 * P4 P5.
1c030 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f ** Synopsis: nCo
1c040 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 4f 70 lumn=P2.**.** Op
1c050 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 en a new cursor
1c060 50 31 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e P1 to a transien
1c070 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 t table..** The
1c080 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 cursor is always
1c090 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 opened read/wri
1c0a0 74 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 te even if .** t
1c0b0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 he main database
1c0c0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 is read-only.
1c0d0 54 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a The ephemeral.**
1c0e0 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 table is delete
1c0f0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 d automatically
1c100 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 when the cursor
1c110 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a is closed..**.**
1c120 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 P2 is the numbe
1c130 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 r of columns in
1c140 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 the ephemeral ta
1c150 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 ble..** The curs
1c160 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 or points to a B
1c170 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 Tree table if P4
1c180 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 ==0 and to a BTr
1c190 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 ee index.** if P
1c1a0 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 4 is not 0. If
1c1b0 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 P4 is not NULL,
1c1c0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b it points to a K
1c1d0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 eyInfo structure
1c1e0 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 .** that defines
1c1f0 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b the format of k
1c200 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 eys in the index
1c210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70 ..**.** The P5 p
1c220 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 arameter can be
1c230 61 20 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54 a mask of the BT
1c240 52 45 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 REE_* flags defi
1c250 6e 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e ned.** in btree.
1c260 68 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 h. These flags
1c270 63 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20 control aspects
1c280 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e of the operation
1c290 20 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 of.** the btree
1c2a0 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49 . The BTREE_OMI
1c2b0 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54 T_JOURNAL and BT
1c2c0 52 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73 REE_SINGLE flags
1c2d0 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75 are.** added au
1c2e0 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a tomatically..*/.
1c2f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41 /* Opcode: OpenA
1c300 75 74 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a utoindex P1 P2 *
1c310 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 P4 *.** Synopsi
1c320 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a s: nColumn=P2.**
1c330 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 .** This opcode
1c340 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61 works the same a
1c350 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 s OP_OpenEphemer
1c360 61 6c 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a al. It has a.**
1c370 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20 different name
1c380 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 69 to distinguish i
1c390 74 73 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20 ts use. Tables
1c3a0 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a created using.**
1c3b0 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 by this opcode
1c3c0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 will be used for
1c3d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 automatically c
1c3e0 72 65 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74 reated transient
1c3f0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a .** indices in j
1c400 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 oins..*/.case OP
1c410 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20 _OpenAutoindex:
1c420 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68 .case OP_OpenEph
1c430 65 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65 emeral: {. Vdbe
1c440 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 4b Cursor *pCx;. K
1c450 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
1c460 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 ;.. static cons
1c470 74 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d t int vfsFlags =
1c480 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f . SQLITE_O
1c490 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a PEN_READWRITE |.
1c4a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 SQLITE_OPE
1c4b0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 N_CREATE |.
1c4c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 SQLITE_OPEN_EXC
1c4d0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53 LUSIVE |. S
1c4e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 QLITE_OPEN_DELET
1c4f0 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 EONCLOSE |.
1c500 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 SQLITE_OPEN_TRA
1c510 4e 53 49 45 4e 54 5f 44 42 3b 0a 20 20 61 73 73 NSIENT_DB;. ass
1c520 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 ert( pOp->p1>=0
1c530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 );. assert( pOp
1c540 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78 ->p2>=0 );. pCx
1c550 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f = allocateCurso
1c560 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f r(p, pOp->p1, pO
1c570 70 2d 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 p->p2, -1, 1);.
1c580 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f if( pCx==0 ) go
1c590 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 to no_mem;. pCx
1c5a0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 ->nullRow = 1;.
1c5b0 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 pCx->isEphemera
1c5c0 6c 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 l = 1;. rc = sq
1c5d0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 lite3BtreeOpen(d
1c5e0 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 b->pVfs, 0, db,
1c5f0 26 70 43 78 2d 3e 70 42 74 2c 20 0a 20 20 20 20 &pCx->pBt, .
1c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c610 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a BTREE_OMIT_J
1c620 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 OURNAL | BTREE_S
1c630 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c INGLE | pOp->p5,
1c640 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 vfsFlags);. if
1c650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1c660 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 ){. rc = sqli
1c670 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 te3BtreeBeginTra
1c680 6e 73 28 70 43 78 2d 3e 70 42 74 2c 20 31 29 3b ns(pCx->pBt, 1);
1c690 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 . }. if( rc==S
1c6a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
1c6b0 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e /* If a transien
1c6c0 74 20 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 t index is requi
1c6d0 72 65 64 2c 20 63 72 65 61 74 65 20 69 74 20 62 red, create it b
1c6e0 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a y calling. **
1c6f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 sqlite3BtreeCre
1c700 61 74 65 54 61 62 6c 65 28 29 20 77 69 74 68 20 ateTable() with
1c710 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 the BTREE_BLOBKE
1c720 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a 20 20 Y flag before.
1c730 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e ** opening it.
1c740 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 If a transient
1c750 74 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 table is require
1c760 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a d, just use the.
1c770 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 ** automatic
1c780 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61 62 ally created tab
1c790 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 le with root-pag
1c7a0 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 e 1 (an BLOB_INT
1c7b0 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 KEY table)..
1c7c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4b 65 79 */. if( (pKey
1c7d0 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 Info = pOp->p4.p
1c7e0 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 KeyInfo)!=0 ){.
1c7f0 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 int pgno;.
1c800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 assert( pOp
1c810 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 ->p4type==P4_KEY
1c820 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 72 63 INFO );. rc
1c830 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
1c840 72 65 61 74 65 54 61 62 6c 65 28 70 43 78 2d 3e reateTable(pCx->
1c850 70 42 74 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 pBt, &pgno, BTRE
1c860 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d E_BLOBKEY | pOp-
1c870 3e 70 35 29 3b 20 0a 20 20 20 20 20 20 69 66 28 >p5); . if(
1c880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1c890 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 {. assert
1c8a0 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 ( pgno==MASTER_R
1c8b0 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 OOT+1 );.
1c8c0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 assert( pKeyInf
1c8d0 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 o->db==db );.
1c8e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 assert( pKe
1c8f0 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 yInfo->enc==ENC(
1c900 64 62 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 db) );. p
1c910 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 Cx->pKeyInfo = p
1c920 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 KeyInfo;.
1c930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
1c940 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 eeCursor(pCx->pB
1c950 74 2c 20 70 67 6e 6f 2c 20 42 54 52 45 45 5f 57 t, pgno, BTREE_W
1c960 52 43 53 52 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 RCSR, pKeyInfo,
1c970 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 pCx->pCursor);.
1c980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 78 }. pCx
1c990 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a 20 ->isTable = 0;.
1c9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1c9b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 rc = sqlite3Btre
1c9c0 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 eCursor(pCx->pBt
1c9d0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 42 , MASTER_ROOT, B
1c9e0 54 52 45 45 5f 57 52 43 53 52 2c 20 30 2c 20 70 TREE_WRCSR, 0, p
1c9f0 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 Cx->pCursor);.
1ca00 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 pCx->isTable
1ca10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = 1;. }. }.
1ca20 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65 64 pCx->isOrdered
1ca30 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54 52 = (pOp->p5!=BTR
1ca40 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 EE_UNORDERED);.
1ca50 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 break;.}../* Op
1ca60 63 6f 64 65 3a 20 53 6f 72 74 65 72 4f 70 65 6e code: SorterOpen
1ca70 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a P1 P2 P3 P4 *.*
1ca80 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 *.** This opcode
1ca90 20 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f works like OP_O
1caa0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 65 78 63 penEphemeral exc
1cab0 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e ept that it open
1cac0 73 0a 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e 74 s.** a transient
1cad0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 73 index that is s
1cae0 70 65 63 69 66 69 63 61 6c 6c 79 20 64 65 73 69 pecifically desi
1caf0 67 6e 65 64 20 74 6f 20 73 6f 72 74 20 6c 61 72 gned to sort lar
1cb00 67 65 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73 69 ge.** tables usi
1cb10 6e 67 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d ng an external m
1cb20 65 72 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69 erge-sort algori
1cb30 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 thm..**.** If ar
1cb40 67 75 6d 65 6e 74 20 50 33 20 69 73 20 6e 6f 6e gument P3 is non
1cb50 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 -zero, then it i
1cb60 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 ndicates that th
1cb70 65 20 73 6f 72 74 65 72 20 6d 61 79 0a 2a 2a 20 e sorter may.**
1cb80 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 73 74 assume that a st
1cb90 61 62 6c 65 20 73 6f 72 74 20 63 6f 6e 73 69 64 able sort consid
1cba0 65 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 ering the first
1cbb0 50 33 20 66 69 65 6c 64 73 20 6f 66 20 65 61 63 P3 fields of eac
1cbc0 68 0a 2a 2a 20 6b 65 79 20 69 73 20 73 75 66 66 h.** key is suff
1cbd0 69 63 69 65 6e 74 20 74 6f 20 70 72 6f 64 75 63 icient to produc
1cbe0 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20 72 e the required r
1cbf0 65 73 75 6c 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 esults..*/.case
1cc00 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3a 20 7b OP_SorterOpen: {
1cc10 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 . VdbeCursor *p
1cc20 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 Cx;.. assert( p
1cc30 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 Op->p1>=0 );. a
1cc40 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d ssert( pOp->p2>=
1cc50 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 0 );. pCx = all
1cc60 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 ocateCursor(p, p
1cc70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c Op->p1, pOp->p2,
1cc80 20 2d 31 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 -1, 1);. if( p
1cc90 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f Cx==0 ) goto no_
1cca0 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 mem;. pCx->pKey
1ccb0 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 Info = pOp->p4.p
1ccc0 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 KeyInfo;. asser
1ccd0 74 28 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f t( pCx->pKeyInfo
1cce0 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 61 73 ->db==db );. as
1ccf0 73 65 72 74 28 20 70 43 78 2d 3e 70 4b 65 79 49 sert( pCx->pKeyI
1cd00 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 nfo->enc==ENC(db
1cd10 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 ) );. rc = sqli
1cd20 74 65 33 56 64 62 65 53 6f 72 74 65 72 49 6e 69 te3VdbeSorterIni
1cd30 74 28 64 62 2c 20 70 4f 70 2d 3e 70 33 2c 20 70 t(db, pOp->p3, p
1cd40 43 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a Cx);. break;.}.
1cd50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 ./* Opcode: Sequ
1cd60 65 6e 63 65 54 65 73 74 20 50 31 20 50 32 20 2a enceTest P1 P2 *
1cd70 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 * *.** Synopsis
1cd80 3a 20 69 66 28 20 63 75 72 73 6f 72 5b 50 31 5d : if( cursor[P1]
1cd90 2e 63 74 72 2b 2b 20 29 20 70 63 20 3d 20 50 32 .ctr++ ) pc = P2
1cda0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 .**.** P1 is a s
1cdb0 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20 49 66 orter cursor. If
1cdc0 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 63 6f the sequence co
1cdd0 75 6e 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 unter is current
1cde0 6c 79 20 7a 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a ly zero, jump.**
1cdf0 20 74 6f 20 50 32 2e 20 52 65 67 61 72 64 6c 65 to P2. Regardle
1ce00 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 ss of whether or
1ce10 20 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 69 73 not the jump is
1ce20 20 74 61 6b 65 6e 2c 20 69 6e 63 72 65 6d 65 6e taken, incremen
1ce30 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 65 71 t the.** the seq
1ce40 75 65 6e 63 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a uence value..*/.
1ce50 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 case OP_Sequence
1ce60 54 65 73 74 3a 20 7b 0a 20 20 56 64 62 65 43 75 Test: {. VdbeCu
1ce70 72 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 rsor *pC;. asse
1ce80 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 rt( pOp->p1>=0 &
1ce90 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 & pOp->p1<p->nCu
1cea0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 rsor );. pC = p
1ceb0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d ->apCsr[pOp->p1]
1cec0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e ;. assert( pC->
1ced0 70 53 6f 72 74 65 72 20 29 3b 0a 20 20 69 66 28 pSorter );. if(
1cee0 20 28 70 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b (pC->seqCount++
1cef0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f )==0 ){. goto
1cf00 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d jump_to_p2;. }
1cf10 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 . break;.}../*
1cf20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 Opcode: OpenPseu
1cf30 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a do P1 P2 P3 * *.
1cf40 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 50 33 20 ** Synopsis: P3
1cf50 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d columns in r[P2]
1cf60 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 .**.** Open a ne
1cf70 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f w cursor that po
1cf80 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74 ints to a fake t
1cf90 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 able that contai
1cfa0 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 ns a single.** r
1cfb0 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 ow of data. The
1cfc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 content of that
1cfd0 20 6f 6e 65 20 72 6f 77 20 69 73 20 74 68 65 20 one row is the
1cfe0 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 content of memor
1cff0 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 y.** register P2
1d000 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 . In other word
1d010 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65 63 s, cursor P1 bec
1d020 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f omes an alias fo
1d030 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c r the .** MEM_Bl
1d040 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 ob content conta
1d050 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 ined in register
1d060 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 P2..**.** A pse
1d070 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65 udo-table create
1d080 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 d by this opcode
1d090 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 is used to hold
1d0a0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 a single.** row
1d0b0 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 output from the
1d0c0 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74 20 sorter so that
1d0d0 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20 64 the row can be d
1d0e0 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a ecomposed into.*
1d0f0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c * individual col
1d100 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20 4f umns using the O
1d110 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e P_Column opcode.
1d120 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 The OP_Column
1d130 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65 opcode.** is the
1d140 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70 63 only cursor opc
1d150 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20 77 ode that works w
1d160 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61 62 ith a pseudo-tab
1d170 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 le..**.** P3 is
1d180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 the number of fi
1d190 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f elds in the reco
1d1a0 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 rds that will be
1d1b0 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68 stored by.** th
1d1c0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a e pseudo-table..
1d1d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50 */.case OP_OpenP
1d1e0 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43 seudo: {. VdbeC
1d1f0 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 ursor *pCx;.. a
1d200 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d ssert( pOp->p1>=
1d210 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
1d220 4f 70 2d 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70 Op->p3>=0 );. p
1d230 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 Cx = allocateCur
1d240 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 sor(p, pOp->p1,
1d250 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 30 29 3b pOp->p3, -1, 0);
1d260 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 . if( pCx==0 )
1d270 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 goto no_mem;. p
1d280 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b Cx->nullRow = 1;
1d290 0a 20 20 70 43 78 2d 3e 70 73 65 75 64 6f 54 61 . pCx->pseudoTa
1d2a0 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d 3e 70 32 bleReg = pOp->p2
1d2b0 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 ;. pCx->isTable
1d2c0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 = 1;. assert(
1d2d0 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 pOp->p5==0 );.
1d2e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
1d2f0 6f 64 65 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 ode: Close P1 *
1d300 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 * * *.**.** Clos
1d310 65 20 61 20 63 75 72 73 6f 72 20 70 72 65 76 69 e a cursor previ
1d320 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 ously opened as
1d330 50 31 2e 20 20 49 66 20 50 31 20 69 73 20 6e 6f P1. If P1 is no
1d340 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f t.** currently o
1d350 70 65 6e 2c 20 74 68 69 73 20 69 6e 73 74 72 75 pen, this instru
1d360 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 ction is a no-op
1d370 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f ..*/.case OP_Clo
1d380 73 65 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 se: {. assert(
1d390 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f pOp->p1>=0 && pO
1d3a0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 p->p1<p->nCursor
1d3b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 );. sqlite3Vdb
1d3c0 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 eFreeCursor(p, p
1d3d0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d ->apCsr[pOp->p1]
1d3e0 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f );. p->apCsr[pO
1d3f0 70 2d 3e 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 p->p1] = 0;. br
1d400 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 eak;.}..#ifdef S
1d410 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c QLITE_ENABLE_COL
1d420 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a UMN_USED_MASK./*
1d430 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 Opcode: Columns
1d440 55 73 65 64 20 50 31 20 2a 20 2a 20 50 34 20 2a Used P1 * * P4 *
1d450 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f .**.** This opco
1d460 64 65 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 65 de (which only e
1d470 78 69 73 74 73 20 69 66 20 53 51 4c 69 74 65 20 xists if SQLite
1d480 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 was compiled wit
1d490 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 h.** SQLITE_ENAB
1d4a0 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d LE_COLUMN_USED_M
1d4b0 41 53 4b 29 20 69 64 65 6e 74 69 66 69 65 73 20 ASK) identifies
1d4c0 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 which columns of
1d4d0 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 the.** table or
1d4e0 20 69 6e 64 65 78 20 66 6f 72 20 63 75 72 73 6f index for curso
1d4f0 72 20 50 31 20 61 72 65 20 75 73 65 64 2e 20 20 r P1 are used.
1d500 50 34 20 69 73 20 61 20 36 34 2d 62 69 74 20 69 P4 is a 64-bit i
1d510 6e 74 65 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e nteger.** (P4_IN
1d520 54 36 34 29 20 69 6e 20 77 68 69 63 68 20 74 68 T64) in which th
1d530 65 20 66 69 72 73 74 20 36 33 20 62 69 74 73 20 e first 63 bits
1d540 61 72 65 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 are one for each
1d550 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 of the.** first
1d560 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 63 columns of t
1d570 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 he table or inde
1d580 78 20 74 68 61 74 20 61 72 65 20 61 63 74 75 61 x that are actua
1d590 6c 6c 79 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 lly used.** by t
1d5a0 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 he cursor. The
1d5b0 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 69 high-order bit i
1d5c0 73 20 73 65 74 20 69 66 20 61 6e 79 20 63 6f 6c s set if any col
1d5d0 75 6d 6e 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 umn after.** the
1d5e0 20 36 34 74 68 20 69 73 20 75 73 65 64 2e 0a 2a 64th is used..*
1d5f0 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e /.case OP_Column
1d600 73 55 73 65 64 3a 20 7b 0a 20 20 56 64 62 65 43 sUsed: {. VdbeC
1d610 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20 ursor *pC;. pC
1d620 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e = p->apCsr[pOp->
1d630 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 p1];. assert( p
1d640 43 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 C->pCursor );.
1d650 70 43 2d 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a pC->maskUsed = *
1d660 28 75 36 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 (u64*)pOp->p4.pI
1d670 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 64;. break;.}.#
1d680 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 endif../* Opcode
1d690 3a 20 53 65 65 6b 47 45 20 50 31 20 50 32 20 50 : SeekGE P1 P2 P
1d6a0 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 3 P4 *.** Synops
1d6b0 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d is: key=r[P3@P4]
1d6c0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 .**.** If cursor
1d6d0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e P1 refers to an
1d6e0 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 SQL table (B-Tr
1d6f0 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 ee that uses int
1d700 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 eger keys), .**
1d710 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e use the value in
1d720 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 register P3 as
1d730 74 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 the key. If cur
1d740 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a sor P1 refers .*
1d750 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 * to an SQL inde
1d760 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 x, then P3 is th
1d770 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 e first in an ar
1d780 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 ray of P4 regist
1d790 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 ers .** that are
1d7a0 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 used as an unpa
1d7b0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 cked index key.
1d7c0 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f .**.** Repositio
1d7d0 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 n cursor P1 so t
1d7e0 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 hat it points t
1d7f0 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 o the smallest e
1d800 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 ntry that .** is
1d810 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 greater than or
1d820 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 equal to the ke
1d830 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 y value. If ther
1d840 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 e are no records
1d850 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 .** greater tha
1d860 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 n or equal to th
1d870 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 e key and P2 is
1d880 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a not zero, then j
1d890 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a ump to P2..**.**
1d8a0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 This opcode lea
1d8b0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 ves the cursor c
1d8c0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 onfigured to mov
1d8d0 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 e in forward ord
1d8e0 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 er,.** from the
1d8f0 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 beginning toward
1d900 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 the end. In ot
1d910 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 her words, the c
1d920 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 ursor is.** conf
1d930 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 igured to use Ne
1d940 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a xt, not Prev..**
1d950 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f .** See also: Fo
1d960 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 und, NotFound, S
1d970 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53 eekLt, SeekGt, S
1d980 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f eekLe.*/./* Opco
1d990 64 65 3a 20 53 65 65 6b 47 54 20 50 31 20 50 32 de: SeekGT P1 P2
1d9a0 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f P3 P4 *.** Syno
1d9b0 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 psis: key=r[P3@P
1d9c0 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 4].**.** If curs
1d9d0 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 or P1 refers to
1d9e0 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d an SQL table (B-
1d9f0 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69 Tree that uses i
1da00 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a nteger keys), .*
1da10 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 * use the value
1da20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 in register P3 a
1da30 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 s a key. If curs
1da40 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a or P1 refers .**
1da50 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 to an SQL index
1da60 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 , then P3 is the
1da70 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 first in an arr
1da80 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 ay of P4 registe
1da90 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 rs .** that are
1daa0 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 used as an unpac
1dab0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a ked index key. .
1dac0 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e **.** Reposition
1dad0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 cursor P1 so th
1dae0 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f at it points to
1daf0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e the smallest en
1db00 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 try that .** is
1db10 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 greater than the
1db20 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 key value. If t
1db30 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f here are no reco
1db40 72 64 73 20 67 72 65 61 74 65 72 20 74 68 61 6e rds greater than
1db50 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 .** the key and
1db60 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c P2 is not zero,
1db70 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 then jump to P2
1db80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 ..**.** This opc
1db90 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 ode leaves the c
1dba0 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 ursor configured
1dbb0 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 to move in forw
1dbc0 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 ard order,.** fr
1dbd0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 om the beginning
1dbe0 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e toward the end.
1dbf0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 In other words
1dc00 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a , the cursor is.
1dc10 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f ** configured to
1dc20 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 use Next, not P
1dc30 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 rev..**.** See a
1dc40 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 lso: Found, NotF
1dc50 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 ound, SeekLt, Se
1dc60 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a ekGe, SeekLe.*/.
1dc70 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c /* Opcode: SeekL
1dc80 54 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20 T P1 P2 P3 P4 *
1dc90 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 .** Synopsis: ke
1dca0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a y=r[P3@P4].**.**
1dcb0 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 If cursor P1 re
1dcc0 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 fers to an SQL t
1dcd0 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 able (B-Tree tha
1dce0 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b t uses integer k
1dcf0 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 eys), .** use th
1dd00 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 e value in regis
1dd10 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e ter P3 as a key.
1dd20 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 If cursor P1 re
1dd30 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 fers .** to an S
1dd40 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 QL index, then P
1dd50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 3 is the first i
1dd60 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 n an array of P4
1dd70 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 registers .** t
1dd80 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 hat are used as
1dd90 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 an unpacked inde
1dda0 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 x key. .**.** Re
1ddb0 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 position cursor
1ddc0 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 P1 so that it p
1ddd0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 oints to the lar
1dde0 67 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 gest entry that
1ddf0 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e .** is less than
1de00 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 the key value.
1de10 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 If there are no
1de20 72 65 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61 records less tha
1de30 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e n .** the key an
1de40 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f d P2 is not zero
1de50 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 , then jump to P
1de60 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 2..**.** This op
1de70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 code leaves the
1de80 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 cursor configure
1de90 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 d to move in rev
1dea0 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 erse order,.** f
1deb0 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 rom the end towa
1dec0 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 rd the beginning
1ded0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 . In other word
1dee0 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 s, the cursor is
1def0 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 .** configured t
1df00 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 o use Prev, not
1df10 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 Next..**.** See
1df20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 also: Found, Not
1df30 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 Found, SeekGt, S
1df40 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f eekGe, SeekLe.*/
1df50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b ./* Opcode: Seek
1df60 4c 45 20 50 31 20 50 32 20 50 33 20 50 34 20 2a LE P1 P2 P3 P4 *
1df70 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 .** Synopsis: ke
1df80 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a y=r[P3@P4].**.**
1df90 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 If cursor P1 re
1dfa0 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 fers to an SQL t
1dfb0 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 able (B-Tree tha
1dfc0 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b t uses integer k
1dfd0 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 eys), .** use th
1dfe0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 e value in regis
1dff0 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e ter P3 as a key.
1e000 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 If cursor P1 re
1e010 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 fers .** to an S
1e020 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 QL index, then P
1e030 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 3 is the first i
1e040 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 n an array of P4
1e050 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 registers .** t
1e060 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 hat are used as
1e070 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 an unpacked inde
1e080 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 x key. .**.** Re
1e090 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 position cursor
1e0a0 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f P1 so that it po
1e0b0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 ints to the larg
1e0c0 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a est entry that .
1e0d0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 ** is less than
1e0e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 or equal to the
1e0f0 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 key value. If th
1e100 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 ere are no recor
1e110 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e ds .** less than
1e120 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 or equal to the
1e130 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e key and P2 is n
1e140 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 ot zero, then ju
1e150 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 mp to P2..**.**
1e160 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 This opcode leav
1e170 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f es the cursor co
1e180 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 nfigured to move
1e190 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 in reverse orde
1e1a0 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 r,.** from the e
1e1b0 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 nd toward the be
1e1c0 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 ginning. In oth
1e1d0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 er words, the cu
1e1e0 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 rsor is.** confi
1e1f0 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 gured to use Pre
1e200 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a v, not Next..**.
1e210 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 ** See also: Fou
1e220 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 nd, NotFound, Se
1e230 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 ekGt, SeekGe, Se
1e240 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ekLt.*/.case OP_
1e250 53 65 65 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 SeekLT:
1e260 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a /* jump, in3 */.
1e270 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 case OP_SeekLE:
1e280 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c /* jump,
1e290 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f in3 */.case OP_
1e2a0 53 65 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 SeekGE:
1e2b0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a /* jump, in3 */.
1e2c0 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 case OP_SeekGT:
1e2d0 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c { /* jump,
1e2e0 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 in3 */. int re
1e2f0 73 3b 0a 20 20 69 6e 74 20 6f 63 3b 0a 20 20 56 s;. int oc;. V
1e300 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 dbeCursor *pC;.
1e310 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
1e320 72 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b r;. int nField;
1e330 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20 20 . i64 iKey;
1e340 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 77 /* The rowid w
1e350 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20 74 6f e are to seek to
1e360 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 */.. assert( p
1e370 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 Op->p1>=0 && pOp
1e380 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 ->p1<p->nCursor
1e390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 );. assert( pOp
1e3a0 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 ->p2!=0 );. pC
1e3b0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e = p->apCsr[pOp->
1e3c0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 p1];. assert( p
1e3d0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 C!=0 );. assert
1e3e0 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c ( pC->pseudoTabl
1e3f0 65 52 65 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 eReg==0 );. ass
1e400 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 20 3d ert( OP_SeekLE =
1e410 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 31 20 29 3b = OP_SeekLT+1 );
1e420 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 . assert( OP_Se
1e430 65 6b 47 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c ekGE == OP_SeekL
1e440 54 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 T+2 );. assert(
1e450 20 4f 50 5f 53 65 65 6b 47 54 20 3d 3d 20 4f 50 OP_SeekGT == OP
1e460 5f 53 65 65 6b 4c 54 2b 33 20 29 3b 0a 20 20 61 _SeekLT+3 );. a
1e470 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 ssert( pC->isOrd
1e480 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 ered );. assert
1e490 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 ( pC->pCursor!=0
1e4a0 20 29 3b 0a 20 20 6f 63 20 3d 20 70 4f 70 2d 3e );. oc = pOp->
1e4b0 6f 70 63 6f 64 65 3b 0a 20 20 70 43 2d 3e 6e 75 opcode;. pC->nu
1e4c0 6c 6c 52 6f 77 20 3d 20 30 3b 0a 23 69 66 64 65 llRow = 0;.#ifde
1e4d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 f SQLITE_DEBUG.
1e4e0 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f pC->seekOp = pO
1e4f0 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 p->opcode;.#endi
1e500 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 75 f.. /* For a cu
1e510 72 73 6f 72 20 77 69 74 68 20 74 68 65 20 42 54 rsor with the BT
1e520 52 45 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e 74 REE_SEEK_EQ hint
1e530 2c 20 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53 65 , only the OP_Se
1e540 65 6b 47 45 20 61 6e 64 0a 20 20 2a 2a 20 4f 50 ekGE and. ** OP
1e550 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73 20 _SeekLE opcodes
1e560 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61 6e 64 are allowed, and
1e570 20 74 68 65 73 65 20 6d 75 73 74 20 62 65 20 69 these must be i
1e580 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f mmediately follo
1e590 77 65 64 0a 20 20 2a 2a 20 62 79 20 61 6e 20 4f wed. ** by an O
1e5a0 50 5f 49 64 78 47 54 20 6f 72 20 4f 50 5f 49 64 P_IdxGT or OP_Id
1e5b0 78 4c 54 20 6f 70 63 6f 64 65 2c 20 72 65 73 70 xLT opcode, resp
1e5c0 65 63 74 69 76 65 6c 79 2c 20 77 69 74 68 20 74 ectively, with t
1e5d0 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a 20 20 2a he same key.. *
1e5e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f /.#ifdef SQLITE_
1e5f0 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 DEBUG. if( sqli
1e600 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 te3BtreeCursorHa
1e610 73 48 69 6e 74 28 70 43 2d 3e 70 43 75 72 73 6f sHint(pC->pCurso
1e620 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 r, BTREE_SEEK_EQ
1e630 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 ) ){. assert(
1e640 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 pOp->opcode==OP
1e650 5f 53 65 65 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e _SeekGE || pOp->
1e660 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c opcode==OP_SeekL
1e670 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 E );. assert(
1e680 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d pOp[1].opcode==
1e690 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b OP_IdxLT || pOp[
1e6a0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 1].opcode==OP_Id
1e6b0 78 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 xGT );. asser
1e6c0 74 28 20 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f t( pOp[1].p1==pO
1e6d0 70 5b 30 5d 2e 70 31 20 29 3b 0a 20 20 20 20 61 p[0].p1 );. a
1e6e0 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 32 ssert( pOp[1].p2
1e6f0 3d 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b 0a 20 ==pOp[0].p2 );.
1e700 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 assert( pOp[1
1e710 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70 33 20 ].p3==pOp[0].p3
1e720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
1e730 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d 70 4f 70 5b Op[1].p4.i==pOp[
1e740 30 5d 2e 70 34 2e 69 20 29 3b 0a 20 20 7d 0a 23 0].p4.i );. }.#
1e750 65 6e 64 69 66 0a 20 0a 20 20 69 66 28 20 70 43 endif. . if( pC
1e760 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 ->isTable ){.
1e770 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76 61 /* The input va
1e780 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74 20 lue in P3 might
1e790 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 be of any type:
1e7a0 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 integer, real, s
1e7b0 74 72 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 62 6c tring,. ** bl
1e7c0 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 ob, or NULL. Bu
1e7d0 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 t it needs to be
1e7e0 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f an integer befo
1e7f0 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 re we can do.
1e800 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20 73 6f ** the seek, so
1e810 20 63 6f 6e 76 65 72 74 20 69 74 2e 20 2a 2f 0a convert it. */.
1e820 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d pIn3 = &aMem
1e830 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 69 [pOp->p3];. i
1e840 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 f( (pIn3->flags
1e850 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 & (MEM_Int|MEM_R
1e860 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d eal|MEM_Str))==M
1e870 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 EM_Str ){.
1e880 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 applyNumericAffi
1e890 6e 69 74 79 28 70 49 6e 33 2c 20 30 29 3b 0a 20 nity(pIn3, 0);.
1e8a0 20 20 20 7d 0a 20 20 20 20 69 4b 65 79 20 3d 20 }. iKey =
1e8b0 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 sqlite3VdbeIntVa
1e8c0 6c 75 65 28 70 49 6e 33 29 3b 0a 0a 20 20 20 20 lue(pIn3);..
1e8d0 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c /* If the P3 val
1e8e0 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 ue could not be
1e8f0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 converted into a
1e900 6e 20 69 6e 74 65 67 65 72 20 77 69 74 68 6f 75 n integer withou
1e910 74 0a 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 t. ** loss of
1e920 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 information, th
1e930 65 6e 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 en special proce
1e940 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 ssing is require
1e950 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 d... */. if(
1e960 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d (pIn3->flags & M
1e970 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 EM_Int)==0 ){.
1e980 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 if( (pIn3->f
1e990 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 lags & MEM_Real)
1e9a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f ==0 ){. /
1e9b0 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 * If the P3 valu
1e9c0 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 e cannot be conv
1e9d0 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79 20 6b erted into any k
1e9e0 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65 72 2c ind of a number,
1e9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e . ** then
1ea00 20 74 68 65 20 73 65 65 6b 20 69 73 20 6e 6f 74 the seek is not
1ea10 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75 possible, so ju
1ea20 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 mp to P2 */.
1ea30 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 VdbeBranchTa
1ea40 6b 65 6e 28 31 2c 32 29 3b 20 67 6f 74 6f 20 6a ken(1,2); goto j
1ea50 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 ump_to_p2;.
1ea60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
1ea70 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 }.. /* If t
1ea80 68 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e he approximation
1ea90 20 69 4b 65 79 20 69 73 20 6c 61 72 67 65 72 20 iKey is larger
1eaa0 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 than the actual
1eab0 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20 real search.
1eac0 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 ** term, subst
1ead0 69 74 75 74 65 20 3e 3d 20 66 6f 72 20 3e 20 61 itute >= for > a
1eae0 6e 64 20 3c 20 66 6f 72 20 3c 3d 2e 20 65 2e 67 nd < for <=. e.g
1eaf0 2e 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20 . if the search
1eb00 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 73 term. ** is
1eb10 20 34 2e 39 20 61 6e 64 20 74 68 65 20 69 6e 74 4.9 and the int
1eb20 65 67 65 72 20 61 70 70 72 6f 78 69 6d 61 74 69 eger approximati
1eb30 6f 6e 20 35 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 on 5:. **.
1eb40 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 ** (
1eb50 78 20 3e 20 20 34 2e 39 29 20 20 20 20 2d 3e 20 x > 4.9) ->
1eb60 20 20 20 20 28 78 20 3e 3d 20 35 29 0a 20 20 20 (x >= 5).
1eb70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20 ** (x
1eb80 3c 3d 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 <= 4.9) ->
1eb90 20 20 28 78 20 3c 20 20 35 29 0a 20 20 20 20 20 (x < 5).
1eba0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 */. if( pI
1ebb0 6e 33 2d 3e 75 2e 72 3c 28 64 6f 75 62 6c 65 29 n3->u.r<(double)
1ebc0 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 iKey ){.
1ebd0 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 assert( OP_SeekG
1ebe0 45 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 2d 31 29 E==(OP_SeekGT-1)
1ebf0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 );. asse
1ec00 72 74 28 20 4f 50 5f 53 65 65 6b 4c 54 3d 3d 28 rt( OP_SeekLT==(
1ec10 4f 50 5f 53 65 65 6b 4c 45 2d 31 29 20 29 3b 0a OP_SeekLE-1) );.
1ec20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
1ec30 28 4f 50 5f 53 65 65 6b 4c 45 20 26 20 30 78 30 (OP_SeekLE & 0x0
1ec40 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 001)==(OP_SeekGT
1ec50 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a 20 20 & 0x0001) );.
1ec60 20 20 20 20 20 20 69 66 28 20 28 6f 63 20 26 20 if( (oc &
1ec70 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 0x0001)==(OP_See
1ec80 6b 47 54 20 26 20 30 78 30 30 30 31 29 20 29 20 kGT & 0x0001) )
1ec90 6f 63 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 oc--;. }..
1eca0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 /* If the a
1ecb0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 pproximation iKe
1ecc0 79 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 y is smaller tha
1ecd0 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 61 n the actual rea
1ece0 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a l search. *
1ecf0 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69 74 75 * term, substitu
1ed00 74 65 20 3c 3d 20 66 6f 72 20 3c 20 61 6e 64 20 te <= for < and
1ed10 3e 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f 0a 20 20 > for >=. */.
1ed20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 6e else if( pIn
1ed30 33 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c 65 29 69 3->u.r>(double)i
1ed40 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 Key ){. a
1ed50 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 ssert( OP_SeekLE
1ed60 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b 31 29 20 ==(OP_SeekLT+1)
1ed70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 );. asser
1ed80 74 28 20 4f 50 5f 53 65 65 6b 47 54 3d 3d 28 4f t( OP_SeekGT==(O
1ed90 50 5f 53 65 65 6b 47 45 2b 31 29 20 29 3b 0a 20 P_SeekGE+1) );.
1eda0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 assert( (
1edb0 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78 30 30 OP_SeekLT & 0x00
1edc0 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 20 01)==(OP_SeekGE
1edd0 26 20 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20 & 0x0001) );.
1ede0 20 20 20 20 20 69 66 28 20 28 6f 63 20 26 20 30 if( (oc & 0
1edf0 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b x0001)==(OP_Seek
1ee00 4c 54 20 26 20 30 78 30 30 30 31 29 20 29 20 6f LT & 0x0001) ) o
1ee10 63 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 c++;. }.
1ee20 20 7d 20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c } . rc = sql
1ee30 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 ite3BtreeMovetoU
1ee40 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 npacked(pC->pCur
1ee50 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b 65 sor, 0, (u64)iKe
1ee60 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 y, 0, &res);.
1ee70 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 pC->movetoTarge
1ee80 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73 t = iKey; /* Us
1ee90 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20 ed by OP_Delete
1eea0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 */. if( rc!=S
1eeb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
1eec0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 goto abort_due
1eed0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d _to_error;. }
1eee0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 46 . }else{. nF
1eef0 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 ield = pOp->p4.i
1ef00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f ;. assert( pO
1ef10 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e p->p4type==P4_IN
1ef20 54 33 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 T32 );. asser
1ef30 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 t( nField>0 );.
1ef40 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 r.pKeyInfo =
1ef50 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 pC->pKeyInfo;.
1ef60 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 r.nField = (u1
1ef70 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20 20 20 2f 6)nField;.. /
1ef80 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 * The next line
1ef90 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74 65 73 of code computes
1efa0 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c as follows, onl
1efb0 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20 2a 2a y faster:. **
1efc0 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 if( oc==OP_Se
1efd0 65 6b 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 ekGT || oc==OP_S
1efe0 65 65 6b 4c 45 20 29 7b 0a 20 20 20 20 2a 2a 20 eekLE ){. **
1eff0 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 r.default_rc
1f000 20 3d 20 2d 31 3b 0a 20 20 20 20 2a 2a 20 20 20 = -1;. **
1f010 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 }else{. **
1f020 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d r.default_rc =
1f030 20 2b 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 0a +1;. ** }.
1f040 20 20 20 20 2a 2f 0a 20 20 20 20 72 2e 64 65 66 */. r.def
1f050 61 75 6c 74 5f 72 63 20 3d 20 28 28 31 20 26 20 ault_rc = ((1 &
1f060 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 54 29 (oc - OP_SeekLT)
1f070 29 20 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a 20 20 ) ? -1 : +1);.
1f080 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 assert( oc!=OP
1f090 5f 53 65 65 6b 47 54 20 7c 7c 20 72 2e 64 65 66 _SeekGT || r.def
1f0a0 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 ault_rc==-1 );.
1f0b0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f assert( oc!=O
1f0c0 50 5f 53 65 65 6b 4c 45 20 7c 7c 20 72 2e 64 65 P_SeekLE || r.de
1f0d0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a fault_rc==-1 );.
1f0e0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d assert( oc!=
1f0f0 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 72 2e 64 OP_SeekGE || r.d
1f100 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b efault_rc==+1 );
1f110 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 . assert( oc!
1f120 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 72 2e =OP_SeekLT || r.
1f130 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 default_rc==+1 )
1f140 3b 0a 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 ;.. r.aMem =
1f150 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a &aMem[pOp->p3];.
1f160 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
1f170 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b BUG. { int i;
1f180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 for(i=0; i<r.nF
1f190 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 ield; i++) asser
1f1a0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 t( memIsValid(&r
1f1b0 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 .aMem[i]) ); }.#
1f1c0 65 6e 64 69 66 0a 20 20 20 20 45 78 70 61 6e 64 endif. Expand
1f1d0 42 6c 6f 62 28 72 2e 61 4d 65 6d 29 3b 0a 20 20 Blob(r.aMem);.
1f1e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
1f1f0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 reeMovetoUnpacke
1f200 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 d(pC->pCursor, &
1f210 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a r, 0, 0, &res);.
1f220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
1f230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 TE_OK ){. g
1f240 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f oto abort_due_to
1f250 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 _error;. }.
1f260 7d 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 }. pC->deferred
1f270 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 Moveto = 0;. pC
1f280 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 ->cacheStatus =
1f290 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66 CACHE_STALE;.#if
1f2a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a def SQLITE_TEST.
1f2b0 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 sqlite3_search
1f2c0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 _count++;.#endif
1f2d0 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 . if( oc>=OP_Se
1f2e0 65 6b 47 45 20 29 7b 20 20 61 73 73 65 72 74 28 ekGE ){ assert(
1f2f0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c oc==OP_SeekGE |
1f300 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 | oc==OP_SeekGT
1f310 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 );. if( res<0
1f320 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f || (res==0 && o
1f330 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 20 29 7b c==OP_SeekGT) ){
1f340 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a . res = 0;.
1f350 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
1f360 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 2d 3e e3BtreeNext(pC->
1f370 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a pCursor, &res);.
1f380 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
1f390 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 LITE_OK ) goto a
1f3a0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f bort_due_to_erro
1f3b0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 r;. }else{.
1f3c0 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 res = 0;.
1f3d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }. }else{.
1f3e0 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 assert( oc==OP_S
1f3f0 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f eekLT || oc==OP_
1f400 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69 66 SeekLE );. if
1f410 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d ( res>0 || (res=
1f420 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 =0 && oc==OP_See
1f430 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65 kLT) ){. re
1f440 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 s = 0;. rc
1f450 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 = sqlite3BtreePr
1f460 65 76 69 6f 75 73 28 70 43 2d 3e 70 43 75 72 73 evious(pC->pCurs
1f470 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 or, &res);.
1f480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1f490 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f OK ) goto abort_
1f4a0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 due_to_error;.
1f4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f }else{. /
1f4c0 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65 20 6e * res might be n
1f4d0 65 67 61 74 69 76 65 20 62 65 63 61 75 73 65 20 egative because
1f4e0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 the table is emp
1f4f0 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20 20 ty. Check to.
1f500 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 ** see if th
1f510 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a is is the case..
1f520 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 */. r
1f530 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 es = sqlite3Btre
1f540 65 45 6f 66 28 70 43 2d 3e 70 43 75 72 73 6f 72 eEof(pC->pCursor
1f550 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 );. }. }. a
1f560 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 ssert( pOp->p2>0
1f570 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 );. VdbeBranch
1f580 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b Taken(res!=0,2);
1f590 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 . if( res ){.
1f5a0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 goto jump_to_p
1f5b0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 2;. }. break;.
1f5c0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 }../* Opcode: Se
1f5d0 65 6b 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a ek P1 P2 * * *.*
1f5e0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 69 6e 74 * Synopsis: int
1f5f0 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 key=r[P2].**.**
1f600 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 74 61 P1 is an open ta
1f610 62 6c 65 20 63 75 72 73 6f 72 20 61 6e 64 20 50 ble cursor and P
1f620 32 20 69 73 20 61 20 72 6f 77 69 64 20 69 6e 74 2 is a rowid int
1f630 65 67 65 72 2e 20 20 41 72 72 61 6e 67 65 0a 2a eger. Arrange.*
1f640 2a 20 66 6f 72 20 50 31 20 74 6f 20 6d 6f 76 65 * for P1 to move
1f650 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e so that it poin
1f660 74 73 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20 ts to the rowid
1f670 67 69 76 65 6e 20 62 79 20 50 32 2e 0a 2a 2a 0a given by P2..**.
1f680 2a 2a 20 54 68 69 73 20 69 73 20 61 63 74 75 61 ** This is actua
1f690 6c 6c 79 20 61 20 64 65 66 65 72 72 65 64 20 73 lly a deferred s
1f6a0 65 65 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 eek. Nothing ac
1f6b0 74 75 61 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 tually happens u
1f6c0 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 ntil.** the curs
1f6d0 6f 72 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 or is used to re
1f6e0 61 64 20 61 20 72 65 63 6f 72 64 2e 20 20 54 68 ad a record. Th
1f6f0 61 74 20 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 at way, if no re
1f700 61 64 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f ads.** occur, no
1f710 20 75 6e 6e 65 63 65 73 73 61 72 79 20 49 2f 4f unnecessary I/O
1f720 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 63 61 73 happens..*/.cas
1f730 65 20 4f 50 5f 53 65 65 6b 3a 20 7b 20 20 20 20 e OP_Seek: {
1f740 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 /* in2 */. Vdbe
1f750 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 Cursor *pC;.. a
1f760 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d ssert( pOp->p1>=
1f770 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 0 && pOp->p1<p->
1f780 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 nCursor );. pC
1f790 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e = p->apCsr[pOp->
1f7a0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 p1];. assert( p
1f7b0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 C!=0 );. assert
1f7c0 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 ( pC->pCursor!=0
1f7d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 );. assert( pC
1f7e0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 70 ->isTable );. p
1f7f0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a C->nullRow = 0;.
1f800 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 pIn2 = &aMem[p
1f810 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 2d 3e 6d Op->p2];. pC->m
1f820 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73 71 ovetoTarget = sq
1f830 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 lite3VdbeIntValu
1f840 65 28 70 49 6e 32 29 3b 0a 20 20 70 43 2d 3e 64 e(pIn2);. pC->d
1f850 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 eferredMoveto =
1f860 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 20 20 1;. break;.}.
1f870 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75 ../* Opcode: Fou
1f880 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a nd P1 P2 P3 P4 *
1f890 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 .** Synopsis: ke
1f8a0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a y=r[P3@P4].**.**
1f8b0 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 If P4==0 then r
1f8c0 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 egister P3 holds
1f8d0 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 a blob construc
1f8e0 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 ted by MakeRecor
1f8f0 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 d. If.** P4>0 t
1f900 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 hen register P3
1f910 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 is the first of
1f920 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61 P4 registers tha
1f930 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b t form an unpack
1f940 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a ed.** record..**
1f950 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 .** Cursor P1 is
1f960 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 on an index btr
1f970 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f ee. If the reco
1f980 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 rd identified by
1f990 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 P3 and P4.** is
1f9a0 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79 a prefix of any
1f9b0 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65 entry in P1 the
1f9c0 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 n a jump is made
1f9d0 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 to P2 and.** P1
1f9e0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e is left pointin
1f9f0 67 20 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e g at the matchin
1fa00 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 g entry..**.** T
1fa10 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 his operation le
1fa20 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 aves the cursor
1fa30 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 in a state where
1fa40 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61 64 it can be.** ad
1fa50 76 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66 6f vanced in the fo
1fa60 72 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e 2e rward direction.
1fa70 20 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74 72 The Next instr
1fa80 75 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72 6b uction will work
1fa90 2c 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68 65 ,.** but not the
1faa0 20 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f Prev instructio
1fab0 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 n..**.** See als
1fac0 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 o: NotFound, NoC
1fad0 6f 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69 73 onflict, NotExis
1fae0 74 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f 2a ts. SeekGe.*/./*
1faf0 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e Opcode: NotFoun
1fb00 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a d P1 P2 P3 P4 *.
1fb10 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 ** Synopsis: key
1fb20 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 =r[P3@P4].**.**
1fb30 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 If P4==0 then re
1fb40 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 gister P3 holds
1fb50 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 a blob construct
1fb60 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 ed by MakeRecord
1fb70 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 . If.** P4>0 th
1fb80 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 en register P3 i
1fb90 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 s the first of P
1fba0 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 4 registers that
1fbb0 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 form an unpacke
1fbc0 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 d.** record..**
1fbd0 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 .** Cursor P1 is
1fbe0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 on an index btr
1fbf0 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f ee. If the reco
1fc00 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 rd identified by
1fc10 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 P3 and P4.** is
1fc20 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78 20 not the prefix
1fc30 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 of any entry in
1fc40 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 P1 then a jump i
1fc50 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20 49 s made to P2. I
1fc60 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f f P1 .** does co
1fc70 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 ntain an entry w
1fc80 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74 63 hose prefix matc
1fc90 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72 65 hes the P3/P4 re
1fca0 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f cord then contro
1fcb0 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 l.** falls throu
1fcc0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 gh to the next i
1fcd0 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 nstruction and P
1fce0 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 1 is left pointi
1fcf0 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 ng at the.** mat
1fd00 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a ching entry..**.
1fd10 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f ** This operatio
1fd20 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 n leaves the cur
1fd30 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 sor in a state w
1fd40 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 here it cannot b
1fd50 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69 6e e.** advanced in
1fd60 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f either directio
1fd70 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 n. In other wor
1fd80 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64 ds, the Next and
1fd90 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65 73 Prev.** opcodes
1fda0 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66 74 do not work aft
1fdb0 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f er this operatio
1fdc0 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 n..**.** See als
1fdd0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 o: Found, NotExi
1fde0 73 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 0a sts, NoConflict.
1fdf0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f */./* Opcode: No
1fe00 43 6f 6e 66 6c 69 63 74 20 50 31 20 50 32 20 50 Conflict P1 P2 P
1fe10 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 3 P4 *.** Synops
1fe20 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d is: key=r[P3@P4]
1fe30 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 .**.** If P4==0
1fe40 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 then register P3
1fe50 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f holds a blob co
1fe60 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b nstructed by Mak
1fe70 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 eRecord. If.**
1fe80 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74 P4>0 then regist
1fe90 65 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72 er P3 is the fir
1fea0 73 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 st of P4 registe
1feb0 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 rs that form an
1fec0 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f unpacked.** reco
1fed0 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f rd..** .** Curso
1fee0 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e r P1 is on an in
1fef0 64 65 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 dex btree. If t
1ff00 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69 he record identi
1ff10 66 69 65 64 20 62 79 20 50 33 20 61 6e 64 20 50 fied by P3 and P
1ff20 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e 4.** contains an
1ff30 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 y NULL value, ju
1ff40 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 mp immediately t
1ff50 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c 20 74 65 o P2. If all te
1ff60 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 rms of the.** re
1ff70 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e 55 4c cord are not-NUL
1ff80 4c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 20 69 L then a check i
1ff90 73 20 64 6f 6e 65 20 74 6f 20 64 65 74 65 72 6d s done to determ
1ffa0 69 6e 65 20 69 66 20 61 6e 79 20 72 6f 77 20 69 ine if any row i
1ffb0 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e 64 65 n the.** P1 inde
1ffc0 78 20 62 74 72 65 65 20 68 61 73 20 61 20 6d 61 x btree has a ma
1ffd0 74 63 68 69 6e 67 20 6b 65 79 20 70 72 65 66 69 tching key prefi
1ffe0 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 x. If there are
1fff0 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a 75 6d no matches, jum
20000 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 p.** immediately
20010 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 72 to P2. If ther
20020 65 20 69 73 20 61 20 6d 61 74 63 68 2c 20 66 61 e is a match, fa
20030 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20 6c ll through and l
20040 65 61 76 65 20 74 68 65 20 50 31 0a 2a 2a 20 63 eave the P1.** c
20050 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 ursor pointing t
20060 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72 o the matching r
20070 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f ow..**.** This o
20080 70 63 6f 64 65 20 69 73 20 73 69 6d 69 6c 61 72 pcode is similar
20090 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 to OP_NotFound
200a0 77 69 74 68 20 74 68 65 20 65 78 63 65 70 74 69 with the excepti
200b0 6f 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 ons that the.**
200c0 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73 branch is always
200d0 20 74 61 6b 65 6e 20 69 66 20 61 6e 79 20 70 61 taken if any pa
200e0 72 74 20 6f 66 20 74 68 65 20 73 65 61 72 63 68 rt of the search
200f0 20 6b 65 79 20 69 6e 70 75 74 20 69 73 20 4e 55 key input is NU
20100 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f LL..**.** This o
20110 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 peration leaves
20120 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 the cursor in a
20130 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 state where it c
20140 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64 76 61 annot be.** adva
20150 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72 20 64 nced in either d
20160 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 irection. In ot
20170 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 4e her words, the N
20180 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a 2a 20 ext and Prev.**
20190 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74 20 77 opcodes do not w
201a0 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73 20 6f ork after this o
201b0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 peration..**.**
201c0 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 See also: NotFou
201d0 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 nd, Found, NotEx
201e0 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ists.*/.case OP_
201f0 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20 20 20 20 20 NoConflict:
20200 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a /* jump, in3 */.
20210 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 case OP_NotFound
20220 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c : /* jump,
20230 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f in3 */.case OP_
20240 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 Found: {
20250 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a /* jump, in3 */.
20260 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78 69 int alreadyExi
20270 73 74 73 3b 0a 20 20 69 6e 74 20 74 61 6b 65 4a sts;. int takeJ
20280 75 6d 70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 ump;. int ii;.
20290 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b VdbeCursor *pC;
202a0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 63 68 . int res;. ch
202b0 61 72 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 ar *pFree;. Unp
202c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 ackedRecord *pId
202d0 78 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 xKey;. Unpacked
202e0 52 65 63 6f 72 64 20 72 3b 0a 20 20 63 68 61 72 Record r;. char
202f0 20 61 54 65 6d 70 52 65 63 5b 52 4f 55 4e 44 38 aTempRec[ROUND8
20300 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 (sizeof(Unpacked
20310 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f Record)) + sizeo
20320 66 28 4d 65 6d 29 2a 34 20 2b 20 37 5d 3b 0a 0a f(Mem)*4 + 7];..
20330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 #ifdef SQLITE_TE
20340 53 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 ST. if( pOp->op
20350 63 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c code!=OP_NoConfl
20360 69 63 74 20 29 20 73 71 6c 69 74 65 33 5f 66 6f ict ) sqlite3_fo
20370 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e und_count++;.#en
20380 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 dif.. assert( p
20390 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 Op->p1>=0 && pOp
203a0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 ->p1<p->nCursor
203b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 );. assert( pOp
203c0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 ->p4type==P4_INT
203d0 33 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 32 );. pC = p->
203e0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a apCsr[pOp->p1];.
203f0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 assert( pC!=0
20400 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
20410 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 _DEBUG. pC->see
20420 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 kOp = pOp->opcod
20430 65 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 33 e;.#endif. pIn3
20440 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 = &aMem[pOp->p3
20450 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d ];. assert( pC-
20460 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 >pCursor!=0 );.
20470 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 assert( pC->isT
20480 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 46 72 able==0 );. pFr
20490 65 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f ee = 0;. if( pO
204a0 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20 p->p4.i>0 ){.
204b0 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 r.pKeyInfo = pC
204c0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 ->pKeyInfo;.
204d0 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 r.nField = (u16)
204e0 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 pOp->p4.i;. r
204f0 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 20 20 .aMem = pIn3;.
20500 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 72 for(ii=0; ii<r
20510 2e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a .nField; ii++){.
20520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 assert( me
20530 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d mIsValid(&r.aMem
20540 5b 69 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 45 [ii]) );. E
20550 78 70 61 6e 64 42 6c 6f 62 28 26 72 2e 61 4d 65 xpandBlob(&r.aMe
20560 6d 5b 69 69 5d 29 3b 0a 23 69 66 64 65 66 20 53 m[ii]);.#ifdef S
20570 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 QLITE_DEBUG.
20580 20 20 69 66 28 20 69 69 20 29 20 52 45 47 49 53 if( ii ) REGIS
20590 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 TER_TRACE(pOp->p
205a0 33 2b 69 69 2c 20 26 72 2e 61 4d 65 6d 5b 69 69 3+ii, &r.aMem[ii
205b0 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d ]);.#endif. }
205c0 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26 . pIdxKey = &
205d0 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 r;. }else{.
205e0 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 pIdxKey = sqlite
205f0 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 3VdbeAllocUnpack
20600 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 edRecord(.
20610 20 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 pC->pKeyInfo,
20620 61 54 65 6d 70 52 65 63 2c 20 73 69 7a 65 6f 66 aTempRec, sizeof
20630 28 61 54 65 6d 70 52 65 63 29 2c 20 26 70 46 72 (aTempRec), &pFr
20640 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 ee. );. if
20650 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 67 ( pIdxKey==0 ) g
20660 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 oto no_mem;.
20670 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c assert( pIn3->fl
20680 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 ags & MEM_Blob )
20690 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 ;. ExpandBlob
206a0 28 70 49 6e 33 29 3b 0a 20 20 20 20 73 71 6c 69 (pIn3);. sqli
206b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 te3VdbeRecordUnp
206c0 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f ack(pC->pKeyInfo
206d0 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d , pIn3->n, pIn3-
206e0 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 >z, pIdxKey);.
206f0 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 }. pIdxKey->def
20700 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 74 ault_rc = 0;. t
20710 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 69 akeJump = 0;. i
20720 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d f( pOp->opcode==
20730 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 7b OP_NoConflict ){
20740 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 . /* For the
20750 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f 70 OP_NoConflict op
20760 63 6f 64 65 2c 20 74 61 6b 65 20 74 68 65 20 6a code, take the j
20770 75 6d 70 20 69 66 20 61 6e 79 20 6f 66 20 74 68 ump if any of th
20780 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 66 e. ** input f
20790 69 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c 20 ields are NULL,
207a0 73 69 6e 63 65 20 61 6e 79 20 6b 65 79 20 77 69 since any key wi
207b0 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 6e th a NULL will n
207c0 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c 69 ot. ** confli
207d0 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 ct */. for(ii
207e0 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d 3e =0; ii<pIdxKey->
207f0 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 nField; ii++){.
20800 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 if( pIdxKey
20810 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 ->aMem[ii].flags
20820 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 & MEM_Null ){.
20830 20 20 20 20 20 20 20 74 61 6b 65 4a 75 6d 70 20 takeJump
20840 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 = 1;. bre
20850 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
20860 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c }. }. rc = sql
20870 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 ite3BtreeMovetoU
20880 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 npacked(pC->pCur
20890 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20 30 2c sor, pIdxKey, 0,
208a0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 73 71 6c 0, &res);. sql
208b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
208c0 46 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 21 Free);. if( rc!
208d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
208e0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 break;. }. p
208f0 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 C->seekResult =
20900 72 65 73 3b 0a 20 20 61 6c 72 65 61 64 79 45 78 res;. alreadyEx
20910 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b ists = (res==0);
20920 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d . pC->nullRow =
20930 20 31 2d 61 6c 72 65 61 64 79 45 78 69 73 74 73 1-alreadyExists
20940 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 ;. pC->deferred
20950 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 Moveto = 0;. pC
20960 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 ->cacheStatus =
20970 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 CACHE_STALE;. i
20980 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d f( pOp->opcode==
20990 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 OP_Found ){.
209a0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 VdbeBranchTaken(
209b0 61 6c 72 65 61 64 79 45 78 69 73 74 73 21 3d 30 alreadyExists!=0
209c0 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 72 ,2);. if( alr
209d0 65 61 64 79 45 78 69 73 74 73 20 29 20 67 6f 74 eadyExists ) got
209e0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 o jump_to_p2;.
209f0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 }else{. VdbeB
20a00 72 61 6e 63 68 54 61 6b 65 6e 28 74 61 6b 65 4a ranchTaken(takeJ
20a10 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45 78 69 73 ump||alreadyExis
20a20 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 ts==0,2);. if
20a30 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c 20 21 61 ( takeJump || !a
20a40 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 67 lreadyExists ) g
20a50 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a oto jump_to_p2;.
20a60 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a }. break;.}..
20a70 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78 /* Opcode: NotEx
20a80 69 73 74 73 20 50 31 20 50 32 20 50 33 20 2a 20 ists P1 P2 P3 *
20a90 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 *.** Synopsis: i
20aa0 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a ntkey=r[P3].**.*
20ab0 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 * P1 is the inde
20ac0 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f 70 x of a cursor op
20ad0 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74 61 62 en on an SQL tab
20ae0 6c 65 20 62 74 72 65 65 20 28 77 69 74 68 20 69 le btree (with i
20af0 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73 29 2e nteger.** keys).
20b00 20 20 50 33 20 69 73 20 61 6e 20 69 6e 74 65 67 P3 is an integ
20b10 65 72 20 72 6f 77 69 64 2e 20 20 49 66 20 50 31 er rowid. If P1
20b20 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 does not contai
20b30 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 0a n a record with.
20b40 2a 2a 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e ** rowid P3 then
20b50 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c jump immediatel
20b60 79 20 74 6f 20 50 32 2e 20 20 4f 72 2c 20 69 66 y to P2. Or, if
20b70 20 50 32 20 69 73 20 30 2c 20 72 61 69 73 65 20 P2 is 0, raise
20b80 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 an.** SQLITE_COR
20b90 52 55 50 54 20 65 72 72 6f 72 2e 20 49 66 20 50 RUPT error. If P
20ba0 31 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 1 does contain a
20bb0 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77 record with row
20bc0 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c id P3 then .** l
20bd0 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 eave the cursor
20be0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61 74 pointing at that
20bf0 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c record and fall
20c00 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 through to the
20c10 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 next.** instruct
20c20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f ion..**.** The O
20c30 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 P_NotFound opcod
20c40 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 e performs the s
20c50 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e ame operation on
20c60 20 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a index btrees.**
20c70 20 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79 (with arbitrary
20c80 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 multi-value key
20c90 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f s)..**.** This o
20ca0 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 pcode leaves the
20cb0 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 cursor in a sta
20cc0 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e te where it cann
20cd0 6f 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a ot be advanced.*
20ce0 2a 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 * in either dire
20cf0 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 ction. In other
20d00 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 words, the Next
20d10 20 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 and Prev opcode
20d20 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f s will.** not wo
20d30 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 rk following thi
20d40 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 s opcode..**.**
20d50 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c See also: Found,
20d60 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e NotFound, NoCon
20d70 66 6c 69 63 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 flict.*/.case OP
20d80 5f 4e 6f 74 45 78 69 73 74 73 3a 20 7b 20 20 20 _NotExists: {
20d90 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e /* jump, in
20da0 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 3 */. VdbeCurso
20db0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f r *pC;. BtCurso
20dc0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 r *pCrsr;. int
20dd0 72 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b res;. u64 iKey;
20de0 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d .. pIn3 = &aMem
20df0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 [pOp->p3];. ass
20e00 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 ert( pIn3->flags
20e10 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 & MEM_Int );.
20e20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e assert( pOp->p1>
20e30 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d =0 && pOp->p1<p-
20e40 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 >nCursor );. pC
20e50 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d = p->apCsr[pOp-
20e60 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 >p1];. assert(
20e70 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 pC!=0 );.#ifdef
20e80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 SQLITE_DEBUG. p
20e90 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a 23 C->seekOp = 0;.#
20ea0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 endif. assert(
20eb0 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 pC->isTable );.
20ec0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 assert( pC->pse
20ed0 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 udoTableReg==0 )
20ee0 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e ;. pCrsr = pC->
20ef0 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 pCursor;. asser
20f00 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 t( pCrsr!=0 );.
20f10 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 4b 65 79 res = 0;. iKey
20f20 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 = pIn3->u.i;.
20f30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 rc = sqlite3Btre
20f40 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 eMovetoUnpacked(
20f50 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20 pCrsr, 0, iKey,
20f60 30 2c 20 26 72 65 73 29 3b 0a 20 20 61 73 73 65 0, &res);. asse
20f70 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f rt( rc==SQLITE_O
20f80 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 3b 0a 20 K || res==0 );.
20f90 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 pC->movetoTarge
20fa0 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73 t = iKey; /* Us
20fb0 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20 ed by OP_Delete
20fc0 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 */. pC->nullRow
20fd0 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 = 0;. pC->cach
20fe0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f eStatus = CACHE_
20ff0 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 64 65 66 STALE;. pC->def
21000 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b erredMoveto = 0;
21010 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b . VdbeBranchTak
21020 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 en(res!=0,2);.
21030 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d pC->seekResult =
21040 20 72 65 73 3b 0a 20 20 69 66 28 20 72 65 73 21 res;. if( res!
21050 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 =0 ){. assert
21060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
21070 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e );. if( pOp->
21080 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 p2==0 ){. r
21090 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 c = SQLITE_CORRU
210a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c PT_BKPT;. }el
210b0 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a se{. goto j
210c0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d ump_to_p2;. }
210d0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a . }. break;.}.
210e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 ./* Opcode: Sequ
210f0 65 6e 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a ence P1 P2 * * *
21100 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b .** Synopsis: r[
21110 50 32 5d 3d 63 75 72 73 6f 72 5b 50 31 5d 2e 63 P2]=cursor[P1].c
21120 74 72 2b 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 tr++.**.** Find
21130 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 the next availab
21140 6c 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 le sequence numb
21150 65 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 er for cursor P1
21160 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 ..** Write the s
21170 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 equence number i
21180 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e nto register P2.
21190 0a 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 .** The sequence
211a0 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 number on the c
211b0 75 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 ursor is increme
211c0 6e 74 65 64 20 61 66 74 65 72 20 74 68 69 73 0a nted after this.
211d0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 ** instruction.
211e0 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 .*/.case OP_Seq
211f0 75 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 uence: {
21200 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 /* out2 */.
21210 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e assert( pOp->p1>
21220 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d =0 && pOp->p1<p-
21230 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 >nCursor );. as
21240 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 sert( p->apCsr[p
21250 4f 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 Op->p1]!=0 );.
21260 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 pOut = out2Prere
21270 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 lease(p, pOp);.
21280 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e pOut->u.i = p->
21290 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e apCsr[pOp->p1]->
212a0 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 seqCount++;. br
212b0 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f eak;.}.../* Opco
212c0 64 65 3a 20 4e 65 77 52 6f 77 69 64 20 50 31 20 de: NewRowid P1
212d0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e P2 P3 * *.** Syn
212e0 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 opsis: r[P2]=row
212f0 69 64 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e id.**.** Get a n
21300 65 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 ew integer recor
21310 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 d number (a.k.a
21320 22 72 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 "rowid") used as
21330 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 the key to a ta
21340 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f ble..** The reco
21350 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 rd number is not
21360 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 previously used
21370 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 as a key in the
21380 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 database.** tab
21390 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 le that cursor P
213a0 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 1 points to. Th
213b0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d e new record num
213c0 62 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a ber is written.*
213d0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 * written to reg
213e0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 ister P2..**.**
213f0 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 If P3>0 then P3
21400 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e is a register in
21410 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 the root frame
21420 6f 66 20 74 68 69 73 20 56 44 42 45 20 74 68 61 of this VDBE tha
21430 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 t holds .** the
21440 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f 75 73 largest previous
21450 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 ly generated rec
21460 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e ord number. No n
21470 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 ew record number
21480 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 s are.** allowed
21490 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e to be less than
214a0 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 this value. Whe
214b0 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 n this value rea
214c0 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d ches its maximum
214d0 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f , .** an SQLITE_
214e0 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 FULL error is ge
214f0 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 nerated. The P3
21500 72 65 67 69 73 74 65 72 20 69 73 20 75 70 64 61 register is upda
21510 74 65 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a ted with the '.*
21520 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f * generated reco
21530 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 rd number. This
21540 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 P3 mechanism is
21550 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 used to help imp
21560 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 lement the.** AU
21570 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 TOINCREMENT feat
21580 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ure..*/.case OP_
21590 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 NewRowid: {
215a0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f /* out2 */
215b0 0a 20 20 69 36 34 20 76 3b 20 20 20 20 20 20 20 . i64 v;
215c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
215d0 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 new rowid */.
215e0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 VdbeCursor *pC;
215f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 /* Cursor
21600 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 67 65 74 of table to get
21610 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a the new rowid *
21620 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 /. int res;
21630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
21640 73 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 sult of an sqlit
21650 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f e3BtreeLast() */
21660 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 . int cnt;
21670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 /* Cou
21680 6e 74 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 nter to limit th
21690 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 e number of sear
216a0 63 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 ches */. Mem *p
216b0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 Mem;
216c0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c /* Register hol
216d0 64 69 6e 67 20 6c 61 72 67 65 73 74 20 72 6f 77 ding largest row
216e0 69 64 20 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 id for AUTOINCRE
216f0 4d 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 MENT */. VdbeFr
21700 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 ame *pFrame;
21710 20 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f /* Root frame o
21720 66 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d f VDBE */.. v =
21730 20 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 0;. res = 0;.
21740 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 pOut = out2Prer
21750 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a elease(p, pOp);.
21760 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
21770 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 1>=0 && pOp->p1<
21780 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 p->nCursor );.
21790 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f pC = p->apCsr[pO
217a0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 p->p1];. assert
217b0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 ( pC!=0 );. ass
217c0 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 ert( pC->pCursor
217d0 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20 2f !=0 );. {. /
217e0 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 * The next rowid
217f0 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 or record numbe
21800 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 r (different ter
21810 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a ms for the same.
21820 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 ** thing) is
21830 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 obtained in a t
21840 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 wo-step algorith
21850 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a m.. **. **
21860 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 First we attemp
21870 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 t to find the la
21880 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 rgest existing r
21890 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 owid and add one
218a0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e . ** to that.
218b0 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 But if the lar
218c0 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f gest existing ro
218d0 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 wid is already t
218e0 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a he maximum. *
218f0 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 * positive integ
21900 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 er, we have to f
21910 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 all through to t
21920 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a he second. **
21930 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 probabilistic a
21940 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a lgorithm. **.
21950 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e ** The secon
21960 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 d algorithm is t
21970 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 o select a rowid
21980 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 at random and s
21990 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 ee if. ** it
219a0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 already exists i
219b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 n the table. If
219c0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 it does not exi
219d0 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 st, we have.
219e0 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 ** succeeded. I
219f0 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 f the random row
21a00 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 id does exist, w
21a10 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f e select a new o
21a20 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 ne. ** and tr
21a30 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 y again, up to 1
21a40 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 00 times.. */
21a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d . assert( pC-
21a60 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 >isTable );..#if
21a70 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 def SQLITE_32BIT
21a80 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e _ROWID.# defin
21a90 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 e MAX_ROWID 0x7f
21aa0 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 ffffff.#else.
21ab0 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 /* Some compile
21ac0 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 rs complain abou
21ad0 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 t constants of t
21ae0 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 he form 0x7fffff
21af0 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 ffffffffff..
21b00 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 ** Others compla
21b10 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 in about 0x7ffff
21b20 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 ffffffffffffLL.
21b30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d The following m
21b40 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a acro seems. *
21b50 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 * to provide the
21b60 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 constant while
21b70 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 making all compi
21b80 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 lers happy..
21b90 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 */.# define MA
21ba0 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 X_ROWID (i64)(
21bb0 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66 (((u64)0x7ffffff
21bc0 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 f)<<32) | (u64)0
21bd0 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 xffffffff ).#end
21be0 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d if.. if( !pC-
21bf0 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 >useRandomRowid
21c00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 ){. rc = sq
21c10 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 lite3BtreeLast(p
21c20 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 C->pCursor, &res
21c30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 );. if( rc!
21c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
21c50 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 goto abort
21c60 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 _due_to_error;.
21c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
21c80 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 res ){.
21c90 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50 3a v = 1; /* IMP:
21ca0 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34 20 2a R-61914-48074 *
21cb0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 /. }else{.
21cc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 assert( s
21cd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
21ce0 72 49 73 56 61 6c 69 64 28 70 43 2d 3e 70 43 75 rIsValid(pC->pCu
21cf0 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 rsor) );.
21d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
21d10 65 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 eeKeySize(pC->pC
21d20 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 ursor, &v);.
21d30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d assert( rc==
21d40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f SQLITE_OK ); /
21d50 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 66 6f * Cannot fail fo
21d60 6c 6c 6f 77 69 6e 67 20 42 74 72 65 65 4c 61 73 llowing BtreeLas
21d70 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 t() */. i
21d80 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 f( v>=MAX_ROWID
21d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 2d ){. pC-
21da0 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 >useRandomRowid
21db0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c = 1;. }el
21dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 76 2b se{. v+
21dd0 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 +; /* IMP: R-2
21de0 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 9538-34987 */.
21df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
21e00 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 }..#ifndef S
21e10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 QLITE_OMIT_AUTOI
21e20 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 NCREMENT. if(
21e30 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 pOp->p3 ){.
21e40 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 /* Assert that
21e50 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d P3 is a valid m
21e60 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 emory cell. */.
21e70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 assert( pOp
21e80 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 ->p3>0 );.
21e90 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b if( p->pFrame ){
21ea0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 46 72 . for(pFr
21eb0 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 ame=p->pFrame; p
21ec0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 Frame->pParent;
21ed0 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 pFrame=pFrame->p
21ee0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 Parent);.
21ef0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 /* Assert that
21f00 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 P3 is a valid me
21f10 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 mory cell. */.
21f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f assert( pO
21f30 70 2d 3e 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e p->p3<=pFrame->n
21f40 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 70 Mem );. p
21f50 4d 65 6d 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 Mem = &pFrame->a
21f60 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 Mem[pOp->p3];.
21f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
21f80 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 /* Assert tha
21f90 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 t P3 is a valid
21fa0 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a memory cell. */.
21fb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
21fc0 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 pOp->p3<=(p->nMe
21fd0 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b m-p->nCursor) );
21fe0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 . pMem =
21ff0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a &aMem[pOp->p3];.
22000 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 memAbout
22010 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65 6d ToChange(p, pMem
22020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
22030 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 assert( memIsVa
22040 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 lid(pMem) );..
22050 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 REGISTER_TRA
22060 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d CE(pOp->p3, pMem
22070 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
22080 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 VdbeMemIntegerif
22090 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 61 y(pMem);. a
220a0 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c ssert( (pMem->fl
220b0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d ags & MEM_Int)!=
220c0 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 0 ); /* mem(P3)
220d0 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 holds an intege
220e0 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 r */. if( p
220f0 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f Mem->u.i==MAX_RO
22100 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 WID || pC->useRa
22110 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 ndomRowid ){.
22120 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
22130 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a _FULL; /* IMP:
22140 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38 20 2a R-12275-61338 *
22150 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 /. goto a
22160 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f bort_due_to_erro
22170 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 r;. }.
22180 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 if( v<pMem->u.i
22190 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 +1 ){. v
221a0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b = pMem->u.i + 1;
221b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 . }. p
221c0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 Mem->u.i = v;.
221d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
221e0 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d f( pC->useRandom
221f0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f Rowid ){. /
22200 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e * IMPLEMENTATION
22210 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 -OF: R-07677-418
22220 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73 81 If the larges
22230 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c t ROWID is equal
22240 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a to the. **
22250 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c largest possibl
22260 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33 e integer (92233
22270 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20 72036854775807)
22280 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 then the databas
22290 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e e. ** engin
222a0 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67 e starts picking
222b0 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64 positive candid
222c0 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61 ate ROWIDs at ra
222d0 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 ndom until.
222e0 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 ** it finds one
222f0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65 that is not pre
22300 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f viously used. */
22310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
22320 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a Op->p3==0 ); /*
22330 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e We cannot be in
22340 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f random rowid mo
22350 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 de if this is.
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e ** an
22380 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 AUTOINCREMENT t
22390 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63 able. */. c
223a0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f nt = 0;. do
223b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
223c0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 3_randomness(siz
223d0 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 eof(v), &v);.
223e0 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 v &= (MAX_R
223f0 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20 20 OWID>>1); v++;
22400 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 76 /* Ensure that v
22410 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e is greater than
22420 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d zero */. }
22430 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20 73 while( ((rc = s
22440 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 qlite3BtreeMovet
22450 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70 43 oUnpacked(pC->pC
22460 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 76 ursor, 0, (u64)v
22470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
224a0 20 20 20 30 2c 20 26 72 65 73 29 29 3d 3d 53 51 0, &res))==SQ
224b0 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 20 LITE_OK).
224c0 20 20 20 20 20 26 26 20 28 72 65 73 3d 3d 30 29 && (res==0)
224d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 . &&
224e0 28 2b 2b 63 6e 74 3c 31 30 30 29 29 3b 0a 20 20 (++cnt<100));.
224f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
22500 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 TE_OK && res==0
22510 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
22520 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f SQLITE_FULL; /
22530 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31 39 2d 35 * IMP: R-38219-5
22540 33 30 30 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 3002 */.
22550 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 goto abort_due_t
22560 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d o_error;. }
22570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 . assert( v
22580 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d >0 ); /* EV: R-
22590 34 30 38 31 32 2d 30 33 35 37 30 20 2a 2f 0a 20 40812-03570 */.
225a0 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66 }. pC->def
225b0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b erredMoveto = 0;
225c0 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 . pC->cacheSt
225d0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 atus = CACHE_STA
225e0 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e LE;. }. pOut->
225f0 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b u.i = v;. break
22600 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ;.}../* Opcode:
22610 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20 Insert P1 P2 P3
22620 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 P4 P5.** Synopsi
22630 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 20 s: intkey=r[P3]
22640 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a data=r[P2].**.**
22650 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 Write an entry
22660 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f into the table o
22670 66 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20 f cursor P1. A
22680 6e 65 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 new entry is.**
22690 63 72 65 61 74 65 64 20 69 66 20 69 74 20 64 6f created if it do
226a0 65 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 esn't already ex
226b0 69 73 74 20 6f 72 20 74 68 65 20 64 61 74 61 20 ist or the data
226c0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a for an existing.
226d0 2a 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 ** entry is over
226e0 77 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61 written. The da
226f0 74 61 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 ta is the value
22700 4d 45 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 MEM_Blob stored
22710 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e in register.** n
22720 75 6d 62 65 72 20 50 32 2e 20 54 68 65 20 6b 65 umber P2. The ke
22730 79 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 y is stored in r
22740 65 67 69 73 74 65 72 20 50 33 2e 20 54 68 65 20 egister P3. The
22750 6b 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 key must.** be a
22760 20 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 MEM_Int..**.**
22770 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 If the OPFLAG_NC
22780 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 35 HANGE flag of P5
22790 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 is set, then th
227a0 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 e row change cou
227b0 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 nt is.** increme
227c0 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 nted (otherwise
227d0 6e 6f 74 29 2e 20 20 49 66 20 74 68 65 20 4f 50 not). If the OP
227e0 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 FLAG_LASTROWID f
227f0 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 lag of P5 is set
22800 2c 0a 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 ,.** then rowid
22810 69 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75 is stored for su
22820 62 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20 bsequent return
22830 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 by the.** sqlite
22840 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 3_last_insert_ro
22850 77 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 wid() function (
22860 6f 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20 otherwise it is
22870 75 6e 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a unmodified)..**.
22880 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 ** If the OPFLAG
22890 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 _USESEEKRESULT f
228a0 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 lag of P5 is set
228b0 20 61 6e 64 20 69 66 20 74 68 65 20 72 65 73 75 and if the resu
228c0 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 61 73 lt of.** the las
228d0 74 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e t seek operation
228e0 20 28 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 20 (OP_NotExists)
228f0 77 61 73 20 61 20 73 75 63 63 65 73 73 2c 20 74 was a success, t
22900 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 hen this.** oper
22910 61 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 20 61 ation will not a
22920 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 ttempt to find t
22930 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 he appropriate r
22940 6f 77 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 0a ow before doing.
22950 2a 2a 20 74 68 65 20 69 6e 73 65 72 74 20 62 75 ** the insert bu
22960 74 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 20 6f t will instead o
22970 76 65 72 77 72 69 74 65 20 74 68 65 20 72 6f 77 verwrite the row
22980 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 that the cursor
22990 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 is.** currently
229a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 50 pointing to. P
229b0 72 65 73 75 6d 61 62 6c 79 2c 20 74 68 65 20 70 resumably, the p
229c0 72 69 6f 72 20 4f 50 5f 4e 6f 74 45 78 69 73 74 rior OP_NotExist
229d0 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 68 61 73 20 s opcode.** has
229e0 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e already position
229f0 65 64 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f ed the cursor co
22a00 72 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 69 rrectly. This i
22a10 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f s an optimizatio
22a20 6e 0a 2a 2a 20 74 68 61 74 20 62 6f 6f 73 74 73 n.** that boosts
22a30 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 79 20 performance by
22a40 61 76 6f 69 64 69 6e 67 20 72 65 64 75 6e 64 61 avoiding redunda
22a50 6e 74 20 73 65 65 6b 73 2e 0a 2a 2a 0a 2a 2a 20 nt seeks..**.**
22a60 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 If the OPFLAG_IS
22a70 55 50 44 41 54 45 20 66 6c 61 67 20 69 73 20 73 UPDATE flag is s
22a80 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 et, then this op
22a90 63 6f 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 code is part of
22aa0 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 an.** UPDATE ope
22ab0 72 61 74 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 ration. Otherwi
22ac0 73 65 20 28 69 66 20 74 68 65 20 66 6c 61 67 20 se (if the flag
22ad0 69 73 20 63 6c 65 61 72 29 20 74 68 65 6e 20 74 is clear) then t
22ae0 68 69 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 his opcode.** is
22af0 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 part of an INSE
22b00 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 RT operation. T
22b10 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 he difference is
22b20 20 6f 6e 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 only important
22b30 74 6f 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65 to.** the update
22b40 20 68 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 hook..**.** Par
22b50 61 6d 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f ameter P4 may po
22b60 69 6e 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 int to a string
22b70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 containing the t
22b80 61 62 6c 65 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a able-name, or.**
22b90 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 may be NULL. If
22ba0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c it is not NULL,
22bb0 20 74 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 then the update
22bc0 2d 68 6f 6f 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 -hook .** (sqlit
22bd0 65 33 2e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 e3.xUpdateCallba
22be0 63 6b 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 ck) is invoked f
22bf0 6f 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 ollowing a succe
22c00 73 73 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a ssful insert..**
22c10 0a 2a 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 .** (WARNING/TOD
22c20 4f 3a 20 49 66 20 50 31 20 69 73 20 61 20 70 73 O: If P1 is a ps
22c30 65 75 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 eudo-cursor and
22c40 50 32 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c P2 is dynamicall
22c50 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 y.** allocated,
22c60 74 68 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f then ownership o
22c70 66 20 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 f P2 is transfer
22c80 72 65 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 red to the pseud
22c90 6f 2d 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 o-cursor.** and
22ca0 72 65 67 69 73 74 65 72 20 50 32 20 62 65 63 6f register P2 beco
22cb0 6d 65 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 mes ephemeral.
22cc0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 If the cursor is
22cd0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a changed, the.**
22ce0 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 value of regist
22cf0 65 72 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 er P2 will then
22d00 63 68 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 change. Make su
22d10 72 65 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 re this does not
22d20 0a 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 .** cause any pr
22d30 6f 62 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 oblems.).**.** T
22d40 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 his instruction
22d50 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 only works on ta
22d60 62 6c 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 bles. The equiv
22d70 61 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f alent instructio
22d80 6e 0a 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 n.** for indices
22d90 20 69 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 is OP_IdxInsert
22da0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ..*/./* Opcode:
22db0 49 6e 73 65 72 74 49 6e 74 20 50 31 20 50 32 20 InsertInt P1 P2
22dc0 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f P3 P4 P5.** Syno
22dd0 70 73 69 73 3a 20 20 69 6e 74 6b 65 79 3d 50 33 psis: intkey=P3
22de0 20 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a data=r[P2].**.*
22df0 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 65 78 61 * This works exa
22e00 63 74 6c 79 20 6c 69 6b 65 20 4f 50 5f 49 6e 73 ctly like OP_Ins
22e10 65 72 74 20 65 78 63 65 70 74 20 74 68 61 74 20 ert except that
22e20 74 68 65 20 6b 65 79 20 69 73 20 74 68 65 0a 2a the key is the.*
22e30 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 * integer value
22e40 50 33 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 P3, not the valu
22e50 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 e of the integer
22e60 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 stored in regis
22e70 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 ter P3..*/.case
22e80 4f 50 5f 49 6e 73 65 72 74 3a 20 0a 63 61 73 65 OP_Insert: .case
22e90 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 3a 20 7b OP_InsertInt: {
22ea0 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 3b 20 20 . Mem *pData;
22eb0 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c /* MEM cell
22ec0 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 66 6f holding data fo
22ed0 72 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 r the record to
22ee0 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 be inserted */.
22ef0 20 4d 65 6d 20 2a 70 4b 65 79 3b 20 20 20 20 20 Mem *pKey;
22f00 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 /* MEM cell h
22f10 6f 6c 64 69 6e 67 20 6b 65 79 20 20 66 6f 72 20 olding key for
22f20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 the record */.
22f30 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 i64 iKey;
22f40 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 /* The integer
22f50 20 52 4f 57 49 44 20 6f 72 20 6b 65 79 20 66 6f ROWID or key fo
22f60 72 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 r the record to
22f70 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 be inserted */.
22f80 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b VdbeCursor *pC;
22f90 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 /* Cursor to
22fa0 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 table into which
22fb0 20 69 6e 73 65 72 74 20 69 73 20 77 72 69 74 74 insert is writt
22fc0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 en */. int nZer
22fd0 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d o; /* Num
22fe0 62 65 72 20 6f 66 20 7a 65 72 6f 2d 62 79 74 65 ber of zero-byte
22ff0 73 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 s to append */.
23000 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 3b int seekResult;
23010 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 /* Result of
23020 70 72 69 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 prior seek or 0
23030 69 66 20 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 if no USESEEKRES
23040 55 4c 54 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f ULT flag */. co
23050 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 nst char *zDb;
23060 2f 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 /* database name
23070 20 2d 20 75 73 65 64 20 62 79 20 74 68 65 20 75 - used by the u
23080 70 64 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 pdate hook */.
23090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c const char *zTbl
230a0 3b 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 ; /* Table name
230b0 2d 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 - used by the op
230c0 64 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 date hook */. i
230d0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 nt op;
230e0 20 2f 2a 20 4f 70 63 6f 64 65 20 66 6f 72 20 75 /* Opcode for u
230f0 70 64 61 74 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 pdate hook: SQLI
23100 54 45 5f 55 50 44 41 54 45 20 6f 72 20 53 51 4c TE_UPDATE or SQL
23110 49 54 45 5f 49 4e 53 45 52 54 20 2a 2f 0a 0a 20 ITE_INSERT */..
23120 20 70 44 61 74 61 20 3d 20 26 61 4d 65 6d 5b 70 pData = &aMem[p
23130 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 Op->p2];. asser
23140 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 t( pOp->p1>=0 &&
23150 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 pOp->p1<p->nCur
23160 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 sor );. assert(
23170 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 44 61 74 memIsValid(pDat
23180 61 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e a) );. pC = p->
23190 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a apCsr[pOp->p1];.
231a0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 assert( pC!=0
231b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d );. assert( pC-
231c0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 >pCursor!=0 );.
231d0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 assert( pC->pse
231e0 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 udoTableReg==0 )
231f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e ;. assert( pC->
23200 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 52 45 47 isTable );. REG
23210 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d ISTER_TRACE(pOp-
23220 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 >p2, pData);..
23230 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d if( pOp->opcode=
23240 3d 4f 50 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 =OP_Insert ){.
23250 20 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 pKey = &aMem[p
23260 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73 Op->p3];. ass
23270 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73 ert( pKey->flags
23280 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 & MEM_Int );.
23290 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 assert( memIsV
232a0 61 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a 20 20 alid(pKey) );.
232b0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 REGISTER_TRACE
232c0 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b (pOp->p3, pKey);
232d0 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 4b 65 79 . iKey = pKey
232e0 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a ->u.i;. }else{.
232f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d assert( pOp-
23300 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 >opcode==OP_Inse
23310 72 74 49 6e 74 20 29 3b 0a 20 20 20 20 69 4b 65 rtInt );. iKe
23320 79 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d y = pOp->p3;. }
23330 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 .. if( pOp->p5
23340 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 & OPFLAG_NCHANGE
23350 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b ) p->nChange++;
23360 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 . if( pOp->p5 &
23370 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 OPFLAG_LASTROWI
23380 44 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 D ) db->lastRowi
23390 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 d = lastRowid =
233a0 69 4b 65 79 3b 0a 20 20 69 66 28 20 70 44 61 74 iKey;. if( pDat
233b0 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e a->flags & MEM_N
233c0 75 6c 6c 20 29 7b 0a 20 20 20 20 70 44 61 74 61 ull ){. pData
233d0 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 44 61 ->z = 0;. pDa
233e0 74 61 2d 3e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c ta->n = 0;. }el
233f0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 se{. assert(
23400 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 pData->flags & (
23410 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 MEM_Blob|MEM_Str
23420 29 20 29 3b 0a 20 20 7d 0a 20 20 73 65 65 6b 52 ) );. }. seekR
23430 65 73 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 esult = ((pOp->p
23440 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 5 & OPFLAG_USESE
23450 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e EKRESULT) ? pC->
23460 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b seekResult : 0);
23470 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c . if( pData->fl
23480 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 ags & MEM_Zero )
23490 7b 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20 70 44 {. nZero = pD
234a0 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 ata->u.nZero;.
234b0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 5a 65 72 6f }else{. nZero
234c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d = 0;. }. rc =
234d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 sqlite3BtreeIns
234e0 65 72 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c ert(pC->pCursor,
234f0 20 30 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 0, iKey,.
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23510 20 20 20 20 70 44 61 74 61 2d 3e 7a 2c 20 70 44 pData->z, pD
23520 61 74 61 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c 0a 20 ata->n, nZero,.
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23540 20 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 (pOp->p
23550 35 20 26 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 5 & OPFLAG_APPEN
23560 44 29 21 3d 30 2c 20 73 65 65 6b 52 65 73 75 6c D)!=0, seekResul
23570 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66 t. );. pC->def
23580 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b erredMoveto = 0;
23590 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 . pC->cacheStat
235a0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 us = CACHE_STALE
235b0 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 ;.. /* Invoke t
235c0 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 he update-hook i
235d0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 f required. */.
235e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
235f0 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74 OK && db->xUpdat
23600 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 eCallback && pOp
23610 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 7a 44 ->p4.z ){. zD
23620 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e b = db->aDb[pC->
23630 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 iDb].zName;.
23640 7a 54 62 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a zTbl = pOp->p4.z
23650 3b 0a 20 20 20 20 6f 70 20 3d 20 28 28 70 4f 70 ;. op = ((pOp
23660 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 ->p5 & OPFLAG_IS
23670 55 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 UPDATE) ? SQLITE
23680 5f 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 _UPDATE : SQLITE
23690 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 61 73 _INSERT);. as
236a0 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c sert( pC->isTabl
236b0 65 20 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 e );. db->xUp
236c0 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d dateCallback(db-
236d0 3e 70 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c >pUpdateArg, op,
236e0 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 zDb, zTbl, iKey
236f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
23700 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d C->iDb>=0 );. }
23710 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 . break;.}../*
23720 4f 70 63 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 Opcode: Delete P
23730 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 1 P2 * P4 P5.**.
23740 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 ** Delete the re
23750 63 6f 72 64 20 61 74 20 77 68 69 63 68 20 74 68 cord at which th
23760 65 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 e P1 cursor is c
23770 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e urrently pointin
23780 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 g..**.** If the
23790 50 35 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 P5 parameter is
237a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 63 75 non-zero, the cu
237b0 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 rsor will be lef
237c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 0a 2a t pointing at .*
237d0 2a 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78 * either the nex
237e0 74 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 t or the previou
237f0 73 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 s record in the
23800 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20 table. If it is
23810 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e left .** pointin
23820 67 20 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 g at the next re
23830 63 6f 72 64 2c 20 74 68 65 6e 20 74 68 65 20 6e cord, then the n
23840 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 ext Next instruc
23850 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 0a tion will be a .
23860 2a 2a 20 6e 6f 2d 6f 70 2e 20 41 73 20 61 20 72 ** no-op. As a r
23870 65 73 75 6c 74 2c 20 69 6e 20 74 68 69 73 20 63 esult, in this c
23880 61 73 65 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 ase it is OK to
23890 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20 delete a record
238a0 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 0a 2a 2a from within a.**
238b0 20 4e 65 78 74 20 6c 6f 6f 70 2e 20 49 66 20 50 Next loop. If P
238c0 35 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 5 is zero, then
238d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 the cursor is le
238e0 66 74 20 69 6e 20 61 6e 20 75 6e 64 65 66 69 6e ft in an undefin
238f0 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 ed state..**.**
23900 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 If the OPFLAG_NC
23910 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32 HANGE flag of P2
23920 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 is set, then th
23930 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 e row change cou
23940 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 nt is.** increme
23950 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 nted (otherwise
23960 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d not)..**.** P1 m
23970 75 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64 ust not be pseud
23980 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73 o-table. It has
23990 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61 to be a real ta
239a0 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 ble with.** mult
239b0 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a iple rows..**.**
239c0 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 If P4 is not NU
239d0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 LL, then it is t
239e0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 he name of the t
239f0 61 62 6c 65 20 74 68 61 74 20 50 31 20 69 73 0a able that P1 is.
23a00 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 ** pointing to.
23a10 20 54 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b The update hook
23a20 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 will be invoked
23a30 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a , if it exists..
23a40 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 ** If P4 is not
23a50 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 50 31 NULL then the P1
23a60 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 cursor must hav
23a70 65 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 e been positione
23a80 64 0a 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f d.** using OP_No
23a90 74 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 tFound prior to
23aa0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 invoking this op
23ab0 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 code..*/.case OP
23ac0 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 _Delete: {. Vdb
23ad0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 75 eCursor *pC;. u
23ae0 38 20 68 61 73 55 70 64 61 74 65 43 61 6c 6c 62 8 hasUpdateCallb
23af0 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 ack;.. assert(
23b00 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f pOp->p1>=0 && pO
23b10 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 p->p1<p->nCursor
23b20 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 );. pC = p->ap
23b30 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 Csr[pOp->p1];.
23b40 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b assert( pC!=0 );
23b50 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 . assert( pC->p
23b60 43 75 72 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a Cursor!=0 ); /*
23b70 20 4f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 Only valid for
23b80 72 65 61 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20 real tables, no
23b90 70 73 65 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a pseudotables */.
23ba0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 assert( pC->de
23bb0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 ferredMoveto==0
23bc0 29 3b 0a 0a 20 20 68 61 73 55 70 64 61 74 65 43 );.. hasUpdateC
23bd0 61 6c 6c 62 61 63 6b 20 3d 20 64 62 2d 3e 78 55 allback = db->xU
23be0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 pdateCallback &&
23bf0 20 70 4f 70 2d 3e 70 34 2e 7a 20 26 26 20 70 43 pOp->p4.z && pC
23c00 2d 3e 69 73 54 61 62 6c 65 3b 0a 20 20 69 66 28 ->isTable;. if(
23c10 20 70 4f 70 2d 3e 70 35 20 26 26 20 68 61 73 55 pOp->p5 && hasU
23c20 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b pdateCallback ){
23c30 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 . sqlite3Btre
23c40 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 eKeySize(pC->pCu
23c50 72 73 6f 72 2c 20 26 70 43 2d 3e 6d 6f 76 65 74 rsor, &pC->movet
23c60 6f 54 61 72 67 65 74 29 3b 0a 20 20 7d 0a 0a 23 oTarget);. }..#
23c70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
23c80 55 47 0a 20 20 2f 2a 20 54 68 65 20 73 65 65 6b UG. /* The seek
23c90 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 operation that
23ca0 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63 positioned the c
23cb0 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 4f ursor prior to O
23cc0 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 0a 20 20 P_Delete will.
23cd0 2a 2a 20 68 61 76 65 20 61 6c 73 6f 20 73 65 74 ** have also set
23ce0 20 74 68 65 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 the pC->movetoT
23cf0 61 72 67 65 74 20 66 69 65 6c 64 20 74 6f 20 74 arget field to t
23d00 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 he rowid of the
23d10 72 6f 77 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 row that. ** is
23d20 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a being deleted *
23d30 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e /. if( pOp->p4.
23d40 7a 20 26 26 20 70 43 2d 3e 69 73 54 61 62 6c 65 z && pC->isTable
23d50 20 26 26 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 && pOp->p5==0 )
23d60 7b 0a 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d {. i64 iKey =
23d70 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 0;. sqlite3B
23d80 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e treeKeySize(pC->
23d90 70 43 75 72 73 6f 72 2c 20 26 69 4b 65 79 29 3b pCursor, &iKey);
23da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d . assert( pC-
23db0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3d 3d 69 >movetoTarget==i
23dc0 4b 65 79 20 29 3b 20 0a 20 20 7d 0a 23 65 6e 64 Key ); . }.#end
23dd0 69 66 0a 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 if. . rc = sqli
23de0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 te3BtreeDelete(p
23df0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 70 4f 70 2d C->pCursor, pOp-
23e00 3e 70 35 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 >p5);. pC->cach
23e10 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f eStatus = CACHE_
23e20 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 STALE;.. /* Inv
23e30 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68 oke the update-h
23e40 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e ook if required.
23e50 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 */. if( rc==SQ
23e60 4c 49 54 45 5f 4f 4b 20 26 26 20 68 61 73 55 70 LITE_OK && hasUp
23e70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a dateCallback ){.
23e80 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 db->xUpdateC
23e90 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 allback(db->pUpd
23ea0 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44 ateArg, SQLITE_D
23eb0 45 4c 45 54 45 2c 0a 20 20 20 20 20 20 20 20 20 ELETE,.
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 d
23ed0 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e b->aDb[pC->iDb].
23ee0 7a 4e 61 6d 65 2c 20 70 4f 70 2d 3e 70 34 2e 7a zName, pOp->p4.z
23ef0 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 , pC->movetoTarg
23f00 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 et);. assert(
23f10 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 pC->iDb>=0 );.
23f20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 }. if( pOp->p2
23f30 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 & OPFLAG_NCHANG
23f40 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b E ) p->nChange++
23f50 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 ;. break;.}./*
23f60 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f 75 Opcode: ResetCou
23f70 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a nt * * * * *.**.
23f80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 ** The value of
23f90 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 the change count
23fa0 65 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 er is copied to
23fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e the database han
23fc0 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f dle.** change co
23fd0 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64 20 unter (returned
23fe0 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 by subsequent ca
23ff0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 lls to sqlite3_c
24000 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20 54 68 hanges())..** Th
24010 65 6e 20 74 68 65 20 56 4d 73 20 69 6e 74 65 72 en the VMs inter
24020 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 nal change count
24030 65 72 20 72 65 73 65 74 73 20 74 6f 20 30 2e 0a er resets to 0..
24040 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 ** This is used
24050 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 by trigger progr
24060 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ams..*/.case OP_
24070 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 ResetCount: {.
24080 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 sqlite3VdbeSetCh
24090 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 anges(db, p->nCh
240a0 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 ange);. p->nCha
240b0 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b nge = 0;. break
240c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ;.}../* Opcode:
240d0 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 20 50 31 SorterCompare P1
240e0 20 50 32 20 50 33 20 50 34 0a 2a 2a 20 53 79 6e P2 P3 P4.** Syn
240f0 6f 70 73 69 73 3a 20 20 69 66 20 6b 65 79 28 50 opsis: if key(P
24100 31 29 21 3d 74 72 69 6d 28 72 5b 50 33 5d 2c 50 1)!=trim(r[P3],P
24110 34 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 4) goto P2.**.**
24120 20 50 31 20 69 73 20 61 20 73 6f 72 74 65 72 20 P1 is a sorter
24130 63 75 72 73 6f 72 2e 20 54 68 69 73 20 69 6e 73 cursor. This ins
24140 74 72 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 truction compare
24150 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 s a prefix of th
24160 65 0a 2a 2a 20 72 65 63 6f 72 64 20 62 6c 6f 62 e.** record blob
24170 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 in register P3
24180 61 67 61 69 6e 73 74 20 61 20 70 72 65 66 69 78 against a prefix
24190 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 of the entry th
241a0 61 74 20 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65 at .** the sorte
241b0 72 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 r cursor current
241c0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4f ly points to. O
241d0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 50 34 nly the first P4
241e0 20 66 69 65 6c 64 73 0a 2a 2a 20 6f 66 20 72 5b fields.** of r[
241f0 50 33 5d 20 61 6e 64 20 74 68 65 20 73 6f 72 74 P3] and the sort
24200 65 72 20 72 65 63 6f 72 64 20 61 72 65 20 63 6f er record are co
24210 6d 70 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 mpared..**.** If
24220 20 65 69 74 68 65 72 20 50 33 20 6f 72 20 74 68 either P3 or th
24230 65 20 73 6f 72 74 65 72 20 63 6f 6e 74 61 69 6e e sorter contain
24240 73 20 61 20 4e 55 4c 4c 20 69 6e 20 6f 6e 65 20 s a NULL in one
24250 6f 66 20 74 68 65 69 72 20 73 69 67 6e 69 66 69 of their signifi
24260 63 61 6e 74 0a 2a 2a 20 66 69 65 6c 64 73 20 28 cant.** fields (
24270 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 not counting the
24280 20 50 34 20 66 69 65 6c 64 73 20 61 74 20 74 68 P4 fields at th
24290 65 20 65 6e 64 20 77 68 69 63 68 20 61 72 65 20 e end which are
242a0 69 67 6e 6f 72 65 64 29 20 74 68 65 6e 0a 2a 2a ignored) then.**
242b0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 the comparison
242c0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 is assumed to be
242d0 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 equal..**.** Fa
242e0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 6e 65 ll through to ne
242f0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 xt instruction i
24300 66 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72 64 f the two record
24310 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 s compare equal
24320 74 6f 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 to.** each other
24330 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 . Jump to P2 if
24340 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65 72 they are differ
24350 65 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ent..*/.case OP_
24360 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 3a 20 7b SorterCompare: {
24370 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 . VdbeCursor *p
24380 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 C;. int res;.
24390 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 int nKeyCol;..
243a0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f pC = p->apCsr[pO
243b0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 p->p1];. assert
243c0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 ( isSorter(pC) )
243d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d ;. assert( pOp-
243e0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 >p4type==P4_INT3
243f0 32 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 2 );. pIn3 = &a
24400 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 Mem[pOp->p3];.
24410 6e 4b 65 79 43 6f 6c 20 3d 20 70 4f 70 2d 3e 70 nKeyCol = pOp->p
24420 34 2e 69 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 4.i;. res = 0;.
24430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 rc = sqlite3Vd
24440 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 beSorterCompare(
24450 70 43 2c 20 70 49 6e 33 2c 20 6e 4b 65 79 43 6f pC, pIn3, nKeyCo
24460 6c 2c 20 26 72 65 73 29 3b 0a 20 20 56 64 62 65 l, &res);. Vdbe
24470 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 BranchTaken(res!
24480 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 =0,2);. if( res
24490 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f ) goto jump_to_
244a0 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a p2;. break;.};.
244b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 ./* Opcode: Sort
244c0 65 72 44 61 74 61 20 50 31 20 50 32 20 50 33 20 erData P1 P2 P3
244d0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a * *.** Synopsis:
244e0 20 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a r[P2]=data.**.*
244f0 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 * Write into reg
24500 69 73 74 65 72 20 50 32 20 74 68 65 20 63 75 72 ister P2 the cur
24510 72 65 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 rent sorter data
24520 20 66 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 for sorter curs
24530 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 or P1..** Then c
24540 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 lear the column
24550 68 65 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 header cache on
24560 63 75 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a cursor P3..**.**
24570 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 This opcode is
24580 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 normally use to
24590 6d 6f 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 move a record ou
245a0 74 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 t of the sorter
245b0 61 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 and into.** a re
245c0 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 gister that is t
245d0 68 65 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 he source for a
245e0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 pseudo-table cur
245f0 73 6f 72 20 63 72 65 61 74 65 64 20 75 73 69 6e sor created usin
24600 67 0a 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e g.** OpenPseudo.
24610 20 20 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 That pseudo-ta
24620 62 6c 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 ble cursor is th
24630 65 20 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 e one that is id
24640 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 entified by.** p
24650 61 72 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c arameter P3. Cl
24660 65 61 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f earing the P3 co
24670 6c 75 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 lumn cache as pa
24680 72 74 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 rt of this opcod
24690 65 20 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 e saves.** us fr
246a0 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 om having to iss
246b0 75 65 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 ue a separate Nu
246c0 6c 6c 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f llRow instructio
246d0 6e 20 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 n to clear that
246e0 63 61 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f cache..*/.case O
246f0 50 5f 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a P_SorterData: {.
24700 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 VdbeCursor *pC
24710 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 ;.. pOut = &aMe
24720 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 m[pOp->p2];. pC
24730 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d = p->apCsr[pOp-
24740 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 >p1];. assert(
24750 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a isSorter(pC) );.
24760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 rc = sqlite3Vd
24770 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 beSorterRowkey(p
24780 43 2c 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 C, pOut);. asse
24790 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f rt( rc!=SQLITE_O
247a0 4b 20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 K || (pOut->flag
247b0 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b s & MEM_Blob) );
247c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e . assert( pOp->
247d0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 p1>=0 && pOp->p1
247e0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 <p->nCursor );.
247f0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 p->apCsr[pOp->p
24800 33 5d 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3]->cacheStatus
24810 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 = CACHE_STALE;.
24820 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 break;.}../* Op
24830 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31 code: RowData P1
24840 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e P2 * * *.** Syn
24850 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74 opsis: r[P2]=dat
24860 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e a.**.** Write in
24870 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 to register P2 t
24880 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 he complete row
24890 64 61 74 61 20 66 6f 72 20 63 75 72 73 6f 72 20 data for cursor
248a0 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 P1..** There is
248b0 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f no interpretatio
248c0 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20 n of the data.
248d0 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20 63 .** It is just c
248e0 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 opied onto the P
248f0 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74 2 register exact
24900 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 ly as .** it is
24910 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 found in the dat
24920 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a abase file..**.*
24930 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72 73 * If the P1 curs
24940 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 or must be point
24950 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 ing to a valid r
24960 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 ow (not a NULL r
24970 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c ow).** of a real
24980 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 table, not a ps
24990 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 2f eudo-table..*/./
249a0 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 4b 65 79 * Opcode: RowKey
249b0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 P1 P2 * * *.**
249c0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d Synopsis: r[P2]=
249d0 6b 65 79 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 key.**.** Write
249e0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 into register P2
249f0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f the complete ro
24a00 77 20 6b 65 79 20 66 6f 72 20 63 75 72 73 6f 72 w key for cursor
24a10 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 P1..** There is
24a20 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 no interpretati
24a30 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 on of the data.
24a40 20 0a 2a 2a 20 54 68 65 20 6b 65 79 20 69 73 20 .** The key is
24a50 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 copied onto the
24a60 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63 P2 register exac
24a70 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 tly as .** it is
24a80 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 found in the da
24a90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a tabase file..**.
24aa0 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72 ** If the P1 cur
24ab0 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e sor must be poin
24ac0 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 ting to a valid
24ad0 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 row (not a NULL
24ae0 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 row).** of a rea
24af0 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 l table, not a p
24b00 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a seudo-table..*/.
24b10 63 61 73 65 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a case OP_RowKey:.
24b20 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a case OP_RowData:
24b30 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 {. VdbeCursor
24b40 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 *pC;. BtCursor
24b50 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b *pCrsr;. u32 n;
24b60 0a 20 20 69 36 34 20 6e 36 34 3b 0a 0a 20 20 70 . i64 n64;.. p
24b70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d Out = &aMem[pOp-
24b80 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 >p2];. memAbout
24b90 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 ToChange(p, pOut
24ba0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 );.. /* Note th
24bb0 61 74 20 52 6f 77 4b 65 79 20 61 6e 64 20 52 6f at RowKey and Ro
24bc0 77 44 61 74 61 20 61 72 65 20 72 65 61 6c 6c 79 wData are really
24bd0 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d exactly the sam
24be0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f e instruction */
24bf0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e . assert( pOp->
24c00 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 p1>=0 && pOp->p1
24c10 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 <p->nCursor );.
24c20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 pC = p->apCsr[p
24c30 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 Op->p1];. asser
24c40 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d t( isSorter(pC)=
24c50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
24c60 70 43 2d 3e 69 73 54 61 62 6c 65 20 7c 7c 20 70 pC->isTable || p
24c70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 Op->opcode!=OP_R
24c80 6f 77 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 owData );. asse
24c90 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d rt( pC->isTable=
24ca0 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 =0 || pOp->opcod
24cb0 65 3d 3d 4f 50 5f 52 6f 77 44 61 74 61 20 29 3b e==OP_RowData );
24cc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 . assert( pC!=0
24cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 );. assert( pC
24ce0 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a ->nullRow==0 );.
24cf0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73 assert( pC->ps
24d00 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 eudoTableReg==0
24d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d );. assert( pC-
24d20 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 >pCursor!=0 );.
24d30 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 pCrsr = pC->pCu
24d40 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 rsor;.. /* The
24d50 4f 50 5f 52 6f 77 4b 65 79 20 61 6e 64 20 4f 50 OP_RowKey and OP
24d60 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65 73 _RowData opcodes
24d70 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f always follow O
24d80 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a 20 P_NotExists or.
24d90 20 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 ** OP_Rewind/Op
24da0 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69 6e _Next with no in
24db0 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72 75 tervening instru
24dc0 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 ctions that migh
24dd0 74 20 69 6e 76 61 6c 69 64 61 74 65 0a 20 20 2a t invalidate. *
24de0 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 49 * the cursor. I
24df0 66 20 74 68 69 73 20 77 68 65 72 65 20 6e 6f 74 f this where not
24e00 20 74 68 65 20 63 61 73 65 2c 20 6f 6e 20 6f 66 the case, on of
24e10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 the following a
24e20 73 73 65 72 74 28 29 73 0a 20 20 2a 2a 20 77 6f ssert()s. ** wo
24e30 75 6c 64 20 66 61 69 6c 2e 20 20 53 68 6f 75 6c uld fail. Shoul
24e40 64 20 74 68 69 73 20 65 76 65 72 20 63 68 61 6e d this ever chan
24e50 67 65 20 28 62 65 63 61 75 73 65 20 6f 66 20 63 ge (because of c
24e60 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 6f hanges in the co
24e70 64 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 6f de. ** generato
24e80 72 29 20 74 68 65 6e 20 74 68 65 20 66 69 78 20 r) then the fix
24e90 77 6f 75 6c 64 20 62 65 20 74 6f 20 69 6e 73 65 would be to inse
24ea0 72 74 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 2a rt a call to. *
24eb0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 * sqlite3VdbeCur
24ec0 73 6f 72 4d 6f 76 65 74 6f 28 29 2e 0a 20 20 2a sorMoveto().. *
24ed0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e /. assert( pC->
24ee0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d deferredMoveto==
24ef0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 0 );. assert( s
24f00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
24f10 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 rIsValid(pCrsr)
24f20 29 3b 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f 74 );.#if 0 /* Not
24f30 20 72 65 71 75 69 72 65 64 20 64 75 65 20 74 6f required due to
24f40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 6f the previous to
24f50 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d assert() statem
24f60 65 6e 74 73 20 2a 2f 0a 20 20 72 63 20 3d 20 73 ents */. rc = s
24f70 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 qlite3VdbeCursor
24f80 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69 66 Moveto(pC);. if
24f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
24fa0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 ) goto abort_due
24fb0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 _to_error;.#endi
24fc0 66 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 54 f.. if( pC->isT
24fd0 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 able==0 ){. a
24fe0 73 73 65 72 74 28 20 21 70 43 2d 3e 69 73 54 61 ssert( !pC->isTa
24ff0 62 6c 65 20 29 3b 0a 20 20 20 20 56 56 41 5f 4f ble );. VVA_O
25000 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 NLY(rc =) sqlite
25010 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 3BtreeKeySize(pC
25020 72 73 72 2c 20 26 6e 36 34 29 3b 0a 20 20 20 20 rsr, &n64);.
25030 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 assert( rc==SQLI
25040 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 54 TE_OK ); /* T
25050 72 75 65 20 62 65 63 61 75 73 65 20 6f 66 20 43 rue because of C
25060 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20 63 61 ursorMoveto() ca
25070 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 ll above */.
25080 69 66 28 20 6e 36 34 3e 64 62 2d 3e 61 4c 69 6d if( n64>db->aLim
25090 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f it[SQLITE_LIMIT_
250a0 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 LENGTH] ){.
250b0 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 goto too_big;.
250c0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 28 75 33 }. n = (u3
250d0 32 29 6e 36 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 2)n64;. }else{.
250e0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 VVA_ONLY(rc
250f0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 =) sqlite3BtreeD
25100 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26 ataSize(pCrsr, &
25110 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 n);. assert(
25120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b rc==SQLITE_OK );
25130 20 20 20 20 2f 2a 20 44 61 74 61 53 69 7a 65 28 /* DataSize(
25140 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f ) cannot fail */
25150 0a 20 20 20 20 69 66 28 20 6e 3e 28 75 33 32 29 . if( n>(u32)
25160 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 db->aLimit[SQLIT
25170 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 E_LIMIT_LENGTH]
25180 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f ){. goto to
25190 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 7d o_big;. }. }
251a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d . testcase( n==
251b0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 0 );. if( sqlit
251c0 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e e3VdbeMemClearAn
251d0 64 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 4d 41 dResize(pOut, MA
251e0 58 28 6e 2c 33 32 29 29 20 29 7b 0a 20 20 20 20 X(n,32)) ){.
251f0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d goto no_mem;. }
25200 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 6e 3b 0a . pOut->n = n;.
25210 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 MemSetTypeFlag
25220 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c 6f 62 29 (pOut, MEM_Blob)
25230 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 54 61 ;. if( pC->isTa
25240 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 ble==0 ){. rc
25250 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b = sqlite3BtreeK
25260 65 79 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20 ey(pCrsr, 0, n,
25270 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 pOut->z);. }els
25280 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 e{. rc = sqli
25290 74 65 33 42 74 72 65 65 44 61 74 61 28 70 43 72 te3BtreeData(pCr
252a0 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e sr, 0, n, pOut->
252b0 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e z);. }. pOut->
252c0 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 enc = SQLITE_UTF
252d0 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 8; /* In case t
252e0 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20 he blob is ever
252f0 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a cast to text */.
25300 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f UPDATE_MAX_BLO
25310 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 52 BSIZE(pOut);. R
25320 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f EGISTER_TRACE(pO
25330 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 p->p2, pOut);.
25340 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
25350 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50 32 ode: Rowid P1 P2
25360 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 * * *.** Synops
25370 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a is: r[P2]=rowid.
25380 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72 **.** Store in r
25390 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e egister P2 an in
253a0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 teger which is t
253b0 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61 he key of the ta
253c0 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74 0a 2a ble entry that.*
253d0 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c * P1 is currentl
253e0 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a y point to..**.*
253f0 2a 20 50 31 20 63 61 6e 20 62 65 20 65 69 74 68 * P1 can be eith
25400 65 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 er an ordinary t
25410 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61 able or a virtua
25420 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 72 65 20 l table. There
25430 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20 61 20 used to.** be a
25440 73 65 70 61 72 61 74 65 20 4f 50 5f 56 52 6f 77 separate OP_VRow
25450 69 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 75 73 id opcode for us
25460 65 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 e with virtual t
25470 61 62 6c 65 73 2c 20 62 75 74 20 74 68 69 73 0a ables, but this.
25480 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65 20 6e 6f ** one opcode no
25490 77 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 w works for both
254a0 20 74 61 62 6c 65 20 74 79 70 65 73 2e 0a 2a 2f table types..*/
254b0 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a 20 .case OP_Rowid:
254c0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {
254d0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56 /* out2 */. V
254e0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 dbeCursor *pC;.
254f0 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69 74 65 i64 v;. sqlite
25500 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 3_vtab *pVtab;.
25510 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d const sqlite3_m
25520 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a odule *pModule;.
25530 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 . pOut = out2Pr
25540 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 erelease(p, pOp)
25550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d ;. assert( pOp-
25560 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 >p1>=0 && pOp->p
25570 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 1<p->nCursor );.
25580 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b pC = p->apCsr[
25590 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 pOp->p1];. asse
255a0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 rt( pC!=0 );. a
255b0 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 ssert( pC->pseud
255c0 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 7c 7c 20 oTableReg==0 ||
255d0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 pC->nullRow );.
255e0 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 if( pC->nullRow
255f0 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c ){. pOut->fl
25600 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
25610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c break;. }el
25620 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65 72 se if( pC->defer
25630 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 redMoveto ){.
25640 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 v = pC->movetoT
25650 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 arget;.#ifndef S
25660 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
25670 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 ALTABLE. }else
25680 69 66 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72 if( pC->pVtabCur
25690 73 6f 72 20 29 7b 0a 20 20 20 20 70 56 74 61 62 sor ){. pVtab
256a0 20 3d 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 = pC->pVtabCurs
256b0 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70 or->pVtab;. p
256c0 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e Module = pVtab->
256d0 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73 pModule;. ass
256e0 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 ert( pModule->xR
256f0 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d owid );. rc =
25700 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 pModule->xRowid
25710 28 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 (pC->pVtabCursor
25720 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 , &v);. sqlit
25730 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d e3VtabImportErrm
25740 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 23 65 sg(p, pVtab);.#e
25750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
25760 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
25770 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 */. }else{.
25780 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 assert( pC->pCu
25790 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 72 rsor!=0 );. r
257a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 c = sqlite3VdbeC
257b0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 43 29 ursorRestore(pC)
257c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 ;. if( rc ) g
257d0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f oto abort_due_to
257e0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 _error;. if(
257f0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 pC->nullRow ){.
25800 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 pOut->flags
25810 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 = MEM_Null;.
25820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
25830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
25840 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 2d BtreeKeySize(pC-
25850 3e 70 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20 >pCursor, &v);.
25860 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 assert( rc==S
25870 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 QLITE_OK ); /*
25880 41 6c 77 61 79 73 20 73 6f 20 62 65 63 61 75 73 Always so becaus
25890 65 20 6f 66 20 43 75 72 73 6f 72 52 65 73 74 6f e of CursorResto
258a0 72 65 28 29 20 61 62 6f 76 65 20 2a 2f 0a 20 20 re() above */.
258b0 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 }. pOut->u.i =
258c0 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f v;. break;.}../
258d0 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f * Opcode: NullRo
258e0 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a w P1 * * * *.**.
258f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 ** Move the curs
25900 6f 72 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c 20 or P1 to a null
25910 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f 6c row. Any OP_Col
25920 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a umn operations.*
25930 2a 20 74 68 61 74 20 6f 63 63 75 72 20 77 68 69 * that occur whi
25940 6c 65 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 le the cursor is
25950 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f 77 on the null row
25960 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 will always.**
25970 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f write a NULL..*/
25980 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 .case OP_NullRow
25990 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 : {. VdbeCursor
259a0 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 *pC;.. assert(
259b0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 pOp->p1>=0 && p
259c0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f Op->p1<p->nCurso
259d0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 r );. pC = p->a
259e0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 pCsr[pOp->p1];.
259f0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 assert( pC!=0 )
25a00 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 ;. pC->nullRow
25a10 3d 20 31 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 = 1;. pC->cache
25a20 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 Status = CACHE_S
25a30 54 41 4c 45 3b 0a 20 20 69 66 28 20 70 43 2d 3e TALE;. if( pC->
25a40 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 pCursor ){. s
25a50 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 qlite3BtreeClear
25a60 43 75 72 73 6f 72 28 70 43 2d 3e 70 43 75 72 73 Cursor(pC->pCurs
25a70 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b or);. }. break
25a80 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ;.}../* Opcode:
25a90 4c 61 73 74 20 50 31 20 50 32 20 50 33 20 2a 20 Last P1 P2 P3 *
25aa0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 *.**.** The next
25ab0 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 use of the Rowi
25ac0 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 50 d or Column or P
25ad0 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 rev instruction
25ae0 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 for P1 .** will
25af0 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73 refer to the las
25b00 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 t entry in the d
25b10 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 atabase table or
25b20 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 index..** If th
25b30 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 e table or index
25b40 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 is empty and P2
25b50 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d >0, then jump im
25b60 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e mediately to P2.
25b70 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f .** If P2 is 0 o
25b80 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f r if the table o
25b90 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 r index is not e
25ba0 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 mpty, fall throu
25bb0 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c gh.** to the fol
25bc0 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 lowing instructi
25bd0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f on..**.** This o
25be0 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 pcode leaves the
25bf0 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 cursor configur
25c00 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 ed to move in re
25c10 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 verse order,.**
25c20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 from the end tow
25c30 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e ard the beginnin
25c40 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 g. In other wor
25c50 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 ds, the cursor i
25c60 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 s.** configured
25c70 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 to use Prev, not
25c80 20 4e 65 78 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f Next..*/.case O
25c90 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20 P_Last: {
25ca0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 /* jump */. Vd
25cb0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 beCursor *pC;.
25cc0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b BtCursor *pCrsr;
25cd0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 . int res;.. a
25ce0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d ssert( pOp->p1>=
25cf0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 0 && pOp->p1<p->
25d00 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 nCursor );. pC
25d10 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e = p->apCsr[pOp->
25d20 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 p1];. assert( p
25d30 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 C!=0 );. pCrsr
25d40 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 = pC->pCursor;.
25d50 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 res = 0;. asse
25d60 72 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a rt( pCrsr!=0 );.
25d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
25d80 72 65 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 reeLast(pCrsr, &
25d90 72 65 73 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c res);. pC->null
25da0 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 Row = (u8)res;.
25db0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 pC->deferredMov
25dc0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 eto = 0;. pC->c
25dd0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 acheStatus = CAC
25de0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e HE_STALE;. pC->
25df0 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 70 4f 70 seekResult = pOp
25e00 2d 3e 70 33 3b 0a 23 69 66 64 65 66 20 53 51 4c ->p3;.#ifdef SQL
25e10 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e ITE_DEBUG. pC->
25e20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 seekOp = OP_Last
25e30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 ;.#endif. if( p
25e40 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 Op->p2>0 ){.
25e50 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 VdbeBranchTaken(
25e60 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 res!=0,2);. i
25e70 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 f( res ) goto ju
25e80 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 mp_to_p2;. }.
25e90 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 break;.}.../* Op
25ea0 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32 code: Sort P1 P2
25eb0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 * * *.**.** Thi
25ec0 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78 s opcode does ex
25ed0 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74 actly the same t
25ee0 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e hing as OP_Rewin
25ef0 64 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a d except that.**
25f00 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61 it increments a
25f10 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67 n undocumented g
25f20 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75 lobal variable u
25f30 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e sed for testing.
25f40 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69 .**.** Sorting i
25f50 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 s accomplished b
25f60 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64 y writing record
25f70 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 s into a sorting
25f80 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 index,.** then
25f90 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69 rewinding that i
25fa0 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67 ndex and playing
25fb0 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65 it back from be
25fc0 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e ginning to.** en
25fd0 64 2e 20 20 57 65 20 75 73 65 20 74 68 65 20 4f d. We use the O
25fe0 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e P_Sort opcode in
25ff0 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69 stead of OP_Rewi
26000 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 nd to do the.**
26010 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61 rewinding so tha
26020 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 t the global var
26030 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e iable will be in
26040 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a cremented and.**
26050 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 regression test
26060 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 s can determine
26070 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 whether or not t
26080 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a he optimizer is.
26090 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74 ** correctly opt
260a0 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74 imizing out sort
260b0 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f s..*/.case OP_So
260c0 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a 20 rterSort: /*
260d0 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f jump */.case OP_
260e0 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f Sort: { /
260f0 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65 66 * jump */.#ifdef
26100 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 SQLITE_TEST. s
26110 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e qlite3_sort_coun
26120 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 t++;. sqlite3_s
26130 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 earch_count--;.#
26140 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75 6e endif. p->aCoun
26150 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 ter[SQLITE_STMTS
26160 54 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 TATUS_SORT]++;.
26170 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 /* Fall through
26180 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20 into OP_Rewind
26190 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 */.}./* Opcode:
261a0 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a Rewind P1 P2 * *
261b0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 *.**.** The nex
261c0 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 t use of the Row
261d0 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 id or Column or
261e0 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e Next instruction
261f0 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c for P1 .** will
26200 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 66 69 refer to the fi
26210 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 rst entry in the
26220 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 database table
26230 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 or index..** If
26240 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 the table or ind
26250 65 78 20 69 73 20 65 6d 70 74 79 2c 20 6a 75 6d ex is empty, jum
26260 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f p immediately to
26270 20 50 32 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 P2..** If the t
26280 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 able or index is
26290 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c not empty, fall
262a0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 through to the
262b0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e following .** in
262c0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a struction..**.**
262d0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 This opcode lea
262e0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 ves the cursor c
262f0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 onfigured to mov
26300 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 e in forward ord
26310 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 er,.** from the
26320 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 beginning toward
26330 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 the end. In ot
26340 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 her words, the c
26350 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 ursor is.** conf
26360 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 igured to use Ne
26370 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f xt, not Prev..*/
26380 0a 63 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a .case OP_Rewind:
26390 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d { /* jum
263a0 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f p */. VdbeCurso
263b0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f r *pC;. BtCurso
263c0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 r *pCrsr;. int
263d0 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 res;.. assert(
263e0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f pOp->p1>=0 && pO
263f0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 p->p1<p->nCursor
26400 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 );. pC = p->ap
26410 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 Csr[pOp->p1];.
26420 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b assert( pC!=0 );
26430 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 . assert( isSor
26440 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f ter(pC)==(pOp->o
26450 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 pcode==OP_Sorter
26460 53 6f 72 74 29 20 29 3b 0a 20 20 72 65 73 20 3d Sort) );. res =
26470 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 1;.#ifdef SQLIT
26480 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 E_DEBUG. pC->se
26490 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 ekOp = OP_Rewind
264a0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 ;.#endif. if( i
264b0 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 sSorter(pC) ){.
264c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 rc = sqlite3V
264d0 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 dbeSorterRewind(
264e0 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c pC, &res);. }el
264f0 73 65 7b 0a 20 20 20 20 70 43 72 73 72 20 3d 20 se{. pCrsr =
26500 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 pC->pCursor;.
26510 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29 assert( pCrsr )
26520 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 ;. rc = sqlit
26530 65 33 42 74 72 65 65 46 69 72 73 74 28 70 43 72 e3BtreeFirst(pCr
26540 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 sr, &res);. p
26550 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 C->deferredMovet
26560 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 o = 0;. pC->c
26570 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 acheStatus = CAC
26580 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 HE_STALE;. }.
26590 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 pC->nullRow = (u
265a0 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 8)res;. assert(
265b0 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f pOp->p2>0 && pO
265c0 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a p->p2<p->nOp );.
265d0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 VdbeBranchTake
265e0 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 n(res!=0,2);. i
265f0 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 f( res ) goto ju
26600 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 mp_to_p2;. brea
26610 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a k;.}../* Opcode:
26620 20 4e 65 78 74 20 50 31 20 50 32 20 50 33 20 50 Next P1 P2 P3 P
26630 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 4 P5.**.** Advan
26640 63 65 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 ce cursor P1 so
26650 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 that it points t
26660 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 o the next key/d
26670 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a ata pair in its.
26680 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 ** table or inde
26690 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 x. If there are
266a0 20 6e 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c no more key/val
266b0 75 65 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 ue pairs then fa
266c0 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f ll through.** to
266d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 the following i
266e0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 nstruction. But
266f0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 if the cursor a
26700 64 76 61 6e 63 65 20 77 61 73 20 73 75 63 63 65 dvance was succe
26710 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 ssful,.** jump i
26720 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 mmediately to P2
26730 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4e 65 78 74 ..**.** The Next
26740 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 opcode is only
26750 76 61 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 valid following
26760 61 6e 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 an SeekGT, SeekG
26770 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 52 65 77 69 E, or.** OP_Rewi
26780 6e 64 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74 nd opcode used t
26790 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 o position the c
267a0 75 72 73 6f 72 2e 20 20 4e 65 78 74 20 69 73 20 ursor. Next is
267b0 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 not allowed.** t
267c0 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b 4c 54 2c o follow SeekLT,
267d0 20 53 65 65 6b 4c 45 2c 20 6f 72 20 4f 50 5f 4c SeekLE, or OP_L
267e0 61 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 ast..**.** The P
267f0 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 1 cursor must be
26800 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c for a real tabl
26810 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d e, not a pseudo-
26820 74 61 62 6c 65 2e 20 20 50 31 20 6d 75 73 74 20 table. P1 must
26830 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 6f 70 65 have.** been ope
26840 6e 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 ned prior to thi
26850 73 20 6f 70 63 6f 64 65 20 6f 72 20 74 68 65 20 s opcode or the
26860 70 72 6f 67 72 61 6d 20 77 69 6c 6c 20 73 65 67 program will seg
26870 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 fault..**.** The
26880 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 20 68 P3 value is a h
26890 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 65 65 int to the btree
268a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e implementation.
268b0 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a If P3==1, that.
268c0 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61 ** means P1 is a
268d0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 n SQL index and
268e0 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 72 75 that this instru
268f0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 ction could have
26900 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 been.** omitted
26910 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 20 68 if that index h
26920 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20 ad been unique.
26930 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30 P3 is usually 0
26940 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61 . P3 is.** alwa
26950 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 ys either 0 or 1
26960 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c ..**.** P4 is al
26970 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f ways of type P4_
26980 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e ADVANCE. The fun
26990 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f ction pointer po
269a0 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 ints to.** sqlit
269b0 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 0a 2a e3BtreeNext()..*
269c0 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f *.** If P5 is po
269d0 73 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a sitive and the j
269e0 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 ump is taken, th
269f0 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 en event counter
26a00 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 .** number P5-1
26a10 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 in the prepared
26a20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 statement is inc
26a30 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 remented..**.**
26a40 53 65 65 20 61 6c 73 6f 3a 20 50 72 65 76 2c 20 See also: Prev,
26a50 4e 65 78 74 49 66 4f 70 65 6e 0a 2a 2f 0a 2f 2a NextIfOpen.*/./*
26a60 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 49 66 4f Opcode: NextIfO
26a70 70 65 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 pen P1 P2 P3 P4
26a80 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 P5.**.** This op
26a90 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 code works just
26aa0 6c 69 6b 65 20 4e 65 78 74 20 65 78 63 65 70 74 like Next except
26ab0 20 74 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 that if cursor
26ac0 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 P1 is not.** ope
26ad0 6e 20 69 74 20 62 65 68 61 76 65 73 20 61 20 6e n it behaves a n
26ae0 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f o-op..*/./* Opco
26af0 64 65 3a 20 50 72 65 76 20 50 31 20 50 32 20 50 de: Prev P1 P2 P
26b00 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 3 P4 P5.**.** Ba
26b10 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 ck up cursor P1
26b20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 so that it point
26b30 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 s to the previou
26b40 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 s key/data pair
26b50 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 in its.** table
26b60 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 or index. If th
26b70 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f ere is no previo
26b80 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 us key/value pai
26b90 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 rs then fall thr
26ba0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 ough.** to the f
26bb0 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 ollowing instruc
26bc0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 tion. But if th
26bd0 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 e cursor backup
26be0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a was successful,.
26bf0 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 ** jump immediat
26c00 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a ely to P2..**.**
26c10 0a 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 .** The Prev opc
26c20 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 ode is only vali
26c30 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 d following an S
26c40 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f eekLT, SeekLE, o
26c50 72 0a 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f 70 63 r.** OP_Last opc
26c60 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 ode used to posi
26c70 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e tion the cursor.
26c80 20 20 50 72 65 76 20 69 73 20 6e 6f 74 20 61 6c Prev is not al
26c90 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c lowed.** to foll
26ca0 6f 77 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 ow SeekGT, SeekG
26cb0 45 2c 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2e E, or OP_Rewind.
26cc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 .**.** The P1 cu
26cd0 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 rsor must be for
26ce0 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e a real table, n
26cf0 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c ot a pseudo-tabl
26d00 65 2e 20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 e. If P1 is.**
26d10 6e 6f 74 20 6f 70 65 6e 20 74 68 65 6e 20 74 68 not open then th
26d20 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e e behavior is un
26d30 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 defined..**.** T
26d40 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 he P3 value is a
26d50 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 hint to the btr
26d60 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ee implementatio
26d70 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 n. If P3==1, tha
26d80 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 t.** means P1 is
26d90 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e an SQL index an
26da0 64 20 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 d that this inst
26db0 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 ruction could ha
26dc0 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 ve been.** omitt
26dd0 65 64 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 ed if that index
26de0 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 had been unique
26df0 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 . P3 is usually
26e00 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 0. P3 is.** al
26e10 77 61 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 ways either 0 or
26e20 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 1..**.** P4 is
26e30 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 always of type P
26e40 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 4_ADVANCE. The f
26e50 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 unction pointer
26e60 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c points to.** sql
26e70 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 ite3BtreePreviou
26e80 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 s()..**.** If P5
26e90 20 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 is positive and
26ea0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b the jump is tak
26eb0 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 en, then event c
26ec0 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 ounter.** number
26ed0 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 P5-1 in the pre
26ee0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 pared statement
26ef0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a is incremented..
26f00 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 */./* Opcode: Pr
26f10 65 76 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50 evIfOpen P1 P2 P
26f20 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 3 P4 P5.**.** Th
26f30 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 is opcode works
26f40 6a 75 73 74 20 6c 69 6b 65 20 50 72 65 76 20 65 just like Prev e
26f50 78 63 65 70 74 20 74 68 61 74 20 69 66 20 63 75 xcept that if cu
26f60 72 73 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a rsor P1 is not.*
26f70 2a 20 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65 * open it behave
26f80 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 s a no-op..*/.ca
26f90 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 se OP_SorterNext
26fa0 3a 20 7b 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a : { /* jump */.
26fb0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 VdbeCursor *pC
26fc0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 ;. int res;..
26fd0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f pC = p->apCsr[pO
26fe0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 p->p1];. assert
26ff0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 ( isSorter(pC) )
27000 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 ;. res = 0;. r
27010 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 c = sqlite3VdbeS
27020 6f 72 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43 orterNext(db, pC
27030 2c 20 26 72 65 73 29 3b 0a 20 20 67 6f 74 6f 20 , &res);. goto
27040 6e 65 78 74 5f 74 61 69 6c 3b 0a 63 61 73 65 20 next_tail;.case
27050 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 20 OP_PrevIfOpen:
27060 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 /* jump */.cas
27070 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a e OP_NextIfOpen:
27080 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 /* jump */.
27090 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f if( p->apCsr[pO
270a0 70 2d 3e 70 31 5d 3d 3d 30 20 29 20 62 72 65 61 p->p1]==0 ) brea
270b0 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 k;. /* Fall thr
270c0 6f 75 67 68 20 2a 2f 0a 63 61 73 65 20 4f 50 5f ough */.case OP_
270d0 50 72 65 76 3a 20 20 20 20 20 20 20 20 20 20 2f Prev: /
270e0 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f * jump */.case O
270f0 50 5f 4e 65 78 74 3a 20 20 20 20 20 20 20 20 20 P_Next:
27100 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 /* jump */. as
27110 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 sert( pOp->p1>=0
27120 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e && pOp->p1<p->n
27130 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 Cursor );. asse
27140 72 74 28 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61 rt( pOp->p5<Arra
27150 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 ySize(p->aCounte
27160 72 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e r) );. pC = p->
27170 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a apCsr[pOp->p1];.
27180 20 20 72 65 73 20 3d 20 70 4f 70 2d 3e 70 33 3b res = pOp->p3;
27190 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 . assert( pC!=0
271a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 );. assert( pC
271b0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f ->deferredMoveto
271c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 ==0 );. assert(
271d0 20 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a pC->pCursor );.
271e0 20 20 61 73 73 65 72 74 28 20 72 65 73 3d 3d 30 assert( res==0
271f0 20 7c 7c 20 28 72 65 73 3d 3d 31 20 26 26 20 70 || (res==1 && p
27200 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 29 20 29 C->isTable==0) )
27210 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 65 ;. testcase( re
27220 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 s==1 );. assert
27230 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f ( pOp->opcode!=O
27240 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 70 P_Next || pOp->p
27250 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 4.xAdvance==sqli
27260 74 65 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a te3BtreeNext );.
27270 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f assert( pOp->o
27280 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c pcode!=OP_Prev |
27290 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e | pOp->p4.xAdvan
272a0 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 ce==sqlite3Btree
272b0 50 72 65 76 69 6f 75 73 20 29 3b 0a 20 20 61 73 Previous );. as
272c0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 sert( pOp->opcod
272d0 65 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e e!=OP_NextIfOpen
272e0 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 || pOp->p4.xAdv
272f0 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 ance==sqlite3Btr
27300 65 65 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65 eeNext );. asse
27310 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 rt( pOp->opcode!
27320 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 7c =OP_PrevIfOpen |
27330 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e | pOp->p4.xAdvan
27340 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 ce==sqlite3Btree
27350 50 72 65 76 69 6f 75 73 29 3b 0a 0a 20 20 2f 2a Previous);.. /*
27360 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65 The Next opcode
27370 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 is only used af
27380 74 65 72 20 53 65 65 6b 47 54 2c 20 53 65 65 6b ter SeekGT, Seek
27390 47 45 2c 20 61 6e 64 20 52 65 77 69 6e 64 2e 0a GE, and Rewind..
273a0 20 20 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 ** The Prev op
273b0 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 code is only use
273c0 64 20 61 66 74 65 72 20 53 65 65 6b 4c 54 2c 20 d after SeekLT,
273d0 53 65 65 6b 4c 45 2c 20 61 6e 64 20 4c 61 73 74 SeekLE, and Last
273e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 . */. assert( p
273f0 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e Op->opcode!=OP_N
27400 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f ext || pOp->opco
27410 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 de!=OP_NextIfOpe
27420 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e n. || pC->
27430 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 seekOp==OP_SeekG
27440 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d T || pC->seekOp=
27450 3d 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 =OP_SeekGE.
27460 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d || pC->seekOp=
27470 3d 4f 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70 43 =OP_Rewind || pC
27480 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75 ->seekOp==OP_Fou
27490 6e 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 nd);. assert( p
274a0 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 Op->opcode!=OP_P
274b0 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f rev || pOp->opco
274c0 64 65 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 de!=OP_PrevIfOpe
274d0 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e n. || pC->
274e0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c seekOp==OP_SeekL
274f0 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d T || pC->seekOp=
27500 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20 =OP_SeekLE.
27510 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d || pC->seekOp=
27520 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 0a 20 20 72 =OP_Last );.. r
27530 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 c = pOp->p4.xAdv
27540 61 6e 63 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 ance(pC->pCursor
27550 2c 20 26 72 65 73 29 3b 0a 6e 65 78 74 5f 74 61 , &res);.next_ta
27560 69 6c 3a 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 il:. pC->cacheS
27570 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 tatus = CACHE_ST
27580 41 4c 45 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 ALE;. VdbeBranc
27590 68 54 61 6b 65 6e 28 72 65 73 3d 3d 30 2c 32 29 hTaken(res==0,2)
275a0 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 ;. if( res==0 )
275b0 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f {. pC->nullRo
275c0 77 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 43 w = 0;. p->aC
275d0 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 5d 2b ounter[pOp->p5]+
275e0 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 +;.#ifdef SQLITE
275f0 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 _TEST. sqlite
27600 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3_search_count++
27610 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 67 6f 74 ;.#endif. got
27620 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 o jump_to_p2_and
27630 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 _check_for_inter
27640 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 rupt;. }else{.
27650 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d pC->nullRow =
27660 20 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 1;. }. goto c
27670 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 heck_for_interru
27680 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 pt;.}../* Opcode
27690 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20 50 : IdxInsert P1 P
276a0 32 20 50 33 20 2a 20 50 35 0a 2a 2a 20 53 79 6e 2 P3 * P5.** Syn
276b0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d opsis: key=r[P2]
276c0 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 .**.** Register
276d0 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 P2 holds an SQL
276e0 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 index key made u
276f0 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 sing the.** Make
27700 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 Record instructi
27710 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 ons. This opcod
27720 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 e writes that ke
27730 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e y.** into the in
27740 64 65 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f dex P1. Data fo
27750 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e r the entry is n
27760 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 il..**.** P3 is
27770 61 20 66 6c 61 67 20 74 68 61 74 20 70 72 6f 76 a flag that prov
27780 69 64 65 73 20 61 20 68 69 6e 74 20 74 6f 20 74 ides a hint to t
27790 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 he b-tree layer
277a0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 69 6e 73 that this.** ins
277b0 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f ert is likely to
277c0 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a be an append..*
277d0 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74 *.** If P5 has t
277e0 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 he OPFLAG_NCHANG
277f0 45 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20 E bit set, then
27800 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 the change count
27810 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 er is.** increme
27820 6e 74 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 nted by this ins
27830 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 truction. If th
27840 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 e OPFLAG_NCHANGE
27850 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c 0a 2a bit is clear,.*
27860 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 * then the chang
27870 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75 6e 63 e counter is unc
27880 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 hanged..**.** If
27890 20 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c P5 has the OPFL
278a0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 AG_USESEEKRESULT
278b0 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 bit set, then t
278c0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 he cursor must h
278d0 61 76 65 0a 2a 2a 20 6a 75 73 74 20 64 6f 6e 65 ave.** just done
278e0 20 61 20 73 65 65 6b 20 74 6f 20 74 68 65 20 73 a seek to the s
278f0 70 6f 74 20 77 68 65 72 65 20 74 68 65 20 6e 65 pot where the ne
27900 77 20 65 6e 74 72 79 20 69 73 20 74 6f 20 62 65 w entry is to be
27910 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20 54 68 inserted..** Th
27920 69 73 20 66 6c 61 67 20 61 76 6f 69 64 73 20 64 is flag avoids d
27930 6f 69 6e 67 20 61 6e 20 65 78 74 72 61 20 73 65 oing an extra se
27940 65 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 ek..**.** This i
27950 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 nstruction only
27960 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 works for indice
27970 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 s. The equivale
27980 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a nt instruction.*
27990 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73 20 * for tables is
279a0 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61 OP_Insert..*/.ca
279b0 73 65 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 se OP_SorterInse
279c0 72 74 3a 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 rt: /* in2
279d0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 */.case OP_IdxI
279e0 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20 nsert: {
279f0 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 /* in2 */. Vdbe
27a00 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e Cursor *pC;. in
27a10 74 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20 t nKey;. const
27a20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 0a 20 20 61 char *zKey;.. a
27a30 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d ssert( pOp->p1>=
27a40 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 0 && pOp->p1<p->
27a50 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 nCursor );. pC
27a60 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e = p->apCsr[pOp->
27a70 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 p1];. assert( p
27a80 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 C!=0 );. assert
27a90 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d ( isSorter(pC)==
27aa0 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 (pOp->opcode==OP
27ab0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 29 20 29 _SorterInsert) )
27ac0 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d ;. pIn2 = &aMem
27ad0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 [pOp->p2];. ass
27ae0 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 ert( pIn2->flags
27af0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 & MEM_Blob );.
27b00 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f if( pOp->p5 & O
27b10 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 PFLAG_NCHANGE )
27b20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 p->nChange++;.
27b30 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 assert( pC->pCur
27b40 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 sor!=0 );. asse
27b50 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d rt( pC->isTable=
27b60 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 =0 );. rc = Exp
27b70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 andBlob(pIn2);.
27b80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
27b90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f OK ){. if( pO
27ba0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f p->opcode==OP_So
27bb0 72 74 65 72 49 6e 73 65 72 74 20 29 7b 0a 20 20 rterInsert ){.
27bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
27bd0 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28 VdbeSorterWrite(
27be0 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 20 20 7d pC, pIn2);. }
27bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4b 65 79 else{. nKey
27c00 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 = pIn2->n;.
27c10 20 20 7a 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a zKey = pIn2->z
27c20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c ;. rc = sql
27c30 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 ite3BtreeInsert(
27c40 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 7a 4b 65 pC->pCursor, zKe
27c50 79 2c 20 6e 4b 65 79 2c 20 22 22 2c 20 30 2c 20 y, nKey, "", 0,
27c60 30 2c 20 70 4f 70 2d 3e 70 33 2c 20 0a 20 20 20 0, pOp->p3, .
27c70 20 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70 35 ((pOp->p5
27c80 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 & OPFLAG_USESEE
27c90 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 KRESULT) ? pC->s
27ca0 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a 20 eekResult : 0).
27cb0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 );.
27cc0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 assert( pC->de
27cd0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 ferredMoveto==0
27ce0 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 63 61 63 );. pC->cac
27cf0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 heStatus = CACHE
27d00 5f 53 54 41 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 _STALE;. }.
27d10 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a }. break;.}../*
27d20 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 Opcode: IdxDele
27d30 74 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a te P1 P2 P3 * *.
27d40 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 ** Synopsis: key
27d50 3d 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 =r[P2@P3].**.**
27d60 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 The content of P
27d70 33 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 3 registers star
27d80 74 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 ting at register
27d90 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 P2 form.** an u
27da0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 npacked index ke
27db0 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 y. This opcode r
27dc0 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 emoves that entr
27dd0 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 y from the .** i
27de0 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 ndex opened by c
27df0 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 ursor P1..*/.cas
27e00 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 e OP_IdxDelete:
27e10 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a {. VdbeCursor *
27e20 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a pC;. BtCursor *
27e30 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 pCrsr;. int res
27e40 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f ;. UnpackedReco
27e50 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 rd r;.. assert(
27e60 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 pOp->p3>0 );.
27e70 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e assert( pOp->p2>
27e80 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 0 && pOp->p2+pOp
27e90 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 ->p3<=(p->nMem-p
27ea0 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a ->nCursor)+1 );.
27eb0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
27ec0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 1>=0 && pOp->p1<
27ed0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 p->nCursor );.
27ee0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f pC = p->apCsr[pO
27ef0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 p->p1];. assert
27f00 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 ( pC!=0 );. pCr
27f10 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 sr = pC->pCursor
27f20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 ;. assert( pCrs
27f30 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 r!=0 );. assert
27f40 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a ( pOp->p5==0 );.
27f50 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 r.pKeyInfo = p
27f60 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 C->pKeyInfo;. r
27f70 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 .nField = (u16)p
27f80 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61 Op->p3;. r.defa
27f90 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e ult_rc = 0;. r.
27fa0 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 aMem = &aMem[pOp
27fb0 2d 3e 70 32 5d 3b 0a 23 69 66 64 65 66 20 53 51 ->p2];.#ifdef SQ
27fc0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 69 LITE_DEBUG. { i
27fd0 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 nt i; for(i=0; i
27fe0 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 <r.nField; i++)
27ff0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c assert( memIsVal
28000 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 id(&r.aMem[i]) )
28010 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 ; }.#endif. rc
28020 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f = sqlite3BtreeMo
28030 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 vetoUnpacked(pCr
28040 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 sr, &r, 0, 0, &r
28050 65 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 es);. if( rc==S
28060 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d QLITE_OK && res=
28070 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 =0 ){. rc = s
28080 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 qlite3BtreeDelet
28090 65 28 70 43 72 73 72 2c 20 30 29 3b 0a 20 20 7d e(pCrsr, 0);. }
280a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 . assert( pC->d
280b0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 eferredMoveto==0
280c0 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 );. pC->cacheS
280d0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 tatus = CACHE_ST
280e0 41 4c 45 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a ALE;. break;.}.
280f0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52 ./* Opcode: IdxR
28100 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a owid P1 P2 * * *
28110 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b .** Synopsis: r[
28120 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 P2]=rowid.**.**
28130 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 Write into regis
28140 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 ter P2 an intege
28150 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6c r which is the l
28160 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 ast entry in the
28170 20 72 65 63 6f 72 64 20 61 74 0a 2a 2a 20 74 68 record at.** th
28180 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 e end of the ind
28190 65 78 20 6b 65 79 20 70 6f 69 6e 74 65 64 20 74 ex key pointed t
281a0 6f 20 62 79 20 63 75 72 73 6f 72 20 50 31 2e 20 o by cursor P1.
281b0 20 54 68 69 73 20 69 6e 74 65 67 65 72 20 73 68 This integer sh
281c0 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 65 20 72 ould be.** the r
281d0 6f 77 69 64 20 6f 66 20 74 68 65 20 74 61 62 6c owid of the tabl
281e0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 e entry to which
281f0 20 74 68 69 73 20 69 6e 64 65 78 20 65 6e 74 72 this index entr
28200 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 y points..**.**
28210 53 65 65 20 61 6c 73 6f 3a 20 52 6f 77 69 64 2c See also: Rowid,
28220 20 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 2a 2f 0a MakeRecord..*/.
28230 63 61 73 65 20 4f 50 5f 49 64 78 52 6f 77 69 64 case OP_IdxRowid
28240 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 : {
28250 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 42 74 /* out2 */. Bt
28260 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 Cursor *pCrsr;.
28270 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b VdbeCursor *pC;
28280 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 0a 20 . i64 rowid;..
28290 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 pOut = out2Prer
282a0 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a elease(p, pOp);.
282b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
282c0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 1>=0 && pOp->p1<
282d0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 p->nCursor );.
282e0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f pC = p->apCsr[pO
282f0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 p->p1];. assert
28300 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 ( pC!=0 );. pCr
28310 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 sr = pC->pCursor
28320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 ;. assert( pCrs
28330 72 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e r!=0 );. pOut->
28340 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c flags = MEM_Null
28350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e ;. assert( pC->
28360 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 isTable==0 );.
28370 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 assert( pC->defe
28380 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b rredMoveto==0 );
28390 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 62 .. /* sqlite3Vb
283a0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 eCursorRestore()
283b0 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 can only fail i
283c0 66 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 f the record has
283d0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 20 20 been deleted.
283e0 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 ** out from unde
283f0 72 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 r the cursor. T
28400 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 hat will never h
28410 61 70 70 65 6e 64 20 66 6f 72 20 61 6e 20 49 64 append for an Id
28420 78 52 6f 77 69 64 0a 20 20 2a 2a 20 6f 70 63 6f xRowid. ** opco
28430 64 65 2c 20 68 65 6e 63 65 20 74 68 65 20 4e 45 de, hence the NE
28440 56 45 52 28 29 20 61 72 72 6f 75 6e 64 20 74 68 VER() arround th
28450 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 72 e check of the r
28460 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a eturn value.. *
28470 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 /. rc = sqlite3
28480 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 VdbeCursorRestor
28490 65 28 70 43 29 3b 0a 20 20 69 66 28 20 4e 45 56 e(pC);. if( NEV
284a0 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b ER(rc!=SQLITE_OK
284b0 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 ) ) goto abort_d
284c0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 ue_to_error;..
284d0 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 if( !pC->nullRow
284e0 20 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 ){. rowid =
284f0 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 0; /* Not neede
28500 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f d. Only used to
28510 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 silence a warni
28520 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 ng. */. rc =
28530 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f sqlite3VdbeIdxRo
28540 77 69 64 28 64 62 2c 20 70 43 72 73 72 2c 20 26 wid(db, pCrsr, &
28550 72 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 rowid);. if(
28560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
28570 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 . goto abor
28580 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a t_due_to_error;.
28590 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e }. pOut->
285a0 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 u.i = rowid;.
285b0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d pOut->flags = M
285c0 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 62 72 EM_Int;. }. br
285d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 eak;.}../* Opcod
285e0 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50 e: IdxGE P1 P2 P
285f0 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 3 P4 P5.** Synop
28600 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 sis: key=r[P3@P4
28610 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 ].**.** The P4 r
28620 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 egister values b
28630 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 eginning with P3
28640 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 form an unpacke
28650 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 d index .** key
28660 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50 that omits the P
28670 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d RIMARY KEY. Com
28680 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 pare this key va
28690 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 lue against the
286a0 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 index .** that P
286b0 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 1 is currently p
286c0 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f ointing to, igno
286d0 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 ring the PRIMARY
286e0 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a KEY or ROWID .*
286f0 2a 20 66 69 65 6c 64 73 20 61 74 20 74 68 65 20 * fields at the
28700 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 end..**.** If th
28710 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 e P1 index entry
28720 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e is greater than
28730 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 or equal to the
28740 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 key value.** th
28750 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 en jump to P2.
28760 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 Otherwise fall t
28770 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 hrough to the ne
28780 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a xt instruction..
28790 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 */./* Opcode: Id
287a0 78 47 54 20 50 31 20 50 32 20 50 33 20 50 34 20 xGT P1 P2 P3 P4
287b0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 P5.** Synopsis:
287c0 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a key=r[P3@P4].**.
287d0 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 ** The P4 regist
287e0 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e er values beginn
287f0 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d ing with P3 form
28800 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 an unpacked ind
28810 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 ex .** key that
28820 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 omits the PRIMAR
28830 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 Y KEY. Compare
28840 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 this key value a
28850 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 gainst the index
28860 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 .** that P1 is
28870 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 currently pointi
28880 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 ng to, ignoring
28890 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 the PRIMARY KEY
288a0 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 or ROWID .** fie
288b0 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a lds at the end..
288c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 **.** If the P1
288d0 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 index entry is g
288e0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 reater than the
288f0 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 key value.** the
28900 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f n jump to P2. O
28910 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 therwise fall th
28920 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 rough to the nex
28930 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a t instruction..*
28940 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 /./* Opcode: Idx
28950 4c 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50 LT P1 P2 P3 P4 P
28960 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 5.** Synopsis: k
28970 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a ey=r[P3@P4].**.*
28980 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 * The P4 registe
28990 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 r values beginni
289a0 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 ng with P3 form
289b0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 an unpacked inde
289c0 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f x .** key that o
289d0 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 mits the PRIMARY
289e0 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 KEY or ROWID.
289f0 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 Compare this key
28a00 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a value against.*
28a10 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 * the index that
28a20 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 P1 is currently
28a30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 pointing to, ig
28a40 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 noring the PRIMA
28a50 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 RY KEY or.** ROW
28a60 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 ID on the P1 ind
28a70 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 ex..**.** If the
28a80 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 P1 index entry
28a90 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 is less than the
28aa0 20 6b 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 key value then
28ab0 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f jump to P2..** O
28ac0 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 therwise fall th
28ad0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 rough to the nex
28ae0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a t instruction..*
28af0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 /./* Opcode: Idx
28b00 4c 45 20 50 31 20 50 32 20 50 33 20 50 34 20 50 LE P1 P2 P3 P4 P
28b10 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 5.** Synopsis: k
28b20 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a ey=r[P3@P4].**.*
28b30 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 * The P4 registe
28b40 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 r values beginni
28b50 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 ng with P3 form
28b60 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 an unpacked inde
28b70 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f x .** key that o
28b80 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 mits the PRIMARY
28b90 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 KEY or ROWID.
28ba0 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 Compare this key
28bb0 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a value against.*
28bc0 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 * the index that
28bd0 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 P1 is currently
28be0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 pointing to, ig
28bf0 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 noring the PRIMA
28c00 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 RY KEY or.** ROW
28c10 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 ID on the P1 ind
28c20 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 ex..**.** If the
28c30 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 P1 index entry
28c40 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 is less than or
28c50 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 equal to the key
28c60 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 value then jump
28c70 0a 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 .** to P2. Other
28c80 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 wise fall throug
28c90 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e h to the next in
28ca0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 struction..*/.ca
28cb0 73 65 20 4f 50 5f 49 64 78 4c 45 3a 20 20 20 20 se OP_IdxLE:
28cc0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f /* jump */
28cd0 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 20 .case OP_IdxGT:
28ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 /* jump
28cf0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c */.case OP_IdxL
28d00 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a T: /* j
28d10 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 ump */.case OP_I
28d20 64 78 47 45 3a 20 20 7b 20 20 20 20 20 20 20 2f dxGE: { /
28d30 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 * jump */. Vdbe
28d40 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e Cursor *pC;. in
28d50 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 t res;. Unpacke
28d60 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 dRecord r;.. as
28d70 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 sert( pOp->p1>=0
28d80 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e && pOp->p1<p->n
28d90 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d Cursor );. pC =
28da0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 p->apCsr[pOp->p
28db0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 1];. assert( pC
28dc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 !=0 );. assert(
28dd0 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 pC->isOrdered )
28de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e ;. assert( pC->
28df0 70 43 75 72 73 6f 72 21 3d 30 29 3b 0a 20 20 61 pCursor!=0);. a
28e00 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 ssert( pC->defer
28e10 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a redMoveto==0 );.
28e20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
28e30 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 5==0 || pOp->p5=
28e40 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =1 );. assert(
28e50 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f pOp->p4type==P4_
28e60 49 4e 54 33 32 20 29 3b 0a 20 20 72 2e 70 4b 65 INT32 );. r.pKe
28e70 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 yInfo = pC->pKey
28e80 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 Info;. r.nField
28e90 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e = (u16)pOp->p4.
28ea0 69 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 i;. if( pOp->op
28eb0 63 6f 64 65 3c 4f 50 5f 49 64 78 4c 54 20 29 7b code<OP_IdxLT ){
28ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 . assert( pOp
28ed0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 ->opcode==OP_Idx
28ee0 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 LE || pOp->opcod
28ef0 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 e==OP_IdxGT );.
28f00 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 r.default_rc
28f10 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = -1;. }else{.
28f20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e assert( pOp->
28f30 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 opcode==OP_IdxGE
28f40 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d || pOp->opcode=
28f50 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 =OP_IdxLT );.
28f60 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 r.default_rc =
28f70 30 3b 0a 20 20 7d 0a 20 20 72 2e 61 4d 65 6d 20 0;. }. r.aMem
28f80 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d = &aMem[pOp->p3]
28f90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
28fa0 44 45 42 55 47 0a 20 20 7b 20 69 6e 74 20 69 3b DEBUG. { int i;
28fb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 for(i=0; i<r.nF
28fc0 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 ield; i++) asser
28fd0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 t( memIsValid(&r
28fe0 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 .aMem[i]) ); }.#
28ff0 65 6e 64 69 66 0a 20 20 72 65 73 20 3d 20 30 3b endif. res = 0;
29000 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e /* Not needed.
29010 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 Only used to s
29020 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 ilence a warning
29030 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 . */. rc = sqli
29040 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d te3VdbeIdxKeyCom
29050 70 61 72 65 28 64 62 2c 20 70 43 2c 20 26 72 2c pare(db, pC, &r,
29060 20 26 72 65 73 29 3b 0a 20 20 61 73 73 65 72 74 &res);. assert
29070 28 20 28 4f 50 5f 49 64 78 4c 45 26 31 29 3d 3d ( (OP_IdxLE&1)==
29080 28 4f 50 5f 49 64 78 4c 54 26 31 29 20 26 26 20 (OP_IdxLT&1) &&
29090 28 4f 50 5f 49 64 78 47 45 26 31 29 3d 3d 28 4f (OP_IdxGE&1)==(O
290a0 50 5f 49 64 78 47 54 26 31 29 20 29 3b 0a 20 20 P_IdxGT&1) );.
290b0 69 66 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 if( (pOp->opcode
290c0 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 &1)==(OP_IdxLT&1
290d0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 ) ){. assert(
290e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 pOp->opcode==OP
290f0 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f _IdxLE || pOp->o
29100 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 pcode==OP_IdxLT
29110 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 2d 72 65 );. res = -re
29120 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 s;. }else{.
29130 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 assert( pOp->opc
29140 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c ode==OP_IdxGE ||
29150 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 pOp->opcode==OP
29160 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72 65 _IdxGT );. re
29170 73 2b 2b 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 s++;. }. VdbeB
29180 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 3e 30 ranchTaken(res>0
29190 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 3e 30 ,2);. if( res>0
291a0 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f ) goto jump_to_
291b0 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a p2;. break;.}..
291c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73 74 72 /* Opcode: Destr
291d0 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a oy P1 P2 P3 * *.
291e0 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 **.** Delete an
291f0 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20 entire database
29200 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 table or index w
29210 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 hose root page i
29220 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a n the database.*
29230 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 * file is given
29240 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 by P1..**.** The
29250 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73 table being des
29260 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65 troyed is in the
29270 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 main database f
29280 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20 20 49 ile if P3==0. I
29290 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20 f.** P3==1 then
292a0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 the table to be
292b0 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 clear is in the
292c0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 auxiliary databa
292d0 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 se file.** that
292e0 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 is used to store
292f0 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 tables create u
29300 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 sing CREATE TEMP
29310 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a ORARY TABLE..**.
29320 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d ** If AUTOVACUUM
29330 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e is enabled then
29340 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 it is possible
29350 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f that another roo
29360 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 t page.** might
29370 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 be moved into th
29380 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65 64 20 e newly deleted
29390 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f 72 64 root page in ord
293a0 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a er to keep all.*
293b0 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e * root pages con
293c0 74 69 67 75 6f 75 73 20 61 74 20 74 68 65 20 62 tiguous at the b
293d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 eginning of the
293e0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 66 database. The f
293f0 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f ormer.** value o
29400 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 f the root page
29410 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69 74 73 that moved - its
29420 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 value before th
29430 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65 64 20 e move occurred
29440 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 -.** is stored i
29450 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 n register P2.
29460 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a 2a 20 6d If no page .** m
29470 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65 71 75 ovement was requ
29480 69 72 65 64 20 28 62 65 63 61 75 73 65 20 74 68 ired (because th
29490 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 e table being dr
294a0 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65 61 64 opped was alread
294b0 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 6f y .** the last o
294c0 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 ne in the databa
294d0 73 65 29 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 se) then a zero
294e0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 is stored in reg
294f0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 49 66 20 ister P2..** If
29500 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69 AUTOVACUUM is di
29510 73 61 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 sabled then a ze
29520 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 ro is stored in
29530 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a register P2..**.
29540 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65 ** See also: Cle
29550 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 ar.*/.case OP_De
29560 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20 stroy: { /*
29570 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d out2 */. int iM
29580 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 44 62 3b oved;. int iDb;
29590 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 .. assert( p->r
295a0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 eadOnly==0 );.
295b0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 pOut = out2Prere
295c0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 lease(p, pOp);.
295d0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d pOut->flags = M
295e0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 64 EM_Null;. if( d
295f0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 3e 20 64 b->nVdbeRead > d
29600 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20 29 b->nVDestroy+1 )
29610 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 {. rc = SQLIT
29620 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d E_LOCKED;. p-
29630 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f >errorAction = O
29640 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 65 6c 73 65 E_Abort;. }else
29650 7b 0a 20 20 20 20 69 44 62 20 3d 20 70 4f 70 2d {. iDb = pOp-
29660 3e 70 33 3b 0a 20 20 20 20 61 73 73 65 72 74 28 >p3;. assert(
29670 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 DbMaskTest(p->b
29680 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 treeMask, iDb) )
29690 3b 0a 20 20 20 20 69 4d 6f 76 65 64 20 3d 20 30 ;. iMoved = 0
296a0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 ; /* Not needed
296b0 2e 20 20 4f 6e 6c 79 20 74 6f 20 73 69 6c 65 6e . Only to silen
296c0 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f ce a warning. */
296d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
296e0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 3BtreeDropTable(
296f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 db->aDb[iDb].pBt
29700 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 , pOp->p1, &iMov
29710 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 ed);. pOut->f
29720 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
29730 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 pOut->u.i =
29740 69 4d 6f 76 65 64 3b 0a 23 69 66 6e 64 65 66 20 iMoved;.#ifndef
29750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f SQLITE_OMIT_AUTO
29760 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 72 VACUUM. if( r
29770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
29780 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20 20 iMoved!=0 ){.
29790 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 sqlite3RootPa
297a0 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44 62 2c geMoved(db, iDb,
297b0 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31 iMoved, pOp->p1
297c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 );. /* All
297d0 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72 61 OP_Destroy opera
297e0 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20 74 tions occur on t
297f0 68 65 20 73 61 6d 65 20 62 74 72 65 65 20 2a 2f he same btree */
29800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 . assert( r
29810 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c esetSchemaOnFaul
29820 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53 63 68 t==0 || resetSch
29830 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62 2b emaOnFault==iDb+
29840 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 1 );. reset
29850 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 SchemaOnFault =
29860 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65 6e iDb+1;. }.#en
29870 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b dif. }. break;
29880 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 .}../* Opcode: C
29890 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a 2a 2a lear P1 P2 P3.**
298a0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 .** Delete all c
298b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 ontents of the d
298c0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 atabase table or
298d0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f index whose roo
298e0 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65 t page.** in the
298f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
29900 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 20 20 s given by P1.
29910 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74 But, unlike Dest
29920 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 roy, do not.** r
29930 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 emove the table
29940 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 or index from th
29950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e e database file.
29960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 .**.** The table
29970 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69 73 20 being clear is
29980 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 in the main data
29990 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d base file if P2=
299a0 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 =0. If.** P2==1
299b0 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 then the table
299c0 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 to be clear is i
299d0 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 n the auxiliary
299e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a database file.**
299f0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f that is used to
29a00 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 store tables cr
29a10 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 eate using CREAT
29a20 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c E TEMPORARY TABL
29a30 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 E..**.** If the
29a40 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d P3 value is non-
29a50 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 74 zero, then the t
29a60 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f able referred to
29a70 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69 must be an.** i
29a80 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61 6e 20 ntkey table (an
29a90 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 SQL table, not a
29aa0 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68 69 n index). In thi
29ab0 73 20 63 61 73 65 20 74 68 65 20 72 6f 77 20 63 s case the row c
29ac0 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 hange .** count
29ad0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 is incremented b
29ae0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 y the number of
29af0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c rows in the tabl
29b00 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e e being cleared.
29b10 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 67 72 .** If P3 is gr
29b20 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c eater than zero,
29b30 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 then the value
29b40 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 stored in regist
29b50 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f er P3 is.** also
29b60 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 incremented by
29b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f the number of ro
29b80 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 ws in the table
29b90 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a being cleared..*
29ba0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44 *.** See also: D
29bb0 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f estroy.*/.case O
29bc0 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74 P_Clear: {. int
29bd0 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20 6e 43 nChange;. . nC
29be0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73 73 hange = 0;. ass
29bf0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 ert( p->readOnly
29c00 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 ==0 );. assert(
29c10 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 DbMaskTest(p->b
29c20 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 treeMask, pOp->p
29c30 32 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 2) );. rc = sql
29c40 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 ite3BtreeClearTa
29c50 62 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e 61 ble(. db->a
29c60 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c Db[pOp->p2].pBt,
29c70 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e pOp->p1, (pOp->
29c80 70 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20 p3 ? &nChange :
29c90 30 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4f 0). );. if( pO
29ca0 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e p->p3 ){. p->
29cb0 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e nChange += nChan
29cc0 67 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d ge;. if( pOp-
29cd0 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 >p3>0 ){. a
29ce0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 ssert( memIsVali
29cf0 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d d(&aMem[pOp->p3]
29d00 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 ) );. memAb
29d10 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 outToChange(p, &
29d20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a aMem[pOp->p3]);.
29d30 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e aMem[pOp->
29d40 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e p3].u.i += nChan
29d50 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 ge;. }. }.
29d60 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
29d70 6f 64 65 3a 20 52 65 73 65 74 53 6f 72 74 65 72 ode: ResetSorter
29d80 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a P1 * * * *.**.*
29d90 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e * Delete all con
29da0 74 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 65 tents from the e
29db0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f phemeral table o
29dc0 72 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74 r sorter.** that
29dd0 20 69 73 20 6f 70 65 6e 20 6f 6e 20 63 75 72 73 is open on curs
29de0 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 or P1..**.** Thi
29df0 73 20 6f 70 63 6f 64 65 20 6f 6e 6c 79 20 77 6f s opcode only wo
29e00 72 6b 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 rks for cursors
29e10 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 used for sorting
29e20 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 and.** opened w
29e30 69 74 68 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d ith OP_OpenEphem
29e40 65 72 61 6c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 eral or OP_Sorte
29e50 72 4f 70 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f rOpen..*/.case O
29e60 50 5f 52 65 73 65 74 53 6f 72 74 65 72 3a 20 7b P_ResetSorter: {
29e70 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 . VdbeCursor *p
29e80 43 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 70 C;. . assert( p
29e90 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 Op->p1>=0 && pOp
29ea0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 ->p1<p->nCursor
29eb0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 );. pC = p->apC
29ec0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 sr[pOp->p1];. a
29ed0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a ssert( pC!=0 );.
29ee0 20 20 69 66 28 20 70 43 2d 3e 70 53 6f 72 74 65 if( pC->pSorte
29ef0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 r ){. sqlite3
29f00 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28 VdbeSorterReset(
29f10 64 62 2c 20 70 43 2d 3e 70 53 6f 72 74 65 72 29 db, pC->pSorter)
29f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 ;. }else{. a
29f30 73 73 65 72 74 28 20 70 43 2d 3e 69 73 45 70 68 ssert( pC->isEph
29f40 65 6d 65 72 61 6c 20 29 3b 0a 20 20 20 20 72 63 emeral );. rc
29f50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
29f60 6c 65 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f learTableOfCurso
29f70 72 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a r(pC->pCursor);.
29f80 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a }. break;.}..
29f90 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 /* Opcode: Creat
29fa0 65 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20 2a eTable P1 P2 * *
29fb0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
29fc0 72 5b 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 r[P2]=root iDb=P
29fd0 31 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 1.**.** Allocate
29fe0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 a new table in
29ff0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 the main databas
2a000 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 e file if P1==0
2a010 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 or in the.** aux
2a020 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 iliary database
2a030 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 file if P1==1 or
2a040 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 in an attached
2a050 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 database if.** P
2a060 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 1>1. Write the
2a070 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 root page number
2a080 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c of the new tabl
2a090 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 e into.** regist
2a0a0 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 er P2.**.** The
2a0b0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 difference betwe
2a0c0 65 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 en a table and a
2a0d0 6e 20 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a n index is this:
2a0e0 20 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a A table must.*
2a0f0 2a 20 68 61 76 65 20 61 20 34 2d 62 79 74 65 20 * have a 4-byte
2a100 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20 integer key and
2a110 63 61 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 can have arbitra
2a120 72 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64 ry data. An ind
2a130 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62 ex.** has an arb
2a140 69 74 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e itrary key but n
2a150 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 o data..**.** Se
2a160 65 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e e also: CreateIn
2a170 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 dex.*/./* Opcode
2a180 3a 20 43 72 65 61 74 65 49 6e 64 65 78 20 50 31 : CreateIndex P1
2a190 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e P2 * * *.** Syn
2a1a0 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f opsis: r[P2]=roo
2a1b0 74 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41 t iDb=P1.**.** A
2a1c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 69 6e llocate a new in
2a1d0 64 65 78 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 dex in the main
2a1e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 database file if
2a1f0 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 P1==0 or in the
2a200 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 .** auxiliary da
2a210 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 tabase file if P
2a220 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 1==1 or in an at
2a230 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 tached database
2a240 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 if.** P1>1. Wri
2a250 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 te the root page
2a260 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e number of the n
2a270 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a ew table into.**
2a280 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a register P2..**
2a290 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e 74 .** See document
2a2a0 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65 61 ation on OP_Crea
2a2b0 74 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64 69 teTable for addi
2a2c0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 tional informati
2a2d0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 on..*/.case OP_C
2a2e0 72 65 61 74 65 49 6e 64 65 78 3a 20 20 20 20 20 reateIndex:
2a2f0 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a /* out2 *
2a300 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 /.case OP_Create
2a310 54 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 Table: {
2a320 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 /* out2 */. i
2a330 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66 nt pgno;. int f
2a340 6c 61 67 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b lags;. Db *pDb;
2a350 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 .. pOut = out2P
2a360 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 rerelease(p, pOp
2a370 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 );. pgno = 0;.
2a380 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 assert( pOp->p1
2a390 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 >=0 && pOp->p1<d
2a3a0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 b->nDb );. asse
2a3b0 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 rt( DbMaskTest(p
2a3c0 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 ->btreeMask, pOp
2a3d0 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72 ->p1) );. asser
2a3e0 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d t( p->readOnly==
2a3f0 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 0 );. pDb = &db
2a400 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a ->aDb[pOp->p1];.
2a410 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 assert( pDb->p
2a420 42 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 Bt!=0 );. if( p
2a430 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 Op->opcode==OP_C
2a440 72 65 61 74 65 54 61 62 6c 65 20 29 7b 0a 20 20 reateTable ){.
2a450 20 20 2f 2a 20 66 6c 61 67 73 20 3d 20 42 54 52 /* flags = BTR
2a460 45 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20 20 EE_INTKEY; */.
2a470 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f flags = BTREE_
2a480 49 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b INTKEY;. }else{
2a490 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52 . flags = BTR
2a4a0 45 45 5f 42 4c 4f 42 4b 45 59 3b 0a 20 20 7d 0a EE_BLOBKEY;. }.
2a4b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
2a4c0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 reeCreateTable(p
2a4d0 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 Db->pBt, &pgno,
2a4e0 66 6c 61 67 73 29 3b 0a 20 20 70 4f 75 74 2d 3e flags);. pOut->
2a4f0 75 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 u.i = pgno;. br
2a500 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 eak;.}../* Opcod
2a510 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61 20 50 e: ParseSchema P
2a520 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 1 * * P4 *.**.**
2a530 20 52 65 61 64 20 61 6e 64 20 70 61 72 73 65 20 Read and parse
2a540 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72 6f 6d all entries from
2a550 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 the SQLITE_MAST
2a560 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 ER table of data
2a570 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61 74 20 base P1.** that
2a580 6d 61 74 63 68 20 74 68 65 20 57 48 45 52 45 20 match the WHERE
2a590 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a clause P4. .**.*
2a5a0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e * This opcode in
2a5b0 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73 65 72 vokes the parser
2a5c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 to create a new
2a5d0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 virtual machine
2a5e0 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20 74 ,.** then runs t
2a5f0 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d he new virtual m
2a600 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73 20 74 achine. It is t
2a610 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61 6e 74 hus a re-entrant
2a620 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 opcode..*/.case
2a630 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 3a OP_ParseSchema:
2a640 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 {. int iDb;.
2a650 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 const char *zMas
2a660 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 ter;. char *zSq
2a670 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20 69 6e l;. InitData in
2a680 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e itData;.. /* An
2a690 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 y prepared state
2a6a0 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f 6b 65 ment that invoke
2a6b0 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69 s this opcode wi
2a6c0 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a ll hold mutexes.
2a6d0 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20 62 74 ** on every bt
2a6e0 72 65 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 ree. This is a
2a6f0 70 72 65 72 65 71 75 69 73 69 74 65 20 66 6f 72 prerequisite for
2a700 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 invoking . **
2a710 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 sqlite3InitCallb
2a720 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 ack().. */.#ifd
2a730 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
2a740 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 for(iDb=0; iDb
2a750 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 <db->nDb; iDb++)
2a760 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 {. assert( iD
2a770 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 b==1 || sqlite3B
2a780 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 treeHoldsMutex(d
2a790 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 b->aDb[iDb].pBt)
2a7a0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a );. }.#endif..
2a7b0 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b iDb = pOp->p1;
2a7c0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d . assert( iDb>=
2a7d0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 0 && iDb<db->nDb
2a7e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 );. assert( Db
2a7f0 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 HasProperty(db,
2a800 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f iDb, DB_SchemaLo
2a810 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a 20 55 73 aded) );. /* Us
2a820 65 64 20 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 ed to be a condi
2a830 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20 20 tional */ {.
2a840 7a 4d 61 73 74 65 72 20 3d 20 53 43 48 45 4d 41 zMaster = SCHEMA
2a850 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 _TABLE(iDb);.
2a860 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 initData.db = d
2a870 62 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e b;. initData.
2a880 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 iDb = pOp->p1;.
2a890 20 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 initData.pzEr
2a8a0 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d rMsg = &p->zErrM
2a8b0 73 67 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 sg;. zSql = s
2a8c0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 qlite3MPrintf(db
2a8d0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 ,. "SELECT
2a8e0 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c name, rootpage,
2a8f0 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25 sql FROM '%q'.%
2a900 73 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 s WHERE %s ORDER
2a910 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 BY rowid",.
2a920 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e db->aDb[iDb].
2a930 7a 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 zName, zMaster,
2a940 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 pOp->p4.z);.
2a950 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 if( zSql==0 ){.
2a960 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
2a970 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 _NOMEM;. }els
2a980 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 e{. assert(
2a990 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d db->init.busy==
2a9a0 30 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 0 );. db->i
2a9b0 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 nit.busy = 1;.
2a9c0 20 20 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 initData.rc
2a9d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 = SQLITE_OK;.
2a9e0 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e assert( !db->
2a9f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
2aa00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
2aa10 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c e3_exec(db, zSql
2aa20 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c , sqlite3InitCal
2aa30 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 lback, &initData
2aa40 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 , 0);. if(
2aa50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 rc==SQLITE_OK )
2aa60 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 rc = initData.rc
2aa70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 ;. sqlite3D
2aa80 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b bFree(db, zSql);
2aa90 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e . db->init.
2aaa0 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a busy = 0;. }.
2aab0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 73 }. if( rc ) s
2aac0 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 qlite3ResetAllSc
2aad0 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f hemasOfConnectio
2aae0 6e 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d n(db);. if( rc=
2aaf0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b =SQLITE_NOMEM ){
2ab00 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d . goto no_mem
2ab10 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 ;. }. break;
2ab20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 .}..#if !defined
2ab30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 (SQLITE_OMIT_ANA
2ab40 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a LYZE)./* Opcode:
2ab50 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31 LoadAnalysis P1
2ab60 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 * * * *.**.** R
2ab70 65 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 ead the sqlite_s
2ab80 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64 tat1 table for d
2ab90 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c atabase P1 and l
2aba0 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a oad the content.
2abb0 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 ** of that table
2abc0 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e into the intern
2abd0 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 al index hash ta
2abe0 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 ble. This will
2abf0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 cause.** the ana
2ac00 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73 65 64 lysis to be used
2ac10 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 when preparing
2ac20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71 all subsequent q
2ac30 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 ueries..*/.case
2ac40 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a OP_LoadAnalysis:
2ac50 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 {. assert( pOp
2ac60 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e ->p1>=0 && pOp->
2ac70 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 p1<db->nDb );.
2ac80 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c rc = sqlite3Anal
2ac90 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70 ysisLoad(db, pOp
2aca0 2d 3e 70 31 29 3b 0a 20 20 62 72 65 61 6b 3b 20 ->p1);. break;
2acb0 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 .}.#endif /* !d
2acc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
2acd0 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a 0a IT_ANALYZE) */..
2ace0 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 /* Opcode: DropT
2acf0 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34 20 2a able P1 * * P4 *
2ad00 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 .**.** Remove th
2ad10 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d e internal (in-m
2ad20 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 emory) data stru
2ad30 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 ctures that desc
2ad40 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c ribe.** the tabl
2ad50 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 e named P4 in da
2ad60 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 tabase P1. This
2ad70 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 is called after
2ad80 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64 a table.** is d
2ad90 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b ropped from disk
2ada0 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 (using the Dest
2adb0 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f roy opcode) in o
2adc0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a rder to keep .**
2add0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 the internal re
2ade0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 presentation of
2adf0 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f the.** schema co
2ae00 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 nsistent with wh
2ae10 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a at is on disk..*
2ae20 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 61 /.case OP_DropTa
2ae30 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 ble: {. sqlite3
2ae40 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 UnlinkAndDeleteT
2ae50 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 able(db, pOp->p1
2ae60 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 , pOp->p4.z);.
2ae70 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
2ae80 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20 50 ode: DropIndex P
2ae90 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 1 * * P4 *.**.**
2aea0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 Remove the inte
2aeb0 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 rnal (in-memory)
2aec0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 data structures
2aed0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a that describe.*
2aee0 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 * the index name
2aef0 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 d P4 in database
2af00 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 P1. This is ca
2af10 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e lled after an in
2af20 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 dex.** is droppe
2af30 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 d from disk (usi
2af40 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f ng the Destroy o
2af50 70 63 6f 64 65 29 0a 2a 2a 20 69 6e 20 6f 72 64 pcode).** in ord
2af60 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 er to keep the i
2af70 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e nternal represen
2af80 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a tation of the.**
2af90 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 schema consiste
2afa0 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20 nt with what is
2afb0 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 on disk..*/.case
2afc0 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20 7b OP_DropIndex: {
2afd0 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b . sqlite3Unlink
2afe0 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 AndDeleteIndex(d
2aff0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d b, pOp->p1, pOp-
2b000 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b >p4.z);. break;
2b010 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 .}../* Opcode: D
2b020 72 6f 70 54 72 69 67 67 65 72 20 50 31 20 2a 20 ropTrigger P1 *
2b030 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d * P4 *.**.** Rem
2b040 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c ove the internal
2b050 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 (in-memory) dat
2b060 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 a structures tha
2b070 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 t describe.** th
2b080 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 64 20 e trigger named
2b090 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 P4 in database P
2b0a0 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 1. This is call
2b0b0 65 64 20 61 66 74 65 72 20 61 20 74 72 69 67 67 ed after a trigg
2b0c0 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 er.** is dropped
2b0d0 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e from disk (usin
2b0e0 67 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70 g the Destroy op
2b0f0 63 6f 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74 code) in order t
2b100 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69 o keep .** the i
2b110 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e nternal represen
2b120 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a tation of the.**
2b130 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 schema consiste
2b140 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20 nt with what is
2b150 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 on disk..*/.case
2b160 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a OP_DropTrigger:
2b170 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 {. sqlite3Unli
2b180 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 nkAndDeleteTrigg
2b190 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 er(db, pOp->p1,
2b1a0 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 pOp->p4.z);. br
2b1b0 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 eak;.}...#ifndef
2b1c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 SQLITE_OMIT_INT
2b1d0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 EGRITY_CHECK./*
2b1e0 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74 Opcode: Integrit
2b1f0 79 43 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50 yCk P1 P2 P3 * P
2b200 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 5.**.** Do an an
2b210 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63 75 alysis of the cu
2b220 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 rrently open dat
2b230 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e abase. Store in
2b240 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 .** register P1
2b250 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 the text of an e
2b260 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73 rror message des
2b270 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62 cribing any prob
2b280 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 lems..** If no p
2b290 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e roblems are foun
2b2a0 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 d, store a NULL
2b2b0 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a in register P1..
2b2c0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 **.** The regist
2b2d0 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 er P3 contains t
2b2e0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 he maximum numbe
2b2f0 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 r of allowed err
2b300 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 ors..** At most
2b310 72 65 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 reg(P3) errors w
2b320 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e ill be reported.
2b330 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 .** In other wor
2b340 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 ds, the analysis
2b350 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 stops as soon a
2b360 73 20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 s reg(P1) errors
2b370 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 are .** seen.
2b380 52 65 67 28 50 31 29 20 69 73 20 75 70 64 61 74 Reg(P1) is updat
2b390 65 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 ed with the numb
2b3a0 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d er of errors rem
2b3b0 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 aining..**.** Th
2b3c0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 e root page numb
2b3d0 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 ers of all table
2b3e0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 s in the databas
2b3f0 65 20 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a e are integer.**
2b400 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50 stored in reg(P
2b410 31 29 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72 1), reg(P1+1), r
2b420 65 67 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20 eg(P1+2), ....
2b430 54 68 65 72 65 20 61 72 65 20 50 32 20 74 61 62 There are P2 tab
2b440 6c 65 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a les.** total..**
2b450 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 .** If P5 is not
2b460 20 7a 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b zero, the check
2b470 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 is done on the
2b480 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 auxiliary databa
2b490 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 se.** file, not
2b4a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 the main databas
2b4b0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 e file..**.** Th
2b4c0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 is opcode is use
2b4d0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 d to implement t
2b4e0 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 he integrity_che
2b4f0 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 ck pragma..*/.ca
2b500 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 se OP_IntegrityC
2b510 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 k: {. int nRoot
2b520 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 ; /* Number
2b530 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 of tables to ch
2b540 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 eck. (Number of
2b550 20 72 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f root pages.) */
2b560 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 . int *aRoot;
2b570 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 /* Array of r
2b580 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 ootpage numbers
2b590 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 for tables to be
2b5a0 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e checked */. in
2b5b0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a t j; /*
2b5c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f Loop counter */
2b5d0 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 . int nErr;
2b5e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
2b5f0 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20 errors reported
2b600 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 */. char *z;
2b610 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 /* Text of
2b620 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74 the error report
2b630 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 */. Mem *pnErr
2b640 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 ; /* Registe
2b650 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 r keeping track
2b660 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e of errors remain
2b670 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 ing */.. assert
2b680 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 ( p->bIsReader )
2b690 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d ;. nRoot = pOp-
2b6a0 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e >p2;. assert( n
2b6b0 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f Root>0 );. aRoo
2b6c0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c t = sqlite3DbMal
2b6d0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f locRaw(db, sizeo
2b6e0 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29 f(int)*(nRoot+1)
2b6f0 20 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d );. if( aRoot=
2b700 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d =0 ) goto no_mem
2b710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d ;. assert( pOp-
2b720 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 >p3>0 && pOp->p3
2b730 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 43 <=(p->nMem-p->nC
2b740 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e 45 72 ursor) );. pnEr
2b750 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 r = &aMem[pOp->p
2b760 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 3];. assert( (p
2b770 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45 nErr->flags & ME
2b780 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61 M_Int)!=0 );. a
2b790 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 ssert( (pnErr->f
2b7a0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c lags & (MEM_Str|
2b7b0 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b MEM_Blob))==0 );
2b7c0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b . pIn1 = &aMem[
2b7d0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 pOp->p1];. for(
2b7e0 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b 20 6a 2b j=0; j<nRoot; j+
2b7f0 2b 29 7b 0a 20 20 20 20 61 52 6f 6f 74 5b 6a 5d +){. aRoot[j]
2b800 20 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 = (int)sqlite3V
2b810 64 62 65 49 6e 74 56 61 6c 75 65 28 26 70 49 6e dbeIntValue(&pIn
2b820 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 6f 1[j]);. }. aRo
2b830 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61 73 73 ot[j] = 0;. ass
2b840 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d ert( pOp->p5<db-
2b850 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 >nDb );. assert
2b860 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e ( DbMaskTest(p->
2b870 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e btreeMask, pOp->
2b880 70 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c p5) );. z = sql
2b890 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 ite3BtreeIntegri
2b8a0 74 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b tyCheck(db->aDb[
2b8b0 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 pOp->p5].pBt, aR
2b8c0 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 oot, nRoot,.
2b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e (in
2b8f0 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e t)pnErr->u.i, &n
2b900 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 Err);. sqlite3D
2b910 62 46 72 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 bFree(db, aRoot)
2b920 3b 0a 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d ;. pnErr->u.i -
2b930 3d 20 6e 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 = nErr;. sqlite
2b940 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 3VdbeMemSetNull(
2b950 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 pIn1);. if( nEr
2b960 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 r==0 ){. asse
2b970 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 rt( z==0 );. }e
2b980 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a lse if( z==0 ){.
2b990 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b goto no_mem;
2b9a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 . }else{. sq
2b9b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 lite3VdbeMemSetS
2b9c0 74 72 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 tr(pIn1, z, -1,
2b9d0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c SQLITE_UTF8, sql
2b9e0 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a ite3_free);. }.
2b9f0 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f UPDATE_MAX_BLO
2ba00 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 BSIZE(pIn1);. s
2ba10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
2ba20 45 6e 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 Encoding(pIn1, e
2ba30 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 ncoding);. brea
2ba40 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 k;.}.#endif /* S
2ba50 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 QLITE_OMIT_INTEG
2ba60 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f RITY_CHECK */../
2ba70 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 * Opcode: RowSet
2ba80 41 64 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a Add P1 P2 * * *.
2ba90 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 20 72 6f ** Synopsis: ro
2baa0 77 73 65 74 28 50 31 29 3d 72 5b 50 32 5d 0a 2a wset(P1)=r[P2].*
2bab0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 *.** Insert the
2bac0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 integer value he
2bad0 6c 64 20 62 79 20 72 65 67 69 73 74 65 72 20 50 ld by register P
2bae0 32 20 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 2 into a boolean
2baf0 20 69 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 index.** held i
2bb00 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a n register P1..*
2bb10 2a 0a 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f *.** An assertio
2bb20 6e 20 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 n fails if P2 is
2bb30 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e not an integer.
2bb40 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 .*/.case OP_RowS
2bb50 65 74 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f etAdd: { /
2bb60 2a 20 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 * in1, in2 */.
2bb70 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 pIn1 = &aMem[pOp
2bb80 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 ->p1];. pIn2 =
2bb90 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a &aMem[pOp->p2];.
2bba0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d assert( (pIn2-
2bbb0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 >flags & MEM_Int
2bbc0 29 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 )!=0 );. if( (p
2bbd0 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d In1->flags & MEM
2bbe0 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 _RowSet)==0 ){.
2bbf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
2bc00 6d 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 mSetRowSet(pIn1)
2bc10 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d ;. if( (pIn1-
2bc20 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 >flags & MEM_Row
2bc30 53 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e Set)==0 ) goto n
2bc40 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c o_mem;. }. sql
2bc50 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 ite3RowSetInsert
2bc60 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 (pIn1->u.pRowSet
2bc70 2c 20 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 , pIn2->u.i);.
2bc80 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
2bc90 6f 64 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 ode: RowSetRead
2bca0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 P1 P2 P3 * *.**
2bcb0 53 79 6e 6f 70 73 69 73 3a 20 20 72 5b 50 33 5d Synopsis: r[P3]
2bcc0 3d 72 6f 77 73 65 74 28 50 31 29 0a 2a 2a 0a 2a =rowset(P1).**.*
2bcd0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6d * Extract the sm
2bce0 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f allest value fro
2bcf0 6d 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 m boolean index
2bd00 50 31 20 61 6e 64 20 70 75 74 20 74 68 61 74 20 P1 and put that
2bd10 76 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 value into.** re
2bd20 67 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 gister P3. Or,
2bd30 69 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 if boolean index
2bd40 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 P1 is initially
2bd50 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 empty, leave P3
2bd60 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e .** unchanged an
2bd70 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 d jump to instru
2bd80 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 ction P2..*/.cas
2bd90 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a e OP_RowSetRead:
2bda0 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 { /* jump
2bdb0 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 , in1, out3 */.
2bdc0 20 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49 6e i64 val;.. pIn
2bdd0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 1 = &aMem[pOp->p
2bde0 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 1];. if( (pIn1-
2bdf0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 >flags & MEM_Row
2be00 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 Set)==0 . || s
2be10 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74 qlite3RowSetNext
2be20 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 (pIn1->u.pRowSet
2be30 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a , &val)==0. ){.
2be40 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 /* The boole
2be50 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 an index is empt
2be60 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 y */. sqlite3
2be70 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 VdbeMemSetNull(p
2be80 49 6e 31 29 3b 0a 20 20 20 20 56 64 62 65 42 72 In1);. VdbeBr
2be90 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b 0a anchTaken(1,2);.
2bea0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f goto jump_to
2beb0 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f _p2_and_check_fo
2bec0 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d r_interrupt;. }
2bed0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 else{. /* A v
2bee0 61 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 alue was pulled
2bef0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a from the index *
2bf00 2f 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 /. VdbeBranch
2bf10 54 61 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20 20 Taken(0,2);.
2bf20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
2bf30 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 tInt64(&aMem[pOp
2bf40 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d ->p3], val);. }
2bf50 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f . goto check_fo
2bf60 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a r_interrupt;.}..
2bf70 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 /* Opcode: RowSe
2bf80 74 54 65 73 74 20 50 31 20 50 32 20 50 33 20 50 tTest P1 P2 P3 P
2bf90 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 4.** Synopsis: i
2bfa0 66 20 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73 65 f r[P3] in rowse
2bfb0 74 28 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a 2a t(P1) goto P2.**
2bfc0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33 20 .** Register P3
2bfd0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 6f is assumed to ho
2bfe0 6c 64 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 ld a 64-bit inte
2bff0 67 65 72 20 76 61 6c 75 65 2e 20 49 66 20 72 65 ger value. If re
2c000 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f 6e gister P1.** con
2c010 74 61 69 6e 73 20 61 20 52 6f 77 53 65 74 20 6f tains a RowSet o
2c020 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 52 bject and that R
2c030 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e owSet object con
2c040 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c tains.** the val
2c050 75 65 20 68 65 6c 64 20 69 6e 20 50 33 2c 20 6a ue held in P3, j
2c060 75 6d 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 ump to register
2c070 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 P2. Otherwise, i
2c080 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e 74 nsert the.** int
2c090 65 67 65 72 20 69 6e 20 50 33 20 69 6e 74 6f 20 eger in P3 into
2c0a0 74 68 65 20 52 6f 77 53 65 74 20 61 6e 64 20 63 the RowSet and c
2c0b0 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74 68 ontinue on to th
2c0c0 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64 65 e.** next opcode
2c0d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77 53 ..**.** The RowS
2c0e0 65 74 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 74 et object is opt
2c0f0 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 65 20 63 imized for the c
2c100 61 73 65 20 77 68 65 72 65 20 73 75 63 63 65 73 ase where succes
2c110 73 69 76 65 20 73 65 74 73 0a 2a 2a 20 6f 66 20 sive sets.** of
2c120 69 6e 74 65 67 65 72 73 2c 20 77 68 65 72 65 20 integers, where
2c130 65 61 63 68 20 73 65 74 20 63 6f 6e 74 61 69 6e each set contain
2c140 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73 2e s no duplicates.
2c150 20 45 61 63 68 20 73 65 74 0a 2a 2a 20 6f 66 20 Each set.** of
2c160 76 61 6c 75 65 73 20 69 73 20 69 64 65 6e 74 69 values is identi
2c170 66 69 65 64 20 62 79 20 61 20 75 6e 69 71 75 65 fied by a unique
2c180 20 50 34 20 76 61 6c 75 65 2e 20 54 68 65 20 66 P4 value. The f
2c190 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73 74 irst set.** must
2c1a0 20 68 61 76 65 20 50 34 3d 3d 30 2c 20 74 68 65 have P4==0, the
2c1b0 20 66 69 6e 61 6c 20 73 65 74 20 50 34 3d 2d 31 final set P4=-1
2c1c0 2e 20 20 50 34 20 6d 75 73 74 20 62 65 20 65 69 . P4 must be ei
2c1d0 74 68 65 72 20 2d 31 20 6f 72 0a 2a 2a 20 6e 6f ther -1 or.** no
2c1e0 6e 2d 6e 65 67 61 74 69 76 65 2e 20 20 46 6f 72 n-negative. For
2c1f0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 non-negative va
2c200 6c 75 65 73 20 6f 66 20 50 34 20 6f 6e 6c 79 20 lues of P4 only
2c210 74 68 65 20 6c 6f 77 65 72 20 34 0a 2a 2a 20 62 the lower 4.** b
2c220 69 74 73 20 61 72 65 20 73 69 67 6e 69 66 69 63 its are signific
2c230 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ant..**.** This
2c240 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61 74 allows optimizat
2c250 69 6f 6e 73 3a 20 28 61 29 20 77 68 65 6e 20 50 ions: (a) when P
2c260 34 3d 3d 30 20 74 68 65 72 65 20 69 73 20 6e 6f 4==0 there is no
2c270 20 6e 65 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a need to test.**
2c280 20 74 68 65 20 72 6f 77 73 65 74 20 6f 62 6a 65 the rowset obje
2c290 63 74 20 66 6f 72 20 50 33 2c 20 61 73 20 69 74 ct for P3, as it
2c2a0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e is guaranteed n
2c2b0 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 74 ot to contain it
2c2c0 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e 20 50 34 ,.** (b) when P4
2c2d0 3d 3d 2d 31 20 74 68 65 72 65 20 69 73 20 6e 6f ==-1 there is no
2c2e0 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 need to insert
2c2f0 74 68 65 20 76 61 6c 75 65 2c 20 61 73 20 69 74 the value, as it
2c300 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 will.** never b
2c310 65 20 74 65 73 74 65 64 20 66 6f 72 2c 20 61 6e e tested for, an
2c320 64 20 28 63 29 20 77 68 65 6e 20 61 20 76 61 6c d (c) when a val
2c330 75 65 20 74 68 61 74 20 69 73 20 70 61 72 74 20 ue that is part
2c340 6f 66 20 73 65 74 20 58 20 69 73 0a 2a 2a 20 69 of set X is.** i
2c350 6e 73 65 72 74 65 64 2c 20 74 68 65 72 65 20 69 nserted, there i
2c360 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 s no need to sea
2c370 72 63 68 20 74 6f 20 73 65 65 20 69 66 20 74 68 rch to see if th
2c380 65 20 73 61 6d 65 20 76 61 6c 75 65 20 77 61 73 e same value was
2c390 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 .** previously i
2c3a0 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20 nserted as part
2c3b0 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c 79 20 69 of set X (only i
2c3c0 66 20 69 74 20 77 61 73 20 70 72 65 76 69 6f 75 f it was previou
2c3d0 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 sly.** inserted
2c3e0 61 73 20 70 61 72 74 20 6f 66 20 73 6f 6d 65 20 as part of some
2c3f0 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 other set)..*/.c
2c400 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 ase OP_RowSetTes
2c410 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 t: {
2c420 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 /* jump
2c430 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 , in1, in3 */.
2c440 69 6e 74 20 69 53 65 74 3b 0a 20 20 69 6e 74 20 int iSet;. int
2c450 65 78 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31 20 exists;.. pIn1
2c460 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d = &aMem[pOp->p1]
2c470 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d ;. pIn3 = &aMem
2c480 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 [pOp->p3];. iSe
2c490 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 t = pOp->p4.i;.
2c4a0 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 assert( pIn3->f
2c4b0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a lags&MEM_Int );.
2c4c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 . /* If there i
2c4d0 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 s anything other
2c4e0 20 74 68 61 6e 20 61 20 72 6f 77 73 65 74 20 6f than a rowset o
2c4f0 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79 20 bject in memory
2c500 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64 65 cell P1,. ** de
2c510 6c 65 74 65 20 69 74 20 6e 6f 77 20 61 6e 64 20 lete it now and
2c520 69 6e 69 74 69 61 6c 69 7a 65 20 50 31 20 77 69 initialize P1 wi
2c530 74 68 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 th an empty rows
2c540 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 et. */. if( (p
2c550 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d In1->flags & MEM
2c560 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 _RowSet)==0 ){.
2c570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
2c580 6d 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 mSetRowSet(pIn1)
2c590 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d ;. if( (pIn1-
2c5a0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 >flags & MEM_Row
2c5b0 53 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e Set)==0 ) goto n
2c5c0 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 o_mem;. }.. as
2c5d0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 sert( pOp->p4typ
2c5e0 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 e==P4_INT32 );.
2c5f0 20 61 73 73 65 72 74 28 20 69 53 65 74 3d 3d 2d assert( iSet==-
2c600 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b 0a 1 || iSet>=0 );.
2c610 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 if( iSet ){.
2c620 20 20 65 78 69 73 74 73 20 3d 20 73 71 6c 69 74 exists = sqlit
2c630 65 33 52 6f 77 53 65 74 54 65 73 74 28 70 49 6e e3RowSetTest(pIn
2c640 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 69 53 1->u.pRowSet, iS
2c650 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a et, pIn3->u.i);.
2c660 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 VdbeBranchTa
2c670 6b 65 6e 28 65 78 69 73 74 73 21 3d 30 2c 32 29 ken(exists!=0,2)
2c680 3b 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 ;. if( exists
2c690 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f ) goto jump_to_
2c6a0 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 p2;. }. if( iS
2c6b0 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c et>=0 ){. sql
2c6c0 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 ite3RowSetInsert
2c6d0 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 (pIn1->u.pRowSet
2c6e0 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 , pIn3->u.i);.
2c6f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 }. break;.}...#
2c700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
2c710 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f IT_TRIGGER../* O
2c720 70 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 pcode: Program P
2c730 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 1 P2 P3 P4 P5.**
2c740 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 .** Execute the
2c750 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 trigger program
2c760 70 61 73 73 65 64 20 61 73 20 50 34 20 28 74 79 passed as P4 (ty
2c770 70 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d pe P4_SUBPROGRAM
2c780 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e ). .**.** P1 con
2c790 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 tains the addres
2c7a0 73 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 s of the memory
2c7b0 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 cell that contai
2c7c0 6e 73 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d ns the first mem
2c7d0 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 ory .** cell in
2c7e0 61 6e 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 an array of valu
2c7f0 65 73 20 75 73 65 64 20 61 73 20 61 72 67 75 6d es used as argum
2c800 65 6e 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d ents to the sub-
2c810 70 72 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 program. P2 .**
2c820 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 contains the add
2c830 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 ress to jump to
2c840 69 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 if the sub-progr
2c850 61 6d 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e am throws an IGN
2c860 4f 52 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f ORE .** exceptio
2c870 6e 20 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 n using the RAIS
2c880 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 E() function. Re
2c890 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 gister P3 contai
2c8a0 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20 0a ns the address .
2c8b0 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 ** of a memory c
2c8c0 65 6c 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 ell in this (the
2c8d0 20 70 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 parent) VM that
2c8e0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f is used to allo
2c8f0 63 61 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d cate the .** mem
2c900 6f 72 79 20 72 65 71 75 69 72 65 64 20 62 79 20 ory required by
2c910 74 68 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 the sub-vdbe at
2c920 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 runtime..**.** P
2c930 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 4 is a pointer t
2c940 6f 20 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e o the VM contain
2c950 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20 ing the trigger
2c960 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 program..**.** I
2c970 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f f P5 is non-zero
2c980 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 , then recursive
2c990 20 70 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61 74 program invocat
2c9a0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a ion is enabled..
2c9b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72 */.case OP_Progr
2c9c0 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 am: { /*
2c9d0 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d jump */. int nM
2c9e0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 em;
2c9f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d /* Number of m
2ca00 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 emory registers
2ca10 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 for sub-program
2ca20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 */. int nByte;
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2ca40 42 79 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65 Bytes of runtime
2ca50 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 space required
2ca60 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 for sub-program
2ca70 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20 */. Mem *pRt;
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2ca90 52 65 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f Register to allo
2caa0 63 61 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61 cate runtime spa
2cab0 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 ce */. Mem *pMe
2cac0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m;
2cad0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 /* Used to itera
2cae0 74 65 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72 te through memor
2caf0 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d y cells */. Mem
2cb00 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 *pEnd;
2cb10 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d /* Last mem
2cb20 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20 ory cell in new
2cb30 61 72 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46 array */. VdbeF
2cb40 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 rame *pFrame;
2cb50 20 20 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66 /* New vdbe f
2cb60 72 61 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20 rame to execute
2cb70 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 in */. SubProgr
2cb80 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20 am *pProgram;
2cb90 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74 /* Sub-program t
2cba0 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76 o execute */. v
2cbb0 6f 69 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20 oid *t;
2cbc0 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 /* Token
2cbd0 69 64 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67 identifying trig
2cbe0 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 ger */.. pProgr
2cbf0 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 am = pOp->p4.pPr
2cc00 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26 ogram;. pRt = &
2cc10 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 aMem[pOp->p3];.
2cc20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 assert( pProgra
2cc30 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 m->nOp>0 );. .
2cc40 20 2f 2a 20 49 66 20 74 68 65 20 70 35 20 66 6c /* If the p5 fl
2cc50 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 ag is clear, the
2cc60 6e 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f n recursive invo
2cc70 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 cation of trigge
2cc80 72 73 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 rs is . ** disa
2cc90 62 6c 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 bled for backwar
2cca0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 ds compatibility
2ccb0 20 28 70 35 20 69 73 20 73 65 74 20 69 66 20 74 (p5 is set if t
2ccc0 68 69 73 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a his sub-program.
2ccd0 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 61 ** is really a
2cce0 20 74 72 69 67 67 65 72 2c 20 6e 6f 74 20 61 20 trigger, not a
2ccf0 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 foreign key acti
2cd00 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66 6c 61 67 on, and the flag
2cd10 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c set. ** and cl
2cd20 65 61 72 65 64 20 62 79 20 74 68 65 20 22 50 52 eared by the "PR
2cd30 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 AGMA recursive_t
2cd40 72 69 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64 riggers" command
2cd50 20 69 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a is clear).. **
2cd60 20 0a 20 20 2a 2a 20 49 74 20 69 73 20 72 65 63 . ** It is rec
2cd70 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f ursive invocatio
2cd80 6e 20 6f 66 20 74 72 69 67 67 65 72 73 2c 20 61 n of triggers, a
2cd90 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c t the SQL level,
2cda0 20 74 68 61 74 20 69 73 20 0a 20 20 2a 2a 20 64 that is . ** d
2cdb0 69 73 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 isabled. In some
2cdc0 20 63 61 73 65 73 20 61 20 73 69 6e 67 6c 65 20 cases a single
2cdd0 74 72 69 67 67 65 72 20 6d 61 79 20 67 65 6e 65 trigger may gene
2cde0 72 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f rate more than o
2cdf0 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67 ne . ** SubProg
2ce00 72 61 6d 20 28 69 66 20 74 68 65 20 74 72 69 67 ram (if the trig
2ce10 67 65 72 20 6d 61 79 20 62 65 20 65 78 65 63 75 ger may be execu
2ce20 74 65 64 20 77 69 74 68 20 6d 6f 72 65 20 74 68 ted with more th
2ce30 61 6e 20 6f 6e 65 20 64 69 66 66 65 72 65 6e 74 an one different
2ce40 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 . ** ON CONFLI
2ce50 43 54 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53 CT algorithm). S
2ce60 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 ubProgram struct
2ce70 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 ures associated
2ce80 77 69 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 with a. ** sing
2ce90 6c 65 20 74 72 69 67 67 65 72 20 61 6c 6c 20 68 le trigger all h
2cea0 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c ave the same val
2ceb0 75 65 20 66 6f 72 20 74 68 65 20 53 75 62 50 72 ue for the SubPr
2cec0 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a ogram.token . *
2ced0 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a * variable. */.
2cee0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b if( pOp->p5 ){
2cef0 0a 20 20 20 20 74 20 3d 20 70 50 72 6f 67 72 61 . t = pProgra
2cf00 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f m->token;. fo
2cf10 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 r(pFrame=p->pFra
2cf20 6d 65 3b 20 70 46 72 61 6d 65 20 26 26 20 70 46 me; pFrame && pF
2cf30 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 rame->token!=t;
2cf40 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 pFrame=pFrame->p
2cf50 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 Parent);. if(
2cf60 20 70 46 72 61 6d 65 20 29 20 62 72 65 61 6b 3b pFrame ) break;
2cf70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e . }.. if( p->n
2cf80 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 Frame>=db->aLimi
2cf90 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 t[SQLITE_LIMIT_T
2cfa0 52 49 47 47 45 52 5f 44 45 50 54 48 5d 20 29 7b RIGGER_DEPTH] ){
2cfb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
2cfc0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 _ERROR;. sqli
2cfd0 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 te3VdbeError(p,
2cfe0 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 "too many levels
2cff0 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 of trigger recu
2d000 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 62 72 65 rsion");. bre
2d010 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 ak;. }.. /* Re
2d020 67 69 73 74 65 72 20 70 52 74 20 69 73 20 75 73 gister pRt is us
2d030 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 ed to store the
2d040 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 memory required
2d050 74 6f 20 73 61 76 65 20 74 68 65 20 73 74 61 74 to save the stat
2d060 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 e. ** of the cu
2d070 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61 rrent program, a
2d080 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 nd the memory re
2d090 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d quired at runtim
2d0a0 65 20 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a e to execute. *
2d0b0 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 * the trigger pr
2d0c0 6f 67 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74 ogram. If this t
2d0d0 72 69 67 67 65 72 20 68 61 73 20 62 65 65 6e 20 rigger has been
2d0e0 66 69 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68 fired before, th
2d0f0 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20 en pRt . ** is
2d100 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 already allocate
2d110 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 d. Otherwise, it
2d120 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c must be initial
2d130 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 ized. */. if(
2d140 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f (pRt->flags&MEM_
2d150 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 Frame)==0 ){.
2d160 20 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e /* SubProgram.n
2d170 4d 65 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68 Mem is set to th
2d180 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f e number of memo
2d190 72 79 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79 ry cells used by
2d1a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f the . ** pro
2d1b0 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53 gram stored in S
2d1c0 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41 ubProgram.aOp. A
2d1d0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c s well as these,
2d1e0 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 one memory.
2d1f0 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69 ** cell is requi
2d200 72 65 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 red for each cur
2d210 73 6f 72 20 75 73 65 64 20 62 79 20 74 68 65 20 sor used by the
2d220 70 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63 program. Set loc
2d230 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 al. ** variab
2d240 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74 le nMem (and lat
2d250 65 72 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43 er, VdbeFrame.nC
2d260 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73 hildMem) to this
2d270 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 value.. */.
2d280 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72 nMem = pProgr
2d290 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67 am->nMem + pProg
2d2a0 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 6e ram->nCsr;. n
2d2b0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 Byte = ROUND8(si
2d2c0 7a 65 6f 66 28 56 64 62 65 46 72 61 6d 65 29 29 zeof(VdbeFrame))
2d2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b . +
2d2e0 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d nMem * sizeof(M
2d2f0 65 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 em).
2d300 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 + pProgram->nC
2d310 73 72 20 2a 20 73 69 7a 65 6f 66 28 56 64 62 65 sr * sizeof(Vdbe
2d320 43 75 72 73 6f 72 20 2a 29 0a 20 20 20 20 20 20 Cursor *).
2d330 20 20 20 20 20 20 20 20 2b 20 70 50 72 6f 67 72 + pProgr
2d340 61 6d 2d 3e 6e 4f 6e 63 65 20 2a 20 73 69 7a 65 am->nOnce * size
2d350 6f 66 28 75 38 29 3b 0a 20 20 20 20 70 46 72 61 of(u8);. pFra
2d360 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 me = sqlite3DbMa
2d370 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 llocZero(db, nBy
2d380 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 46 te);. if( !pF
2d390 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 67 6f rame ){. go
2d3a0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d to no_mem;. }
2d3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
2d3c0 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 74 29 3b MemRelease(pRt);
2d3d0 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61 67 73 20 . pRt->flags
2d3e0 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 = MEM_Frame;.
2d3f0 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d pRt->u.pFrame =
2d400 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46 pFrame;.. pF
2d410 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 rame->v = p;.
2d420 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d pFrame->nChildM
2d430 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 em = nMem;. p
2d440 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 Frame->nChildCsr
2d450 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 = pProgram->nCs
2d460 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 70 r;. pFrame->p
2d470 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 c = (int)(pOp -
2d480 61 4f 70 29 3b 0a 20 20 20 20 70 46 72 61 6d 65 aOp);. pFrame
2d490 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d ->aMem = p->aMem
2d4a0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d ;. pFrame->nM
2d4b0 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 em = p->nMem;.
2d4c0 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 20 pFrame->apCsr
2d4d0 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20 = p->apCsr;.
2d4e0 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20 pFrame->nCursor
2d4f0 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 = p->nCursor;.
2d500 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20 pFrame->aOp =
2d510 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46 72 61 p->aOp;. pFra
2d520 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 me->nOp = p->nOp
2d530 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f ;. pFrame->to
2d540 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e ken = pProgram->
2d550 74 6f 6b 65 6e 3b 0a 20 20 20 20 70 46 72 61 6d token;. pFram
2d560 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 e->aOnceFlag = p
2d570 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 20 ->aOnceFlag;.
2d580 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c pFrame->nOnceFl
2d590 61 67 20 3d 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 ag = p->nOnceFla
2d5a0 67 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 g;.#ifdef SQLITE
2d5b0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 _ENABLE_STMT_SCA
2d5c0 4e 53 54 41 54 55 53 0a 20 20 20 20 70 46 72 61 NSTATUS. pFra
2d5d0 6d 65 2d 3e 61 6e 45 78 65 63 20 3d 20 70 2d 3e me->anExec = p->
2d5e0 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 0a anExec;.#endif..
2d5f0 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62 65 pEnd = &Vdbe
2d600 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 FrameMem(pFrame)
2d610 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d [pFrame->nChildM
2d620 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d 65 em];. for(pMe
2d630 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 m=VdbeFrameMem(p
2d640 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70 45 Frame); pMem!=pE
2d650 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 nd; pMem++){.
2d660 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
2d670 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a MEM_Undefined;.
2d680 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d pMem->db =
2d690 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c db;. }. }el
2d6a0 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20 3d se{. pFrame =
2d6b0 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 3b 0a pRt->u.pFrame;.
2d6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 6f assert( pPro
2d6d0 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f 67 gram->nMem+pProg
2d6e0 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d ram->nCsr==pFram
2d6f0 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 29 3b 0a e->nChildMem );.
2d700 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 6f assert( pPro
2d710 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 gram->nCsr==pFra
2d720 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 29 3b me->nChildCsr );
2d730 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e . assert( (in
2d740 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3d 3d 70 t)(pOp - aOp)==p
2d750 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d Frame->pc );. }
2d760 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b .. p->nFrame++;
2d770 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 . pFrame->pPare
2d780 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a nt = p->pFrame;.
2d790 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f pFrame->lastRo
2d7a0 77 69 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b wid = lastRowid;
2d7b0 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e . pFrame->nChan
2d7c0 67 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b ge = p->nChange;
2d7d0 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 . pFrame->nDbCh
2d7e0 61 6e 67 65 20 3d 20 70 2d 3e 64 62 2d 3e 6e 43 ange = p->db->nC
2d7f0 68 61 6e 67 65 3b 0a 20 20 70 2d 3e 6e 43 68 61 hange;. p->nCha
2d800 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 nge = 0;. p->pF
2d810 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 rame = pFrame;.
2d820 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 p->aMem = aMem
2d830 3d 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 = &VdbeFrameMem(
2d840 70 46 72 61 6d 65 29 5b 2d 31 5d 3b 0a 20 20 70 pFrame)[-1];. p
2d850 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d ->nMem = pFrame-
2d860 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d >nChildMem;. p-
2d870 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29 >nCursor = (u16)
2d880 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 pFrame->nChildCs
2d890 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 r;. p->apCsr =
2d8a0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 (VdbeCursor **)&
2d8b0 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2b 31 5d 3b aMem[p->nMem+1];
2d8c0 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4f 70 20 . p->aOp = aOp
2d8d0 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 3b = pProgram->aOp;
2d8e0 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70 50 72 6f . p->nOp = pPro
2d8f0 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e gram->nOp;. p->
2d900 61 4f 6e 63 65 46 6c 61 67 20 3d 20 28 75 38 20 aOnceFlag = (u8
2d910 2a 29 26 70 2d 3e 61 70 43 73 72 5b 70 2d 3e 6e *)&p->apCsr[p->n
2d920 43 75 72 73 6f 72 5d 3b 0a 20 20 70 2d 3e 6e 4f Cursor];. p->nO
2d930 6e 63 65 46 6c 61 67 20 3d 20 70 50 72 6f 67 72 nceFlag = pProgr
2d940 61 6d 2d 3e 6e 4f 6e 63 65 3b 0a 23 69 66 64 65 am->nOnce;.#ifde
2d950 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
2d960 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a STMT_SCANSTATUS.
2d970 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 30 3b p->anExec = 0;
2d980 0a 23 65 6e 64 69 66 0a 20 20 70 4f 70 20 3d 20 .#endif. pOp =
2d990 26 61 4f 70 5b 2d 31 5d 3b 0a 20 20 6d 65 6d 73 &aOp[-1];. mems
2d9a0 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c et(p->aOnceFlag,
2d9b0 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 0, p->nOnceFlag
2d9c0 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a );.. break;.}..
2d9d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d /* Opcode: Param
2d9e0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a P1 P2 * * *.**.
2d9f0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 ** This opcode i
2da00 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73 s only ever pres
2da10 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72 ent in sub-progr
2da20 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74 ams called via t
2da30 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 he .** OP_Progra
2da40 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43 m instruction. C
2da50 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72 opy a value curr
2da60 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 ently stored in
2da70 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c a memory .** cel
2da80 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 l of the calling
2da90 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20 (parent) frame
2daa0 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68 to cell P2 in th
2dab0 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73 e current frames
2dac0 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 .** address spa
2dad0 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 ce. This is used
2dae0 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 by trigger prog
2daf0 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74 rams to access t
2db00 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 he new.* .** and
2db10 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a old.* values..*
2db20 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73 *.** The address
2db30 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 of the cell in
2db40 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 the parent frame
2db50 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 is determined b
2db60 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 y adding.** the
2db70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 value of the P1
2db80 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 argument to the
2db90 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 value of the P1
2dba0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a argument to the.
2dbb0 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 ** calling OP_Pr
2dbc0 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f ogram instructio
2dbd0 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 n..*/.case OP_Pa
2dbe0 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 ram: {
2dbf0 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 /* out2 */. Vd
2dc00 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b beFrame *pFrame;
2dc10 0a 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 . Mem *pIn;. p
2dc20 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c Out = out2Prerel
2dc30 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 ease(p, pOp);.
2dc40 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 pFrame = p->pFra
2dc50 6d 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46 72 me;. pIn = &pFr
2dc60 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 ame->aMem[pOp->p
2dc70 31 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 1 + pFrame->aOp[
2dc80 70 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b pFrame->pc].p1];
2dc90 20 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 . sqlite3Vdb
2dca0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 eMemShallowCopy(
2dcb0 70 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 pOut, pIn, MEM_E
2dcc0 70 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b 0a phem);. break;.
2dcd0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 }..#endif /* #if
2dce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
2dcf0 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69 66 _TRIGGER */..#if
2dd00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
2dd10 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 _FOREIGN_KEY./*
2dd20 4f 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74 65 Opcode: FkCounte
2dd30 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a r P1 P2 * * *.**
2dd40 20 53 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74 72 Synopsis: fkctr
2dd50 5b 50 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 [P1]+=P2.**.** I
2dd60 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 ncrement a "cons
2dd70 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 traint counter"
2dd80 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 by P2 (P2 may be
2dd90 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 negative or pos
2dda0 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 itive)..** If P1
2ddb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 is non-zero, th
2ddc0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 e database const
2ddd0 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 raint counter is
2dde0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a incremented .**
2ddf0 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 (deferred forei
2de00 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e gn key constrain
2de10 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ts). Otherwise,
2de20 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 if P1 is zero, t
2de30 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 he .** statement
2de40 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 counter is incr
2de50 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 emented (immedia
2de60 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 te foreign key c
2de70 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a onstraints)..*/.
2de80 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 case OP_FkCounte
2de90 72 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 r: {. if( db->f
2dea0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65 lags & SQLITE_De
2deb0 66 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64 62 ferFKs ){. db
2dec0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f ->nDeferredImmCo
2ded0 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 ns += pOp->p2;.
2dee0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e }else if( pOp->
2def0 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 p1 ){. db->nD
2df00 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 eferredCons += p
2df10 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b Op->p2;. }else{
2df20 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 . p->nFkConst
2df30 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 raint += pOp->p2
2df40 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d ;. }. break;.}
2df50 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 ../* Opcode: FkI
2df60 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 fZero P1 P2 * *
2df70 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 *.** Synopsis: i
2df80 66 20 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20 67 f fkctr[P1]==0 g
2df90 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 oto P2.**.** Thi
2dfa0 73 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20 69 s opcode tests i
2dfb0 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 f a foreign key
2dfc0 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 constraint-count
2dfd0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 er is currently
2dfe0 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 zero..** If so,
2dff0 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 jump to instruct
2e000 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73 ion P2. Otherwis
2e010 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 e, fall through
2e020 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 to the next .**
2e030 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a instruction..**.
2e040 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d ** If P1 is non-
2e050 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a zero, then the j
2e060 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 ump is taken if
2e070 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e the database con
2e080 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 0a straint-counter.
2e090 2a 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 ** is zero (the
2e0a0 6f 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73 20 one that counts
2e0b0 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 deferred constra
2e0c0 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e int violations).
2e0d0 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65 72 If P1 is.** zer
2e0e0 6f 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 o, the jump is t
2e0f0 61 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 aken if the stat
2e100 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 ement constraint
2e110 2d 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72 6f -counter is zero
2e120 0a 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20 66 .** (immediate f
2e130 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 oreign key const
2e140 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 raint violations
2e150 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b )..*/.case OP_Fk
2e160 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 IfZero: {
2e170 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 /* jump */. i
2e180 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 f( pOp->p1 ){.
2e190 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 VdbeBranchTake
2e1a0 6e 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 n(db->nDeferredC
2e1b0 6f 6e 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 ons==0 && db->nD
2e1c0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d eferredImmCons==
2e1d0 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 64 0, 2);. if( d
2e1e0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 b->nDeferredCons
2e1f0 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 ==0 && db->nDefe
2e200 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 rredImmCons==0 )
2e210 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 goto jump_to_p2
2e220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 ;. }else{. V
2e230 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 dbeBranchTaken(p
2e240 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d ->nFkConstraint=
2e250 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 =0 && db->nDefer
2e260 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 redImmCons==0, 2
2e270 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 );. if( p->nF
2e280 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26 kConstraint==0 &
2e290 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 & db->nDeferredI
2e2a0 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f mmCons==0 ) goto
2e2b0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d jump_to_p2;. }
2e2c0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 . break;.}.#end
2e2d0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 if /* #ifndef SQ
2e2e0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 LITE_OMIT_FOREIG
2e2f0 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 N_KEY */..#ifnde
2e300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 f SQLITE_OMIT_AU
2e310 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f TOINCREMENT./* O
2e320 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31 pcode: MemMax P1
2e330 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e P2 * * *.** Syn
2e340 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 opsis: r[P1]=max
2e350 28 72 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a (r[P1],r[P2]).**
2e360 0a 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67 69 .** P1 is a regi
2e370 73 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 ster in the root
2e380 20 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 frame of this V
2e390 4d 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61 6d M (the root fram
2e3a0 65 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e e is.** differen
2e3b0 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 t from the curre
2e3c0 6e 74 20 66 72 61 6d 65 20 69 66 20 74 68 69 73 nt frame if this
2e3d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 instruction is
2e3e0 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a 2a being executed.*
2e3f0 2a 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 70 * within a sub-p
2e400 72 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68 65 rogram). Set the
2e410 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 value of regist
2e420 65 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61 78 er P1 to the max
2e430 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 imum of .** its
2e440 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e current value an
2e450 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 d the value in r
2e460 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a egister P2..**.*
2e470 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 * This instructi
2e480 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 on throws an err
2e490 6f 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 or if the memory
2e4a0 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 cell is not ini
2e4b0 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 tially.** an int
2e4c0 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 eger..*/.case OP
2e4d0 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 _MemMax: {
2e4e0 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 /* in2 */. Vd
2e4f0 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b beFrame *pFrame;
2e500 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 . if( p->pFrame
2e510 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 ){. for(pFra
2e520 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 me=p->pFrame; pF
2e530 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 rame->pParent; p
2e540 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 Frame=pFrame->pP
2e550 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31 arent);. pIn1
2e560 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d = &pFrame->aMem
2e570 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c [pOp->p1];. }el
2e580 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 se{. pIn1 = &
2e590 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 aMem[pOp->p1];.
2e5a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d }. assert( mem
2e5b0 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b IsValid(pIn1) );
2e5c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 . sqlite3VdbeMe
2e5d0 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 mIntegerify(pIn1
2e5e0 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 );. pIn2 = &aMe
2e5f0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 m[pOp->p2];. sq
2e600 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 lite3VdbeMemInte
2e610 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 gerify(pIn2);.
2e620 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 if( pIn1->u.i<pI
2e630 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49 n2->u.i){. pI
2e640 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e n1->u.i = pIn2->
2e650 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b u.i;. }. break
2e660 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 ;.}.#endif /* SQ
2e670 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e LITE_OMIT_AUTOIN
2e680 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f CREMENT */../* O
2e690 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31 20 pcode: IfPos P1
2e6a0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e P2 P3 * *.** Syn
2e6b0 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e opsis: if r[P1]>
2e6c0 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 0 then r[P1]-=P3
2e6d0 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 , goto P2.**.**
2e6e0 52 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 Register P1 must
2e6f0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 contain an inte
2e700 67 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 ger..** If the v
2e710 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 alue of register
2e720 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61 P1 is 1 or grea
2e730 74 65 72 2c 20 73 75 62 74 72 61 63 74 20 50 33 ter, subtract P3
2e740 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61 6c from the.** val
2e750 75 65 20 69 6e 20 50 31 20 61 6e 64 20 6a 75 6d ue in P1 and jum
2e760 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 p to P2..**.** I
2e770 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 f the initial va
2e780 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 lue of register
2e790 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 P1 is less than
2e7a0 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 76 1, then the.** v
2e7b0 61 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67 65 alue is unchange
2e7c0 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70 61 d and control pa
2e7d0 73 73 65 73 20 74 68 72 6f 75 67 68 20 74 6f 20 sses through to
2e7e0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 the next instruc
2e7f0 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 tion..*/.case OP
2e800 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 _IfPos: {
2e810 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f /* jump, in1 */
2e820 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b . pIn1 = &aMem[
2e830 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 pOp->p1];. asse
2e840 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 rt( pIn1->flags&
2e850 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 MEM_Int );. Vdb
2e860 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 70 49 eBranchTaken( pI
2e870 6e 31 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 n1->u.i>0, 2);.
2e880 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 if( pIn1->u.i>0
2e890 20 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e ){. pIn1->u.
2e8a0 69 20 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 i -= pOp->p3;.
2e8b0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 goto jump_to_p
2e8c0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 2;. }. break;.
2e8d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 }../* Opcode: Se
2e8e0 74 49 66 4e 6f 74 50 6f 73 20 50 31 20 50 32 20 tIfNotPos P1 P2
2e8f0 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 P3 * *.** Synops
2e900 69 73 3a 20 69 66 20 72 5b 50 31 5d 3c 3d 30 20 is: if r[P1]<=0
2e910 74 68 65 6e 20 72 5b 50 32 5d 3d 50 33 0a 2a 2a then r[P2]=P3.**
2e920 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20 .** Register P1
2e930 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 must contain an
2e940 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 49 66 20 74 integer..** If t
2e950 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 he value of regi
2e960 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74 20 70 ster P1 is not p
2e970 6f 73 69 74 69 76 65 20 28 69 66 20 69 74 20 69 ositive (if it i
2e980 73 20 6c 65 73 73 20 74 68 61 6e 20 31 29 20 74 s less than 1) t
2e990 68 65 6e 0a 2a 2a 20 73 65 74 20 74 68 65 20 76 hen.** set the v
2e9a0 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 alue of register
2e9b0 20 50 32 20 74 6f 20 62 65 20 74 68 65 20 69 6e P2 to be the in
2e9c0 74 65 67 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 teger P3..*/.cas
2e9d0 65 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73 e OP_SetIfNotPos
2e9e0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e : { /* in
2e9f0 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 1, in2 */. pIn1
2ea00 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 = &aMem[pOp->p1
2ea10 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e ];. assert( pIn
2ea20 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 1->flags&MEM_Int
2ea30 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e );. if( pIn1->
2ea40 75 2e 69 3c 3d 30 20 29 7b 0a 20 20 20 20 70 4f u.i<=0 ){. pO
2ea50 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 ut = out2Prerele
2ea60 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 20 ase(p, pOp);.
2ea70 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 pOut->u.i = pOp
2ea80 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 62 72 65 61 ->p3;. }. brea
2ea90 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a k;.}../* Opcode:
2eaa0 20 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 IfNotZero P1 P2
2eab0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 P3 * *.** Synop
2eac0 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 30 sis: if r[P1]!=0
2ead0 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c then r[P1]-=P3,
2eae0 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 goto P2.**.** R
2eaf0 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 egister P1 must
2eb00 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 contain an integ
2eb10 65 72 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 74 er. If the cont
2eb20 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 ent of register
2eb30 50 31 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c P1 is.** initial
2eb40 6c 79 20 6e 6f 6e 7a 65 72 6f 2c 20 74 68 65 6e ly nonzero, then
2eb50 20 73 75 62 74 72 61 63 74 20 50 33 20 66 72 6f subtract P3 fro
2eb60 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 m the value in r
2eb70 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 0a 2a egister P1 and.*
2eb80 2a 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 49 * jump to P2. I
2eb90 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 f register P1 is
2eba0 20 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f 2c initially zero,
2ebb0 20 6c 65 61 76 65 20 69 74 20 75 6e 63 68 61 6e leave it unchan
2ebc0 67 65 64 0a 2a 2a 20 61 6e 64 20 66 61 6c 6c 20 ged.** and fall
2ebd0 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 through..*/.case
2ebe0 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b OP_IfNotZero: {
2ebf0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c /* jump,
2ec00 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d in1 */. pIn1 =
2ec10 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b &aMem[pOp->p1];
2ec20 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d . assert( pIn1-
2ec30 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 >flags&MEM_Int )
2ec40 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 ;. VdbeBranchTa
2ec50 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c ken(pIn1->u.i<0,
2ec60 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 2);. if( pIn1-
2ec70 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20 70 49 6e >u.i ){. pIn
2ec80 31 2d 3e 75 2e 69 20 2d 3d 20 70 4f 70 2d 3e 70 1->u.i -= pOp->p
2ec90 33 3b 0a 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 3;. goto jum
2eca0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 p_to_p2;. }. b
2ecb0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f reak;.}../* Opco
2ecc0 64 65 3a 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f de: DecrJumpZero
2ecd0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 P1 P2 * * *.**
2ece0 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d Synopsis: if (--
2ecf0 72 5b 50 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50 r[P1])==0 goto P
2ed00 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 2.**.** Register
2ed10 20 50 31 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e P1 must hold an
2ed20 20 69 6e 74 65 67 65 72 2e 20 20 44 65 63 72 65 integer. Decre
2ed30 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 ment the value i
2ed40 6e 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a n register P1.**
2ed50 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 then jump to P2
2ed60 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 if the new valu
2ed70 65 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65 72 e is exactly zer
2ed80 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 o..*/.case OP_De
2ed90 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20 20 crJumpZero: {
2eda0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 /* jump, in1
2edb0 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 */. pIn1 = &aMe
2edc0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 m[pOp->p1];. as
2edd0 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 sert( pIn1->flag
2ede0 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 s&MEM_Int );. p
2edf0 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64 In1->u.i--;. Vd
2ee00 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 beBranchTaken(pI
2ee10 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a n1->u.i==0, 2);.
2ee20 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d if( pIn1->u.i=
2ee30 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 =0 ) goto jump_t
2ee40 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d o_p2;. break;.}
2ee50 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 .../* Opcode: Ju
2ee60 6d 70 5a 65 72 6f 49 6e 63 72 20 50 31 20 50 32 mpZeroIncr P1 P2
2ee70 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 * * *.** Synops
2ee80 69 73 3a 20 69 66 20 28 72 5b 50 31 5d 2b 2b 29 is: if (r[P1]++)
2ee90 3d 3d 30 20 29 20 67 6f 74 6f 20 50 32 0a 2a 2a ==0 ) goto P2.**
2eea0 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 .** The register
2eeb0 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e P1 must contain
2eec0 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 an integer. If
2eed0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 register P1 is
2eee0 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20 7a 65 72 initially.** zer
2eef0 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 o, then jump to
2ef00 50 32 2e 20 20 49 6e 63 72 65 6d 65 6e 74 20 72 P2. Increment r
2ef10 65 67 69 73 74 65 72 20 50 31 20 72 65 67 61 72 egister P1 regar
2ef20 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 dless of whether
2ef30 20 6f 72 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 6a or.** not the j
2ef40 75 6d 70 20 69 73 20 74 61 6b 65 6e 2e 0a 2a 2f ump is taken..*/
2ef50 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70 5a 65 72 .case OP_JumpZer
2ef60 6f 49 6e 63 72 3a 20 7b 20 20 20 20 20 20 20 20 oIncr: {
2ef70 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a /* jump, in1 */.
2ef80 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 pIn1 = &aMem[p
2ef90 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 Op->p1];. asser
2efa0 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d t( pIn1->flags&M
2efb0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 EM_Int );. Vdbe
2efc0 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 BranchTaken(pIn1
2efd0 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20 20 ->u.i==0, 2);.
2efe0 69 66 28 20 28 70 49 6e 31 2d 3e 75 2e 69 2b 2b if( (pIn1->u.i++
2eff0 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 )==0 ) goto jump
2f000 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b _to_p2;. break;
2f010 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 .}../* Opcode: A
2f020 67 67 53 74 65 70 30 20 2a 20 50 32 20 50 33 20 ggStep0 * P2 P3
2f030 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 P4 P5.** Synopsi
2f040 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 s: accum=r[P3] s
2f050 74 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a tep(r[P2@P5]).**
2f060 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 .** Execute the
2f070 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f step function fo
2f080 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 r an aggregate.
2f090 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e The.** function
2f0a0 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74 has P5 argument
2f0b0 73 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69 s. P4 is a poi
2f0c0 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 nter to the Func
2f0d0 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 Def.** structure
2f0e0 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20 that specifies
2f0f0 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 the function. R
2f100 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 egister P3 is th
2f110 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 e.** accumulator
2f120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 ..**.** The P5 a
2f130 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b rguments are tak
2f140 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 en from register
2f150 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 P2 and its.** s
2f160 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a uccessors..*/./*
2f170 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 Opcode: AggStep
2f180 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a * P2 P3 P4 P5.*
2f190 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 * Synopsis: accu
2f1a0 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 m=r[P3] step(r[P
2f1b0 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 2@P5]).**.** Exe
2f1c0 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 cute the step fu
2f1d0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 nction for an ag
2f1e0 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a gregate. The.**
2f1f0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 function has P5
2f200 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 arguments. P4
2f210 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f is a pointer to
2f220 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 an sqlite3_cont
2f230 65 78 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 ext.** object th
2f240 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 75 at is used to ru
2f250 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 n the function.
2f260 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73 0a Register P3 is.
2f270 2a 2a 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 ** as the accumu
2f280 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 lator..**.** The
2f290 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 P5 arguments ar
2f2a0 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 e taken from reg
2f2b0 69 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 ister P2 and its
2f2c0 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a .** successors..
2f2d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 **.** This opcod
2f2e0 65 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 e is initially c
2f2f0 6f 64 65 64 20 61 73 20 4f 50 5f 41 67 67 53 74 oded as OP_AggSt
2f300 65 70 30 2e 20 20 4f 6e 20 66 69 72 73 74 20 65 ep0. On first e
2f310 76 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 valuation,.** th
2f320 65 20 46 75 6e 63 44 65 66 20 73 74 6f 72 65 64 e FuncDef stored
2f330 20 69 6e 20 50 34 20 69 73 20 63 6f 6e 76 65 72 in P4 is conver
2f340 74 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 ted into an sqli
2f350 74 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a te3_context and.
2f360 2a 2a 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 ** the opcode is
2f370 20 63 68 61 6e 67 65 64 2e 20 20 49 6e 20 74 68 changed. In th
2f380 69 73 20 77 61 79 2c 20 74 68 65 20 69 6e 69 74 is way, the init
2f390 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 ialization of th
2f3a0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e e.** sqlite3_con
2f3b0 74 65 78 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e text only happen
2f3c0 73 20 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64 20 s once, instead
2f3d0 6f 66 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20 of on each call
2f3e0 74 6f 20 74 68 65 0a 2a 2a 20 73 74 65 70 20 66 to the.** step f
2f3f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 unction..*/.case
2f400 20 4f 50 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a OP_AggStep0: {.
2f410 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 int n;. sqlit
2f420 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 e3_context *pCtx
2f430 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 ;.. assert( pOp
2f440 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e ->p4type==P4_FUN
2f450 43 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f CDEF );. n = pO
2f460 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 p->p5;. assert(
2f470 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f pOp->p3>0 && pO
2f480 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d p->p3<=(p->nMem-
2f490 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 p->nCursor) );.
2f4a0 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c assert( n==0 ||
2f4b0 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 (pOp->p2>0 && p
2f4c0 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d Op->p2+n<=(p->nM
2f4d0 65 6d 2d 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 em-p->nCursor)+1
2f4e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 ) );. assert( p
2f4f0 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32 20 7c Op->p3<pOp->p2 |
2f500 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e | pOp->p3>=pOp->
2f510 70 32 2b 6e 20 29 3b 0a 20 20 70 43 74 78 20 3d p2+n );. pCtx =
2f520 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
2f530 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a Raw(db, sizeof(*
2f540 70 43 74 78 29 20 2b 20 28 6e 2d 31 29 2a 73 69 pCtx) + (n-1)*si
2f550 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c zeof(sqlite3_val
2f560 75 65 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 74 ue*));. if( pCt
2f570 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d x==0 ) goto no_m
2f580 65 6d 3b 0a 20 20 70 43 74 78 2d 3e 70 4d 65 6d em;. pCtx->pMem
2f590 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70 46 = 0;. pCtx->pF
2f5a0 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 unc = pOp->p4.pF
2f5b0 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70 unc;. pCtx->iOp
2f5c0 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 = (int)(pOp - a
2f5d0 4f 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64 Op);. pCtx->pVd
2f5e0 62 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e be = p;. pCtx->
2f5f0 61 72 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d argc = n;. pOp-
2f600 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 46 55 4e >p4type = P4_FUN
2f610 43 43 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e CCTX;. pOp->p4.
2f620 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 pCtx = pCtx;. p
2f630 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f Op->opcode = OP_
2f640 41 67 67 53 74 65 70 3b 0a 20 20 2f 2a 20 46 61 AggStep;. /* Fa
2f650 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 ll through into
2f660 4f 50 5f 41 67 67 53 74 65 70 20 2a 2f 0a 7d 0a OP_AggStep */.}.
2f670 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a case OP_AggStep:
2f680 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 {. int i;. sq
2f690 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 lite3_context *p
2f6a0 43 74 78 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d Ctx;. Mem *pMem
2f6b0 3b 0a 20 20 4d 65 6d 20 74 3b 0a 0a 20 20 61 73 ;. Mem t;.. as
2f6c0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 sert( pOp->p4typ
2f6d0 65 3d 3d 50 34 5f 46 55 4e 43 43 54 58 20 29 3b e==P4_FUNCCTX );
2f6e0 0a 20 20 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 . pCtx = pOp->p
2f6f0 34 2e 70 43 74 78 3b 0a 20 20 70 4d 65 6d 20 3d 4.pCtx;. pMem =
2f700 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b &aMem[pOp->p3];
2f710 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66 .. /* If this f
2f720 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 73 69 64 unction is insid
2f730 65 20 6f 66 20 61 20 74 72 69 67 67 65 72 2c 20 e of a trigger,
2f740 74 68 65 20 72 65 67 69 73 74 65 72 20 61 72 72 the register arr
2f750 61 79 20 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a ay in aMem[]. *
2f760 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 66 * might change f
2f770 72 6f 6d 20 6f 6e 65 20 65 76 61 6c 75 61 74 69 rom one evaluati
2f780 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 on to the next.
2f790 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 The next block
2f7a0 6f 66 20 63 6f 64 65 0a 20 20 2a 2a 20 63 68 65 of code. ** che
2f7b0 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 cks to see if th
2f7c0 65 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79 e register array
2f7d0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 61 6e has changed, an
2f7e0 64 20 69 66 20 73 6f 20 69 74 0a 20 20 2a 2a 20 d if so it. **
2f7f0 72 65 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 reinitializes th
2f800 65 20 72 65 6c 61 76 61 6e 74 20 70 61 72 74 73 e relavant parts
2f810 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f of the sqlite3_
2f820 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a context object *
2f830 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 4d /. if( pCtx->pM
2f840 65 6d 20 21 3d 20 70 4d 65 6d 20 29 7b 0a 20 20 em != pMem ){.
2f850 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 70 pCtx->pMem = p
2f860 4d 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 Mem;. for(i=p
2f870 43 74 78 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d Ctx->argc-1; i>=
2f880 30 3b 20 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 0; i--) pCtx->ar
2f890 67 76 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f gv[i] = &aMem[pO
2f8a0 70 2d 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 p->p2+i];. }..#
2f8b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
2f8c0 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c UG. for(i=0; i<
2f8d0 70 43 74 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 pCtx->argc; i++)
2f8e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 {. assert( me
2f8f0 6d 49 73 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 mIsValid(pCtx->a
2f900 72 67 76 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 rgv[i]) );. R
2f910 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f EGISTER_TRACE(pO
2f920 70 2d 3e 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 p->p2+i, pCtx->a
2f930 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e rgv[i]);. }.#en
2f940 64 69 66 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b dif.. pMem->n++
2f950 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d ;. sqlite3VdbeM
2f960 65 6d 49 6e 69 74 28 26 74 2c 20 64 62 2c 20 4d emInit(&t, db, M
2f970 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 EM_Null);. pCtx
2f980 2d 3e 70 4f 75 74 20 3d 20 26 74 3b 0a 20 20 70 ->pOut = &t;. p
2f990 43 74 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 Ctx->fErrorOrAux
2f9a0 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 73 6b = 0;. pCtx->sk
2f9b0 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20 20 28 70 ipFlag = 0;. (p
2f9c0 43 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 74 65 Ctx->pFunc->xSte
2f9d0 70 29 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72 p)(pCtx,pCtx->ar
2f9e0 67 63 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 20 gc,pCtx->argv);
2f9f0 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d /* IMP: R-24505-
2fa00 32 33 32 33 30 20 2a 2f 0a 20 20 69 66 28 20 70 23230 */. if( p
2fa10 43 74 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 Ctx->fErrorOrAux
2fa20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 ){. if( pCtx
2fa30 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 ->isError ){.
2fa40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 sqlite3VdbeEr
2fa50 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c ror(p, "%s", sql
2fa60 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 ite3_value_text(
2fa70 26 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d &t));. rc =
2fa80 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 3b 0a pCtx->isError;.
2fa90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
2faa0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
2fab0 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 &t);. }else{.
2fac0 20 20 61 73 73 65 72 74 28 20 74 2e 66 6c 61 67 assert( t.flag
2fad0 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 s==MEM_Null );.
2fae0 20 7d 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 73 }. if( pCtx->s
2faf0 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 kipFlag ){. a
2fb00 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f ssert( pOp[-1].o
2fb10 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 pcode==OP_CollSe
2fb20 71 20 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f 70 q );. i = pOp
2fb30 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66 28 [-1].p1;. if(
2fb40 20 69 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 i ) sqlite3Vdbe
2fb50 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 MemSetInt64(&aMe
2fb60 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 m[i], 1);. }.
2fb70 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 break;.}../* Opc
2fb80 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 ode: AggFinal P1
2fb90 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 P2 * P4 *.** Sy
2fba0 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b nopsis: accum=r[
2fbb0 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45 P1] N=P2.**.** E
2fbc0 78 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c xecute the final
2fbd0 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f izer function fo
2fbe0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 r an aggregate.
2fbf0 20 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 P1 is.** the me
2fc00 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 mory location th
2fc10 61 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 at is the accumu
2fc20 6c 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 lator for the ag
2fc30 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 gregate..**.** P
2fc40 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 2 is the number
2fc50 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 of arguments tha
2fc60 74 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 t the step funct
2fc70 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a ion takes and.**
2fc80 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 P4 is a pointer
2fc90 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 to the FuncDef
2fca0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f for this functio
2fcb0 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 n. The P2.** ar
2fcc0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 gument is not us
2fcd0 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 ed by this opcod
2fce0 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 e. It is only t
2fcf0 68 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 here to disambig
2fd00 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e uate.** function
2fd10 73 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 s that can take
2fd20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 varying numbers
2fd30 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 of arguments. T
2fd40 68 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e he.** P4 argumen
2fd50 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 t is only needed
2fd60 20 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 for the degener
2fd70 61 74 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a ate case where.*
2fd80 2a 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 * the step funct
2fd90 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 ion was not prev
2fda0 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a iously called..*
2fdb0 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e /.case OP_AggFin
2fdc0 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 al: {. Mem *pMe
2fdd0 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 m;. assert( pOp
2fde0 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 ->p1>0 && pOp->p
2fdf0 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e 6e 1<=(p->nMem-p->n
2fe00 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4d 65 Cursor) );. pMe
2fe10 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 m = &aMem[pOp->p
2fe20 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 1];. assert( (p
2fe30 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d Mem->flags & ~(M
2fe40 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 EM_Null|MEM_Agg)
2fe50 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 )==0 );. rc = s
2fe60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e qlite3VdbeMemFin
2fe70 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d alize(pMem, pOp-
2fe80 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66 >p4.pFunc);. if
2fe90 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 ( rc ){. sqli
2fea0 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 te3VdbeError(p,
2feb0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 "%s", sqlite3_va
2fec0 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b lue_text(pMem));
2fed0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 . }. sqlite3Vd
2fee0 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 beChangeEncoding
2fef0 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 (pMem, encoding)
2ff00 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 ;. UPDATE_MAX_B
2ff10 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 LOBSIZE(pMem);.
2ff20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 if( sqlite3Vdbe
2ff30 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20 MemTooBig(pMem)
2ff40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f ){. goto too_
2ff50 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b big;. }. break
2ff60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c ;.}..#ifndef SQL
2ff70 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 ITE_OMIT_WAL./*
2ff80 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69 Opcode: Checkpoi
2ff90 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a nt P1 P2 P3 * *.
2ffa0 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 **.** Checkpoint
2ffb0 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68 database P1. Th
2ffc0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 is is a no-op if
2ffd0 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65 P1 is not curre
2ffe0 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d ntly in.** WAL m
2fff0 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50 ode. Parameter P
30000 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 2 is one of SQLI
30010 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 TE_CHECKPOINT_PA
30020 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20 SSIVE, FULL,.**
30030 52 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55 4e RESTART, or TRUN
30040 43 41 54 45 2e 20 20 57 72 69 74 65 20 31 20 6f CATE. Write 1 o
30050 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d r 0 into mem[P3]
30060 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 if the checkpoi
30070 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 nt returns.** SQ
30080 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74 LITE_BUSY or not
30090 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 , respectively.
300a0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 Write the numbe
300b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 r of pages in th
300c0 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74 e.** WAL after t
300d0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e he checkpoint in
300e0 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 to mem[P3+1] and
300f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 the number of p
30100 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57 ages.** in the W
30110 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65 AL that have bee
30120 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 n checkpointed a
30130 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f fter the checkpo
30140 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 int.** completes
30150 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e into mem[P3+2].
30160 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20 However on an
30170 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d error, mem[P3+1]
30180 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 and.** mem[P3+2
30190 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 ] are initialize
301a0 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 d to -1..*/.case
301b0 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20 OP_Checkpoint:
301c0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 {. int i;
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
301e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e /* Loop coun
301f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65 ter */. int aRe
30200 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 s[3];
30210 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 /* Resu
30220 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d lts */. Mem *pM
30230 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 em;
30240 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 /* Writ
30250 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a e results here *
30260 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e /.. assert( p->
30270 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 readOnly==0 );.
30280 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 aRes[0] = 0;.
30290 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32 aRes[1] = aRes[2
302a0 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 ] = -1;. assert
302b0 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 ( pOp->p2==SQLIT
302c0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 E_CHECKPOINT_PAS
302d0 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 SIVE. || p
302e0 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 Op->p2==SQLITE_C
302f0 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20 HECKPOINT_FULL.
30300 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 || pOp->p2
30310 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f ==SQLITE_CHECKPO
30320 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20 20 INT_RESTART.
30330 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 || pOp->p2==S
30340 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 QLITE_CHECKPOINT
30350 5f 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a 20 _TRUNCATE. );.
30360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 rc = sqlite3Che
30370 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70 2d ckpoint(db, pOp-
30380 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61 >p1, pOp->p2, &a
30390 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32 5d Res[1], &aRes[2]
303a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c );. if( rc==SQL
303b0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 ITE_BUSY ){.
303c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
303d0 20 20 20 20 61 52 65 73 5b 30 5d 20 3d 20 31 3b aRes[0] = 1;
303e0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 . }. for(i=0,
303f0 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 pMem = &aMem[pOp
30400 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69 2b 2b 2c ->p3]; i<3; i++,
30410 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 pMem++){. sq
30420 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 lite3VdbeMemSetI
30430 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69 36 34 29 nt64(pMem, (i64)
30440 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d 20 20 20 aRes[i]);. }
30450 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 20 20 0a . break;.}; .
30460 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 #endif..#ifndef
30470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 SQLITE_OMIT_PRAG
30480 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 6f MA./* Opcode: Jo
30490 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20 50 32 20 urnalMode P1 P2
304a0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 P3 * *.**.** Cha
304b0 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 nge the journal
304c0 6d 6f 64 65 20 6f 66 20 64 61 74 61 62 61 73 65 mode of database
304d0 20 50 31 20 74 6f 20 50 33 2e 20 50 33 20 6d 75 P1 to P3. P3 mu
304e0 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 st be one of the
304f0 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 .** PAGER_JOURNA
30500 4c 4d 4f 44 45 5f 58 58 58 20 76 61 6c 75 65 73 LMODE_XXX values
30510 2e 20 49 66 20 63 68 61 6e 67 69 6e 67 20 62 65 . If changing be
30520 74 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75 tween the variou
30530 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6d 6f s rollback.** mo
30540 64 65 73 20 28 64 65 6c 65 74 65 2c 20 74 72 75 des (delete, tru
30550 6e 63 61 74 65 2c 20 70 65 72 73 69 73 74 2c 20 ncate, persist,
30560 6f 66 66 20 61 6e 64 20 6d 65 6d 6f 72 79 29 2c off and memory),
30570 20 74 68 69 73 20 69 73 20 61 20 73 69 6d 70 6c this is a simpl
30580 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 e.** operation.
30590 4e 6f 20 49 4f 20 69 73 20 72 65 71 75 69 72 65 No IO is require
305a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 68 61 6e d..**.** If chan
305b0 67 69 6e 67 20 69 6e 74 6f 20 6f 72 20 6f 75 74 ging into or out
305c0 20 6f 66 20 57 41 4c 20 6d 6f 64 65 20 74 68 65 of WAL mode the
305d0 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 6d 6f procedure is mo
305e0 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a re complicated..
305f0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 73 74 **.** Write a st
30600 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ring containing
30610 74 68 65 20 66 69 6e 61 6c 20 6a 6f 75 72 6e 61 the final journa
30620 6c 2d 6d 6f 64 65 20 74 6f 20 72 65 67 69 73 74 l-mode to regist
30630 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f er P2..*/.case O
30640 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b P_JournalMode: {
30650 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 /* out2 */.
30660 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 Btree *pBt;
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30680 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63 68 61 /* Btree to cha
30690 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 nge journal mode
306a0 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a of */. Pager *
306b0 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 pPager;
306c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 /* Page
306d0 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 r associated wit
306e0 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20 65 h pBt */. int e
306f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 New;
30700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
30710 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a w journal mode *
30720 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20 20 /. int eOld;
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30740 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 6a /* The old j
30750 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 ournal mode */.#
30760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
30770 49 54 5f 57 41 4c 0a 20 20 63 6f 6e 73 74 20 63 IT_WAL. const c
30780 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 har *zFilename;
30790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 /* Name
307a0 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c of database fil
307b0 65 20 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a e for pPager */.
307c0 23 65 6e 64 69 66 0a 0a 20 20 70 4f 75 74 20 3d #endif.. pOut =
307d0 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 out2Prerelease(
307e0 70 2c 20 70 4f 70 29 3b 0a 20 20 65 4e 65 77 20 p, pOp);. eNew
307f0 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 = pOp->p3;. ass
30800 65 72 74 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 ert( eNew==PAGER
30810 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c _JOURNALMODE_DEL
30820 45 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 ETE . || e
30830 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e New==PAGER_JOURN
30840 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 ALMODE_TRUNCATE
30850 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d . || eNew=
30860 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f =PAGER_JOURNALMO
30870 44 45 5f 50 45 52 53 49 53 54 20 0a 20 20 20 20 DE_PERSIST .
30880 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 || eNew==PAGE
30890 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 R_JOURNALMODE_OF
308a0 46 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 F. || eNew
308b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d ==PAGER_JOURNALM
308c0 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20 ODE_MEMORY.
308d0 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 || eNew==PAGER
308e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c _JOURNALMODE_WAL
308f0 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d . || eNew=
30900 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f =PAGER_JOURNALMO
30910 44 45 5f 51 55 45 52 59 0a 20 20 29 3b 0a 20 20 DE_QUERY. );.
30920 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e assert( pOp->p1>
30930 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 =0 && pOp->p1<db
30940 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 ->nDb );. asser
30950 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d t( p->readOnly==
30960 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 0 );.. pBt = db
30970 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 ->aDb[pOp->p1].p
30980 42 74 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 Bt;. pPager = s
30990 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 qlite3BtreePager
309a0 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d 20 (pBt);. eOld =
309b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a sqlite3PagerGetJ
309c0 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 ournalMode(pPage
309d0 72 29 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d r);. if( eNew==
309e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 PAGER_JOURNALMOD
309f0 45 5f 51 55 45 52 59 20 29 20 65 4e 65 77 20 3d E_QUERY ) eNew =
30a00 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73 71 eOld;. if( !sq
30a10 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 lite3PagerOkToCh
30a20 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 angeJournalMode(
30a30 70 50 61 67 65 72 29 20 29 20 65 4e 65 77 20 3d pPager) ) eNew =
30a40 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66 20 eOld;..#ifndef
30a50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a SQLITE_OMIT_WAL.
30a60 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 zFilename = sq
30a70 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 lite3PagerFilena
30a80 6d 65 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 0a me(pPager, 1);..
30a90 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f /* Do not allo
30aa0 77 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 w a transition t
30ab0 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 o journal_mode=W
30ac0 41 4c 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 AL for a databas
30ad0 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d 70 6f 72 e. ** in tempor
30ae0 61 72 79 20 73 74 6f 72 61 67 65 20 6f 72 20 69 ary storage or i
30af0 66 20 74 68 65 20 56 46 53 20 64 6f 65 73 20 6e f the VFS does n
30b00 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 ot support share
30b10 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f 0a 20 d memory . */.
30b20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 if( eNew==PAGER
30b30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c _JOURNALMODE_WAL
30b40 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 53 . && (sqlite3S
30b50 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d trlen30(zFilenam
30b60 65 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 e)==0
30b70 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20 2a 2f 0a /* Temp file */.
30b80 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c 69 74 || !sqlit
30b90 65 33 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72 e3PagerWalSuppor
30ba0 74 65 64 28 70 50 61 67 65 72 29 29 20 20 20 2f ted(pPager)) /
30bb0 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f * No shared-memo
30bc0 72 79 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 ry support */.
30bd0 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 4f ){. eNew = eO
30be0 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 ld;. }.. if( (
30bf0 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20 20 20 26 eNew!=eOld). &
30c00 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a & (eOld==PAGER_J
30c10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c OURNALMODE_WAL |
30c20 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f | eNew==PAGER_JO
30c30 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 URNALMODE_WAL).
30c40 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64 62 2d ){. if( !db-
30c50 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 64 >autoCommit || d
30c60 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 b->nVdbeRead>1 )
30c70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c {. rc = SQL
30c80 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 ITE_ERROR;.
30c90 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f sqlite3VdbeErro
30ca0 72 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20 22 r(p,. "
30cb0 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 25 73 cannot change %s
30cc0 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f 6d 20 77 wal mode from w
30cd0 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 ithin a transact
30ce0 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 ion",.
30cf0 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 (eNew==PAGER_JOU
30d00 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 22 RNALMODE_WAL ? "
30d10 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20 6f 66 22 into" : "out of"
30d20 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 ). );.
30d30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 break;. }els
30d40 65 7b 0a 20 0a 20 20 20 20 20 20 69 66 28 20 65 e{. . if( e
30d50 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e Old==PAGER_JOURN
30d60 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 ALMODE_WAL ){.
30d70 20 20 20 20 20 20 2f 2a 20 49 66 20 6c 65 61 76 /* If leav
30d80 69 6e 67 20 57 41 4c 20 6d 6f 64 65 2c 20 63 6c ing WAL mode, cl
30d90 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 ose the log file
30da0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c . If successful,
30db0 20 74 68 65 20 63 61 6c 6c 0a 20 20 20 20 20 20 the call.
30dc0 20 20 2a 2a 20 74 6f 20 50 61 67 65 72 43 6c 6f ** to PagerClo
30dd0 73 65 57 61 6c 28 29 20 63 68 65 63 6b 70 6f 69 seWal() checkpoi
30de0 6e 74 73 20 61 6e 64 20 64 65 6c 65 74 65 73 20 nts and deletes
30df0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d the write-ahead-
30e00 6c 6f 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 log . **
30e10 66 69 6c 65 2e 20 41 6e 20 45 58 43 4c 55 53 49 file. An EXCLUSI
30e20 56 45 20 6c 6f 63 6b 20 6d 61 79 20 73 74 69 6c VE lock may stil
30e30 6c 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 l be held on the
30e40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a database file .
30e50 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65 72 ** after
30e60 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 72 65 a successful re
30e70 74 75 72 6e 2e 20 0a 20 20 20 20 20 20 20 20 2a turn. . *
30e80 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 /. rc = s
30e90 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 qlite3PagerClose
30ea0 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 Wal(pPager);.
30eb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
30ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
30ed0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 sqlite3Pager
30ee0 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 SetJournalMode(p
30ef0 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 20 20 Pager, eNew);.
30f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 }. }e
30f10 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 lse if( eOld==PA
30f20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
30f30 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 MEMORY ){.
30f40 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72 61 6e /* Cannot tran
30f50 73 69 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 sition directly
30f60 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f 20 57 from MEMORY to W
30f70 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20 4f 46 AL. Use mode OF
30f80 46 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 F. ** as
30f90 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 an intermediate
30fa0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 */. sqlit
30fb0 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 e3PagerSetJourna
30fc0 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 50 41 lMode(pPager, PA
30fd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f GER_JOURNALMODE_
30fe0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 OFF);. }.
30ff0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 . /* Open a
31000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 transaction on
31010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
31020 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 e. Regardless of
31030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 the journal.
31040 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 69 73 ** mode, this
31050 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 77 transaction alw
31060 61 79 73 20 75 73 65 73 20 61 20 72 6f 6c 6c 62 ays uses a rollb
31070 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 ack journal..
31080 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 */. asse
31090 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 rt( sqlite3Btree
310a0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d IsInTrans(pBt)==
310b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 0 );. if( r
310c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
310d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
310e0 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72 73 ite3BtreeSetVers
310f0 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d 3d ion(pBt, (eNew==
31100 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 PAGER_JOURNALMOD
31110 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29 29 3b E_WAL ? 2 : 1));
31120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
31130 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e }.#endif /* ifn
31140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
31150 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 WAL */.. if( rc
31160 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20 65 ){. eNew = e
31170 4f 6c 64 3b 0a 20 20 7d 0a 20 20 65 4e 65 77 20 Old;. }. eNew
31180 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 = sqlite3PagerSe
31190 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 tJournalMode(pPa
311a0 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20 20 70 ger, eNew);.. p
311b0 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Out->flags = MEM
311c0 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c _Str|MEM_Static|
311d0 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 MEM_Term;. pOut
311e0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 ->z = (char *)sq
311f0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 lite3JournalMode
31200 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f name(eNew);. pO
31210 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 ut->n = sqlite3S
31220 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 trlen30(pOut->z)
31230 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 ;. pOut->enc =
31240 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 SQLITE_UTF8;. s
31250 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
31260 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 Encoding(pOut, e
31270 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 ncoding);. brea
31280 6b 3b 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 k;.};.#endif /*
31290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 SQLITE_OMIT_PRAG
312a0 4d 41 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 MA */..#if !defi
312b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
312c0 56 41 43 55 55 4d 29 20 26 26 20 21 64 65 66 69 VACUUM) && !defi
312d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
312e0 41 54 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 ATTACH)./* Opcod
312f0 65 3a 20 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20 e: Vacuum * * *
31300 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d * *.**.** Vacuum
31310 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 the entire data
31320 62 61 73 65 2e 20 20 54 68 69 73 20 6f 70 63 6f base. This opco
31330 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 6f 74 de will cause ot
31340 68 65 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d her virtual.** m
31350 61 63 68 69 6e 65 73 20 74 6f 20 62 65 20 63 72 achines to be cr
31360 65 61 74 65 64 20 61 6e 64 20 72 75 6e 2e 20 20 eated and run.
31370 49 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 It may not be ca
31380 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e lled from within
31390 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f .** a transactio
313a0 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 n..*/.case OP_Va
313b0 63 75 75 6d 3a 20 7b 0a 20 20 61 73 73 65 72 74 cuum: {. assert
313c0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 ( p->readOnly==0
313d0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 );. rc = sqlit
313e0 65 33 52 75 6e 56 61 63 75 75 6d 28 26 70 2d 3e e3RunVacuum(&p->
313f0 7a 45 72 72 4d 73 67 2c 20 64 62 29 3b 0a 20 20 zErrMsg, db);.
31400 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a break;.}.#endif.
31410 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 .#if !defined(SQ
31420 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 LITE_OMIT_AUTOVA
31430 43 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a CUUM)./* Opcode:
31440 20 49 6e 63 72 56 61 63 75 75 6d 20 50 31 20 50 IncrVacuum P1 P
31450 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 65 2 * * *.**.** Pe
31460 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 rform a single s
31470 74 65 70 20 6f 66 20 74 68 65 20 69 6e 63 72 65 tep of the incre
31480 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 70 72 mental vacuum pr
31490 6f 63 65 64 75 72 65 20 6f 6e 0a 2a 2a 20 74 68 ocedure on.** th
314a0 65 20 50 31 20 64 61 74 61 62 61 73 65 2e 20 49 e P1 database. I
314b0 66 20 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 f the vacuum has
314c0 20 66 69 6e 69 73 68 65 64 2c 20 6a 75 6d 70 20 finished, jump
314d0 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a to instruction.*
314e0 2a 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c * P2. Otherwise,
314f0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f fall through to
31500 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 the next instru
31510 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f ction..*/.case O
31520 50 5f 49 6e 63 72 56 61 63 75 75 6d 3a 20 7b 20 P_IncrVacuum: {
31530 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a /* jump *
31540 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a /. Btree *pBt;.
31550 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e . assert( pOp->
31560 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 p1>=0 && pOp->p1
31570 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 <db->nDb );. as
31580 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 sert( DbMaskTest
31590 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 (p->btreeMask, p
315a0 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73 73 Op->p1) );. ass
315b0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 ert( p->readOnly
315c0 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 ==0 );. pBt = d
315d0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e b->aDb[pOp->p1].
315e0 70 42 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 pBt;. rc = sqli
315f0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 te3BtreeIncrVacu
31600 75 6d 28 70 42 74 29 3b 0a 20 20 56 64 62 65 42 um(pBt);. VdbeB
31610 72 61 6e 63 68 54 61 6b 65 6e 28 72 63 3d 3d 53 ranchTaken(rc==S
31620 51 4c 49 54 45 5f 44 4f 4e 45 2c 32 29 3b 0a 20 QLITE_DONE,2);.
31630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
31640 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 63 20 3d DONE ){. rc =
31650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
31660 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b goto jump_to_p2;
31670 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a . }. break;.}.
31680 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 #endif../* Opcod
31690 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a e: Expire P1 * *
316a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 * *.**.** Cause
316b0 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 precompiled sta
316c0 74 65 6d 65 6e 74 73 20 74 6f 20 65 78 70 69 72 tements to expir
316d0 65 2e 20 20 57 68 65 6e 20 61 6e 20 65 78 70 69 e. When an expi
316e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a red statement.**
316f0 20 69 73 20 65 78 65 63 75 74 65 64 20 75 73 69 is executed usi
31700 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 ng sqlite3_step(
31710 29 20 69 74 20 77 69 6c 6c 20 65 69 74 68 65 72 ) it will either
31720 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a automatically.*
31730 2a 20 72 65 70 72 65 70 61 72 65 20 69 74 73 65 * reprepare itse
31740 6c 66 20 28 69 66 20 69 74 20 77 61 73 20 6f 72 lf (if it was or
31750 69 67 69 6e 61 6c 6c 79 20 63 72 65 61 74 65 64 iginally created
31760 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 using sqlite3_p
31770 72 65 70 61 72 65 5f 76 32 28 29 29 0a 2a 2a 20 repare_v2()).**
31780 6f 72 20 69 74 20 77 69 6c 6c 20 66 61 69 6c 20 or it will fail
31790 77 69 74 68 20 53 51 4c 49 54 45 5f 53 43 48 45 with SQLITE_SCHE
317a0 4d 41 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 MA..** .** If P1
317b0 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c 20 is 0, then all
317c0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 SQL statements b
317d0 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20 49 ecome expired. I
317e0 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f f P1 is non-zero
317f0 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20 74 ,.** then only t
31800 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65 he currently exe
31810 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 cuting statement
31820 20 69 73 20 65 78 70 69 72 65 64 2e 0a 2a 2f 0a is expired..*/.
31830 63 61 73 65 20 4f 50 5f 45 78 70 69 72 65 3a 20 case OP_Expire:
31840 7b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70 31 {. if( !pOp->p1
31850 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 ){. sqlite3E
31860 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 xpirePreparedSta
31870 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d tements(db);. }
31880 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70 else{. p->exp
31890 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 ired = 1;. }.
318a0 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 break;.}..#ifnde
318b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 f SQLITE_OMIT_SH
318c0 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 ARED_CACHE./* Op
318d0 63 6f 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 code: TableLock
318e0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a P1 P2 P3 P4 *.**
318f0 20 53 79 6e 6f 70 73 69 73 3a 20 69 44 62 3d 50 Synopsis: iDb=P
31900 31 20 72 6f 6f 74 3d 50 32 20 77 72 69 74 65 3d 1 root=P2 write=
31910 50 33 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 P3.**.** Obtain
31920 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74 a lock on a part
31930 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 54 68 icular table. Th
31940 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 is instruction i
31950 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e s only used when
31960 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 63 .** the shared-c
31970 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 ache feature is
31980 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 enabled. .**.**
31990 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 P1 is the index
319a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
319b0 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d in sqlite3.aDb[]
319c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
319d0 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65 .** on which the
319e0 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 lock is acquire
319f0 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b 20 69 d. A readlock i
31a00 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20 50 33 s obtained if P3
31a10 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74 ==0 or.** a writ
31a20 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e e lock if P3==1.
31a30 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69 .**.** P2 contai
31a40 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 ns the root-page
31a50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f of the table to
31a60 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 lock..**.** P4
31a70 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 contains a point
31a80 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f er to the name o
31a90 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e f the table bein
31aa0 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20 69 g locked. This i
31ab0 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74 s only.** used t
31ac0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 o generate an er
31ad0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 74 ror message if t
31ae0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 he lock cannot b
31af0 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63 e obtained..*/.c
31b00 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b ase OP_TableLock
31b10 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69 74 65 : {. u8 isWrite
31b20 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e Lock = (u8)pOp->
31b30 70 33 3b 0a 20 20 69 66 28 20 69 73 57 72 69 74 p3;. if( isWrit
31b40 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d eLock || 0==(db-
31b50 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 >flags&SQLITE_Re
31b60 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 29 adUncommitted) )
31b70 7b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 {. int p1 = p
31b80 4f 70 2d 3e 70 31 3b 20 0a 20 20 20 20 61 73 73 Op->p1; . ass
31b90 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 ert( p1>=0 && p1
31ba0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 <db->nDb );.
31bb0 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 assert( DbMaskTe
31bc0 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c st(p->btreeMask,
31bd0 20 70 31 29 20 29 3b 0a 20 20 20 20 61 73 73 65 p1) );. asse
31be0 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d rt( isWriteLock=
31bf0 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 =0 || isWriteLoc
31c00 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d k==1 );. rc =
31c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 sqlite3BtreeLoc
31c20 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 kTable(db->aDb[p
31c30 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 1].pBt, pOp->p2,
31c40 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 isWriteLock);.
31c50 20 20 20 69 66 28 20 28 72 63 26 30 78 46 46 29 if( (rc&0xFF)
31c60 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 ==SQLITE_LOCKED
31c70 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 ){. const c
31c80 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 har *z = pOp->p4
31c90 2e 7a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 .z;. sqlite
31ca0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 64 3VdbeError(p, "d
31cb0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 atabase table is
31cc0 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29 locked: %s", z)
31cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 ;. }. }. br
31ce0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a eak;.}.#endif /*
31cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 SQLITE_OMIT_SHA
31d00 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 RED_CACHE */..#i
31d10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
31d20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f T_VIRTUALTABLE./
31d30 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e * Opcode: VBegin
31d40 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a * * * P4 *.**.*
31d50 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f * P4 may be a po
31d60 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 inter to an sqli
31d70 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 te3_vtab structu
31d80 72 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20 re. If so, call
31d90 74 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d the .** xBegin m
31da0 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 ethod for that t
31db0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f able..**.** Also
31dc0 2c 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 , whether or not
31dd0 20 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63 P4 is set, chec
31de0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e k that this is n
31df0 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 ot being called
31e00 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 from.** within a
31e10 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76 callback to a v
31e20 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79 irtual table xSy
31e30 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20 nc() method. If
31e40 69 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72 it is, the error
31e50 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 .** code will be
31e60 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c set to SQLITE_L
31e70 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f OCKED..*/.case O
31e80 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54 P_VBegin: {. VT
31e90 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20 20 70 able *pVTab;. p
31ea0 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 VTab = pOp->p4.p
31eb0 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c Vtab;. rc = sql
31ec0 69 74 65 33 56 74 61 62 42 65 67 69 6e 28 64 62 ite3VtabBegin(db
31ed0 2c 20 70 56 54 61 62 29 3b 0a 20 20 69 66 28 20 , pVTab);. if(
31ee0 70 56 54 61 62 20 29 20 73 71 6c 69 74 65 33 56 pVTab ) sqlite3V
31ef0 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 tabImportErrmsg(
31f00 70 2c 20 70 56 54 61 62 2d 3e 70 56 74 61 62 29 p, pVTab->pVtab)
31f10 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e ;. break;.}.#en
31f20 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d dif /* SQLITE_OM
31f30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 IT_VIRTUALTABLE
31f40 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */..#ifndef SQLI
31f50 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
31f60 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 ABLE./* Opcode:
31f70 56 43 72 65 61 74 65 20 50 31 20 50 32 20 2a 20 VCreate P1 P2 *
31f80 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 * *.**.** P2 is
31f90 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 a register that
31fa0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f holds the name o
31fb0 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c f a virtual tabl
31fc0 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 0a 2a e in database .*
31fd0 2a 20 50 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 * P1. Call the x
31fe0 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 66 6f Create method fo
31ff0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f r that table..*/
32000 0a 63 61 73 65 20 4f 50 5f 56 43 72 65 61 74 65 .case OP_VCreate
32010 3a 20 7b 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 : {. Mem sMem;
32020 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 /* For
32030 73 74 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f storing the reco
32040 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 rd being decoded
32050 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
32060 20 2a 7a 54 61 62 3b 20 20 2f 2a 20 4e 61 6d 65 *zTab; /* Name
32070 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 of the virtual
32080 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 6d 65 6d 73 table */.. mems
32090 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a et(&sMem, 0, siz
320a0 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 73 4d eof(sMem));. sM
320b0 65 6d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 2f 2a em.db = db;. /*
320c0 20 42 65 63 61 75 73 65 20 50 32 20 69 73 20 61 Because P2 is a
320d0 6c 77 61 79 73 20 61 20 73 74 61 74 69 63 20 73 lways a static s
320e0 74 72 69 6e 67 2c 20 69 74 20 69 73 20 69 6d 70 tring, it is imp
320f0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 0a ossible for the.
32100 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 ** sqlite3Vdbe
32110 4d 65 6d 43 6f 70 79 28 29 20 74 6f 20 66 61 69 MemCopy() to fai
32120 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 l */. assert( (
32130 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c aMem[pOp->p2].fl
32140 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 29 21 3d ags & MEM_Str)!=
32150 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 0 );. assert( (
32160 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c aMem[pOp->p2].fl
32170 61 67 73 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 ags & MEM_Static
32180 29 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 )!=0 );. rc = s
32190 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 qlite3VdbeMemCop
321a0 79 28 26 73 4d 65 6d 2c 20 26 61 4d 65 6d 5b 70 y(&sMem, &aMem[p
321b0 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 61 73 73 65 Op->p2]);. asse
321c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f rt( rc==SQLITE_O
321d0 4b 20 29 3b 0a 20 20 7a 54 61 62 20 3d 20 28 63 K );. zTab = (c
321e0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 onst char*)sqlit
321f0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 73 e3_value_text(&s
32200 4d 65 6d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 Mem);. assert(
32210 7a 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c zTab || db->mall
32220 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 ocFailed );. if
32230 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 72 63 ( zTab ){. rc
32240 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 = sqlite3VtabCa
32250 6c 6c 43 72 65 61 74 65 28 64 62 2c 20 70 4f 70 llCreate(db, pOp
32260 2d 3e 70 31 2c 20 7a 54 61 62 2c 20 26 70 2d 3e ->p1, zTab, &p->
32270 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 zErrMsg);. }.
32280 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
32290 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 lease(&sMem);.
322a0 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 break;.}.#endif
322b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 /* SQLITE_OMIT_V
322c0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a IRTUALTABLE */..
322d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
322e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
322f0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65 73 ./* Opcode: VDes
32300 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20 2a troy P1 * * P4 *
32310 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 .**.** P4 is the
32320 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 name of a virtu
32330 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 al table in data
32340 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20 74 base P1. Call t
32350 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 he xDestroy meth
32360 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 od.** of that ta
32370 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f ble..*/.case OP_
32380 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64 62 VDestroy: {. db
32390 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a 20 ->nVDestroy++;.
323a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 rc = sqlite3Vta
323b0 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c bCallDestroy(db,
323c0 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 pOp->p1, pOp->p
323d0 34 2e 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44 65 4.z);. db->nVDe
323e0 73 74 72 6f 79 2d 2d 3b 0a 20 20 62 72 65 61 6b stroy--;. break
323f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 ;.}.#endif /* SQ
32400 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
32410 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 LTABLE */..#ifnd
32420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 ef SQLITE_OMIT_V
32430 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f IRTUALTABLE./* O
32440 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 pcode: VOpen P1
32450 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 * * P4 *.**.** P
32460 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 4 is a pointer t
32470 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c o a virtual tabl
32480 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c e object, an sql
32490 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 ite3_vtab struct
324a0 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 ure..** P1 is a
324b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 cursor number.
324c0 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e This opcode open
324d0 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 s a cursor to th
324e0 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 e virtual.** tab
324f0 6c 65 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 le and stores th
32500 61 74 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e at cursor in P1.
32510 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 .*/.case OP_VOpe
32520 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f n: {. VdbeCurso
32530 72 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 r *pCur;. sqlit
32540 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a e3_vtab_cursor *
32550 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 pVtabCursor;. s
32560 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 qlite3_vtab *pVt
32570 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 ab;. const sqli
32580 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 te3_module *pMod
32590 75 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 ule;.. assert(
325a0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a p->bIsReader );.
325b0 20 20 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 pCur = 0;. pV
325c0 74 61 62 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 tabCursor = 0;.
325d0 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 pVtab = pOp->p4
325e0 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 .pVtab->pVtab;.
325f0 20 69 66 28 20 70 56 74 61 62 3d 3d 30 20 7c 7c if( pVtab==0 ||
32600 20 4e 45 56 45 52 28 70 56 74 61 62 2d 3e 70 4d NEVER(pVtab->pM
32610 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a 20 20 20 odule==0) ){.
32620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 rc = SQLITE_LOC
32630 4b 45 44 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a KED;. break;.
32640 20 20 7d 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 }. pModule =
32650 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a pVtab->pModule;.
32660 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e rc = pModule->
32670 78 4f 70 65 6e 28 70 56 74 61 62 2c 20 26 70 56 xOpen(pVtab, &pV
32680 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 73 71 tabCursor);. sq
32690 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 lite3VtabImportE
326a0 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b rrmsg(p, pVtab);
326b0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b . if( SQLITE_OK
326c0 3d 3d 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 49 ==rc ){. /* I
326d0 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 nitialize sqlite
326e0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 3_vtab_cursor ba
326f0 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 se class */.
32700 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 pVtabCursor->pVt
32710 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20 20 ab = pVtab;..
32720 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 /* Initialize v
32730 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 dbe cursor objec
32740 74 20 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d 20 t */. pCur =
32750 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 allocateCursor(p
32760 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 , pOp->p1, 0, -1
32770 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 , 0);. if( pC
32780 75 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 ur ){. pCur
32790 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 ->pVtabCursor =
327a0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 pVtabCursor;.
327b0 20 20 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b 2b pVtab->nRef++
327c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
327d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d assert( db->m
327e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
327f0 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 pModule->xC
32800 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 lose(pVtabCursor
32810 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f );. goto no
32820 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a _mem;. }. }.
32830 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 break;.}.#endi
32840 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 f /* SQLITE_OMIT
32850 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f _VIRTUALTABLE */
32860 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
32870 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
32880 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 46 LE./* Opcode: VF
32890 69 6c 74 65 72 20 50 31 20 50 32 20 50 33 20 50 ilter P1 P2 P3 P
328a0 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 4 *.** Synopsis:
328b0 20 69 70 6c 61 6e 3d 72 5b 50 33 5d 20 7a 70 6c iplan=r[P3] zpl
328c0 61 6e 3d 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 31 an='P4'.**.** P1
328d0 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 is a cursor ope
328e0 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e ned using VOpen.
328f0 20 20 50 32 20 69 73 20 61 6e 20 61 64 64 72 65 P2 is an addre
32900 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 ss to jump to if
32910 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65 64 .** the filtered
32920 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65 result set is e
32930 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 mpty..**.** P4 i
32940 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 s either NULL or
32950 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 a string that w
32960 61 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 as generated by
32970 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a the xBestIndex.*
32980 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 * method of the
32990 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e 74 module. The int
329a0 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 erpretation of t
329b0 68 65 20 50 34 20 73 74 72 69 6e 67 20 69 73 20 he P4 string is
329c0 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d left.** to the m
329d0 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 odule implementa
329e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 tion..**.** This
329f0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 opcode invokes
32a00 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 the xFilter meth
32a10 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61 od on the virtua
32a20 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65 l table specifie
32a30 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68 65 d.** by P1. The
32a40 20 69 6e 74 65 67 65 72 20 71 75 65 72 79 20 70 integer query p
32a50 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74 6f lan parameter to
32a60 20 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f 72 xFilter is stor
32a70 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a ed in register.*
32a80 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72 20 50 * P3. Register P
32a90 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20 61 3+1 stores the a
32aa0 72 67 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f rgc parameter to
32ab0 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 be passed to th
32ac0 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65 74 e.** xFilter met
32ad0 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20 50 hod. Registers P
32ae0 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61 3+2..P3+1+argc a
32af0 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20 61 re the argc.** a
32b00 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 dditional parame
32b10 74 65 72 73 20 77 68 69 63 68 20 61 72 65 20 70 ters which are p
32b20 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c assed to.** xFil
32b30 74 65 72 20 61 73 20 61 72 67 76 2e 20 52 65 67 ter as argv. Reg
32b40 69 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f 6d ister P3+2 becom
32b50 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e 20 es argv[0] when
32b60 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65 passed to xFilte
32b70 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 r..**.** A jump
32b80 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69 66 is made to P2 if
32b90 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 the result set
32ba0 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67 20 after filtering
32bb0 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a would be empty..
32bc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 */.case OP_VFilt
32bd0 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 er: { /* jump
32be0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 */. int nArg;.
32bf0 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20 63 int iQuery;. c
32c00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 onst sqlite3_mod
32c10 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 ule *pModule;.
32c20 4d 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d Mem *pQuery;. M
32c30 65 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c em *pArgc;. sql
32c40 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 ite3_vtab_cursor
32c50 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 *pVtabCursor;.
32c60 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 sqlite3_vtab *p
32c70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73 Vtab;. VdbeCurs
32c80 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 or *pCur;. int
32c90 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 res;. int i;.
32ca0 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20 Mem **apArg;..
32cb0 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70 pQuery = &aMem[p
32cc0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63 Op->p3];. pArgc
32cd0 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20 = &pQuery[1];.
32ce0 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 pCur = p->apCsr
32cf0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 [pOp->p1];. ass
32d00 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 ert( memIsValid(
32d10 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47 pQuery) );. REG
32d20 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d ISTER_TRACE(pOp-
32d30 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 >p3, pQuery);.
32d40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 assert( pCur->pV
32d50 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 tabCursor );. p
32d60 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 75 VtabCursor = pCu
32d70 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a r->pVtabCursor;.
32d80 20 20 70 56 74 61 62 20 3d 20 70 56 74 61 62 43 pVtab = pVtabC
32d90 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 ursor->pVtab;.
32da0 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d pModule = pVtab-
32db0 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 >pModule;.. /*
32dc0 47 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e Grab the index n
32dd0 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20 70 umber and argc p
32de0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 arameters */. a
32df0 73 73 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e ssert( (pQuery->
32e00 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d flags&MEM_Int)!=
32e10 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 0 && pArgc->flag
32e20 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 s==MEM_Int );.
32e30 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67 nArg = (int)pArg
32e40 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 c->u.i;. iQuery
32e50 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e = (int)pQuery->
32e60 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b u.i;.. /* Invok
32e70 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 e the xFilter me
32e80 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73 20 3d 20 thod */. res =
32e90 30 3b 0a 20 20 61 70 41 72 67 20 3d 20 70 2d 3e 0;. apArg = p->
32ea0 61 70 41 72 67 3b 0a 20 20 66 6f 72 28 69 20 3d apArg;. for(i =
32eb0 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 0; i<nArg; i++)
32ec0 7b 0a 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d {. apArg[i] =
32ed0 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 &pArgc[i+1];.
32ee0 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 }. rc = pModule
32ef0 2d 3e 78 46 69 6c 74 65 72 28 70 56 74 61 62 43 ->xFilter(pVtabC
32f00 75 72 73 6f 72 2c 20 69 51 75 65 72 79 2c 20 70 ursor, iQuery, p
32f10 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 Op->p4.z, nArg,
32f20 61 70 41 72 67 29 3b 0a 20 20 73 71 6c 69 74 65 apArg);. sqlite
32f30 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 3VtabImportErrms
32f40 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 g(p, pVtab);. i
32f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
32f60 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 4d ){. res = pM
32f70 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 74 61 odule->xEof(pVta
32f80 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 bCursor);. }.
32f90 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 pCur->nullRow =
32fa0 30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 0;. VdbeBranchT
32fb0 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a aken(res!=0,2);.
32fc0 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f if( res ) goto
32fd0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 jump_to_p2;. b
32fe0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f reak;.}.#endif /
32ff0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 * SQLITE_OMIT_VI
33000 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 RTUALTABLE */..#
33010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
33020 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
33030 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 6f 6c 75 /* Opcode: VColu
33040 6d 6e 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a mn P1 P2 P3 * *.
33050 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 ** Synopsis: r[P
33060 33 5d 3d 76 63 6f 6c 75 6d 6e 28 50 32 29 0a 2a 3]=vcolumn(P2).*
33070 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 76 *.** Store the v
33080 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 2d 74 alue of the P2-t
33090 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 h column of.** t
330a0 68 65 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69 he row of the vi
330b0 72 74 75 61 6c 2d 74 61 62 6c 65 20 74 68 61 74 rtual-table that
330c0 20 74 68 65 20 0a 2a 2a 20 50 31 20 63 75 72 73 the .** P1 curs
330d0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 or is pointing t
330e0 6f 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 o into register
330f0 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 P3..*/.case OP_V
33100 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 Column: {. sqli
33110 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b te3_vtab *pVtab;
33120 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 . const sqlite3
33130 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 _module *pModule
33140 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 0a ;. Mem *pDest;.
33150 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 sqlite3_contex
33160 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 t sContext;.. V
33170 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 20 dbeCursor *pCur
33180 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e = p->apCsr[pOp->
33190 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 p1];. assert( p
331a0 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 Cur->pVtabCursor
331b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f );. assert( pO
331c0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e p->p3>0 && pOp->
331d0 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2d 70 2d 3e p3<=(p->nMem-p->
331e0 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 44 nCursor) );. pD
331f0 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d est = &aMem[pOp-
33200 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 >p3];. memAbout
33210 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73 ToChange(p, pDes
33220 74 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e t);. if( pCur->
33230 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 nullRow ){. s
33240 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 qlite3VdbeMemSet
33250 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 Null(pDest);.
33260 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 break;. }. pV
33270 74 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 tab = pCur->pVta
33280 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a bCursor->pVtab;.
33290 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 pModule = pVta
332a0 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 b->pModule;. as
332b0 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 sert( pModule->x
332c0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73 Column );. mems
332d0 65 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c et(&sContext, 0,
332e0 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 sizeof(sContext
332f0 29 29 3b 0a 20 20 73 43 6f 6e 74 65 78 74 2e 70 ));. sContext.p
33300 4f 75 74 20 3d 20 70 44 65 73 74 3b 0a 20 20 4d Out = pDest;. M
33310 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 44 emSetTypeFlag(pD
33320 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a est, MEM_Null);.
33330 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e rc = pModule->
33340 78 43 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56 xColumn(pCur->pV
33350 74 61 62 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e tabCursor, &sCon
33360 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a text, pOp->p2);.
33370 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 sqlite3VtabImp
33380 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 ortErrmsg(p, pVt
33390 61 62 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74 ab);. if( sCont
333a0 65 78 74 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 ext.isError ){.
333b0 20 20 20 72 63 20 3d 20 73 43 6f 6e 74 65 78 74 rc = sContext
333c0 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 .isError;. }.
333d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
333e0 65 45 6e 63 6f 64 69 6e 67 28 70 44 65 73 74 2c eEncoding(pDest,
333f0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 52 45 encoding);. RE
33400 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 GISTER_TRACE(pOp
33410 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 ->p3, pDest);.
33420 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 UPDATE_MAX_BLOBS
33430 49 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20 20 69 IZE(pDest);.. i
33440 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 f( sqlite3VdbeMe
33450 6d 54 6f 6f 42 69 67 28 70 44 65 73 74 29 20 29 mTooBig(pDest) )
33460 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 {. goto too_b
33470 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b ig;. }. break;
33480 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c .}.#endif /* SQL
33490 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
334a0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 TABLE */..#ifnde
334b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 f SQLITE_OMIT_VI
334c0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 RTUALTABLE./* Op
334d0 63 6f 64 65 3a 20 56 4e 65 78 74 20 50 31 20 50 code: VNext P1 P
334e0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 2 * * *.**.** Ad
334f0 76 61 6e 63 65 20 76 69 72 74 75 61 6c 20 74 61 vance virtual ta
33500 62 6c 65 20 50 31 20 74 6f 20 74 68 65 20 6e 65 ble P1 to the ne
33510 78 74 20 72 6f 77 20 69 6e 20 69 74 73 20 72 65 xt row in its re
33520 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 2a 2a 20 sult set and.**
33530 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 jump to instruct
33540 69 6f 6e 20 50 32 2e 20 20 4f 72 2c 20 69 66 20 ion P2. Or, if
33550 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c the virtual tabl
33560 65 20 68 61 73 20 72 65 61 63 68 65 64 0a 2a 2a e has reached.**
33570 20 74 68 65 20 65 6e 64 20 6f 66 20 69 74 73 20 the end of its
33580 72 65 73 75 6c 74 20 73 65 74 2c 20 74 68 65 6e result set, then
33590 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f fall through to
335a0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 the next instru
335b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f ction..*/.case O
335c0 50 5f 56 4e 65 78 74 3a 20 7b 20 20 20 2f 2a 20 P_VNext: { /*
335d0 6a 75 6d 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 jump */. sqlite
335e0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 3_vtab *pVtab;.
335f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d const sqlite3_m
33600 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a odule *pModule;.
33610 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 56 64 62 int res;. Vdb
33620 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a eCursor *pCur;..
33630 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 res = 0;. pCu
33640 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 r = p->apCsr[pOp
33650 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 ->p1];. assert(
33660 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 pCur->pVtabCurs
33670 6f 72 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 or );. if( pCur
33680 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 ->nullRow ){.
33690 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 break;. }. pV
336a0 74 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 tab = pCur->pVta
336b0 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a bCursor->pVtab;.
336c0 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 pModule = pVta
336d0 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 b->pModule;. as
336e0 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 sert( pModule->x
336f0 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e Next );.. /* In
33700 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74 28 29 voke the xNext()
33710 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d method of the m
33720 6f 64 75 6c 65 2e 20 54 68 65 72 65 20 69 73 20 odule. There is
33730 6e 6f 20 77 61 79 20 66 6f 72 20 74 68 65 0a 20 no way for the.
33740 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 69 ** underlying i
33750 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f mplementation to
33760 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 return an error
33770 20 69 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 64 if one occurs d
33780 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74 uring. ** xNext
33790 28 29 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 (). Instead, if
337a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
337b0 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65 true is returne
337c0 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 d (indicating th
337d0 61 74 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 73 at . ** data is
337e0 20 61 76 61 69 6c 61 62 6c 65 29 20 61 6e 64 20 available) and
337f0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 the error code r
33800 65 74 75 72 6e 65 64 20 77 68 65 6e 20 78 43 6f eturned when xCo
33810 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d lumn or. ** som
33820 65 20 6f 74 68 65 72 20 6d 65 74 68 6f 64 20 69 e other method i
33830 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65 64 20 6f s next invoked o
33840 6e 20 74 68 65 20 73 61 76 65 20 76 69 72 74 75 n the save virtu
33850 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e al table cursor.
33860 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 4d 6f . */. rc = pMo
33870 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 dule->xNext(pCur
33880 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a ->pVtabCursor);.
33890 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 sqlite3VtabImp
338a0 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 ortErrmsg(p, pVt
338b0 61 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 ab);. if( rc==S
338c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
338d0 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 res = pModule->x
338e0 45 6f 66 28 70 43 75 72 2d 3e 70 56 74 61 62 43 Eof(pCur->pVtabC
338f0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 56 64 ursor);. }. Vd
33900 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 21 72 beBranchTaken(!r
33910 65 73 2c 32 29 3b 0a 20 20 69 66 28 20 21 72 65 es,2);. if( !re
33920 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 s ){. /* If t
33930 68 65 72 65 20 69 73 20 64 61 74 61 2c 20 6a 75 here is data, ju
33940 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 mp to P2 */.
33950 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f goto jump_to_p2_
33960 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e and_check_for_in
33970 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 67 terrupt;. }. g
33980 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e oto check_for_in
33990 74 65 72 72 75 70 74 3b 0a 7d 0a 23 65 6e 64 69 terrupt;.}.#endi
339a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 f /* SQLITE_OMIT
339b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f _VIRTUALTABLE */
339c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
339d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
339e0 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52 LE./* Opcode: VR
339f0 65 6e 61 6d 65 20 50 31 20 2a 20 2a 20 50 34 20 ename P1 * * P4
33a00 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 *.**.** P4 is a
33a10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 pointer to a vir
33a20 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 tual table objec
33a30 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 t, an sqlite3_vt
33a40 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a ab structure..**
33a50 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 This opcode inv
33a60 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 okes the corresp
33a70 6f 6e 64 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d onding xRename m
33a80 65 74 68 6f 64 2e 20 54 68 65 20 76 61 6c 75 65 ethod. The value
33a90 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 .** in register
33aa0 50 31 20 69 73 20 70 61 73 73 65 64 20 61 73 20 P1 is passed as
33ab0 74 68 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65 the zName argume
33ac0 6e 74 20 74 6f 20 74 68 65 20 78 52 65 6e 61 6d nt to the xRenam
33ad0 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73 e method..*/.cas
33ae0 65 20 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a e OP_VRename: {.
33af0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a sqlite3_vtab *
33b00 70 56 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e pVtab;. Mem *pN
33b10 61 6d 65 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20 ame;.. pVtab =
33b20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 pOp->p4.pVtab->p
33b30 56 74 61 62 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 Vtab;. pName =
33b40 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a &aMem[pOp->p1];.
33b50 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d assert( pVtab-
33b60 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d >pModule->xRenam
33b70 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d e );. assert( m
33b80 65 6d 49 73 56 61 6c 69 64 28 70 4e 61 6d 65 29 emIsValid(pName)
33b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
33ba0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a >readOnly==0 );.
33bb0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 REGISTER_TRACE
33bc0 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 (pOp->p1, pName)
33bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d ;. assert( pNam
33be0 65 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 e->flags & MEM_S
33bf0 74 72 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 tr );. testcase
33c00 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 ( pName->enc==SQ
33c10 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 74 LITE_UTF8 );. t
33c20 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e estcase( pName->
33c30 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 enc==SQLITE_UTF1
33c40 36 42 45 20 29 3b 0a 20 20 74 65 73 74 63 61 73 6BE );. testcas
33c50 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 e( pName->enc==S
33c60 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b QLITE_UTF16LE );
33c70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 . rc = sqlite3V
33c80 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e dbeChangeEncodin
33c90 67 28 70 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f g(pName, SQLITE_
33ca0 55 54 46 38 29 3b 0a 20 20 69 66 28 20 72 63 3d UTF8);. if( rc=
33cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
33cc0 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d rc = pVtab->pM
33cd0 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 odule->xRename(p
33ce0 56 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b Vtab, pName->z);
33cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 . sqlite3Vtab
33d00 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 ImportErrmsg(p,
33d10 70 56 74 61 62 29 3b 0a 20 20 20 20 70 2d 3e 65 pVtab);. p->e
33d20 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a xpired = 0;. }.
33d30 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 break;.}.#endi
33d40 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 f..#ifndef SQLIT
33d50 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 E_OMIT_VIRTUALTA
33d60 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 BLE./* Opcode: V
33d70 55 70 64 61 74 65 20 50 31 20 50 32 20 50 33 20 Update P1 P2 P3
33d80 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 P4 P5.** Synopsi
33d90 73 3a 20 64 61 74 61 3d 72 5b 50 33 40 50 32 5d s: data=r[P3@P2]
33da0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 .**.** P4 is a p
33db0 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 ointer to a virt
33dc0 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 ual table object
33dd0 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 , an sqlite3_vta
33de0 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 b structure..**
33df0 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f This opcode invo
33e00 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f kes the correspo
33e10 6e 64 69 6e 67 20 78 55 70 64 61 74 65 20 6d 65 nding xUpdate me
33e20 74 68 6f 64 2e 20 50 32 20 76 61 6c 75 65 73 0a thod. P2 values.
33e30 2a 2a 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75 ** are contiguou
33e40 73 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 73 s memory cells s
33e50 74 61 72 74 69 6e 67 20 61 74 20 50 33 20 74 6f tarting at P3 to
33e60 20 70 61 73 73 20 74 6f 20 74 68 65 20 78 55 70 pass to the xUp
33e70 64 61 74 65 20 0a 2a 2a 20 69 6e 76 6f 63 61 74 date .** invocat
33e80 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 69 ion. The value i
33e90 6e 20 72 65 67 69 73 74 65 72 20 28 50 33 2b 50 n register (P3+P
33ea0 32 2d 31 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 2-1) corresponds
33eb0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 32 74 68 to the .** p2th
33ec0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 element of the
33ed0 61 72 67 76 20 61 72 72 61 79 20 70 61 73 73 65 argv array passe
33ee0 64 20 74 6f 20 78 55 70 64 61 74 65 2e 0a 2a 2a d to xUpdate..**
33ef0 0a 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 .** The xUpdate
33f00 6d 65 74 68 6f 64 20 77 69 6c 6c 20 64 6f 20 61 method will do a
33f10 20 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e DELETE or an IN
33f20 53 45 52 54 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a SERT or both..**
33f30 20 54 68 65 20 61 72 67 76 5b 30 5d 20 65 6c 65 The argv[0] ele
33f40 6d 65 6e 74 20 28 77 68 69 63 68 20 63 6f 72 72 ment (which corr
33f50 65 73 70 6f 6e 64 73 20 74 6f 20 6d 65 6d 6f 72 esponds to memor
33f60 79 20 63 65 6c 6c 20 50 33 29 0a 2a 2a 20 69 73 y cell P3).** is
33f70 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20 the rowid of a
33f80 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 row to delete.
33f90 49 66 20 61 72 67 76 5b 30 5d 20 69 73 20 4e 55 If argv[0] is NU
33fa0 4c 4c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 64 LL then no .** d
33fb0 65 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73 2e 20 eletion occurs.
33fc0 20 54 68 65 20 61 72 67 76 5b 31 5d 20 65 6c 65 The argv[1] ele
33fd0 6d 65 6e 74 20 69 73 20 74 68 65 20 72 6f 77 69 ment is the rowi
33fe0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 0a 2a 2a d of the new .**
33ff0 20 72 6f 77 2e 20 20 54 68 69 73 20 63 61 6e 20 row. This can
34000 62 65 20 4e 55 4c 4c 20 74 6f 20 68 61 76 65 20 be NULL to have
34010 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c the virtual tabl
34020 65 20 73 65 6c 65 63 74 20 74 68 65 20 6e 65 77 e select the new
34030 20 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 69 .** rowid for i
34040 74 73 65 6c 66 2e 20 20 54 68 65 20 73 75 62 73 tself. The subs
34050 65 71 75 65 6e 74 20 65 6c 65 6d 65 6e 74 73 20 equent elements
34060 69 6e 20 74 68 65 20 61 72 72 61 79 20 61 72 65 in the array are
34070 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 .** the values
34080 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 of columns in th
34090 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a e new row..**.**
340a0 20 49 66 20 50 32 3d 3d 31 20 74 68 65 6e 20 6e If P2==1 then n
340b0 6f 20 69 6e 73 65 72 74 20 69 73 20 70 65 72 66 o insert is perf
340c0 6f 72 6d 65 64 2e 20 20 61 72 67 76 5b 30 5d 20 ormed. argv[0]
340d0 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a is the rowid of.
340e0 2a 2a 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 ** a row to dele
340f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 te..**.** P1 is
34100 61 20 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 2e 20 a boolean flag.
34110 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 If it is set to
34120 74 72 75 65 20 61 6e 64 20 74 68 65 20 78 55 70 true and the xUp
34130 64 61 74 65 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 date call.** is
34140 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e successful, then
34150 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 the value retur
34160 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6c ned by sqlite3_l
34170 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 ast_insert_rowid
34180 28 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f () .** is set to
34190 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
341a0 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 e rowid for the
341b0 72 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 row just inserte
341c0 64 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20 74 d..**.** P5 is t
341d0 68 65 20 65 72 72 6f 72 20 61 63 74 69 6f 6e 73 he error actions
341e0 20 28 4f 45 5f 52 65 70 6c 61 63 65 2c 20 4f 45 (OE_Replace, OE
341f0 5f 46 61 69 6c 2c 20 4f 45 5f 49 67 6e 6f 72 65 _Fail, OE_Ignore
34200 2c 20 65 74 63 29 20 74 6f 0a 2a 2a 20 61 70 70 , etc) to.** app
34210 6c 79 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f ly in the case o
34220 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 f a constraint f
34230 61 69 6c 75 72 65 20 6f 6e 20 61 6e 20 69 6e 73 ailure on an ins
34240 65 72 74 20 6f 72 20 75 70 64 61 74 65 2e 0a 2a ert or update..*
34250 2f 0a 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 /.case OP_VUpdat
34260 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 e: {. sqlite3_v
34270 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f tab *pVtab;. co
34280 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 nst sqlite3_modu
34290 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 le *pModule;. i
342a0 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 nt nArg;. int i
342b0 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 ;. sqlite_int64
342c0 20 72 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 2a 2a rowid;. Mem **
342d0 61 70 41 72 67 3b 0a 20 20 4d 65 6d 20 2a 70 58 apArg;. Mem *pX
342e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 ;.. assert( pOp
342f0 2d 3e 70 32 3d 3d 31 20 20 20 20 20 20 20 20 7c ->p2==1 |
34300 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 46 61 | pOp->p5==OE_Fa
34310 69 6c 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d il || pOp->p5=
34320 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 =OE_Rollback .
34330 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d || pOp->p5=
34340 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 70 4f 70 =OE_Abort || pOp
34350 2d 3e 70 35 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 ->p5==OE_Ignore
34360 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 || pOp->p5==OE_R
34370 65 70 6c 61 63 65 0a 20 20 29 3b 0a 20 20 61 73 eplace. );. as
34380 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c sert( p->readOnl
34390 79 3d 3d 30 20 29 3b 0a 20 20 70 56 74 61 62 20 y==0 );. pVtab
343a0 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d = pOp->p4.pVtab-
343b0 3e 70 56 74 61 62 3b 0a 20 20 69 66 28 20 70 56 >pVtab;. if( pV
343c0 74 61 62 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 tab==0 || NEVER(
343d0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d pVtab->pModule==
343e0 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 0) ){. rc = S
343f0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 QLITE_LOCKED;.
34400 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 break;. }. p
34410 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e Module = pVtab->
34420 70 4d 6f 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20 pModule;. nArg
34430 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 = pOp->p2;. ass
34440 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 ert( pOp->p4type
34450 3d 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 69 ==P4_VTAB );. i
34460 66 28 20 41 4c 57 41 59 53 28 70 4d 6f 64 75 6c f( ALWAYS(pModul
34470 65 2d 3e 78 55 70 64 61 74 65 29 20 29 7b 0a 20 e->xUpdate) ){.
34480 20 20 20 75 38 20 76 74 61 62 4f 6e 43 6f 6e 66 u8 vtabOnConf
34490 6c 69 63 74 20 3d 20 64 62 2d 3e 76 74 61 62 4f lict = db->vtabO
344a0 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 61 nConflict;. a
344b0 70 41 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b pArg = p->apArg;
344c0 0a 20 20 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b . pX = &aMem[
344d0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f pOp->p3];. fo
344e0 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 r(i=0; i<nArg; i
344f0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 ++){. asser
34500 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 t( memIsValid(pX
34510 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 ) );. memAb
34520 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 outToChange(p, p
34530 58 29 3b 0a 20 20 20 20 20 20 61 70 41 72 67 5b X);. apArg[
34540 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20 20 70 i] = pX;. p
34550 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 X++;. }. d
34560 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 b->vtabOnConflic
34570 74 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 t = pOp->p5;.
34580 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 rc = pModule->x
34590 55 70 64 61 74 65 28 70 56 74 61 62 2c 20 6e 41 Update(pVtab, nA
345a0 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f 77 69 rg, apArg, &rowi
345b0 64 29 3b 0a 20 20 20 20 64 62 2d 3e 76 74 61 62 d);. db->vtab
345c0 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 76 74 61 OnConflict = vta
345d0 62 4f 6e 43 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 bOnConflict;.
345e0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f sqlite3VtabImpo
345f0 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 rtErrmsg(p, pVta
34600 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d b);. if( rc==
34610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4f 70 SQLITE_OK && pOp
34620 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20 20 61 73 ->p1 ){. as
34630 73 65 72 74 28 20 6e 41 72 67 3e 31 20 26 26 20 sert( nArg>1 &&
34640 61 70 41 72 67 5b 30 5d 20 26 26 20 28 61 70 41 apArg[0] && (apA
34650 72 67 5b 30 5d 2d 3e 66 6c 61 67 73 26 4d 45 4d rg[0]->flags&MEM
34660 5f 4e 75 6c 6c 29 20 29 3b 0a 20 20 20 20 20 20 _Null) );.
34670 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 db->lastRowid =
34680 6c 61 73 74 52 6f 77 69 64 20 3d 20 72 6f 77 69 lastRowid = rowi
34690 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 d;. }. if(
346a0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 (rc&0xff)==SQLI
346b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 TE_CONSTRAINT &&
346c0 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e pOp->p4.pVtab->
346d0 62 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 bConstraint ){.
346e0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 if( pOp->p5
346f0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 ==OE_Ignore ){.
34700 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
34710 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c TE_OK;. }el
34720 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 se{. p->e
34730 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 28 28 70 rrorAction = ((p
34740 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 Op->p5==OE_Repla
34750 63 65 29 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a ce) ? OE_Abort :
34760 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20 pOp->p5);.
34770 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }. }else{.
34780 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b p->nChange++
34790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 ;. }. }. br
347a0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a eak;.}.#endif /*
347b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 SQLITE_OMIT_VIR
347c0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 TUALTABLE */..#i
347d0 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d fndef SQLITE_OM
347e0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 IT_PAGER_PRAGMAS
347f0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 ./* Opcode: Page
34800 63 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 count P1 P2 * *
34810 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 *.**.** Write th
34820 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 e current number
34830 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 of pages in dat
34840 61 62 61 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f abase P1 to memo
34850 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 ry cell P2..*/.c
34860 61 73 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 ase OP_Pagecount
34870 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f : { /
34880 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 * out2 */. pOut
34890 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 = out2Prereleas
348a0 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 e(p, pOp);. pOu
348b0 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65 33 t->u.i = sqlite3
348c0 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 64 62 BtreeLastPage(db
348d0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 ->aDb[pOp->p1].p
348e0 42 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a Bt);. break;.}.
348f0 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 #endif...#ifndef
34900 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 SQLITE_OMIT_PA
34910 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f GER_PRAGMAS./* O
34920 70 63 6f 64 65 3a 20 4d 61 78 50 67 63 6e 74 20 pcode: MaxPgcnt
34930 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a P1 P2 P3 * *.**.
34940 2a 2a 20 54 72 79 20 74 6f 20 73 65 74 20 74 68 ** Try to set th
34950 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 e maximum page c
34960 6f 75 6e 74 20 66 6f 72 20 64 61 74 61 62 61 73 ount for databas
34970 65 20 50 31 20 74 6f 20 74 68 65 20 76 61 6c 75 e P1 to the valu
34980 65 20 69 6e 20 50 33 2e 0a 2a 2a 20 44 6f 20 6e e in P3..** Do n
34990 6f 74 20 6c 65 74 20 74 68 65 20 6d 61 78 69 6d ot let the maxim
349a0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 61 um page count fa
349b0 6c 6c 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 ll below the cur
349c0 72 65 6e 74 20 70 61 67 65 20 63 6f 75 6e 74 20 rent page count
349d0 61 6e 64 0a 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 and.** do not ch
349e0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d ange the maximum
349f0 20 70 61 67 65 20 63 6f 75 6e 74 20 76 61 6c 75 page count valu
34a00 65 20 69 66 20 50 33 3d 3d 30 2e 0a 2a 2a 0a 2a e if P3==0..**.*
34a10 2a 20 53 74 6f 72 65 20 74 68 65 20 6d 61 78 69 * Store the maxi
34a20 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 61 mum page count a
34a30 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 20 fter the change
34a40 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a in register P2..
34a50 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 78 50 67 */.case OP_MaxPg
34a60 63 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 cnt: {
34a70 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 75 /* out2 */. u
34a80 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 4d nsigned int newM
34a90 61 78 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 ax;. Btree *pBt
34aa0 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 ;.. pOut = out2
34ab0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f Prerelease(p, pO
34ac0 70 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e p);. pBt = db->
34ad0 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 aDb[pOp->p1].pBt
34ae0 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b 0a ;. newMax = 0;.
34af0 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b if( pOp->p3 ){
34b00 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 73 71 . newMax = sq
34b10 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 lite3BtreeLastPa
34b20 67 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 ge(pBt);. if(
34b30 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73 69 67 newMax < (unsig
34b40 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e 65 ned)pOp->p3 ) ne
34b50 77 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e 65 64 wMax = (unsigned
34b60 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 )pOp->p3;. }.
34b70 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 pOut->u.i = sqli
34b80 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 te3BtreeMaxPageC
34b90 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61 78 ount(pBt, newMax
34ba0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 );. break;.}.#e
34bb0 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 ndif.../* Opcode
34bc0 3a 20 49 6e 69 74 20 2a 20 50 32 20 2a 20 50 34 : Init * P2 * P4
34bd0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 *.** Synopsis:
34be0 20 53 74 61 72 74 20 61 74 20 50 32 0a 2a 2a 0a Start at P2.**.
34bf0 2a 2a 20 50 72 6f 67 72 61 6d 73 20 63 6f 6e 74 ** Programs cont
34c00 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 ain a single ins
34c10 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 70 tance of this op
34c20 63 6f 64 65 20 61 73 20 74 68 65 20 76 65 72 79 code as the very
34c30 20 66 69 72 73 74 0a 2a 2a 20 6f 70 63 6f 64 65 first.** opcode
34c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 61 63 69 ..**.** If traci
34c50 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20 28 62 ng is enabled (b
34c60 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 72 y the sqlite3_tr
34c70 61 63 65 28 29 29 20 69 6e 74 65 72 66 61 63 65 ace()) interface
34c80 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 55 54 , then.** the UT
34c90 46 2d 38 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 F-8 string conta
34ca0 69 6e 65 64 20 69 6e 20 50 34 20 69 73 20 65 6d ined in P4 is em
34cb0 69 74 74 65 64 20 6f 6e 20 74 68 65 20 74 72 61 itted on the tra
34cc0 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 ce callback..**
34cd0 4f 72 20 69 66 20 50 34 20 69 73 20 62 6c 61 6e Or if P4 is blan
34ce0 6b 2c 20 75 73 65 20 74 68 65 20 73 74 72 69 6e k, use the strin
34cf0 67 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 g returned by sq
34d00 6c 69 74 65 33 5f 73 71 6c 28 29 2e 0a 2a 2a 0a lite3_sql()..**.
34d10 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 74 20 ** If P2 is not
34d20 7a 65 72 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e zero, jump to in
34d30 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f struction P2..*/
34d40 0a 63 61 73 65 20 4f 50 5f 49 6e 69 74 3a 20 7b .case OP_Init: {
34d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d /* jum
34d60 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 p */. char *zTr
34d70 61 63 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a ace;. char *z;.
34d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
34d90 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 OMIT_TRACE. if(
34da0 20 64 62 2d 3e 78 54 72 61 63 65 0a 20 20 20 26 db->xTrace. &
34db0 26 20 21 70 2d 3e 64 6f 69 6e 67 52 65 72 75 6e & !p->doingRerun
34dc0 0a 20 20 20 26 26 20 28 7a 54 72 61 63 65 20 3d . && (zTrace =
34dd0 20 28 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f (pOp->p4.z ? pO
34de0 70 2d 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 p->p4.z : p->zSq
34df0 6c 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 l))!=0. ){.
34e00 7a 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 z = sqlite3VdbeE
34e10 78 70 61 6e 64 53 71 6c 28 70 2c 20 7a 54 72 61 xpandSql(p, zTra
34e20 63 65 29 3b 0a 20 20 20 20 64 62 2d 3e 78 54 72 ce);. db->xTr
34e30 61 63 65 28 64 62 2d 3e 70 54 72 61 63 65 41 72 ace(db->pTraceAr
34e40 67 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 g, z);. sqlit
34e50 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b e3DbFree(db, z);
34e60 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 . }.#ifdef SQLI
34e70 54 45 5f 55 53 45 5f 46 43 4e 54 4c 5f 54 52 41 TE_USE_FCNTL_TRA
34e80 43 45 0a 20 20 7a 54 72 61 63 65 20 3d 20 28 70 CE. zTrace = (p
34e90 4f 70 2d 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e Op->p4.z ? pOp->
34ea0 70 34 2e 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b p4.z : p->zSql);
34eb0 0a 20 20 69 66 28 20 7a 54 72 61 63 65 20 29 7b . if( zTrace ){
34ec0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
34ed0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e for(i=0; i<db->n
34ee0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 Db; i++){.
34ef0 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 if( DbMaskTest(p
34f00 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3d ->btreeMask, i)=
34f10 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 =0 ) continue;.
34f20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c sqlite3_fil
34f30 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 e_control(db, db
34f40 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 ->aDb[i].zName,
34f50 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 41 SQLITE_FCNTL_TRA
34f60 43 45 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 CE, zTrace);.
34f70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a }. }.#endif /*
34f80 20 53 51 4c 49 54 45 5f 55 53 45 5f 46 43 4e 54 SQLITE_USE_FCNT
34f90 4c 5f 54 52 41 43 45 20 2a 2f 0a 23 69 66 64 65 L_TRACE */.#ifde
34fa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 f SQLITE_DEBUG.
34fb0 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 if( (db->flags
34fc0 26 20 53 51 4c 49 54 45 5f 53 71 6c 54 72 61 63 & SQLITE_SqlTrac
34fd0 65 29 21 3d 30 0a 20 20 20 26 26 20 28 7a 54 72 e)!=0. && (zTr
34fe0 61 63 65 20 3d 20 28 70 4f 70 2d 3e 70 34 2e 7a ace = (pOp->p4.z
34ff0 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20 70 ? pOp->p4.z : p
35000 2d 3e 7a 53 71 6c 29 29 21 3d 30 0a 20 20 29 7b ->zSql))!=0. ){
35010 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 . sqlite3Debu
35020 67 50 72 69 6e 74 66 28 22 53 51 4c 2d 74 72 61 gPrintf("SQL-tra
35030 63 65 3a 20 25 73 5c 6e 22 2c 20 7a 54 72 61 63 ce: %s\n", zTrac
35040 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f e);. }.#endif /
35050 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a * SQLITE_DEBUG *
35060 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 /.#endif /* SQLI
35070 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f TE_OMIT_TRACE */
35080 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 . if( pOp->p2 )
35090 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 goto jump_to_p2
350a0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f ;. break;.}.../
350b0 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 6f 70 20 2a * Opcode: Noop *
350c0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 * * * *.**.** D
350d0 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69 73 o nothing. This
350e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 instruction is
350f0 6f 66 74 65 6e 20 75 73 65 66 75 6c 20 61 73 20 often useful as
35100 61 20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69 6e a jump.** destin
35110 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 ation..*/./*.**
35120 54 68 65 20 6d 61 67 69 63 20 45 78 70 6c 61 69 The magic Explai
35130 6e 20 6f 70 63 6f 64 65 20 61 72 65 20 6f 6e 6c n opcode are onl
35140 79 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 20 y inserted when
35150 65 78 70 6c 61 69 6e 3d 3d 32 20 28 77 68 69 63 explain==2 (whic
35160 68 0a 2a 2a 20 69 73 20 74 6f 20 73 61 79 20 77 h.** is to say w
35170 68 65 6e 20 74 68 65 20 45 58 50 4c 41 49 4e 20 hen the EXPLAIN
35180 51 55 45 52 59 20 50 4c 41 4e 20 73 79 6e 74 61 QUERY PLAN synta
35190 78 20 69 73 20 75 73 65 64 2e 29 0a 2a 2a 20 54 x is used.).** T
351a0 68 69 73 20 6f 70 63 6f 64 65 20 72 65 63 6f 72 his opcode recor
351b0 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 ds information f
351c0 72 6f 6d 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 rom the optimize
351d0 72 2e 20 20 49 74 20 69 73 20 74 68 65 0a 2a 2a r. It is the.**
351e0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 6e the same as a n
351f0 6f 2d 6f 70 2e 20 20 54 68 69 73 20 6f 70 63 6f o-op. This opco
35200 64 65 73 6e 65 76 65 72 20 61 70 70 65 61 72 73 desnever appears
35210 20 69 6e 20 61 20 72 65 61 6c 20 56 4d 20 70 72 in a real VM pr
35220 6f 67 72 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75 6c ogram..*/.defaul
35230 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a t: { /*
35240 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 This is really
35250 4f 50 5f 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f 45 OP_Noop and OP_E
35260 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 61 73 73 65 xplain */. asse
35270 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d rt( pOp->opcode=
35280 3d 4f 50 5f 4e 6f 6f 70 20 7c 7c 20 70 4f 70 2d =OP_Noop || pOp-
35290 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c >opcode==OP_Expl
352a0 61 69 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a ain );. break;.
352b0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }../************
352c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
352d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
352e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
352f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
35300 2a 0a 2a 2a 20 54 68 65 20 63 61 73 65 73 20 6f *.** The cases o
35310 66 20 74 68 65 20 73 77 69 74 63 68 20 73 74 61 f the switch sta
35320 74 65 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 69 tement above thi
35330 73 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 61 6c s line should al
35340 6c 20 62 65 20 69 6e 64 65 6e 74 65 64 0a 2a 2a l be indented.**
35350 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 by 6 spaces. B
35360 75 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 ut the left-most
35370 20 36 20 73 70 61 63 65 73 20 68 61 76 65 20 62 6 spaces have b
35380 65 65 6e 20 72 65 6d 6f 76 65 64 20 74 6f 20 69 een removed to i
35390 6d 70 72 6f 76 65 20 74 68 65 0a 2a 2a 20 72 65 mprove the.** re
353a0 61 64 61 62 69 6c 69 74 79 2e 20 20 46 72 6f 6d adability. From
353b0 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 64 this point on d
353c0 6f 77 6e 2c 20 74 68 65 20 6e 6f 72 6d 61 6c 20 own, the normal
353d0 69 6e 64 65 6e 74 61 74 69 6f 6e 20 72 75 6c 65 indentation rule
353e0 73 20 61 72 65 0a 2a 2a 20 72 65 73 74 6f 72 65 s are.** restore
353f0 64 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a d..*************
35400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
35410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
35420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
35430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
35440 2f 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 /. }..#ifdef
35450 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 VDBE_PROFILE.
35460 20 7b 0a 20 20 20 20 20 20 75 36 34 20 65 6e 64 {. u64 end
35470 54 69 6d 65 20 3d 20 73 71 6c 69 74 65 33 48 77 Time = sqlite3Hw
35480 74 69 6d 65 28 29 3b 0a 20 20 20 20 20 20 69 66 time();. if
35490 28 20 65 6e 64 54 69 6d 65 3e 73 74 61 72 74 20 ( endTime>start
354a0 29 20 70 4f 72 69 67 4f 70 2d 3e 63 79 63 6c 65 ) pOrigOp->cycle
354b0 73 20 2b 3d 20 65 6e 64 54 69 6d 65 20 2d 20 73 s += endTime - s
354c0 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4f 72 69 tart;. pOri
354d0 67 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 gOp->cnt++;.
354e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a }.#endif.. /*
354f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 The following c
35500 6f 64 65 20 61 64 64 73 20 6e 6f 74 68 69 6e 67 ode adds nothing
35510 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 to the actual f
35520 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 unctionality.
35530 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 ** of the progr
35540 61 6d 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 am. It is only
35550 68 65 72 65 20 66 6f 72 20 74 65 73 74 69 6e 67 here for testing
35560 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a and debugging..
35570 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 ** On the ot
35580 68 65 72 20 68 61 6e 64 2c 20 69 74 20 64 6f 65 her hand, it doe
35590 73 20 62 75 72 6e 20 43 50 55 20 63 79 63 6c 65 s burn CPU cycle
355a0 73 20 65 76 65 72 79 20 74 69 6d 65 20 74 68 72 s every time thr
355b0 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 ough. ** the
355c0 65 76 61 6c 75 61 74 6f 72 20 6c 6f 6f 70 2e 20 evaluator loop.
355d0 20 53 6f 20 77 65 20 63 61 6e 20 6c 65 61 76 65 So we can leave
355e0 20 69 74 20 6f 75 74 20 77 68 65 6e 20 4e 44 45 it out when NDE
355f0 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a BUG is defined..
35600 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e */.#ifndef N
35610 44 45 42 55 47 0a 20 20 20 20 61 73 73 65 72 74 DEBUG. assert
35620 28 20 70 4f 70 3e 3d 26 61 4f 70 5b 2d 31 5d 20 ( pOp>=&aOp[-1]
35630 26 26 20 70 4f 70 3c 26 61 4f 70 5b 70 2d 3e 6e && pOp<&aOp[p->n
35640 4f 70 2d 31 5d 20 29 3b 0a 0a 23 69 66 64 65 66 Op-1] );..#ifdef
35650 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
35660 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 if( db->flags
35670 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 & SQLITE_VdbeTra
35680 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 ce ){. if(
35690 72 63 21 3d 30 20 29 20 70 72 69 6e 74 66 28 22 rc!=0 ) printf("
356a0 72 63 3d 25 64 5c 6e 22 2c 72 63 29 3b 0a 20 20 rc=%d\n",rc);.
356b0 20 20 20 20 69 66 28 20 70 4f 72 69 67 4f 70 2d if( pOrigOp-
356c0 3e 6f 70 66 6c 61 67 73 20 26 20 28 4f 50 46 4c >opflags & (OPFL
356d0 47 5f 4f 55 54 32 29 20 29 7b 0a 20 20 20 20 20 G_OUT2) ){.
356e0 20 20 20 72 65 67 69 73 74 65 72 54 72 61 63 65 registerTrace
356f0 28 70 4f 72 69 67 4f 70 2d 3e 70 32 2c 20 26 61 (pOrigOp->p2, &a
35700 4d 65 6d 5b 70 4f 72 69 67 4f 70 2d 3e 70 32 5d Mem[pOrigOp->p2]
35710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
35720 20 69 66 28 20 70 4f 72 69 67 4f 70 2d 3e 6f 70 if( pOrigOp->op
35730 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 flags & OPFLG_OU
35740 54 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 T3 ){. re
35750 67 69 73 74 65 72 54 72 61 63 65 28 70 4f 72 69 gisterTrace(pOri
35760 67 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 gOp->p3, &aMem[p
35770 4f 72 69 67 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 OrigOp->p3]);.
35780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 }. }.#end
35790 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 if /* SQLITE_DE
357a0 42 55 47 20 2a 2f 0a 23 65 6e 64 69 66 20 20 2f BUG */.#endif /
357b0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 20 20 7d 20 * NDEBUG */. }
357c0 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 74 /* The end of t
357d0 68 65 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 20 he for(;;) loop
357e0 74 68 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 the loops throug
357f0 68 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 0a 20 20 h opcodes */..
35800 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 /* If we reach t
35810 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 his point, it me
35820 61 6e 73 20 74 68 61 74 20 65 78 65 63 75 74 69 ans that executi
35830 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20 77 on is finished w
35840 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f ith. ** an erro
35850 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a r of some kind..
35860 20 20 2a 2f 0a 76 64 62 65 5f 65 72 72 6f 72 5f */.vdbe_error_
35870 68 61 6c 74 3a 0a 20 20 61 73 73 65 72 74 28 20 halt:. assert(
35880 72 63 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 rc );. p->rc =
35890 72 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 rc;. testcase(
358a0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e sqlite3GlobalCon
358b0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 fig.xLog!=0 );.
358c0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 72 63 2c sqlite3_log(rc,
358d0 20 22 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 72 "statement abor
358e0 74 73 20 61 74 20 25 64 3a 20 5b 25 73 5d 20 25 ts at %d: [%s] %
358f0 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 s", .
35900 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f (int)(pO
35910 70 20 2d 20 61 4f 70 29 2c 20 70 2d 3e 7a 53 71 p - aOp), p->zSq
35920 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a l, p->zErrMsg);.
35930 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c sqlite3VdbeHal
35940 74 28 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d t(p);. if( rc==
35950 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
35960 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 EM ) db->mallocF
35970 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 ailed = 1;. rc
35980 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a = SQLITE_ERROR;.
35990 20 20 69 66 28 20 72 65 73 65 74 53 63 68 65 6d if( resetSchem
359a0 61 4f 6e 46 61 75 6c 74 3e 30 20 29 7b 0a 20 20 aOnFault>0 ){.
359b0 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e sqlite3ResetOn
359c0 65 53 63 68 65 6d 61 28 64 62 2c 20 72 65 73 65 eSchema(db, rese
359d0 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 2d 31 tSchemaOnFault-1
359e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 );. }.. /* Thi
359f0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 s is the only wa
35a00 79 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 y out of this pr
35a10 6f 63 65 64 75 72 65 2e 20 20 57 65 20 68 61 76 ocedure. We hav
35a20 65 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 e to. ** releas
35a30 65 20 74 68 65 20 6d 75 74 65 78 65 73 20 6f 6e e the mutexes on
35a40 20 62 74 72 65 65 73 20 74 68 61 74 20 77 65 72 btrees that wer
35a50 65 20 61 63 71 75 69 72 65 64 20 61 74 20 74 68 e acquired at th
35a60 65 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 e. ** top. */.v
35a70 64 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20 64 62 dbe_return:. db
35a80 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 ->lastRowid = la
35a90 73 74 52 6f 77 69 64 3b 0a 20 20 74 65 73 74 63 stRowid;. testc
35aa0 61 73 65 28 20 6e 56 6d 53 74 65 70 3e 30 20 29 ase( nVmStep>0 )
35ab0 3b 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b ;. p->aCounter[
35ac0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 SQLITE_STMTSTATU
35ad0 53 5f 56 4d 5f 53 54 45 50 5d 20 2b 3d 20 28 69 S_VM_STEP] += (i
35ae0 6e 74 29 6e 56 6d 53 74 65 70 3b 0a 20 20 73 71 nt)nVmStep;. sq
35af0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 lite3VdbeLeave(p
35b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
35b10 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 . /* Jump to he
35b20 72 65 20 69 66 20 61 20 73 74 72 69 6e 67 20 6f re if a string o
35b30 72 20 62 6c 6f 62 20 6c 61 72 67 65 72 20 74 68 r blob larger th
35b40 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 an SQLITE_MAX_LE
35b50 4e 47 54 48 0a 20 20 2a 2a 20 69 73 20 65 6e 63 NGTH. ** is enc
35b60 6f 75 6e 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 74 ountered.. */.t
35b70 6f 6f 5f 62 69 67 3a 0a 20 20 73 71 6c 69 74 65 oo_big:. sqlite
35b80 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 73 3VdbeError(p, "s
35b90 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f tring or blob to
35ba0 6f 20 62 69 67 22 29 3b 0a 20 20 72 63 20 3d 20 o big");. rc =
35bb0 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 SQLITE_TOOBIG;.
35bc0 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 goto vdbe_error
35bd0 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d _halt;.. /* Jum
35be0 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20 6d p to here if a m
35bf0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 20 alloc() fails..
35c00 20 2a 2f 0a 6e 6f 5f 6d 65 6d 3a 0a 20 20 64 62 */.no_mem:. db
35c10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
35c20 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 1;. sqlite3Vdb
35c30 65 45 72 72 6f 72 28 70 2c 20 22 6f 75 74 20 6f eError(p, "out o
35c40 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 72 63 f memory");. rc
35c50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
35c60 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 . goto vdbe_err
35c70 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a or_halt;.. /* J
35c80 75 6d 70 20 74 6f 20 68 65 72 65 20 66 6f 72 20 ump to here for
35c90 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f any other kind o
35ca0 66 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 20 20 f fatal error.
35cb0 54 68 65 20 22 72 63 22 20 76 61 72 69 61 62 6c The "rc" variabl
35cc0 65 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 6f e. ** should ho
35cd0 6c 64 20 74 68 65 20 65 72 72 6f 72 20 6e 75 6d ld the error num
35ce0 62 65 72 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f ber.. */.abort_
35cf0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3a 0a 20 20 due_to_error:.
35d00 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 4d assert( p->zErrM
35d10 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 sg==0 );. if( d
35d20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
35d30 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f ) rc = SQLITE_NO
35d40 4d 45 4d 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 MEM;. if( rc!=S
35d50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
35d60 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 M ){. sqlite3
35d70 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 VdbeError(p, "%s
35d80 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 ", sqlite3ErrStr
35d90 28 72 63 29 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 (rc));. }. got
35da0 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c o vdbe_error_hal
35db0 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f t;.. /* Jump to
35dc0 20 68 65 72 65 20 69 66 20 74 68 65 20 73 71 6c here if the sql
35dd0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 ite3_interrupt()
35de0 20 41 50 49 20 73 65 74 73 20 74 68 65 20 69 6e API sets the in
35df0 74 65 72 72 75 70 74 0a 20 20 2a 2a 20 66 6c 61 terrupt. ** fla
35e00 67 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 g.. */.abort_du
35e10 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3a 0a e_to_interrupt:.
35e20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 75 31 assert( db->u1
35e30 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 .isInterrupted )
35e40 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f ;. rc = SQLITE_
35e50 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 2d 3e INTERRUPT;. p->
35e60 72 63 20 3d 20 72 63 3b 0a 20 20 73 71 6c 69 74 rc = rc;. sqlit
35e70 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 e3VdbeError(p, "
35e80 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 %s", sqlite3ErrS
35e90 74 72 28 72 63 29 29 3b 0a 20 20 67 6f 74 6f 20 tr(rc));. goto
35ea0 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b vdbe_error_halt;
35eb0 0a 7d 0a .}.