BOOL CheckPgClassInfo()

in parse.c [385:476]


BOOL CheckPgClassInfo(StatementClass *stmt)
{
	const COL_INFO *coli;
	int	table_info;
	TABLE_INFO	*ti;
	BOOL	hasoids = FALSE, hassubclass =FALSE, keyFound = FALSE;

MYLOG(MIN_LOG_LEVEL, "Entering\n");
	if (0 != SC_checked_hasoids(stmt))
		return TRUE;
	if (!stmt->ti || !stmt->ti[0])
		return FALSE;
	ti = stmt->ti[0];
	MYLOG(DETAIL_LOG_LEVEL, "ti->col_info=%p\n", ti->col_info);
	if (TI_checked_hasoids(ti))
		;
	else if (coli = ti->col_info, NULL != coli)
	{
		table_info = coli->table_info;
		if (0 == (table_info & TBINFO_HASSUBCLASS))
		{
			TI_set_has_no_subclass(ti);
		}
		else
		{
			hassubclass = TRUE;
			TI_set_hassubclass(ti);
			STR_TO_NAME(ti->bestitem, TABLEOID_NAME);
			STRX_TO_NAME(ti->bestqual, "\"" TABLEOID_NAME "\" = %u");
		}
		if (!hassubclass)
		{
			if (0 == (table_info & TBINFO_HASOIDS))
			{
				TI_set_has_no_oids(ti);
			}
			else
			{
				hasoids = TRUE;
				TI_set_hasoids(ti);
				STR_TO_NAME(ti->bestitem, OID_NAME);
				STRX_TO_NAME(ti->bestqual, "\"" OID_NAME "\" = %u");
			}
		}
		ti->table_oid = coli->table_oid;
		if (!hasoids && !hassubclass)
		{
			QResultClass	*res = coli->result;
			int	num_tuples = res ? QR_get_num_cached_tuples(res) : -1;

			if (num_tuples > 0)
			{
				int	i;

				for (i = 0; i < num_tuples; i++)
				{
					if (QR_get_value_backend_int(res, i, COLUMNS_AUTO_INCREMENT, NULL) != 0&&
					    QR_get_value_backend_int(res, i, COLUMNS_FIELD_TYPE, NULL) == PG_TYPE_INT4)
					{
						char		query[512];

						STR_TO_NAME(ti->bestitem, QR_get_value_backend_text(res, i, COLUMNS_COLUMN_NAME));
						SPRINTF_FIXED(query, "\"%s\" = %%d", SAFE_NAME(ti->bestitem));
						STRX_TO_NAME(ti->bestqual, query);
						break;
					}
				}
			}
		}
		TI_set_hasoids_checked(ti);
	}
	else
		return FALSE;

	stmt->num_key_fields = PG_NUM_NORMAL_KEYS;
	if (TI_has_subclass(ti))
		keyFound = FALSE;
	else if (TI_has_oids(ti))
		keyFound = TRUE;
	else if (NAME_IS_NULL(ti->bestqual))
	{
		keyFound = TRUE;
		stmt->num_key_fields--;
	}
	else
		keyFound = TRUE;
	MYLOG(DETAIL_LOG_LEVEL, "subclass=%d oids=%d bestqual=%s keyFound=%d num_key_fields=%d\n", TI_has_subclass(ti), TI_has_oids(ti), PRINT_NAME(ti->bestqual), keyFound, stmt->num_key_fields);

	SC_set_checked_hasoids(stmt, keyFound);

	return TRUE;
}