/* * Walker function to extract table oids from SELECT statement. */ static bool select_table_walker(Node *node, void *context) { SelectContext *ctx = (SelectContext *) context; int num_oids; if (node == NULL) return false; if (IsA(node, RangeVar)) { RangeVar *rgv = (RangeVar *)node; char *table; int oid; char *s; table = make_table_name_from_rangevar(rgv); oid = pool_table_name_to_oid(table); if (oid) { if (POOL_MAX_SELECT_OIDS <= ctx->num_oids) { pool_debug("select_table_walker: number of oids exceeds"); return false; } num_oids = ctx->num_oids++; ctx->table_oids[num_oids] = oid; s = strip_quote(table); strlcpy(ctx->table_names[num_oids], s, POOL_NAMEDATALEN); free(s); pool_debug("select_table_walker: ctx->table_names[%d] = %s", num_oids, ctx->table_names[num_oids]); } } return raw_expression_tree_walker(node, select_table_walker, context); }
/* * Search function name in whilelist or blacklist regex array * Return 1 on success (found in list) * Return 0 when not found in list * Return -1 if the given search type doesn't exist. * Search type supported are: WHITELIST and BLACKLIST */ int pattern_compare(char *str, const int type, const char *param_name) { int i = 0; char *s; int result = 0; RegPattern *lists_patterns; int *pattc; if (strcmp(param_name, "white_function_list") == 0 || strcmp(param_name, "black_function_list") == 0) { lists_patterns = pool_config->lists_patterns; pattc = &pool_config->pattc; } else if (strcmp(param_name, "white_memqcache_table_list") == 0 || strcmp(param_name, "black_memqcache_table_list") == 0) { lists_patterns = pool_config->lists_memqcache_table_patterns; pattc = &pool_config->memqcache_table_pattc; } else if (strcmp(param_name, "black_query_pattern_list") == 0) { lists_patterns = pool_config->lists_query_patterns; pattc = &pool_config->query_pattc; } else { ereport(WARNING, (errmsg("pattern_compare: unknown paramname %s", param_name))); return -1; } s = strip_quote(str); if (!s) { elog(WARNING, "pattern_compare: strip_quote() returns error"); return -1; } for (i = 0; i < *pattc; i++) { if (lists_patterns[i].type != type) continue; if (regexec(&lists_patterns[i].regexv, s, 0, 0, 0) == 0) { switch (type) { /* return 1 if string matches whitelist pattern */ case WHITELIST: ereport(DEBUG2, (errmsg("comparing function name in whitelist regex array"), errdetail("pattern_compare: %s (%s) matched: %s", param_name, lists_patterns[i].pattern, s))); result = 1; break; /* return 1 if string matches blacklist pattern */ case BLACKLIST: ereport(DEBUG2, (errmsg("comparing function name in blacklist regex array"), errdetail("pattern_compare: %s (%s) matched: %s", param_name, lists_patterns[i].pattern, s))); result = 1; break; default: ereport(WARNING, (errmsg("pattern_compare: \"%s\" unknown pattern match type: \"%s\"", param_name, s))); result = -1; break; } /* return the result */ break; } ereport(DEBUG2, (errmsg("comparing function name in blacklist/whitelist regex array"), errdetail("pattern_compare: %s (%s) not matched: %s", param_name, lists_patterns[i].pattern, s))); } free(s); return result; }