41 #if defined(SERVER_MODE) 47 #if defined (SUPPRESS_STRLEN_WARNING) 48 #define strlen(s1) ((int) strlen(s1)) 56 #define STRINGS_PER_BLOCK (8192-(4*sizeof(long)+sizeof(char *)+40)) 57 #define HASH_NUMBER 128 58 #define NODES_PER_BLOCK 256 178 #if defined(SERVER_MODE) 182 static pthread_mutex_t blocks_lock = PTHREAD_MUTEX_INITIALIZER;
183 static pthread_mutex_t free_lists_lock = PTHREAD_MUTEX_INITIALIZER;
184 static pthread_mutex_t parser_memory_lock = PTHREAD_MUTEX_INITIALIZER;
185 static pthread_mutex_t parser_id_lock = PTHREAD_MUTEX_INITIALIZER;
200 const int wrap_with_single_quote);
202 const char *new_tail,
const int new_tail_length);
218 #if defined(SERVER_MODE) 243 #if defined(SERVER_MODE) 246 block->
next = parser_Node_blocks[idhash];
247 parser_Node_blocks[idhash] = block;
256 #if defined(SERVER_MODE) 260 return &block->
nodes[0];
276 #if defined(SERVER_MODE) 283 #if defined(SERVER_MODE) 287 free_list = parser_Node_free_lists[idhash];
290 free_list = free_list->
next;
293 #if defined(SERVER_MODE) 297 if (free_list ==
NULL)
313 node = free_list->
node;
333 #if defined(SERVER_MODE) 339 #if defined(SERVER_MODE) 342 previous_block = &parser_Node_blocks[idhash];
343 block = *previous_block;
345 while (block !=
NULL)
350 *previous_block = block->
next;
356 previous_block = &block->
next;
359 block = *previous_block;
361 #if defined(SERVER_MODE) 378 #if defined(SERVER_MODE) 398 block->
block_end = STRINGS_PER_BLOCK - 1;
430 #if defined(SERVER_MODE) 433 block->
next = parser_String_blocks[idhash];
434 parser_String_blocks[idhash] = block;
435 #if defined(SERVER_MODE) 462 #if defined(SERVER_MODE) 469 #if defined(SERVER_MODE) 472 block = parser_String_blocks[idhash];
479 #if defined(SERVER_MODE) 514 #if defined(SERVER_MODE) 520 #if defined(SERVER_MODE) 523 previous_string = &parser_String_blocks[idhash];
524 string = *previous_string;
525 while (
string != string_to_free)
527 previous_string = &
string->
next;
528 string = *previous_string;
533 *previous_string =
string->
next;
536 #if defined(SERVER_MODE) 553 #if defined(SERVER_MODE) 559 #if defined(SERVER_MODE) 562 string = parser_String_blocks[idhash];
563 while (
string !=
NULL 566 string =
string->
next;
568 #if defined(SERVER_MODE) 592 const int wrap_with_single_quote)
600 new_tail_length =
strlen (new_tail);
601 if (wrap_with_single_quote)
603 new_tail_length += 2;
615 strcpy (s, old_string);
616 if (wrap_with_single_quote)
620 strcat (s, new_tail);
621 if (wrap_with_single_quote)
640 s = &
string->u.chars[
string->last_string_end];
641 if (wrap_with_single_quote)
644 strcpy (s + 1, new_tail);
645 strcpy (s + new_tail_length - 1,
"'");
649 strcpy (s, new_tail);
651 string->last_string_end += new_tail_length;
652 s = &
string->u.chars[
string->last_string_start];
678 const int new_tail_length)
697 bytes) + old_string->
length + new_tail_length,
706 memcpy (&old_string->
bytes[old_string->
length], new_tail, new_tail_length);
707 old_string->
length += (int) new_tail_length;
725 memcpy (&old_string->
bytes[old_string->
length], new_tail, new_tail_length);
726 old_string->
length += (int) new_tail_length;
729 string->last_string_end += (int) new_tail_length;
730 s = &
string->u.chars[
string->last_string_start];
747 #if defined(SERVER_MODE) 753 #if defined(SERVER_MODE) 756 free_list = parser_Node_free_lists[idhash];
759 free_list = free_list->
next;
762 if (free_list ==
NULL)
768 if (free_list ==
NULL)
770 #if defined(SERVER_MODE) 777 free_list->
next = parser_Node_free_lists[idhash];
778 parser_Node_free_lists[idhash] = free_list;
782 #if defined(SERVER_MODE) 788 #if defined(SERVER_MODE) 806 #if defined(SERVER_MODE) 812 #if defined(SERVER_MODE) 815 previous_free_list = &parser_Node_free_lists[idhash];
816 free_list = *previous_free_list;
819 previous_free_list = &free_list->
next;
820 free_list = *previous_free_list;
826 *previous_free_list = free_list->
next;
829 #if defined(SERVER_MODE) 873 #if defined(SERVER_MODE) 893 #if defined(SERVER_MODE) 896 free_list = parser_Node_free_lists[idhash];
899 free_list = free_list->
next;
902 #if defined(SERVER_MODE) 907 if (free_list ==
NULL)
932 free_list->
node = node;
958 memset (pointer, 0, length);
984 if (new_tail ==
NULL)
988 else if (old_string ==
NULL)
995 strcpy (s, new_tail);
1015 const int new_tail_length)
1019 if (old_string ==
NULL)
1024 if (old_string ==
NULL)
1029 old_string->
bytes[0] = 0;
1032 if (new_tail ==
NULL)
1054 if (new_tail ==
NULL)
1074 if (nulstring ==
NULL)
1088 const unsigned char *
1093 return string->bytes;
1110 return string->length;
1128 #if defined(SERVER_MODE) 1134 #if defined(SERVER_MODE) 1137 previous_block = &parser_String_blocks[idhash];
1138 block = *previous_block;
1140 while (block !=
NULL)
1145 *previous_block = block->
next;
1151 previous_block = &block->
next;
1154 block = *previous_block;
1156 #if defined(SERVER_MODE) 1173 #if defined(SERVER_MODE) 1176 struct drand48_data rand_buf;
1185 #if !defined (SERVER_MODE) 1189 #if defined(SERVER_MODE) 1195 #if defined(SERVER_MODE) 1205 parser->execution_values.row_count = -1;
1208 gettimeofday (&t,
NULL);
1209 srand48_r (t.tv_usec, &rand_buf);
1210 lrand48_r (&rand_buf, &parser->lrand);
1211 drand48_r (&rand_buf, &parser->drand);
1216 parser->query_id = NULL_QUERY_ID;
1217 parser->flag.is_in_and_list = 0;
1218 parser->flag.is_holdable = 0;
1219 parser->flag.is_xasl_pinned_reference = 0;
1220 parser->flag.recompile_xasl_pinned = 0;
1221 parser->auto_param_count = 0;
1222 parser->flag.return_generated_keys = 0;
1223 parser->flag.is_system_generated_stmt = 0;
1224 parser->flag.has_internal_error = 0;
1225 parser->max_print_len = 0;
1226 parser->flag.is_auto_commit = 0;
void parser_free_lcks_classes(PARSER_CONTEXT *parser)
bool db_is_json_doc_type(DB_TYPE type)
static PARSER_NODE_FREE_LIST * parser_Node_free_lists[HASH_NUMBER]
static PARSER_STRING_BLOCK * parser_String_blocks[HASH_NUMBER]
char chars[STRINGS_PER_BLOCK]
void * parser_alloc(const PARSER_CONTEXT *parser, const int length)
struct db_value * m_default_value
PT_JSON_TABLE_COLUMN_INFO json_table_column_info
static void pt_unregister_parser(const PARSER_CONTEXT *parser)
PARSER_VARCHAR * pt_append_nulstring(const PARSER_CONTEXT *parser, PARSER_VARCHAR *bstring, const char *nulstring)
static PARSER_STRING_BLOCK * parser_create_string_block(const PARSER_CONTEXT *parser, const int length)
PT_RESERVED_NAME pt_Reserved_name_table[]
PARSER_NODE_FREE_LIST * next
PT_NODE nodes[NODES_PER_BLOCK]
struct json_table_column_behavior on_empty
#define pthread_mutex_unlock(a)
QUERY_TRACE_FORMAT format
enum pt_type_enum PT_TYPE_ENUM
#define assert_release(e)
union pt_plan_trace_info::@133 trace
PARSER_CONTEXT * parser_create_parser(void)
bool pt_is_json_doc_type(PT_TYPE_ENUM type)
PARSER_VARCHAR * pt_append_bytes(const PARSER_CONTEXT *parser, PARSER_VARCHAR *old_string, const char *new_tail, const int new_tail_length)
static PARSER_STRING_BLOCK * pt_find_string_block(const PARSER_CONTEXT *parser, const char *old_string)
bool pt_is_json_value_type(PT_TYPE_ENUM type)
bool db_is_json_value_type(DB_TYPE type)
DB_VALUE * host_variables
void parser_free_node_resources(PT_NODE *node)
void parser_free_parser(PARSER_CONTEXT *parser)
DB_TYPE pt_type_enum_to_db(const PT_TYPE_ENUM t)
static void pt_free_string_blocks(const PARSER_CONTEXT *parser)
int pt_get_varchar_length(const PARSER_VARCHAR *string)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
#define PT_IS_CONST_NOT_HOSTVAR(n)
static void pt_free_a_string_block(const PARSER_CONTEXT *parser, PARSER_STRING_BLOCK *string_to_free)
#define ER_OUT_OF_VIRTUAL_MEMORY
static PT_NODE * parser_create_node_block(const PARSER_CONTEXT *parser)
struct json_table_column_behavior on_error
int pt_count_assignments(PARSER_CONTEXT *parser, PT_NODE *assignments)
PARSER_VARCHAR * pt_append_varchar(const PARSER_CONTEXT *parser, PARSER_VARCHAR *old_string, const PARSER_VARCHAR *new_tail)
union parser_string_block::aligned u
char * pt_append_string(const PARSER_CONTEXT *parser, const char *old_string, const char *new_tail)
short db_value_is_in_workspace
#define CONST_CAST(dest_type, expr)
PT_NODE * pt_get_next_assignment(PT_ASSIGNMENTS_HELPER *ea)
static int pt_register_parser(const PARSER_CONTEXT *parser)
PT_NODE * parser_create_node(const PARSER_CONTEXT *parser)
TP_DOMAIN ** host_var_expected_domains
static char * pt_append_string_for(const PARSER_CONTEXT *parser, const char *old_string, const char *new_tail, const int wrap_with_single_quote)
void parser_free_node(const PARSER_CONTEXT *parser, PT_NODE *node)
const unsigned char * pt_get_varchar_bytes(const PARSER_VARCHAR *string)
static void pt_free_node_blocks(const PARSER_CONTEXT *parser)
#define free_and_init(ptr)
void pt_init_assignments_helper(PARSER_CONTEXT *parser, PT_ASSIGNMENTS_HELPER *helper, PT_NODE *assignment)
int db_make_null(DB_VALUE *value)
static PARSER_VARCHAR * pt_append_bytes_for(const PARSER_CONTEXT *parser, PARSER_VARCHAR *old_string, const char *new_tail, const int new_tail_length)
PT_PLAN_TRACE_INFO plan_trace[MAX_NUM_PLAN_TRACE]
#define pthread_mutex_lock(a)
int db_value_clear(DB_VALUE *value)
PARSER_STRING_BLOCK * next
void * parser_allocate_string_buffer(const PARSER_CONTEXT *parser, const int length, const int align)
struct json_t * json_plan
static PARSER_NODE_BLOCK * parser_Node_blocks[HASH_NUMBER]
void parser_init_func_vectors(void)
PT_INSERT_VALUE_INFO insert_value
#define STRINGS_PER_BLOCK