vdbe.h.svn-base
上传用户:sunhongbo
上传日期:2022-01-25
资源大小:3010k
文件大小:7k
源码类别:

数据库系统

开发平台:

C/C++

  1. /*
  2. ** 2001 September 15
  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. ** Header file for the Virtual DataBase Engine (VDBE)
  13. **
  14. ** This header defines the interface to the virtual database engine
  15. ** or VDBE.  The VDBE implements an abstract machine that runs a
  16. ** simple program to access and modify the underlying database.
  17. **
  18. ** $Id: vdbe.h,v 1.130 2008/04/11 14:56:53 drh Exp $
  19. */
  20. #ifndef _SQLITE_VDBE_H_
  21. #define _SQLITE_VDBE_H_
  22. #include <stdio.h>
  23. /*
  24. ** A single VDBE is an opaque structure named "Vdbe".  Only routines
  25. ** in the source file sqliteVdbe.c are allowed to see the insides
  26. ** of this structure.
  27. */
  28. typedef struct Vdbe Vdbe;
  29. /*
  30. ** The names of the following types declared in vdbeInt.h are required
  31. ** for the VdbeOp definition.
  32. */
  33. typedef struct VdbeFunc VdbeFunc;
  34. typedef struct Mem Mem;
  35. typedef struct UnpackedRecord UnpackedRecord;
  36. /*
  37. ** A single instruction of the virtual machine has an opcode
  38. ** and as many as three operands.  The instruction is recorded
  39. ** as an instance of the following structure:
  40. */
  41. struct VdbeOp {
  42.   u8 opcode;          /* What operation to perform */
  43.   signed char p4type; /* One of the P4_xxx constants for p4 */
  44.   u8 opflags;         /* Not currently used */
  45.   u8 p5;              /* Fifth parameter is an unsigned character */
  46.   int p1;             /* First operand */
  47.   int p2;             /* Second parameter (often the jump destination) */
  48.   int p3;             /* The third parameter */
  49.   union {             /* forth parameter */
  50.     int i;                 /* Integer value if p4type==P4_INT32 */
  51.     void *p;               /* Generic pointer */
  52.     char *z;               /* Pointer to data for string (char array) types */
  53.     i64 *pI64;             /* Used when p4type is P4_INT64 */
  54.     double *pReal;         /* Used when p4type is P4_REAL */
  55.     FuncDef *pFunc;        /* Used when p4type is P4_FUNCDEF */
  56.     VdbeFunc *pVdbeFunc;   /* Used when p4type is P4_VDBEFUNC */
  57.     CollSeq *pColl;        /* Used when p4type is P4_COLLSEQ */
  58.     Mem *pMem;             /* Used when p4type is P4_MEM */
  59.     sqlite3_vtab *pVtab;   /* Used when p4type is P4_VTAB */
  60.     KeyInfo *pKeyInfo;     /* Used when p4type is P4_KEYINFO */
  61.   } p4;
  62. #ifdef SQLITE_DEBUG
  63.   char *zComment;     /* Comment to improve readability */
  64. #endif
  65. #ifdef VDBE_PROFILE
  66.   int cnt;            /* Number of times this instruction was executed */
  67.   long long cycles;   /* Total time spend executing this instruction */
  68. #endif
  69. };
  70. typedef struct VdbeOp VdbeOp;
  71. /*
  72. ** A smaller version of VdbeOp used for the VdbeAddOpList() function because
  73. ** it takes up less space.
  74. */
  75. struct VdbeOpList {
  76.   u8 opcode;          /* What operation to perform */
  77.   signed char p1;     /* First operand */
  78.   signed char p2;     /* Second parameter (often the jump destination) */
  79.   signed char p3;     /* Third parameter */
  80. };
  81. typedef struct VdbeOpList VdbeOpList;
  82. /*
  83. ** Allowed values of VdbeOp.p3type
  84. */
  85. #define P4_NOTUSED    0   /* The P4 parameter is not used */
  86. #define P4_DYNAMIC  (-1)  /* Pointer to a string obtained from sqliteMalloc() */
  87. #define P4_STATIC   (-2)  /* Pointer to a static string */
  88. #define P4_COLLSEQ  (-4)  /* P4 is a pointer to a CollSeq structure */
  89. #define P4_FUNCDEF  (-5)  /* P4 is a pointer to a FuncDef structure */
  90. #define P4_KEYINFO  (-6)  /* P4 is a pointer to a KeyInfo structure */
  91. #define P4_VDBEFUNC (-7)  /* P4 is a pointer to a VdbeFunc structure */
  92. #define P4_MEM      (-8)  /* P4 is a pointer to a Mem*    structure */
  93. #define P4_TRANSIENT (-9) /* P4 is a pointer to a transient string */
  94. #define P4_VTAB     (-10) /* P4 is a pointer to an sqlite3_vtab structure */
  95. #define P4_MPRINTF  (-11) /* P4 is a string obtained from sqlite3_mprintf() */
  96. #define P4_REAL     (-12) /* P4 is a 64-bit floating point value */
  97. #define P4_INT64    (-13) /* P4 is a 64-bit signed integer */
  98. #define P4_INT32    (-14) /* P4 is a 32-bit signed integer */
  99. /* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure
  100. ** is made.  That copy is freed when the Vdbe is finalized.  But if the
  101. ** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used.  It still
  102. ** gets freed when the Vdbe is finalized so it still should be obtained
  103. ** from a single sqliteMalloc().  But no copy is made and the calling
  104. ** function should *not* try to free the KeyInfo.
  105. */
  106. #define P4_KEYINFO_HANDOFF (-9)
  107. /*
  108. ** The Vdbe.aColName array contains 5n Mem structures, where n is the 
  109. ** number of columns of data returned by the statement.
  110. */
  111. #define COLNAME_NAME     0
  112. #define COLNAME_DECLTYPE 1
  113. #define COLNAME_DATABASE 2
  114. #define COLNAME_TABLE    3
  115. #define COLNAME_COLUMN   4
  116. #ifdef SQLITE_ENABLE_COLUMN_METADATA
  117. # define COLNAME_N        5      /* Number of COLNAME_xxx symbols */
  118. #else
  119. # ifdef SQLITE_OMIT_DECLTYPE
  120. #   define COLNAME_N      1      /* Store only the name */
  121. # else
  122. #   define COLNAME_N      2      /* Store the name and decltype */
  123. # endif
  124. #endif
  125. /*
  126. ** The following macro converts a relative address in the p2 field
  127. ** of a VdbeOp structure into a negative number so that 
  128. ** sqlite3VdbeAddOpList() knows that the address is relative.  Calling
  129. ** the macro again restores the address.
  130. */
  131. #define ADDR(X)  (-1-(X))
  132. /*
  133. ** The makefile scans the vdbe.c source file and creates the "opcodes.h"
  134. ** header file that defines a number for each opcode used by the VDBE.
  135. */
  136. #include "opcodes.h"
  137. /*
  138. ** Prototypes for the VDBE interface.  See comments on the implementation
  139. ** for a description of what each of these routines does.
  140. */
  141. Vdbe *sqlite3VdbeCreate(sqlite3*);
  142. int sqlite3VdbeAddOp0(Vdbe*,int);
  143. int sqlite3VdbeAddOp1(Vdbe*,int,int);
  144. int sqlite3VdbeAddOp2(Vdbe*,int,int,int);
  145. int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int);
  146. int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int);
  147. int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp);
  148. void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1);
  149. void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2);
  150. void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3);
  151. void sqlite3VdbeChangeP5(Vdbe*, u8 P5);
  152. void sqlite3VdbeJumpHere(Vdbe*, int addr);
  153. void sqlite3VdbeChangeToNoop(Vdbe*, int addr, int N);
  154. void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N);
  155. void sqlite3VdbeUsesBtree(Vdbe*, int);
  156. VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
  157. int sqlite3VdbeMakeLabel(Vdbe*);
  158. void sqlite3VdbeDelete(Vdbe*);
  159. void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int);
  160. int sqlite3VdbeFinalize(Vdbe*);
  161. void sqlite3VdbeResolveLabel(Vdbe*, int);
  162. int sqlite3VdbeCurrentAddr(Vdbe*);
  163. #ifdef SQLITE_DEBUG
  164.   void sqlite3VdbeTrace(Vdbe*,FILE*);
  165. #endif
  166. void sqlite3VdbeResetStepResult(Vdbe*);
  167. int sqlite3VdbeReset(Vdbe*, int);
  168. void sqlite3VdbeSetNumCols(Vdbe*,int);
  169. int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, int);
  170. void sqlite3VdbeCountChanges(Vdbe*);
  171. sqlite3 *sqlite3VdbeDb(Vdbe*);
  172. void sqlite3VdbeSetSql(Vdbe*, const char *z, int n);
  173. void sqlite3VdbeSwap(Vdbe*,Vdbe*);
  174. int sqlite3VdbeReleaseMemory(int);
  175. UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,void*,int);
  176. void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*);
  177. int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*);
  178. #ifndef NDEBUG
  179.   void sqlite3VdbeComment(Vdbe*, const char*, ...);
  180. # define VdbeComment(X)  sqlite3VdbeComment X
  181. #else
  182. # define VdbeComment(X)
  183. #endif
  184. #endif