diff --git a/lib/Admin_Handler.cpp b/lib/Admin_Handler.cpp index 33f8d0587..d51722210 100644 --- a/lib/Admin_Handler.cpp +++ b/lib/Admin_Handler.cpp @@ -4421,6 +4421,8 @@ void admin_session_handler(S* sess, void *_pa, PtrSize_t *pkt) { // If we couldn't extract the table name, return error error = l_strdup("could not extract table name from pattern"); + proxy_error("Error: %s\n", error); + SPA->send_error_msg_to_client(sess, error); run_query = false; goto __run_query; } @@ -4470,6 +4472,8 @@ void admin_session_handler(S* sess, void *_pa, PtrSize_t *pkt) { // Not in describe mode or no table name - return error error = l_strdup("describe mode not initialized - first describe query not executed"); + proxy_error("Error: %s\n", error); + SPA->send_error_msg_to_client(sess, error); run_query = false; goto __run_query; } @@ -4479,9 +4483,12 @@ void admin_session_handler(S* sess, void *_pa, PtrSize_t *pkt) { // (SELECT pg_catalog.pg_collation c...) AS attcollation, a.attidentity, a.attgenerated // FROM pg_catalog.pg_attribute a WHERE a.attrelid = 'tablename' ... // We return all columns PostgreSQL expects, extracting real type from SQLite + // Key identifiers: pg_attribute a, a.attrelid =, a.attname, pg_get_expr if ((strcasestr(query_no_space, "FROM pg_catalog.pg_attribute a") != nullptr || strcasestr(query_no_space, "FROM pg_attribute a") != nullptr) && - strcasestr(query_no_space, "a.attrelid =") != nullptr) { + strcasestr(query_no_space, "a.attrelid =") != nullptr && + strcasestr(query_no_space, "a.attname") != nullptr && + strcasestr(query_no_space, "pg_get_expr") != nullptr) { matched_describe_pattern = true; // Use table name from session (already escaped in first query) @@ -4499,6 +4506,8 @@ void admin_session_handler(S* sess, void *_pa, PtrSize_t *pkt) { // If we couldn't match table name, return error error = l_strdup("describe mode not initialized - first describe query not executed"); + proxy_error("Error: %s\n", error); + SPA->send_error_msg_to_client(sess, error); run_query = false; goto __run_query; }