Annotation of embedaddon/php/ext/sqlite/libsqlite/src/vdbeInt.h, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2003 September 6
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             7: **    May you do good and not evil.
        !             8: **    May you find forgiveness for yourself and forgive others.
        !             9: **    May you share freely, never taking more than you give.
        !            10: **
        !            11: *************************************************************************
        !            12: ** This is the header file for information that is private to the
        !            13: ** VDBE.  This information used to all be at the top of the single
        !            14: ** source code file "vdbe.c".  When that file became too big (over
        !            15: ** 6000 lines long) it was split up into several smaller files and
        !            16: ** this header information was factored out.
        !            17: */
        !            18: 
        !            19: /*
        !            20: ** When converting from the native format to the key format and back
        !            21: ** again, in addition to changing the byte order we invert the high-order
        !            22: ** bit of the most significant byte.  This causes negative numbers to
        !            23: ** sort before positive numbers in the memcmp() function.
        !            24: */
        !            25: #define keyToInt(X)   (sqliteVdbeByteSwap(X) ^ 0x80000000)
        !            26: #define intToKey(X)   (sqliteVdbeByteSwap((X) ^ 0x80000000))
        !            27: 
        !            28: /*
        !            29: ** The makefile scans this source file and creates the following
        !            30: ** array of string constants which are the names of all VDBE opcodes.
        !            31: ** This array is defined in a separate source code file named opcode.c
        !            32: ** which is automatically generated by the makefile.
        !            33: */
        !            34: extern char *sqliteOpcodeNames[];
        !            35: 
        !            36: /*
        !            37: ** SQL is translated into a sequence of instructions to be
        !            38: ** executed by a virtual machine.  Each instruction is an instance
        !            39: ** of the following structure.
        !            40: */
        !            41: typedef struct VdbeOp Op;
        !            42: 
        !            43: /*
        !            44: ** Boolean values
        !            45: */
        !            46: typedef unsigned char Bool;
        !            47: 
        !            48: /*
        !            49: ** A cursor is a pointer into a single BTree within a database file.
        !            50: ** The cursor can seek to a BTree entry with a particular key, or
        !            51: ** loop over all entries of the Btree.  You can also insert new BTree
        !            52: ** entries or retrieve the key or data from the entry that the cursor
        !            53: ** is currently pointing to.
        !            54: ** 
        !            55: ** Every cursor that the virtual machine has open is represented by an
        !            56: ** instance of the following structure.
        !            57: **
        !            58: ** If the Cursor.isTriggerRow flag is set it means that this cursor is
        !            59: ** really a single row that represents the NEW or OLD pseudo-table of
        !            60: ** a row trigger.  The data for the row is stored in Cursor.pData and
        !            61: ** the rowid is in Cursor.iKey.
        !            62: */
        !            63: struct Cursor {
        !            64:   BtCursor *pCursor;    /* The cursor structure of the backend */
        !            65:   int lastRecno;        /* Last recno from a Next or NextIdx operation */
        !            66:   int nextRowid;        /* Next rowid returned by OP_NewRowid */
        !            67:   Bool recnoIsValid;    /* True if lastRecno is valid */
        !            68:   Bool keyAsData;       /* The OP_Column command works on key instead of data */
        !            69:   Bool atFirst;         /* True if pointing to first entry */
        !            70:   Bool useRandomRowid;  /* Generate new record numbers semi-randomly */
        !            71:   Bool nullRow;         /* True if pointing to a row with no data */
        !            72:   Bool nextRowidValid;  /* True if the nextRowid field is valid */
        !            73:   Bool pseudoTable;     /* This is a NEW or OLD pseudo-tables of a trigger */
        !            74:   Bool deferredMoveto;  /* A call to sqliteBtreeMoveto() is needed */
        !            75:   int movetoTarget;     /* Argument to the deferred sqliteBtreeMoveto() */
        !            76:   Btree *pBt;           /* Separate file holding temporary table */
        !            77:   int nData;            /* Number of bytes in pData */
        !            78:   char *pData;          /* Data for a NEW or OLD pseudo-table */
        !            79:   int iKey;             /* Key for the NEW or OLD pseudo-table row */
        !            80: };
        !            81: typedef struct Cursor Cursor;
        !            82: 
        !            83: /*
        !            84: ** A sorter builds a list of elements to be sorted.  Each element of
        !            85: ** the list is an instance of the following structure.
        !            86: */
        !            87: typedef struct Sorter Sorter;
        !            88: struct Sorter {
        !            89:   int nKey;           /* Number of bytes in the key */
        !            90:   char *zKey;         /* The key by which we will sort */
        !            91:   int nData;          /* Number of bytes in the data */
        !            92:   char *pData;        /* The data associated with this key */
        !            93:   Sorter *pNext;      /* Next in the list */
        !            94: };
        !            95: 
        !            96: /* 
        !            97: ** Number of buckets used for merge-sort.  
        !            98: */
        !            99: #define NSORT 30
        !           100: 
        !           101: /*
        !           102: ** Number of bytes of string storage space available to each stack
        !           103: ** layer without having to malloc.  NBFS is short for Number of Bytes
        !           104: ** For Strings.
        !           105: */
        !           106: #define NBFS 32
        !           107: 
        !           108: /*
        !           109: ** A single level of the stack or a single memory cell
        !           110: ** is an instance of the following structure. 
        !           111: */
        !           112: struct Mem {
        !           113:   int i;              /* Integer value */
        !           114:   int n;              /* Number of characters in string value, including '\0' */
        !           115:   int flags;          /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
        !           116:   double r;           /* Real value */
        !           117:   char *z;            /* String value */
        !           118:   char zShort[NBFS];  /* Space for short strings */
        !           119: };
        !           120: typedef struct Mem Mem;
        !           121: 
        !           122: /*
        !           123: ** Allowed values for Mem.flags
        !           124: */
        !           125: #define MEM_Null      0x0001   /* Value is NULL */
        !           126: #define MEM_Str       0x0002   /* Value is a string */
        !           127: #define MEM_Int       0x0004   /* Value is an integer */
        !           128: #define MEM_Real      0x0008   /* Value is a real number */
        !           129: #define MEM_Dyn       0x0010   /* Need to call sqliteFree() on Mem.z */
        !           130: #define MEM_Static    0x0020   /* Mem.z points to a static string */
        !           131: #define MEM_Ephem     0x0040   /* Mem.z points to an ephemeral string */
        !           132: #define MEM_Short     0x0080   /* Mem.z points to Mem.zShort */
        !           133: 
        !           134: /* The following MEM_ value appears only in AggElem.aMem.s.flag fields.
        !           135: ** It indicates that the corresponding AggElem.aMem.z points to a
        !           136: ** aggregate function context that needs to be finalized.
        !           137: */
        !           138: #define MEM_AggCtx    0x0100   /* Mem.z points to an agg function context */
        !           139: 
        !           140: /*
        !           141: ** The "context" argument for a installable function.  A pointer to an
        !           142: ** instance of this structure is the first argument to the routines used
        !           143: ** implement the SQL functions.
        !           144: **
        !           145: ** There is a typedef for this structure in sqlite.h.  So all routines,
        !           146: ** even the public interface to SQLite, can use a pointer to this structure.
        !           147: ** But this file is the only place where the internal details of this
        !           148: ** structure are known.
        !           149: **
        !           150: ** This structure is defined inside of vdbe.c because it uses substructures
        !           151: ** (Mem) which are only defined there.
        !           152: */
        !           153: struct sqlite_func {
        !           154:   FuncDef *pFunc;   /* Pointer to function information.  MUST BE FIRST */
        !           155:   Mem s;            /* The return value is stored here */
        !           156:   void *pAgg;       /* Aggregate context */
        !           157:   u8 isError;       /* Set to true for an error */
        !           158:   u8 isStep;        /* Current in the step function */
        !           159:   int cnt;          /* Number of times that the step function has been called */
        !           160: };
        !           161: 
        !           162: /*
        !           163: ** An Agg structure describes an Aggregator.  Each Agg consists of
        !           164: ** zero or more Aggregator elements (AggElem).  Each AggElem contains
        !           165: ** a key and one or more values.  The values are used in processing
        !           166: ** aggregate functions in a SELECT.  The key is used to implement
        !           167: ** the GROUP BY clause of a select.
        !           168: */
        !           169: typedef struct Agg Agg;
        !           170: typedef struct AggElem AggElem;
        !           171: struct Agg {
        !           172:   int nMem;            /* Number of values stored in each AggElem */
        !           173:   AggElem *pCurrent;   /* The AggElem currently in focus */
        !           174:   HashElem *pSearch;   /* The hash element for pCurrent */
        !           175:   Hash hash;           /* Hash table of all aggregate elements */
        !           176:   FuncDef **apFunc;    /* Information about aggregate functions */
        !           177: };
        !           178: struct AggElem {
        !           179:   char *zKey;          /* The key to this AggElem */
        !           180:   int nKey;            /* Number of bytes in the key, including '\0' at end */
        !           181:   Mem aMem[1];         /* The values for this AggElem */
        !           182: };
        !           183: 
        !           184: /*
        !           185: ** A Set structure is used for quick testing to see if a value
        !           186: ** is part of a small set.  Sets are used to implement code like
        !           187: ** this:
        !           188: **            x.y IN ('hi','hoo','hum')
        !           189: */
        !           190: typedef struct Set Set;
        !           191: struct Set {
        !           192:   Hash hash;             /* A set is just a hash table */
        !           193:   HashElem *prev;        /* Previously accessed hash elemen */
        !           194: };
        !           195: 
        !           196: /*
        !           197: ** A Keylist is a bunch of keys into a table.  The keylist can
        !           198: ** grow without bound.  The keylist stores the ROWIDs of database
        !           199: ** records that need to be deleted or updated.
        !           200: */
        !           201: typedef struct Keylist Keylist;
        !           202: struct Keylist {
        !           203:   int nKey;         /* Number of slots in aKey[] */
        !           204:   int nUsed;        /* Next unwritten slot in aKey[] */
        !           205:   int nRead;        /* Next unread slot in aKey[] */
        !           206:   Keylist *pNext;   /* Next block of keys */
        !           207:   int aKey[1];      /* One or more keys.  Extra space allocated as needed */
        !           208: };
        !           209: 
        !           210: /*
        !           211: ** A Context stores the last insert rowid, the last statement change count,
        !           212: ** and the current statement change count (i.e. changes since last statement).
        !           213: ** Elements of Context structure type make up the ContextStack, which is
        !           214: ** updated by the ContextPush and ContextPop opcodes (used by triggers)
        !           215: */
        !           216: typedef struct Context Context;
        !           217: struct Context {
        !           218:   int lastRowid;    /* Last insert rowid (from db->lastRowid) */
        !           219:   int lsChange;     /* Last statement change count (from db->lsChange) */
        !           220:   int csChange;     /* Current statement change count (from db->csChange) */
        !           221: };
        !           222: 
        !           223: /*
        !           224: ** An instance of the virtual machine.  This structure contains the complete
        !           225: ** state of the virtual machine.
        !           226: **
        !           227: ** The "sqlite_vm" structure pointer that is returned by sqlite_compile()
        !           228: ** is really a pointer to an instance of this structure.
        !           229: */
        !           230: struct Vdbe {
        !           231:   sqlite *db;         /* The whole database */
        !           232:   Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */
        !           233:   FILE *trace;        /* Write an execution trace here, if not NULL */
        !           234:   int nOp;            /* Number of instructions in the program */
        !           235:   int nOpAlloc;       /* Number of slots allocated for aOp[] */
        !           236:   Op *aOp;            /* Space to hold the virtual machine's program */
        !           237:   int nLabel;         /* Number of labels used */
        !           238:   int nLabelAlloc;    /* Number of slots allocated in aLabel[] */
        !           239:   int *aLabel;        /* Space to hold the labels */
        !           240:   Mem *aStack;        /* The operand stack, except string values */
        !           241:   Mem *pTos;          /* Top entry in the operand stack */
        !           242:   char **zArgv;       /* Text values used by the callback */
        !           243:   char **azColName;   /* Becomes the 4th parameter to callbacks */
        !           244:   int nCursor;        /* Number of slots in aCsr[] */
        !           245:   Cursor *aCsr;       /* One element of this array for each open cursor */
        !           246:   Sorter *pSort;      /* A linked list of objects to be sorted */
        !           247:   FILE *pFile;        /* At most one open file handler */
        !           248:   int nField;         /* Number of file fields */
        !           249:   char **azField;     /* Data for each file field */
        !           250:   int nVar;           /* Number of entries in azVariable[] */
        !           251:   char **azVar;       /* Values for the OP_Variable opcode */
        !           252:   int *anVar;         /* Length of each value in azVariable[] */
        !           253:   u8 *abVar;          /* TRUE if azVariable[i] needs to be sqliteFree()ed */
        !           254:   char *zLine;            /* A single line from the input file */
        !           255:   int nLineAlloc;         /* Number of spaces allocated for zLine */
        !           256:   int magic;              /* Magic number for sanity checking */
        !           257:   int nMem;               /* Number of memory locations currently allocated */
        !           258:   Mem *aMem;              /* The memory locations */
        !           259:   Agg agg;                /* Aggregate information */
        !           260:   int nSet;               /* Number of sets allocated */
        !           261:   Set *aSet;              /* An array of sets */
        !           262:   int nCallback;          /* Number of callbacks invoked so far */
        !           263:   Keylist *pList;         /* A list of ROWIDs */
        !           264:   int keylistStackDepth;  /* The size of the "keylist" stack */
        !           265:   Keylist **keylistStack; /* The stack used by opcodes ListPush & ListPop */
        !           266:   int contextStackDepth;  /* The size of the "context" stack */
        !           267:   Context *contextStack;  /* Stack used by opcodes ContextPush & ContextPop*/
        !           268:   int pc;                 /* The program counter */
        !           269:   int rc;                 /* Value to return */
        !           270:   unsigned uniqueCnt;     /* Used by OP_MakeRecord when P2!=0 */
        !           271:   int errorAction;        /* Recovery action to do in case of an error */
        !           272:   int undoTransOnError;   /* If error, either ROLLBACK or COMMIT */
        !           273:   int inTempTrans;        /* True if temp database is transactioned */
        !           274:   int returnStack[100];   /* Return address stack for OP_Gosub & OP_Return */
        !           275:   int returnDepth;        /* Next unused element in returnStack[] */
        !           276:   int nResColumn;         /* Number of columns in one row of the result set */
        !           277:   char **azResColumn;     /* Values for one row of result */ 
        !           278:   int popStack;           /* Pop the stack this much on entry to VdbeExec() */
        !           279:   char *zErrMsg;          /* Error message written here */
        !           280:   u8 explain;             /* True if EXPLAIN present on SQL command */
        !           281: };
        !           282: 
        !           283: /*
        !           284: ** The following are allowed values for Vdbe.magic
        !           285: */
        !           286: #define VDBE_MAGIC_INIT     0x26bceaa5    /* Building a VDBE program */
        !           287: #define VDBE_MAGIC_RUN      0xbdf20da3    /* VDBE is ready to execute */
        !           288: #define VDBE_MAGIC_HALT     0x519c2973    /* VDBE has completed execution */
        !           289: #define VDBE_MAGIC_DEAD     0xb606c3c8    /* The VDBE has been deallocated */
        !           290: 
        !           291: /*
        !           292: ** Function prototypes
        !           293: */
        !           294: void sqliteVdbeCleanupCursor(Cursor*);
        !           295: void sqliteVdbeSorterReset(Vdbe*);
        !           296: void sqliteVdbeAggReset(Agg*);
        !           297: void sqliteVdbeKeylistFree(Keylist*);
        !           298: void sqliteVdbePopStack(Vdbe*,int);
        !           299: int sqliteVdbeCursorMoveto(Cursor*);
        !           300: int sqliteVdbeByteSwap(int);
        !           301: #if !defined(NDEBUG) || defined(VDBE_PROFILE)
        !           302: void sqliteVdbePrintOp(FILE*, int, Op*);
        !           303: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>