Fix for SQLStatistics - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Fix for SQLStatistics |
Date | |
Msg-id | 200105151918.f4FJIAJ21034@candle.pha.pa.us Whole thread Raw |
List | pgsql-patches |
Attached is a small patch to SQLStatistics() to allow proper information about CLUSTER and HASH indexes, as proposed by the ODBC code. Right now the CLUSTER information is not maintained, but the HASH is accurate. Also, I found that the tests for UNIQUE and CLUSTER were done using atoi(). I don't think that works because these queries return 't' or 'f', not 1 or 0. Can someone confirm I have have the t/f and 1/0 stuff correct, and can someone test a HASH index to see that it displays properly? I don't know how to call SQLStatistics. Thanks. -- 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: src/interfaces/odbc/info.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/odbc/info.c,v retrieving revision 1.47 diff -c -r1.47 info.c *** src/interfaces/odbc/info.c 2001/05/14 21:53:16 1.47 --- src/interfaces/odbc/info.c 2001/05/15 19:17:00 *************** *** 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" ! ", i.indisclustered, a.amname, c.relhasrules" ! " from pg_index i, pg_class c, pg_class d, pg_am a" ! " where d.relname = '%s'" ! " and d.oid = i.indrelid" ! " and i.indexrelid = c.oid" ! " and c.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,2295 ---- sprintf(buf, "%s_idx_fake_oid", table_name); set_tuplefield_string(&row->tuple[5], buf); + /* + * Clustered index? I think non-clustered should be type OTHER + * not HASHED + */ set_tuplefield_int2(&row->tuple[6], (Int2) SQL_INDEX_OTHER); set_tuplefield_int2(&row->tuple[7], (Int2) 1); *************** *** 2272,2278 **** { /* If only requesting unique indexs, then just return those. */ if (fUnique == SQL_INDEX_ALL || ! (fUnique == SQL_INDEX_UNIQUE && atoi(isunique))) { i = 0; /* add a row in this table for each field in the index */ --- 2307,2313 ---- { /* If only requesting unique indexs, then just return those. */ if (fUnique == SQL_INDEX_ALL || ! (fUnique == SQL_INDEX_UNIQUE && isunique[0] == 't')) { i = 0; /* add a row in this table for each field in the index */ *************** *** 2289,2295 **** /* non-unique index? */ if (globals.unique_index) ! set_tuplefield_int2(&row->tuple[3], (Int2) (atoi(isunique) ? FALSE : TRUE)); else set_tuplefield_int2(&row->tuple[3], TRUE); --- 2324,2330 ---- /* non-unique index? */ if (globals.unique_index) ! set_tuplefield_int2(&row->tuple[3], (Int2) (isunique[0] == 't' ? FALSE : TRUE)); else set_tuplefield_int2(&row->tuple[3], TRUE); *************** *** 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) --- 2332,2344 ---- set_tuplefield_string(&row->tuple[4], ""); set_tuplefield_string(&row->tuple[5], index_name); ! /* ! * Clustered index? I think non-clustered should be type ! * OTHER not HASHED ! */ ! set_tuplefield_int2(&row->tuple[6], (Int2) ! (isclustered[0] == 't') ? 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-patches by date: