Patch for ODBC Index info - Mailing list pgsql-odbc

From Bruce Momjian
Subject Patch for ODBC Index info
Date
Msg-id 200105161758.f4GHwhN22099@candle.pha.pa.us
Whole thread Raw
Responses Re: Patch for ODBC Index info
List pgsql-odbc
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)

pgsql-odbc by date:

Previous
From: "Rony Khoury"
Date:
Subject: what is with this #deleted thing?
Next
From: Chris Andrews
Date:
Subject: psqlodbc.dll + MSQuery == crash