diff -c psqlodbc.orig\info.c psqlodbc\info.c *** psqlodbc.orig\info.c Mon May 29 20:26:44 2006 --- psqlodbc\info.c Wed Jun 07 18:35:10 2006 *************** *** 1943,1961 **** " inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace", sizeof(columns_query)); if (search_by_ids) ! snprintf(columns_query, sizeof(columns_query), "%s and c.oid = %u", columns_query, reloid); else { if (escTableName) ! snprintf(columns_query, sizeof(columns_query), "%s and c.relname %s '%s'", columns_query, like_or_eq, escTableName); schema_strcat1(columns_query, " and n.nspname %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS, szTableName, cbTableName, conn); } strcat(columns_query, ") inner join pg_catalog.pg_attribute a" " on (not a.attisdropped) and a.attnum > 0"); if (search_by_ids) ! snprintf(columns_query, sizeof(columns_query), "%s and a.attnum = %d", columns_query, attnum); else if (escColumnName) ! snprintf(columns_query, sizeof(columns_query), "%s and a.attname %s '%s'", columns_query, like_or_eq, escColumnName); strcat(columns_query, " and a.attrelid = c.oid) inner join pg_catalog.pg_type t" " on t.oid = a.atttypid) left outer join pg_attrdef d" --- 1943,1962 ---- " inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace", sizeof(columns_query)); if (search_by_ids) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and c.oid = %u", reloid); else { if (escTableName) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and c.relname %s '%s'", like_or_eq, escTableName); schema_strcat1(columns_query, " and n.nspname %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS, szTableName, cbTableName, conn); } strcat(columns_query, ") inner join pg_catalog.pg_attribute a" " on (not a.attisdropped) and a.attnum > 0"); + if (search_by_ids) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and a.attnum = %d", attnum); else if (escColumnName) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and a.attname %s '%s'", like_or_eq, escColumnName); strcat(columns_query, " and a.attrelid = c.oid) inner join pg_catalog.pg_type t" " on t.oid = a.atttypid) left outer join pg_attrdef d" *************** *** 1973,1982 **** " and a.atttypid = t.oid and (a.attnum > 0)", PG_VERSION_LE(conn, 6.2) ? "a.attlen" : "a.atttypmod"); if (escTableName) ! snprintf(columns_query, sizeof(columns_query), "%s and c.relname %s '%s'", columns_query, like_or_eq, escTableName); my_strcat1(columns_query, " and u.usename %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS); if (escColumnName) ! snprintf(columns_query, sizeof(columns_query), "%s and a.attname %s '%s'", columns_query, like_or_eq, escColumnName); strcat(columns_query, " order by c.relname, attnum"); } --- 1974,1983 ---- " and a.atttypid = t.oid and (a.attnum > 0)", PG_VERSION_LE(conn, 6.2) ? "a.attlen" : "a.atttypmod"); if (escTableName) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and c.relname %s '%s'", like_or_eq, escTableName); my_strcat1(columns_query, " and u.usename %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS); if (escColumnName) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and a.attname %s '%s'", like_or_eq, escColumnName); strcat(columns_query, " order by c.relname, attnum"); } *************** *** 2537,2543 **** /* TableName cannot contain a string search pattern */ /* my_strcat(columns_query, " and c.relname = '%.*s'", szTableName, cbTableName); */ if (escTableName) ! snprintf(columns_query, sizeof(columns_query), "%s and c.relname = '%s'", columns_query, escTableName); /* SchemaName cannot contain a string search pattern */ if (conn->schema_support) schema_strcat(columns_query, " and u.nspname = '%.*s'", escSchemaName, SQL_NTS, szTableName, cbTableName, conn); --- 2538,2544 ---- /* TableName cannot contain a string search pattern */ /* my_strcat(columns_query, " and c.relname = '%.*s'", szTableName, cbTableName); */ if (escTableName) ! snprintf(columns_query + strlen(columns_query), sizeof(columns_query), " and c.relname = '%s'", escTableName); /* SchemaName cannot contain a string search pattern */ if (conn->schema_support) schema_strcat(columns_query, " and u.nspname = '%.*s'", escSchemaName, SQL_NTS, szTableName, cbTableName, conn); *************** *** 3217,3222 **** --- 3218,3224 ---- char *escSchemaName = NULL, *escTableName = NULL, *escColumnName = NULL; const char *like_or_eq; char column_query[INFO_INQUIRY_LEN]; + int cq_len; BOOL search_pattern; QResultClass *res; *************** *** 3245,3259 **** " table_name, column_name, grantor, grantee," " privilege_type as PRIVILEGE, is_grantable from" " information_schema.column_privileges where true"); if (escSchemaName) ! snprintf(column_query, sizeof(column_query), ! "%s and table_schem = '%s'", column_query, escSchemaName); if (escTableName) ! snprintf(column_query, sizeof(column_query), ! "%s and table_name = '%s'", column_query, escTableName); if (escColumnName) ! snprintf(column_query, sizeof(column_query), ! "%s and column_name %s '%s'", column_query, like_or_eq, escColumnName); if (res = CC_send_query(conn, column_query, NULL, IGNORE_ABORT_ON_CONN, stmt), !QR_command_maybe_successful(res)) { SC_set_error(stmt, STMT_EXEC_ERROR, "PGAPI_ColumnPrivileges query error", func); --- 3247,3262 ---- " table_name, column_name, grantor, grantee," " privilege_type as PRIVILEGE, is_grantable from" " information_schema.column_privileges where true"); + cq_len = strlen(column_query); if (escSchemaName) ! cq_len += strlen_snprintf(column_query + cq_len, sizeof(column_query), ! " and table_schem = '%s'", escSchemaName); if (escTableName) ! cq_len += strlen_snprintf(column_query + cq_len, sizeof(column_query), ! " and table_name = '%s'", escTableName); if (escColumnName) ! cq_len += strlen_snprintf(column_query + cq_len, sizeof(column_query), ! " and column_name %s '%s'", like_or_eq, escColumnName); if (res = CC_send_query(conn, column_query, NULL, IGNORE_ABORT_ON_CONN, stmt), !QR_command_maybe_successful(res)) { SC_set_error(stmt, STMT_EXEC_ERROR, "PGAPI_ColumnPrivileges query error", func); *************** *** 4570,4576 **** strcat(proc_query, " has_function_privilege(p.oid, 'EXECUTE')"); my_strcat1(proc_query, " and nspname %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS); if (escProcName) ! snprintf(proc_query, sizeof(proc_query), "%s and proname %s '%s'", proc_query, like_or_eq, escProcName); strcat(proc_query, " order by nspname, proname, p.oid, attnum"); } else --- 4573,4579 ---- strcat(proc_query, " has_function_privilege(p.oid, 'EXECUTE')"); my_strcat1(proc_query, " and nspname %s '%.*s'", like_or_eq, escSchemaName, SQL_NTS); if (escProcName) ! snprintf(proc_query + strlen(proc_query), sizeof(proc_query), " and proname %s '%s'", like_or_eq, escProcName); strcat(proc_query, " order by nspname, proname, p.oid, attnum"); } else *************** *** 4580,4586 **** "(not proretset)"); ret_col = 5; if (escProcName) ! snprintf(proc_query, sizeof(proc_query), " and proname %s '%s'", proc_query, like_or_eq, escProcName); strcat(proc_query, " order by proname, proretset"); } if (tres = CC_send_query(conn, proc_query, NULL, IGNORE_ABORT_ON_CONN, stmt), !QR_command_maybe_successful(tres)) --- 4583,4589 ---- "(not proretset)"); ret_col = 5; if (escProcName) ! snprintf(proc_query + strlen(proc_query), sizeof(proc_query), " and proname %s '%s'", like_or_eq, escProcName); strcat(proc_query, " order by proname, proretset"); } if (tres = CC_send_query(conn, proc_query, NULL, IGNORE_ABORT_ON_CONN, stmt), !QR_command_maybe_successful(tres)) *************** *** 5115,5121 **** schema_strcat1(proc_query, " nspname %s '%.*s' and", like_or_eq, escSchemaName, SQL_NTS, szTableName, cbTableName, conn); } if (escTableName) ! snprintf(proc_query, sizeof(proc_query), "%s relname %s '%s' and", proc_query, like_or_eq, escTableName); if (conn->schema_support) { strcat(proc_query, " pg_namespace.oid = relnamespace and relkind in ('r', 'v') and"); --- 5118,5124 ---- schema_strcat1(proc_query, " nspname %s '%.*s' and", like_or_eq, escSchemaName, SQL_NTS, szTableName, cbTableName, conn); } if (escTableName) ! snprintf(proc_query + strlen(proc_query), sizeof(proc_query), " relname %s '%s' and", like_or_eq, escTableName); if (conn->schema_support) { strcat(proc_query, " pg_namespace.oid = relnamespace and relkind in ('r', 'v') and"); diff -c psqlodbc.orig\misc.c psqlodbc\misc.c *** psqlodbc.orig\misc.c Mon May 29 20:26:44 2006 --- psqlodbc\misc.c Wed Jun 07 18:59:15 2006 *************** *** 291,293 **** --- 291,311 ---- } return my_strcat1(buf, fmt, s1, s, len); } + + /* + * strlen_snprintf is a extension to snprintf + * It returns strlen of buf every time (not -1 when truncated) + */ + + int + strlen_snprintf(char *buf, size_t size, const char *format, ...) + { + int len; + va_list arglist; + + va_start(arglist, buf); + if ((len = vsnprintf(buf, size, format, arglist)) < 0) + len = size; + va_end(arglist); + return len; + } diff -c psqlodbc.orig\misc.h psqlodbc\misc.h *** psqlodbc.orig\misc.h Mon May 29 20:26:44 2006 --- psqlodbc\misc.h Wed Jun 07 15:37:52 2006 *************** *** 132,137 **** --- 132,138 ---- char *schema_strcat1(char *buf, const char *fmt, const char *s1, const char *s, int len, const char *, int, ConnectionClass *conn); + int strlen_snprintf(char *buf, size_t size, const char *format, ...); /* #define GET_SCHEMA_NAME(nspname) (stricmp(nspname, "public") ? nspname : "") */ #define GET_SCHEMA_NAME(nspname) (nspname) diff -c psqlodbc.orig\psqlodbc.h psqlodbc\psqlodbc.h *** psqlodbc.orig\psqlodbc.h Mon May 29 20:28:38 2006 --- psqlodbc\psqlodbc.h Wed Jun 07 18:15:47 2006 *************** *** 110,115 **** --- 110,116 ---- #define strnicmp _strnicmp #define stricmp _stricmp #define strdup _strdup + #define vsnprintf _vsnprintf #endif #ifndef SQL_ATTR_APP_ROW_DESC