1 // Copyright (c) 1999-2018 David Muse
2 // See the file COPYING for more information.
3 
4 #ifndef DATATYPES_H
5 #define DATATYPES_H
6 #include <rudiments/charstring.h>
7 
8 extern "C" {
9 
10 #define COLUMN_TYPE_IDS		0
11 #define COLUMN_TYPE_NAMES	1
12 
13 typedef	enum {
14 	UNKNOWN_DATATYPE=0,
15 	// addded by freetds
16 	CHAR_DATATYPE,		// 1
17 	INT_DATATYPE,
18 	SMALLINT_DATATYPE,
19 	TINYINT_DATATYPE,
20 	MONEY_DATATYPE,
21 	DATETIME_DATATYPE,
22 	NUMERIC_DATATYPE,
23 	DECIMAL_DATATYPE,
24 	SMALLDATETIME_DATATYPE,
25 	SMALLMONEY_DATATYPE,
26 	IMAGE_DATATYPE,
27 	BINARY_DATATYPE,
28 	BIT_DATATYPE,
29 	REAL_DATATYPE,
30 	FLOAT_DATATYPE,
31 	TEXT_DATATYPE,
32 	VARCHAR_DATATYPE,
33 	VARBINARY_DATATYPE,
34 	LONGCHAR_DATATYPE,
35 	LONGBINARY_DATATYPE,
36 	LONG_DATATYPE,
37 	ILLEGAL_DATATYPE,
38 	SENSITIVITY_DATATYPE,
39 	BOUNDARY_DATATYPE,
40 	VOID_DATATYPE,
41 	USHORT_DATATYPE,
42 	// added by lago
43 	UNDEFINED_DATATYPE,	// 27
44 	DOUBLE_DATATYPE,
45 	DATE_DATATYPE,
46 	TIME_DATATYPE,
47 	TIMESTAMP_DATATYPE,
48 	// added by msql
49 	UINT_DATATYPE,		// 32
50 	LASTREAL_DATATYPE,
51 	// added by mysql
52 	STRING_DATATYPE,	// 34
53 	VARSTRING_DATATYPE,
54 	LONGLONG_DATATYPE,
55 	MEDIUMINT_DATATYPE,
56 	YEAR_DATATYPE,
57 	NEWDATE_DATATYPE,
58 	NULL_DATATYPE,
59 	ENUM_DATATYPE,
60 	SET_DATATYPE,
61 	TINY_BLOB_DATATYPE,
62 	MEDIUM_BLOB_DATATYPE,
63 	LONG_BLOB_DATATYPE,
64 	BLOB_DATATYPE,
65 	// added by oracle
66 	VARCHAR2_DATATYPE,	// 47
67 	NUMBER_DATATYPE,
68 	ROWID_DATATYPE,
69 	RAW_DATATYPE,
70 	LONG_RAW_DATATYPE,
71 	MLSLABEL_DATATYPE,
72 	CLOB_DATATYPE,
73 	BFILE_DATATYPE,
74 	// added by odbc
75 	BIGINT_DATATYPE,	// 55
76 	INTEGER_DATATYPE,
77 	LONGVARBINARY_DATATYPE,
78 	LONGVARCHAR_DATATYPE,
79 	// added by db2
80 	GRAPHIC_DATATYPE,	// 59
81 	VARGRAPHIC_DATATYPE,
82 	LONGVARGRAPHIC_DATATYPE,
83 	DBCLOB_DATATYPE,
84 	DATALINK_DATATYPE,
85 	USER_DEFINED_TYPE_DATATYPE,
86 	SHORT_DATATYPE,
87 	TINY_DATATYPE,
88 	// added by firebird
89 	D_FLOAT_DATATYPE,	// 67
90 	ARRAY_DATATYPE,
91 	QUAD_DATATYPE,
92 	INT64_DATATYPE,
93 	DOUBLE_PRECISION_DATATYPE,
94 	// added by postgresql
95 	BOOL_DATATYPE,
96 	BYTEA_DATATYPE,
97 	NAME_DATATYPE,
98 	INT8_DATATYPE,
99 	INT2_DATATYPE,
100 	INT2VECTOR_DATATYPE,
101 	INT4_DATATYPE,
102 	REGPROC_DATATYPE,
103 	OID_DATATYPE,
104 	TID_DATATYPE,
105 	XID_DATATYPE,
106 	CID_DATATYPE,
107 	OIDVECTOR_DATATYPE,
108 	SMGR_DATATYPE,
109 	POINT_DATATYPE,
110 	LSEG_DATATYPE,
111 	PATH_DATATYPE,
112 	BOX_DATATYPE,
113 	POLYGON_DATATYPE,
114 	LINE_DATATYPE,
115 	_LINE_DATATYPE,
116 	FLOAT4_DATATYPE,
117 	FLOAT8_DATATYPE,
118 	ABSTIME_DATATYPE,
119 	RELTIME_DATATYPE,
120 	TINTERVAL_DATATYPE,
121 	CIRCLE_DATATYPE,
122 	_CIRCLE_DATATYPE,
123 	_MONEY_DATATYPE,
124 	MACADDR_DATATYPE,
125 	INET_DATATYPE,
126 	CIDR_DATATYPE,
127 	_BOOL_DATATYPE,
128 	_BYTEA_DATATYPE,
129 	_CHAR_DATATYPE,
130 	_NAME_DATATYPE,
131 	_INT2_DATATYPE,
132 	_INT2VECTOR_DATATYPE,
133 	_INT4_DATATYPE,
134 	_REGPROC_DATATYPE,
135 	_TEXT_DATATYPE,
136 	_OID_DATATYPE,
137 	_TID_DATATYPE,
138 	_XID_DATATYPE,
139 	_CID_DATATYPE,
140 	_OIDVECTOR_DATATYPE,
141 	_BPCHAR_DATATYPE,
142 	_VARCHAR_DATATYPE,
143 	_INT8_DATATYPE,
144 	_POINT_DATATYPE,
145 	_LSEG_DATATYPE,
146 	_PATH_DATATYPE,
147 	_BOX_DATATYPE,
148 	_FLOAT4_DATATYPE,
149 	_FLOAT8_DATATYPE,
150 	_ABSTIME_DATATYPE,
151 	_RELTIME_DATATYPE,
152 	_TINTERVAL_DATATYPE,
153 	_POLYGON_DATATYPE,
154 	ACLITEM_DATATYPE,
155 	_ACLITEM_DATATYPE,
156 	_MACADDR_DATATYPE,
157 	_INET_DATATYPE,
158 	_CIDR_DATATYPE,
159 	BPCHAR_DATATYPE,
160 	_TIMESTAMP_DATATYPE,
161 	_DATE_DATATYPE,
162 	_TIME_DATATYPE,
163 	TIMESTAMPTZ_DATATYPE,
164 	_TIMESTAMPTZ_DATATYPE,
165 	INTERVAL_DATATYPE,
166 	_INTERVAL_DATATYPE,
167 	_NUMERIC_DATATYPE,
168 	TIMETZ_DATATYPE,
169 	_TIMETZ_DATATYPE,
170 	_BIT_DATATYPE,
171 	VARBIT_DATATYPE,
172 	_VARBIT_DATATYPE,
173 	REFCURSOR_DATATYPE,
174 	_REFCURSOR_DATATYPE,
175 	REGPROCEDURE_DATATYPE,
176 	REGOPER_DATATYPE,
177 	REGOPERATOR_DATATYPE,
178 	REGCLASS_DATATYPE,
179 	REGTYPE_DATATYPE,
180 	_REGPROCEDURE_DATATYPE,
181 	_REGOPER_DATATYPE,
182 	_REGOPERATOR_DATATYPE,
183 	_REGCLASS_DATATYPE,
184 	_REGTYPE_DATATYPE,
185 	RECORD_DATATYPE,
186 	CSTRING_DATATYPE,
187 	ANY_DATATYPE,
188 	ANYARRAY_DATATYPE,
189 	TRIGGER_DATATYPE,
190 	LANGUAGE_HANDLER_DATATYPE,
191 	INTERNAL_DATATYPE,
192 	OPAQUE_DATATYPE,
193 	ANYELEMENT_DATATYPE,
194 	PG_TYPE_DATATYPE,
195 	PG_ATTRIBUTE_DATATYPE,
196 	PG_PROC_DATATYPE,
197 	PG_CLASS_DATATYPE,
198 	// none added by sqlite
199 	// added by sqlserver
200 	UBIGINT_DATATYPE,
201 	UNIQUEIDENTIFIER_DATATYPE,
202 	// added by informix
203 	SMALLFLOAT_DATATYPE,
204 	BYTE_DATATYPE,
205 	BOOLEAN_DATATYPE,
206 	// also added by mysql
207 	TINYTEXT_DATATYPE,
208 	MEDIUMTEXT_DATATYPE,
209 	LONGTEXT_DATATYPE,
210 	JSON_DATATYPE,
211 	GEOMETRY_DATATYPE,
212 	// also added by oracle
213 	SDO_GEOMETRY_DATATYPE,
214 	// added by mssql
215 	NCHAR_DATATYPE,
216 	NVARCHAR_DATATYPE,
217 	NTEXT_DATATYPE,
218 	XML_DATATYPE,
219 	DATETIMEOFFSET_DATATYPE,
220 	END_DATATYPE
221 } datatype;
222 
223 #ifdef NEED_DATATYPESTRING
224 static const char	*datatypestring[] = {
225 	"UNKNOWN",
226 	// addded by freetds
227 	"CHAR",		// 1
228 	"INT",
229 	"SMALLINT",
230 	"TINYINT",
231 	"MONEY",
232 	"DATETIME",
233 	"NUMERIC",
234 	"DECIMAL",
235 	"SMALLDATETIME",
236 	"SMALLMONEY",
237 	"IMAGE",
238 	"BINARY",
239 	"BIT",
240 	"REAL",
241 	"FLOAT",
242 	"TEXT",
243 	"VARCHAR",
244 	"VARBINARY",
245 	"LONGCHAR",
246 	"LONGBINARY",
247 	"LONG",
248 	"ILLEGAL",
249 	"SENSITIVITY",
250 	"BOUNDARY",
251 	"VOID",
252 	"USHORT",
253 	// added by lago
254 	"UNDEFINED",	// 27
255 	"DOUBLE",
256 	"DATE",
257 	"TIME",
258 	"TIMESTAMP",
259 	// added by msql
260 	"UINT",		// 32
261 	"LASTREAL",
262 	// added by mysql
263 	"STRING",	// 34
264 	"VARSTRING",
265 	"LONGLONG",
266 	"MEDIUMINT",
267 	"YEAR",
268 	"NEWDATE",
269 	"NULL",
270 	"ENUM",
271 	"SET",
272 	"TINYBLOB",
273 	"MEDIUMBLOB",
274 	"LONGBLOB",
275 	"BLOB",
276 	// added by oracle
277 	"VARCHAR2",	// 47
278 	"NUMBER",
279 	"ROWID",
280 	"RAW",
281 	"LONG_RAW",
282 	"MLSLABEL",
283 	"CLOB",
284 	"BFILE",
285 	// added by odbc
286 	"BIGINT",	// 55
287 	"INTEGER",
288 	"LONGVARBINARY",
289 	"LONGVARCHAR",
290 	// added by db2
291 	"GRAPHIC",	// 59
292 	"VARGRAPHIC",
293 	"LONGVARGRAPHIC",
294 	"DBCLOB",
295 	"DATALINK",
296 	"USER_DEFINED_TYPE",
297 	"SHORT",
298 	"TINY",
299 	// added by firebird
300 	"D_FLOAT",	// 67
301 	"ARRAY",
302 	"QUAD",
303 	"INT64",
304 	"DOUBLE PRECISION",
305 	// added by postgresql
306 	"BOOL",
307 	"BYTEA",
308 	"NAME",
309 	"INT8",
310 	"INT2",
311 	"INT2VECTOR",
312 	"INT4",
313 	"REGPROC",
314 	"OID",
315 	"TID",
316 	"XID",
317 	"CID",
318 	"OIDVECTOR",
319 	"SMGR",
320 	"POINT",
321 	"LSEG",
322 	"PATH",
323 	"BOX",
324 	"POLYGON",
325 	"LINE",
326 	"LINE_ARRAY",
327 	"FLOAT4",
328 	"FLOAT8",
329 	"ABSTIME",
330 	"RELTIME",
331 	"TINTERVAL",
332 	"CIRCLE",
333 	"CIRCLE_ARRAY",
334 	"MONEY_ARRAY",
335 	"MACADDR",
336 	"INET",
337 	"CIDR",
338 	"BOOL_ARRAY",
339 	"BYTEA_ARRAY",
340 	"CHAR_ARRAY",
341 	"NAME_ARRAY",
342 	"INT2_ARRAY",
343 	"INT2VECTOR_ARRAY",
344 	"INT4_ARRAY",
345 	"REGPROC_ARRAY",
346 	"TEXT_ARRAY",
347 	"OID_ARRAY",
348 	"TID_ARRAY",
349 	"XID_ARRAY",
350 	"CID_ARRAY",
351 	"OIDVECTOR_ARRAY",
352 	"BPCHAR_ARRAY",
353 	"VARCHAR_ARRAY",
354 	"INT8_ARRAY",
355 	"POINT_ARRAY",
356 	"LSEG_ARRAY",
357 	"PATH_ARRAY",
358 	"BOX_ARRAY",
359 	"FLOAT4_ARRAY",
360 	"FLOAT8_ARRAY",
361 	"ABSTIME_ARRAY",
362 	"RELTIME_ARRAY",
363 	"TINTERVAL_ARRAY",
364 	"POLYGON_ARRAY",
365 	"ACLITEM",
366 	"ACLITEM_ARRAY",
367 	"MACADDR_ARRAY",
368 	"INET_ARRAY",
369 	"CIDR_ARRAY",
370 	"BPCHAR",
371 	"TIMESTAMP_ARRAY",
372 	"DATE_ARRAY",
373 	"TIME_ARRAY",
374 	"TIMESTAMPTZ",
375 	"TIMESTAMPTZ_ARRAY",
376 	"INTERVAL",
377 	"INTERVAL_ARRAY",
378 	"NUMERIC_ARRAY",
379 	"TIMETZ",
380 	"TIMETZ_ARRAY",
381 	"BIT_ARRAY",
382 	"VARBIT",
383 	"VARBIT_ARRAY",
384 	"REFCURSOR",
385 	"REFCURSOR_ARRAY",
386 	"REGPROCEDURE",
387 	"REGOPER",
388 	"REGOPERATOR",
389 	"REGCLASS",
390 	"REGTYPE",
391 	"REGPROCEDURE_ARRAY",
392 	"REGOPER_ARRAY",
393 	"REGOPERATOR_ARRAY",
394 	"REGCLASS_ARRAY",
395 	"REGTYPE_ARRAY",
396 	"RECORD",
397 	"CSTRING",
398 	"ANY",
399 	"ANYARRAY",
400 	"TRIGGER",
401 	"LANGUAGE_HANDLER",
402 	"INTERNAL",
403 	"OPAQUE",
404 	"ANYELEMENT",
405 	"PG_TYPE",
406 	"PG_ATTRIBUTE",
407 	"PG_PROC",
408 	"PG_CLASS",
409 	// none added by sqlite
410 	// added by sqlserver
411 	"UBIGINT",
412 	"UNIQUEIDENTIFIER",
413 	// added by informix
414 	"SMALLFLOAT",
415 	"BYTE",
416 	"BOOLEAN",
417 	// also added by mysql
418 	"TINYTEXT",
419 	"MEDIUMTEXT",
420 	"LONGTEXT",
421 	"JSON",
422 	"GEOMETRY",
423 	// also added by oracle
424 	"SDO_GEOMETRY",
425 	// added by mssql
426 	"NCHAR",
427 	"NVARCHAR",
428 	"NTEXT",
429 	"XML",
430 	"DATETIMEOFFSET",
431 	NULL
432 };
433 #endif
434 
435 #ifdef NEED_IS_BIT_TYPE_CHAR
isBitTypeChar(const char * type)436 static bool isBitTypeChar(const char *type) {
437 	return (!charstring::compareIgnoringCase(type,"BIT") ||
438 		!charstring::compareIgnoringCase(type,"VARBIT"));
439 }
440 #endif
441 
442 #ifdef NEED_IS_BIT_TYPE_INT
isBitTypeInt(int16_t type)443 static bool isBitTypeInt(int16_t type) {
444 	return (type==BIT_DATATYPE ||
445 		type==VARBIT_DATATYPE);
446 }
447 #endif
448 
449 #ifdef NEED_IS_BOOL_TYPE_CHAR
isBoolTypeChar(const char * type)450 static bool isBoolTypeChar(const char *type) {
451 	return !charstring::compareIgnoringCase(type,"BOOL");
452 }
453 #endif
454 
455 #ifdef NEED_IS_BOOL_TYPE_INT
isBoolTypeInt(int16_t type)456 static bool isBoolTypeInt(int16_t type) {
457 	return (type==BOOL_DATATYPE);
458 }
459 #endif
460 
461 #ifdef NEED_IS_FLOAT_TYPE_CHAR
isFloatTypeChar(const char * type)462 static bool isFloatTypeChar(const char *type) {
463 	return (!charstring::compareIgnoringCase(type,"NUMERIC") ||
464 		!charstring::compareIgnoringCase(type,"REAL") ||
465 		!charstring::compareIgnoringCase(type,"FLOAT") ||
466 		!charstring::compareIgnoringCase(type,"DOUBLE") ||
467 		!charstring::compareIgnoringCase(type,"D_FLOAT") ||
468 		!charstring::compareIgnoringCase(type,"DECIMAL") ||
469 		!charstring::compareIgnoringCase(type,"MONEY") ||
470 		!charstring::compareIgnoringCase(type,"SMALLMONEY") ||
471 		!charstring::compareIgnoringCase(type,"DOUBLE PRECISION") ||
472 		!charstring::compareIgnoringCase(type,"FLOAT4") ||
473 		!charstring::compareIgnoringCase(type,"FLOAT8") ||
474 		!charstring::compareIgnoringCase(type,"_NUMERIC"));
475 }
476 #endif
477 
478 #ifdef NEED_IS_NONSCALE_FLOAT_TYPE_CHAR
isNonScaleFloatTypeChar(const char * type)479 static bool isNonScaleFloatTypeChar(const char *type) {
480 	return (!charstring::compareIgnoringCase(type,"REAL") ||
481 		!charstring::compareIgnoringCase(type,"FLOAT") ||
482 		!charstring::compareIgnoringCase(type,"DOUBLE") ||
483 		!charstring::compareIgnoringCase(type,"D_FLOAT") ||
484 		!charstring::compareIgnoringCase(type,"DOUBLE PRECISION") ||
485 		!charstring::compareIgnoringCase(type,"FLOAT4") ||
486 		!charstring::compareIgnoringCase(type,"FLOAT8"));
487 }
488 #endif
489 
490 #ifdef NEED_IS_FLOAT_TYPE_INT
isFloatTypeInt(int16_t type)491 static bool isFloatTypeInt(int16_t type) {
492 	return (type==NUMERIC_DATATYPE ||
493 		type==REAL_DATATYPE ||
494 		type==FLOAT_DATATYPE ||
495 		type==DOUBLE_DATATYPE ||
496 		type==D_FLOAT_DATATYPE ||
497 		type==DECIMAL_DATATYPE ||
498 		type==MONEY_DATATYPE ||
499 		type==SMALLMONEY_DATATYPE ||
500 		type==DOUBLE_PRECISION_DATATYPE ||
501 		type==FLOAT4_DATATYPE ||
502 		type==FLOAT8_DATATYPE ||
503 		type==_NUMERIC_DATATYPE);
504 }
505 #endif
506 
507 #ifdef NEED_BIT_STRING_TO_LONG
bitStringToLong(const char * str)508 static int32_t bitStringToLong(const char *str) {
509 	uint32_t	result=0;
510 	size_t		length=charstring::length(str);
511 	for (size_t i=0; i<length; i++) {
512 		result=(result<<1)|(str[i]=='1');
513 	}
514 	return result;
515 }
516 #endif
517 
518 #ifdef NEED_IS_NUMBER_TYPE_CHAR
isNumberTypeChar(const char * type)519 static bool isNumberTypeChar(const char *type) {
520 	return (!charstring::compareIgnoringCase(type,"NUMBER") ||
521 		!charstring::compareIgnoringCase(type,"INT") ||
522 		!charstring::compareIgnoringCase(type,"SMALLINT") ||
523 		!charstring::compareIgnoringCase(type,"TINYINT") ||
524 		!charstring::compareIgnoringCase(type,"REAL") ||
525 		!charstring::compareIgnoringCase(type,"FLOAT") ||
526 		!charstring::compareIgnoringCase(type,"USHORT") ||
527 		!charstring::compareIgnoringCase(type,"DOUBLE") ||
528 		!charstring::compareIgnoringCase(type,"UINT") ||
529 		!charstring::compareIgnoringCase(type,"LASTREAL") ||
530 		!charstring::compareIgnoringCase(type,"TINY") ||
531 		!charstring::compareIgnoringCase(type,"SHORT") ||
532 		!charstring::compareIgnoringCase(type,"LONGLONG") ||
533 		!charstring::compareIgnoringCase(type,"MEDIUMINT") ||
534 		!charstring::compareIgnoringCase(type,"YEAR") ||
535 		!charstring::compareIgnoringCase(type,"BIGINT") ||
536 		!charstring::compareIgnoringCase(type,"INTEGER") ||
537 		!charstring::compareIgnoringCase(type,"D_FLOAT") ||
538 		!charstring::compareIgnoringCase(type,"DECIMAL") ||
539 		!charstring::compareIgnoringCase(type,"INT64") ||
540 		!charstring::compareIgnoringCase(type,"MONEY") ||
541 		!charstring::compareIgnoringCase(type,"SMALLMONEY") ||
542 		!charstring::compareIgnoringCase(type,"DOUBLE PRECISION") ||
543 		!charstring::compareIgnoringCase(type,"INT8") ||
544 		!charstring::compareIgnoringCase(type,"INT2") ||
545 		!charstring::compareIgnoringCase(type,"INT4") ||
546 		!charstring::compareIgnoringCase(type,"OID") ||
547 		!charstring::compareIgnoringCase(type,"TID") ||
548 		!charstring::compareIgnoringCase(type,"XID") ||
549 		!charstring::compareIgnoringCase(type,"CID") ||
550 		!charstring::compareIgnoringCase(type,"FLOAT4") ||
551 		!charstring::compareIgnoringCase(type,"FLOAT8") ||
552 		!charstring::compareIgnoringCase(type,"TINTERVAL") ||
553 		!charstring::compareIgnoringCase(type,"_MONEY") ||
554 		!charstring::compareIgnoringCase(type,"_INT2") ||
555 		!charstring::compareIgnoringCase(type,"_INT4") ||
556 		!charstring::compareIgnoringCase(type,"_oid") ||
557 		!charstring::compareIgnoringCase(type,"_TID") ||
558 		!charstring::compareIgnoringCase(type,"_XID") ||
559 		!charstring::compareIgnoringCase(type,"_CID") ||
560 		!charstring::compareIgnoringCase(type,"_INT8") ||
561 		!charstring::compareIgnoringCase(type,"_FLOAT4") ||
562 		!charstring::compareIgnoringCase(type,"_FLOAT8") ||
563 		!charstring::compareIgnoringCase(type,"_TINTERVAL") ||
564 		!charstring::compareIgnoringCase(type,"INTERVAL") ||
565 		!charstring::compareIgnoringCase(type,"_INTERVAL") ||
566 		!charstring::compareIgnoringCase(type,"NUMERIC"));
567 }
568 #endif
569 
570 #ifdef NEED_IS_NUMBER_TYPE_INT
isNumberTypeInt(int16_t type)571 static bool isNumberTypeInt(int16_t type) {
572 	return (type==NUMBER_DATATYPE ||
573 		type==INT_DATATYPE ||
574 		type==SMALLINT_DATATYPE ||
575 		type==TINYINT_DATATYPE ||
576 		type==BIT_DATATYPE ||
577 		type==REAL_DATATYPE ||
578 		type==FLOAT_DATATYPE ||
579 		type==USHORT_DATATYPE ||
580 		type==DOUBLE_DATATYPE ||
581 		type==UINT_DATATYPE ||
582 		type==LASTREAL_DATATYPE ||
583 		type==TINY_DATATYPE ||
584 		type==SHORT_DATATYPE ||
585 		type==LONGLONG_DATATYPE ||
586 		type==MEDIUMINT_DATATYPE ||
587 		type==YEAR_DATATYPE ||
588 		type==BIGINT_DATATYPE ||
589 		type==INTEGER_DATATYPE ||
590 		type==D_FLOAT_DATATYPE ||
591 		type==DECIMAL_DATATYPE ||
592 		type==INT64_DATATYPE ||
593 		type==MONEY_DATATYPE ||
594 		type==SMALLMONEY_DATATYPE ||
595 		type==DOUBLE_PRECISION_DATATYPE ||
596 		type==INT8_DATATYPE ||
597 		type==INT2_DATATYPE ||
598 		type==INT4_DATATYPE ||
599 		type==TID_DATATYPE ||
600 		type==XID_DATATYPE ||
601 		type==CID_DATATYPE ||
602 		type==FLOAT4_DATATYPE ||
603 		type==FLOAT8_DATATYPE ||
604 		type==TINTERVAL_DATATYPE ||
605 		type==_MONEY_DATATYPE ||
606 		type==_INT2_DATATYPE ||
607 		type==_INT4_DATATYPE ||
608 		type==_TID_DATATYPE ||
609 		type==_XID_DATATYPE ||
610 		type==_CID_DATATYPE ||
611 		type==_INT8_DATATYPE ||
612 		type==_FLOAT4_DATATYPE ||
613 		type==_FLOAT8_DATATYPE ||
614 		type==_TINTERVAL_DATATYPE ||
615 		type==INTERVAL_DATATYPE ||
616 		type==_INTERVAL_DATATYPE ||
617 		type==NUMERIC_DATATYPE);
618 }
619 #endif
620 
621 #ifdef NEED_IS_BLOB_TYPE_CHAR
isBlobTypeChar(const char * type)622 static bool isBlobTypeChar(const char *type) {
623 	return (!charstring::compareIgnoringCase(type,"IMAGE") ||
624 		!charstring::compareIgnoringCase(type,"BINARY") ||
625 		!charstring::compareIgnoringCase(type,"VARBINARY") ||
626 		!charstring::compareIgnoringCase(type,"LONGCHAR") ||
627 		!charstring::compareIgnoringCase(type,"LONGBINARY") ||
628 		!charstring::compareIgnoringCase(type,"LONG") ||
629 		!charstring::compareIgnoringCase(type,"TINYBLOB") ||
630 		!charstring::compareIgnoringCase(type,"MEDIUMBLOB") ||
631 		!charstring::compareIgnoringCase(type,"LONGBLOB") ||
632 		!charstring::compareIgnoringCase(type,"BLOB") ||
633 		!charstring::compareIgnoringCase(type,"LONGVARBINARY") ||
634 		!charstring::compareIgnoringCase(type,"LONGVARCHAR") ||
635 		!charstring::compareIgnoringCase(type,"RAW") ||
636 		!charstring::compareIgnoringCase(type,"LONG_RAW") ||
637 		!charstring::compareIgnoringCase(type,"CLOB") ||
638 		!charstring::compareIgnoringCase(type,"BFILE") ||
639 		!charstring::compareIgnoringCase(type,"DBCLOB") ||
640 		!charstring::compareIgnoringCase(type,"TINYTEXT") ||
641 		!charstring::compareIgnoringCase(type,"MEDIUMTEXT") ||
642 		!charstring::compareIgnoringCase(type,"LONGTEXT") ||
643 		!charstring::compareIgnoringCase(type,"JSON") ||
644 		!charstring::compareIgnoringCase(type,"GEOMETRY") ||
645 		!charstring::compareIgnoringCase(type,"SDO_GEOMETRY") ||
646 		!charstring::compareIgnoringCase(type,"NTEXT") ||
647 		!charstring::compareIgnoringCase(type,"XML") ||
648 		!charstring::compareIgnoringCase(type,"GRAPHIC") ||
649 		!charstring::compareIgnoringCase(type,"VARGRAPHIC") ||
650 		!charstring::compareIgnoringCase(type,"LONGVARGRAPHIC") ||
651 		!charstring::compareIgnoringCase(type,"DBCLOB"));
652 }
653 #endif
654 
655 #ifdef NEED_IS_BLOB_TYPE_INT
isBlobTypeInt(int16_t type)656 static bool isBlobTypeInt(int16_t type) {
657 	return (type==IMAGE_DATATYPE ||
658 		type==BINARY_DATATYPE ||
659 		type==VARBINARY_DATATYPE ||
660 		type==LONGCHAR_DATATYPE ||
661 		type==LONGBINARY_DATATYPE ||
662 		type==LONG_DATATYPE ||
663 		type==TINY_BLOB_DATATYPE ||
664 		type==MEDIUM_BLOB_DATATYPE ||
665 		type==LONG_BLOB_DATATYPE ||
666 		type==BLOB_DATATYPE ||
667 		type==RAW_DATATYPE ||
668 		type==LONG_RAW_DATATYPE ||
669 		type==CLOB_DATATYPE ||
670 		type==BFILE_DATATYPE ||
671 		type==DBCLOB_DATATYPE ||
672 		type==TINYTEXT_DATATYPE ||
673 		type==MEDIUMTEXT_DATATYPE ||
674 		type==LONGTEXT_DATATYPE ||
675 		type==JSON_DATATYPE ||
676 		type==GEOMETRY_DATATYPE ||
677 		type==SDO_GEOMETRY_DATATYPE);
678 }
679 #endif
680 
681 #ifdef NEED_IS_UNSIGNED_TYPE_CHAR
isUnsignedTypeChar(const char * type)682 static bool isUnsignedTypeChar(const char *type) {
683 	return (!charstring::compareIgnoringCase(type,"USHORT") ||
684 		!charstring::compareIgnoringCase(type,"UINT")||
685 		!charstring::compareIgnoringCase(type,"YEAR") ||
686 		!charstring::compareIgnoringCase(type,"TIMESTAMP"));
687 }
688 #endif
689 
690 #ifdef NEED_IS_UNSIGNED_TYPE_INT
isUnsignedTypeInt(int16_t type)691 static bool isUnsignedTypeInt(int16_t type) {
692 	return (type==USHORT_DATATYPE ||
693 		type==UINT_DATATYPE ||
694 		type==YEAR_DATATYPE ||
695 		type==TIMESTAMP_DATATYPE);
696 }
697 #endif
698 
699 #ifdef NEED_IS_BINARY_TYPE_CHAR
isBinaryTypeChar(const char * type)700 static bool isBinaryTypeChar(const char *type) {
701 	return (!charstring::compareIgnoringCase(type,"IMAGE") ||
702 		!charstring::compareIgnoringCase(type,"BINARY") ||
703 		!charstring::compareIgnoringCase(type,"VARBINARY") ||
704 		!charstring::compareIgnoringCase(type,"LONGBINARY") ||
705 		!charstring::compareIgnoringCase(type,"TINYBLOB") ||
706 		!charstring::compareIgnoringCase(type,"MEDIUMBLOB") ||
707 		!charstring::compareIgnoringCase(type,"LONGBLOB") ||
708 		!charstring::compareIgnoringCase(type,"BLOB") ||
709 		!charstring::compareIgnoringCase(type,"BFILE") ||
710 		!charstring::compareIgnoringCase(type,"LONGVARBINARY") ||
711 		!charstring::compareIgnoringCase(type,"GRAPHIC") ||
712 		!charstring::compareIgnoringCase(type,"VARGRAPHIC") ||
713 		!charstring::compareIgnoringCase(type,"LONGVARGRAPHIC") ||
714 		!charstring::compareIgnoringCase(type,"OID") ||
715 		!charstring::compareIgnoringCase(type,"_OID") ||
716 		!charstring::compareIgnoringCase(type,"OIDVECTOR") ||
717 		!charstring::compareIgnoringCase(type,"_BYTEA") ||
718 		!charstring::compareIgnoringCase(type,"TIMESTAMP") ||
719 		!charstring::compareIgnoringCase(type,"DATE") ||
720 		!charstring::compareIgnoringCase(type,"TIME") ||
721 		!charstring::compareIgnoringCase(type,"DATETIME") ||
722 		!charstring::compareIgnoringCase(type,"NEWDATE"));
723 }
724 #endif
725 
726 #ifdef NEED_IS_BINARY_TYPE_INT
isBinaryTypeInt(int16_t type)727 static bool isBinaryTypeInt(int16_t type) {
728 	return (type==IMAGE_DATATYPE ||
729 		type==BINARY_DATATYPE ||
730 		type==VARBINARY_DATATYPE ||
731 		type==LONGBINARY_DATATYPE ||
732 		type==TINY_BLOB_DATATYPE ||
733 		type==MEDIUM_BLOB_DATATYPE ||
734 		type==LONG_BLOB_DATATYPE ||
735 		type==BLOB_DATATYPE ||
736 		type==BFILE_DATATYPE ||
737 		type==LONGVARBINARY_DATATYPE ||
738 		type==GRAPHIC_DATATYPE ||
739 		type==VARGRAPHIC_DATATYPE ||
740 		type==LONGVARGRAPHIC_DATATYPE ||
741 		type==OID_DATATYPE ||
742 		type==_OID_DATATYPE ||
743 		type==OIDVECTOR_DATATYPE ||
744 		type==_BYTEA_DATATYPE ||
745 		type==TIMESTAMP_DATATYPE ||
746 		type==DATE_DATATYPE ||
747 		type==TIME_DATATYPE ||
748 		type==DATETIME_DATATYPE ||
749 		type==NEWDATE_DATATYPE);
750 }
751 #endif
752 
753 #ifdef NEED_IS_DATETIME_TYPE_CHAR
isDateTimeTypeChar(const char * type)754 static bool isDateTimeTypeChar(const char *type) {
755 	return (!charstring::compareIgnoringCase(type,"DATETIME") ||
756 		!charstring::compareIgnoringCase(type,"SMALLDATETIME") ||
757 		!charstring::compareIgnoringCase(type,"DATE") ||
758 		!charstring::compareIgnoringCase(type,"TIME") ||
759 		!charstring::compareIgnoringCase(type,"TIMESTAMP") ||
760 		!charstring::compareIgnoringCase(type,"NEWDATE") ||
761 		!charstring::compareIgnoringCase(type,"DATETIMEOFFSET"));
762 }
763 #endif
764 
765 #ifdef NEED_IS_DATETIME_TYPE_INT
isDateTimeTypeInt(int16_t type)766 static bool isDateTimeTypeInt(int16_t type) {
767 	return (type==DATETIME_DATATYPE ||
768 		type==SMALLDATETIME_DATATYPE ||
769 		type==DATE_DATATYPE ||
770 		type==TIME_DATATYPE ||
771 		type==TIMESTAMP_DATATYPE ||
772 		type==NEWDATE_DATATYPE);
773 }
774 #endif
775 
776 }
777 
778 #endif
779