I have applied the following patch to ODBC index lookups for HASH.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Index: info.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/odbc/info.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -c -r1.47 -r1.48
*** info.c 2001/05/14 21:53:16 1.47
--- info.c 2001/05/16 17:47:27 1.48
***************
*** 2009,2015 ****
char *table_name;
char index_name[MAX_INFO_STRING];
short fields_vector[16];
! char isunique[10];
SDWORD index_name_len,
fields_vector_len;
TupleNode *row;
--- 2009,2017 ----
char *table_name;
char index_name[MAX_INFO_STRING];
short fields_vector[16];
! char isunique[10],
! isclustered[10],
! ishash[MAX_INFO_STRING];
SDWORD index_name_len,
fields_vector_len;
TupleNode *row;
***************
*** 2169,2178 ****
indx_stmt = (StatementClass *) hindx_stmt;
sprintf(index_query, "select c.relname, i.indkey, i.indisunique"
! ", c.relhasrules"
! " from pg_index i, pg_class c, pg_class d"
! " where c.oid = i.indexrelid and d.relname = '%s'"
! " and d.oid = i.indrelid", table_name);
result = SQLExecDirect(hindx_stmt, index_query, strlen(index_query));
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
--- 2171,2183 ----
indx_stmt = (StatementClass *) hindx_stmt;
sprintf(index_query, "select c.relname, i.indkey, i.indisunique"
! ", x.indisclustered, a.amname, i.relhasrules"
! " from pg_index x, pg_class i, pg_class c, pg_am a"
! " where c.relname = '%s'"
! " and c.oid = x.indrelid"
! " and x.indexrelid = i.oid"
! " and i.relam = a.oid"
! , table_name);
result = SQLExecDirect(hindx_stmt, index_query, strlen(index_query));
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
***************
*** 2224,2230 ****
--- 2229,2261 ----
goto SEEYA;
}
+ /* bind the "is clustered" column */
result = SQLBindCol(hindx_stmt, 4, SQL_C_CHAR,
+ isclustered, sizeof(isclustered), NULL);
+ if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
+ {
+ stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column
+ * in SQLStatistics."; */
+ stmt->errornumber = indx_stmt->errornumber;
+ SQLFreeStmt(hindx_stmt, SQL_DROP);
+ goto SEEYA;
+
+ }
+
+ /* bind the "is hash" column */
+ result = SQLBindCol(hindx_stmt, 5, SQL_C_CHAR,
+ ishash, sizeof(ishash), NULL);
+ if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
+ {
+ stmt->errormsg = indx_stmt->errormsg; /* "Couldn't bind column
+ * in SQLStatistics."; */
+ stmt->errornumber = indx_stmt->errornumber;
+ SQLFreeStmt(hindx_stmt, SQL_DROP);
+ goto SEEYA;
+
+ }
+
+ result = SQLBindCol(hindx_stmt, 6, SQL_C_CHAR,
relhasrules, MAX_INFO_STRING, NULL);
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
{
***************
*** 2255,2260 ****
--- 2286,2294 ----
sprintf(buf, "%s_idx_fake_oid", table_name);
set_tuplefield_string(&row->tuple[5], buf);
+ /*
+ * Clustered/HASH index?
+ */
set_tuplefield_int2(&row->tuple[6], (Int2) SQL_INDEX_OTHER);
set_tuplefield_int2(&row->tuple[7], (Int2) 1);
***************
*** 2297,2303 ****
set_tuplefield_string(&row->tuple[4], "");
set_tuplefield_string(&row->tuple[5], index_name);
! set_tuplefield_int2(&row->tuple[6], (Int2) SQL_INDEX_OTHER);
set_tuplefield_int2(&row->tuple[7], (Int2) (i + 1));
if (fields_vector[i] == OID_ATTNUM)
--- 2331,2342 ----
set_tuplefield_string(&row->tuple[4], "");
set_tuplefield_string(&row->tuple[5], index_name);
! /*
! * Clustered/HASH index?
! */
! set_tuplefield_int2(&row->tuple[6], (Int2)
! (atoi(isclustered) ? SQL_INDEX_CLUSTERED :
! (!strncmp(ishash, "hash", 4)) ? SQL_INDEX_HASHED : SQL_INDEX_OTHER);
set_tuplefield_int2(&row->tuple[7], (Int2) (i + 1));
if (fields_vector[i] == OID_ATTNUM)