value.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. /*
  2. * Licensed Materials - Property of IBM and/or HCL
  3. *
  4. * IBM Informix Dynamic Server
  5. * (c) Copyright IBM Corporation 1996, 2015 All rights reserved.
  6. * (c) Copyright HCL Technologies Ltd. 2017. All Rights Reserved.
  7. *
  8. ***************************************************************************
  9. *
  10. * Title: value.h
  11. * Description:
  12. * value header include file; multi-purpose value struct
  13. *
  14. ***************************************************************************
  15. */
  16. #ifndef _VALUE
  17. #define _VALUE
  18. #include "ifxtypes.h"
  19. #include "decimal.h"
  20. #include "locator.h"
  21. #include "blob.h"
  22. #include "int8.h"
  23. #include "collct.h"
  24. #include "datetime.h"
  25. #ifdef TURBO
  26. #include "rsam.h"
  27. #endif
  28. /* !null && blob type */
  29. #define ISBLOBVALUE(val) ((val).v_ind != -1 && ISBLOBTYPE((val).v_type))
  30. #define MAXADDR 14
  31. #ifdef TURBO
  32. /* move here from catalog.h */
  33. typedef struct sqcolumn_t
  34. {
  35. column_t *sqcl_columnts;
  36. int2 sqcl_ncols;
  37. int2 sqcl_length;
  38. int2 sqcl_start;
  39. int2 sqcl_align;
  40. struct sqcolumn_t *sqcl_child;
  41. struct sqcolumn_t *sqcl_next;
  42. } sqcolumn_t;
  43. #define ROW_COMMON_HDR \
  44. /* common fields shared by row_value_t and tab_t */ \
  45. mint magic_number; /* keep the user honest */ \
  46. int4 td_rowflags; /* flags for row */ \
  47. struct ddtabdesc *td_ddinfo; /* pointer to DD info */ \
  48. struct coldesc *td_cols; /* columns in row */ \
  49. int2 td_ncols; /* number of columns */ \
  50. int2 td_rowsize; /* row size in bytes */ \
  51. int4 td_rowtype; /* row type */ \
  52. char *td_row; /* pointer to row buffer */ \
  53. uint4 td_isrecnum; /* rowid */ \
  54. int4 td_fragid; /* fragid */ \
  55. struct ddxtdtype *td_typedesc; /* row type desc */ \
  56. struct value *td_values; /* used by mi_value to return col info */ \
  57. struct tabdesc *td_child; /* row descs for subtypes or \
  58. tab descs for subtables*/ \
  59. int4 td_thsubscript; /* index into thread's table buffer array */
  60. #else /* TURBO */
  61. #define ROW_COMMON_HDR \
  62. void *dummy; /* dummy place holder */
  63. #endif /* TURBO */
  64. typedef struct rowvaluet row_desc_t;
  65. typedef struct rowvaluet row_value_t;
  66. /* flags for td_rowflags */
  67. #define TD_ROWREF 0x00000001L /* to be REFed, keep fragid and rowid */
  68. #define TD_ROWTYPE 0x00000002L /* row is typed */
  69. #define TD_ROWLOCAL 0x00000004L /* row data is in td_row */
  70. #if 0
  71. #define TD_ROWDYNA 0x00000008L /* row value in sqt_dtab */
  72. #endif
  73. #define TD_ROWSAVED 0x00000010L /* row in save set */
  74. #define TD_ROWCONV 0x00000020L /* binary or ascii conv. required */
  75. #define TD_ROWBINARY 0x00000040L /* binary result requested */
  76. #define TD_ROWCMDDUR 0x00000080L /* row desc alloc'd PER_COMMAND */
  77. #define TD_ROWEXECDUR 0x00000100L /* row desc alloc'd PER_STMT_EXEC */
  78. #define TD_ROWPREPDUR 0x00000200L /* row desc alloc'd PER_STMT_PREP */
  79. #define TD_ROWS92DUR 0x00000400L /* row desc alloc'd PER_STMT_92 */
  80. #define TD_ROWROUTDUR 0x00000800L /* row desc alloc'd PER_ROUTINE */
  81. #define TD_ROWTMPDUR 0x00001000L /* Temporary fix for PTS 165231 */
  82. #define TD_ROWDEFAULT 0x00002000L /* Column has default value */
  83. #define TD_DESCDUR_OR 0x00004000L /* Fix for 245852 */
  84. #define TD_ROWDESTROY 0x80000000 /* processing rowdestroy */
  85. #define ALLOW_DURATION_DEFAULT 0 /* macro setting to allow default */
  86. #define DISALLOW_DURATION_DEFAULT 1 /* macro setting to avoid default */
  87. #define DISALLOW_DURATION_SET 2 /* macro setting to avoid set value */
  88. /*
  89. * Macro for getting row desc duration. No flag set implies row desc creation
  90. * via chkralloc (heap memory) which we match with PER_STMT_PREP duration
  91. * Allow for detecting default case where no explicit flag is set
  92. */
  93. #define GET_ROWDESC_DURATION(rowdesc, defmode) \
  94. (((rowdesc)->td_rowflags & TD_DESCDUR_OR) && \
  95. ((defmode) & DISALLOW_DURATION_SET)) ? PER_NONE : \
  96. ((rowdesc)->td_rowflags & TD_ROWROUTDUR) ? PER_ROUTINE : \
  97. ((rowdesc)->td_rowflags & TD_ROWCMDDUR) ? PER_COMMAND : \
  98. ((rowdesc)->td_rowflags & TD_ROWEXECDUR) ? PER_STMT_EXEC : \
  99. ((rowdesc)->td_rowflags & TD_ROWPREPDUR) ? PER_STMT_PREP : \
  100. ((rowdesc)->td_rowflags & TD_ROWS92DUR) ? PER_STMT_92 : \
  101. ((defmode) == ALLOW_DURATION_DEFAULT) ? PER_STMT_PREP : PER_NONE
  102. /*
  103. * Macro for setting row desc duration. Not all row desc creations result
  104. * in a call to the macro to set the duration flag.
  105. * Allow PER_NONE to return to no flag set state.
  106. */
  107. #define SET_ROWDESC_DURATION(rowdesc,duration) \
  108. do { \
  109. (rowdesc)->td_rowflags &= \
  110. ~(TD_ROWCMDDUR|TD_ROWEXECDUR|TD_ROWPREPDUR|TD_ROWS92DUR|TD_ROWROUTDUR); \
  111. \
  112. switch (duration) \
  113. { \
  114. case PER_NONE : \
  115. break; \
  116. case PER_ROUTINE : \
  117. (rowdesc)->td_rowflags |= TD_ROWROUTDUR; \
  118. break; \
  119. case PER_COMMAND : \
  120. (rowdesc)->td_rowflags |= TD_ROWCMDDUR; \
  121. break; \
  122. case PER_STMT_EXEC : \
  123. (rowdesc)->td_rowflags |= TD_ROWEXECDUR; \
  124. break; \
  125. case PER_STMT_92 : \
  126. (rowdesc)->td_rowflags |= TD_ROWS92DUR; \
  127. break; \
  128. case PER_STMT_PREP : \
  129. default : \
  130. (rowdesc)->td_rowflags |= TD_ROWPREPDUR; \
  131. break; \
  132. } \
  133. } while(0)
  134. struct rowvaluet
  135. {
  136. ROW_COMMON_HDR
  137. #ifdef TURBO
  138. sqcolumn_t *ct_columnts; /* array of column_t's for rsrowcompress.
  139. * moved from ct_desc to rowvaluet since,
  140. * info contained in ct_desc is specific
  141. * to the supertype.
  142. */
  143. #endif
  144. };
  145. #ifdef TURBO
  146. #define cd_columnts cd_rowdesc->ct_columnts
  147. #endif
  148. /* flag to switch_rowtype() on whether to create the rowdesc
  149. * and how to link it with existing cd_rowdesc chain
  150. */
  151. #define R_NCREATE 0 /* Flag error if rowdesc does not exist in
  152. * td_child list
  153. */
  154. #define R_LTAIL 1 /* If created now, link to tail of list */
  155. #define R_LHEAD 2 /* Put rowdesc at the head of the list */
  156. #define VCHAR_COMMON_HDR \
  157. char *vcp; /* data start */ \
  158. int4 vlen; /* data length */ \
  159. int2 vflgs; /* flags - see below */ \
  160. int2 valign; /* UDT (SQLROW, SQLUDTFIXED/VAR) alignment */
  161. /*
  162. * col_t cd_coll_desc cache of cl_*typeinfo
  163. * and cl_data for val{load/store/ldout}
  164. */
  165. typedef struct _coll_desc
  166. {
  167. ifx_cltypeinfo_t *cld_typeinfo; /* collection cl_svr_typeinfo */
  168. int4 cld_typesize; /* size of typeinfo */
  169. } coll_desc_t;
  170. /*
  171. ** vchar_t is shared by the value_t and udt_t
  172. */
  173. typedef struct _vchar
  174. {
  175. VCHAR_COMMON_HDR
  176. int4 vidx; /* string+UDT: data block size */
  177. int4 vsstart; /* substring start for 4GL-RDS */
  178. int4 vsend; /* substring end for 4GL-RDS */
  179. int4 fixedLen; /* Length of fixedStr */
  180. #if MI_PTR_SIZE == 64
  181. mulong vbyvaluedata; /* data store for byvalue UDTs for 64-bit */
  182. #else
  183. int4 vbyvaluedata; /* data store for byvalue UDTs */
  184. #endif
  185. char *fixedStr; /* Fixed str for FSSEARCH */
  186. unsigned char *shiftTbl;/* Shift table for FSSEARCH */
  187. } vchar_t;
  188. typedef struct value
  189. {
  190. short v_type;
  191. short v_ind; /* null indicator */
  192. int4 v_xid;
  193. short v_prec; /* decimal precision */
  194. union /* data value */
  195. { /* depending on v_type */
  196. vchar_t vchar; /* char and udts */
  197. mint vint; /* SQLSMINT */
  198. int4 vlng; /* SQLINT */
  199. ifx_int8_t vint8; /* SQLINT8 */
  200. #ifndef NOBIGINT
  201. bigint vbigint; /* SQLBIGINT */
  202. #define v_bigint v_val.vbigint
  203. #endif
  204. float vflo; /* SQLSMFLOAT */
  205. double vdub; /* SQLFLOAT */
  206. struct
  207. {
  208. dec_t vdec; /* SQLDECIMAL */
  209. union
  210. {
  211. dtime_t vdatetime;
  212. intrvl_t vintrvl;
  213. } vtme;
  214. } vdecstruct;
  215. short vaddr[MAXADDR]; /* 4GL address modifiers */
  216. tblob_t vtblob; /* BLOB as stored in tuple */
  217. loc_t *vlocator; /* blobs locator */
  218. ifx_collection_t vcollection; /* collection */
  219. ifx_collval_t vtree; /* value_t tree of collection/ROW */
  220. struct
  221. {
  222. VCHAR_COMMON_HDR
  223. row_value_t vrow; /* row descriptor and data */
  224. } vrowstruct; /* for row values */
  225. } v_val;
  226. } value_t;
  227. #define CASTVALP (struct value *)
  228. /*
  229. * defines to make the union transparent
  230. */
  231. #define v_charp v_val.vchar.vcp
  232. #define v_index v_val.vchar.vidx
  233. #define v_align v_val.vchar.valign
  234. #define v_len v_val.vchar.vlen
  235. #define v_flags v_val.vchar.vflgs
  236. #define v_sstart v_val.vchar.vsstart
  237. #define v_send v_val.vchar.vsend
  238. #define v_fixedLen v_val.vchar.fixedLen
  239. #define v_fixedStr v_val.vchar.fixedStr
  240. #define v_shiftTbl v_val.vchar.shiftTbl
  241. #define v_byvaluedata v_val.vchar.vbyvaluedata
  242. #define v_int v_val.vint
  243. #define v_long v_val.vlng
  244. #define v_int8 v_val.vint8
  245. #define v_float v_val.vflo
  246. #define v_double v_val.vdub
  247. #define v_decimal v_val.vdecstruct.vdec
  248. #define v_idesc v_ind
  249. #define v_naddr v_prec
  250. #define v_addr v_val.vaddr
  251. #define v_datetime v_val.vdecstruct.vtme.vdatetime
  252. #define v_intrvl v_val.vdecstruct.vtme.vintrvl
  253. #define v_tblob v_val.vtblob
  254. #define v_blocator v_val.vlocator
  255. #define v_coll v_val.vcollection
  256. /* tchan : add macro for items in vtree */
  257. #define v_child v_val.vtree.ct_child
  258. #define v_vtcoll v_val.vtree.ct_coll
  259. #define v_row v_val.vrowstruct.vrow
  260. /*
  261. * flags for v_flags (For FE programs)
  262. * used by the 4GL Debugger and Pcode Run Time
  263. */
  264. #define V_BREAK 0x1 /* break when variable is updated */
  265. #define V_SUBSTR 0x2 /* char value is a substring */
  266. #define V_QUOTED 0x4 /* char value is from quoted string */
  267. #define V_ASCII0 0x8 /* ascii 0 value */
  268. /*
  269. * flags for v_flags (For BE programs)
  270. * used for FS_[N]SEARCH patterns
  271. */
  272. #define V_FSANSIESCWARN 0x1 /* Fixed string contained a non-ANSI escape
  273. * sequence in an non-ANSI database
  274. */
  275. #define V_NOHASH 0x2 /* UDT not hashable */
  276. #define V_FIXED 0x4 /* UDT is fixed length (SQLROW type only) */
  277. #define V_BYVAL 0x8 /* UDT is by value */
  278. #define V_QUAL 0x10 /* v_char contains qualifier
  279. * (used with char type on client,
  280. * and SQLUDTVAR (XID_LVARCHAR) type on server)
  281. */
  282. /* This flag is used in rvaldata(), but mainly used by the FE to null
  283. * terminate the SQLCHAR data rather than blank padding it as for normal
  284. * SQLCHAR column.
  285. */
  286. #define V_NTERM 0x20 /* null terminated the SQLCHAR data */
  287. #define V_ENCRYPTED 0x40 /* encrypted value */
  288. #define V_ALLOC 0x80 /* Miapi has allocated vcp buffer */
  289. #define FRCBOOL(x) if (x->v_ind >= 0)\
  290. switch (x->v_type) \
  291. {\
  292. case SQLSMINT: break;\
  293. case SQLDATE:\
  294. case SQLSERIAL:\
  295. case SQLINT: if (x->v_long != 0)\
  296. {\
  297. SET_BOOLOP_RESULT(x, 1);\
  298. }\
  299. else\
  300. SET_BOOLOP_RESULT(x, 0);\
  301. SET_BOOLOP_TYPE(x); \
  302. break;\
  303. default: cvtosmint(x);\
  304. break;\
  305. } \
  306. else \
  307. { \
  308. SET_BOOLOP_RESULT(x, 0);\
  309. SET_BOOLOP_TYPE(x); \
  310. }
  311. #define init_int_value(valptr) \
  312. (valptr)->v_type = SQLSMINT; \
  313. (valptr)->v_ind = 0; \
  314. (valptr)->v_prec = 0; \
  315. (valptr)->v_int = 0;
  316. #define ISNULLVAL(valp) ((valp)->v_ind < 0)
  317. #define ISLVARCHARTYPE(valp) \
  318. (\
  319. ISUDTVARTYPE((valp)->v_type) &&\
  320. (valp)->v_xid == XID_LVARCHAR\
  321. )
  322. #define ISBOOLEANTYPE(valp) \
  323. (\
  324. ISUDTFIXEDTYPE((valp)->v_type) &&\
  325. (valp)->v_xid == XID_BOOLEAN\
  326. )
  327. #ifdef TURBO /* TURBO */
  328. #define SET_NULL_VALUE(valp, type, xid) \
  329. { \
  330. short typ = (type); \
  331. (valp)->v_type = typ; \
  332. (valp)->v_ind = -1; \
  333. (valp)->v_xid = (xid); \
  334. (valp)->v_prec = 0; \
  335. if (ISCOLLTYPE(typ)) \
  336. byfill(&((valp)->v_val), sizeof((valp)->v_val), 0); \
  337. }
  338. #endif /* TURBO */
  339. /*
  340. * macros for evaluating boolean expressions results.
  341. */
  342. #ifdef TURBO /* TURBO */
  343. #define SET_BOOLOP_RESULT(valp, value) \
  344. {\
  345. (valp)->v_val.vchar.vcp = (char *) &((valp)->v_val.vchar.vbyvaluedata);\
  346. *((valp)->v_val.vchar.vcp) = (char) (value);\
  347. (valp)->v_len = 1;\
  348. (valp)->v_align = 1;\
  349. (valp)->v_flags = V_BYVAL; \
  350. }
  351. #define SET_BOOLOP_TYPE(valp) \
  352. {\
  353. (valp)->v_type = SQLUDTFIXED;\
  354. (valp)->v_xid = XID_BOOLEAN;\
  355. }
  356. /* Check for v_ind seperately if you want to find out if the boolean result
  357. is null. The following check for v_ind is here to prevent looking into
  358. an uninitialized vcp of a null boolean value.*/
  359. #define BOOLOP_RESULT(val) ((val.v_ind <0)? 0 : *((val).v_val.vchar.vcp))
  360. #define BOOLOP_RESULTP(valp) ((valp->v_ind<0)? 0: *((valp)->v_val.vchar.vcp))
  361. #define IS_BOOLOP_TYPEP(valp) \
  362. (\
  363. ISUDTFIXEDTYPE((valp)->v_type) &&\
  364. (valp)->v_xid == XID_BOOLEAN\
  365. )
  366. /* check for a valid boolean value only 0 or 1 or valid values */
  367. #define INVALID_BOOLEAN(inval) (!(BOOLOP_RESULT(inval)==0||\
  368. BOOLOP_RESULT(inval)==1))
  369. #if defined(__STDC__) || defined(__cplusplus)
  370. extern void copy_value(value_t *fval, value_t *tval);
  371. #else
  372. extern void copy_value();
  373. #endif /* defined(__STDC__) || defined(__cplusplus) */
  374. #else /* TURBO */
  375. #define SET_BOOLOP_RESULT(valp, value) (valp)->v_int = value
  376. #define SET_BOOLOP_TYPE(valp) (valp)->v_type = SQLSMINT
  377. #define BOOLOP_RESULT(val) (val).v_int
  378. #define BOOLOP_RESULTP(valp) (valp)->v_int
  379. #define IS_BOOLOP_TYPEP(valp) (valp)->v_type == SQLSMINT
  380. #define copy_value(fromP, toP) bycopy((char*)(fromP), (char *)(toP), \
  381. sizeof(struct value));
  382. #endif /* TURBO */
  383. #endif /* _VALUE */