in src/odbc/rsodbc/rscatalog.cpp [2869:2973]
static void addTableTypeFilterCondition(char *filterClause, char *pVal, SQLSMALLINT cbLen, int schemaPatternType)
{
if(pVal && *pVal != '\0')
{
char tempBuf[MAX_TEMP_BUF_LEN];
int len = (int)((cbLen == SQL_NTS) ? strlen(pVal) : cbLen);
char *pToken;
strncpy(tempBuf, pVal, len);
tempBuf[len] = '\0';
pToken = strtok(tempBuf, ",");
if (schemaPatternType == LOCAL_SCHEMA_QUERY)
{
rs_strncat(filterClause, " AND (false ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
while (pToken)
{
pToken = trim_whitespaces(pToken);
if (_stricmp(pToken, "TABLE") == 0
|| _stricmp(pToken, "'TABLE'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'r' AND n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
else
if (_stricmp(pToken, "VIEW") == 0
|| _stricmp(pToken, "'VIEW'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'v' AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
else
if (_stricmp(pToken, "SYSTEM TABLE") == 0
|| _stricmp(pToken, "'SYSTEM TABLE'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'r' AND (n.nspname = 'pg_catalog' OR n.nspname = 'information_schema') ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
else
if (_stricmp(pToken, "SYSTEM VIEW") == 0
|| _stricmp(pToken, "'SYSTEM VIEW'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'v' AND (n.nspname = 'pg_catalog' OR n.nspname = 'information_schema') ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
else
if (_stricmp(pToken, "SYSTEM TOAST TABLE") == 0
|| _stricmp(pToken, "'SYSTEM TOAST TABLE'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'r' AND n.nspname = 'pg_toast' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
else
if (_stricmp(pToken, "TEMPORARY TABLE") == 0
|| _stricmp(pToken, "'TEMPORARY TABLE'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'r' AND n.nspname ~ '^pg_temp_' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
else
if (_stricmp(pToken, "TEMPORARY VIEW") == 0
|| _stricmp(pToken, "'TEMPORARY VIEW'") == 0)
{
rs_strncat(filterClause, " OR ( c.relkind = 'v' AND n.nspname ~ '^pg_temp_' ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
pToken = strtok(NULL, ",");
} // Loop
rs_strncat(filterClause, " ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
} // LOCAL_SCHEMA_QUERY
else
if (schemaPatternType == NO_SCHEMA_UNIVERSAL_QUERY
|| schemaPatternType == EXTERNAL_SCHEMA_QUERY)
{
bool first = TRUE;
rs_strncat(filterClause, " AND TABLE_TYPE IN ( ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
while (pToken)
{
char *pEscapedName = NULL;
short cbEscapedName = 0;
int len1;
if (!first)
{
rs_strncat(filterClause, ", ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
pToken = trim_whitespaces(pToken);
if (*pToken == '\'')
{
pToken++;
pToken[strlen(pToken) - 1] = '\0'; // overwrite last '\'' with terminator
}
pEscapedName = escapedFilterCondition(pToken, strlen(pToken));
len1 = strlen(filterClause);
snprintf(filterClause + len1, MAX_CATALOG_QUERY_FILTER_LEN - len1, "'%s'", pEscapedName);
pEscapedName = (char *)rs_free(pEscapedName);
first = FALSE;
pToken = strtok(NULL, ",");
} // Loop
rs_strncat(filterClause, " ) ", MAX_CATALOG_QUERY_FILTER_LEN - strlen(filterClause));
}
}
}