Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef TUPMACS_H
00015 #define TUPMACS_H
00016
00017
00018
00019
00020
00021 #define att_isnull(ATT, BITS) (!((BITS)[(ATT) >> 3] & (1 << ((ATT) & 0x07))))
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)
00038
00039
00040
00041
00042 #if SIZEOF_DATUM == 8
00043
00044 #define fetch_att(T,attbyval,attlen) \
00045 ( \
00046 (attbyval) ? \
00047 ( \
00048 (attlen) == (int) sizeof(Datum) ? \
00049 *((Datum *)(T)) \
00050 : \
00051 ( \
00052 (attlen) == (int) sizeof(int32) ? \
00053 Int32GetDatum(*((int32 *)(T))) \
00054 : \
00055 ( \
00056 (attlen) == (int) sizeof(int16) ? \
00057 Int16GetDatum(*((int16 *)(T))) \
00058 : \
00059 ( \
00060 AssertMacro((attlen) == 1), \
00061 CharGetDatum(*((char *)(T))) \
00062 ) \
00063 ) \
00064 ) \
00065 ) \
00066 : \
00067 PointerGetDatum((char *) (T)) \
00068 )
00069 #else
00070
00071 #define fetch_att(T,attbyval,attlen) \
00072 ( \
00073 (attbyval) ? \
00074 ( \
00075 (attlen) == (int) sizeof(int32) ? \
00076 Int32GetDatum(*((int32 *)(T))) \
00077 : \
00078 ( \
00079 (attlen) == (int) sizeof(int16) ? \
00080 Int16GetDatum(*((int16 *)(T))) \
00081 : \
00082 ( \
00083 AssertMacro((attlen) == 1), \
00084 CharGetDatum(*((char *)(T))) \
00085 ) \
00086 ) \
00087 ) \
00088 : \
00089 PointerGetDatum((char *) (T)) \
00090 )
00091 #endif
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 #define att_align_datum(cur_offset, attalign, attlen, attdatum) \
00102 ( \
00103 ((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
00104 (intptr_t) (cur_offset) : \
00105 att_align_nominal(cur_offset, attalign) \
00106 )
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 #define att_align_pointer(cur_offset, attalign, attlen, attptr) \
00123 ( \
00124 ((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \
00125 (intptr_t) (cur_offset) : \
00126 att_align_nominal(cur_offset, attalign) \
00127 )
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 #define att_align_nominal(cur_offset, attalign) \
00145 ( \
00146 ((attalign) == 'i') ? INTALIGN(cur_offset) : \
00147 (((attalign) == 'c') ? (intptr_t) (cur_offset) : \
00148 (((attalign) == 'd') ? DOUBLEALIGN(cur_offset) : \
00149 ( \
00150 AssertMacro((attalign) == 's'), \
00151 SHORTALIGN(cur_offset) \
00152 ))) \
00153 )
00154
00155
00156
00157
00158
00159
00160 #define att_addlength_datum(cur_offset, attlen, attdatum) \
00161 att_addlength_pointer(cur_offset, attlen, DatumGetPointer(attdatum))
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 #define att_addlength_pointer(cur_offset, attlen, attptr) \
00173 ( \
00174 ((attlen) > 0) ? \
00175 ( \
00176 (cur_offset) + (attlen) \
00177 ) \
00178 : (((attlen) == -1) ? \
00179 ( \
00180 (cur_offset) + VARSIZE_ANY(attptr) \
00181 ) \
00182 : \
00183 ( \
00184 AssertMacro((attlen) == -2), \
00185 (cur_offset) + (strlen((char *) (attptr)) + 1) \
00186 )) \
00187 )
00188
00189
00190
00191
00192
00193
00194
00195
00196 #if SIZEOF_DATUM == 8
00197
00198 #define store_att_byval(T,newdatum,attlen) \
00199 do { \
00200 switch (attlen) \
00201 { \
00202 case sizeof(char): \
00203 *(char *) (T) = DatumGetChar(newdatum); \
00204 break; \
00205 case sizeof(int16): \
00206 *(int16 *) (T) = DatumGetInt16(newdatum); \
00207 break; \
00208 case sizeof(int32): \
00209 *(int32 *) (T) = DatumGetInt32(newdatum); \
00210 break; \
00211 case sizeof(Datum): \
00212 *(Datum *) (T) = (newdatum); \
00213 break; \
00214 default: \
00215 elog(ERROR, "unsupported byval length: %d", \
00216 (int) (attlen)); \
00217 break; \
00218 } \
00219 } while (0)
00220 #else
00221
00222 #define store_att_byval(T,newdatum,attlen) \
00223 do { \
00224 switch (attlen) \
00225 { \
00226 case sizeof(char): \
00227 *(char *) (T) = DatumGetChar(newdatum); \
00228 break; \
00229 case sizeof(int16): \
00230 *(int16 *) (T) = DatumGetInt16(newdatum); \
00231 break; \
00232 case sizeof(int32): \
00233 *(int32 *) (T) = DatumGetInt32(newdatum); \
00234 break; \
00235 default: \
00236 elog(ERROR, "unsupported byval length: %d", \
00237 (int) (attlen)); \
00238 break; \
00239 } \
00240 } while (0)
00241 #endif
00242
00243 #endif