Commit a8dbe428 authored by Hiroshi Inoue's avatar Hiroshi Inoue

Change SQLPrimaryKeys() so that it detects the primary key

other than tablename_pkey.
parent d8d9ed93
...@@ -59,6 +59,7 @@ SQLBindParameter( ...@@ -59,6 +59,7 @@ SQLBindParameter(
SC_log_error(func, "", NULL); SC_log_error(func, "", NULL);
return SQL_INVALID_HANDLE; return SQL_INVALID_HANDLE;
} }
SC_clear_error(stmt);
if (stmt->parameters_allocated < ipar) if (stmt->parameters_allocated < ipar)
{ {
...@@ -292,6 +293,7 @@ SQLDescribeParam( ...@@ -292,6 +293,7 @@ SQLDescribeParam(
SC_log_error(func, "", NULL); SC_log_error(func, "", NULL);
return SQL_INVALID_HANDLE; return SQL_INVALID_HANDLE;
} }
SC_clear_error(stmt);
if ((ipar < 1) || (ipar > stmt->parameters_allocated)) if ((ipar < 1) || (ipar > stmt->parameters_allocated))
{ {
...@@ -366,6 +368,7 @@ SQLNumParams( ...@@ -366,6 +368,7 @@ SQLNumParams(
SC_log_error(func, "", NULL); SC_log_error(func, "", NULL);
return SQL_INVALID_HANDLE; return SQL_INVALID_HANDLE;
} }
SC_clear_error(stmt);
if (pcpar) if (pcpar)
*pcpar = 0; *pcpar = 0;
......
...@@ -233,7 +233,7 @@ dialog: ...@@ -233,7 +233,7 @@ dialog:
{ {
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
conn->errornumber = CONN_TRUNCATED; conn->errornumber = CONN_TRUNCATED;
conn->errormsg = "The buffer was too small for the result."; conn->errormsg = "The buffer was too small for the ConnStrOut.";
} }
} }
......
...@@ -545,7 +545,7 @@ SQLNativeSql( ...@@ -545,7 +545,7 @@ SQLNativeSql(
{ {
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
conn->errornumber = STMT_TRUNCATED; conn->errornumber = STMT_TRUNCATED;
conn->errormsg = "The buffer was too small for the result."; conn->errormsg = "The buffer was too small for the NativeSQL.";
} }
} }
......
...@@ -677,7 +677,7 @@ SQLGetInfo( ...@@ -677,7 +677,7 @@ SQLGetInfo(
{ {
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
conn->errornumber = STMT_TRUNCATED; conn->errornumber = STMT_TRUNCATED;
conn->errormsg = "The buffer was too small for the result."; conn->errormsg = "The buffer was too small for tthe InfoValue.";
} }
} }
} }
...@@ -2441,6 +2441,7 @@ SQLPrimaryKeys( ...@@ -2441,6 +2441,7 @@ SQLPrimaryKeys(
{ {
static char *func = "SQLPrimaryKeys"; static char *func = "SQLPrimaryKeys";
StatementClass *stmt = (StatementClass *) hstmt; StatementClass *stmt = (StatementClass *) hstmt;
ConnectionClass *conn;
TupleNode *row; TupleNode *row;
RETCODE result; RETCODE result;
int seq = 0; int seq = 0;
...@@ -2451,6 +2452,7 @@ SQLPrimaryKeys( ...@@ -2451,6 +2452,7 @@ SQLPrimaryKeys(
SDWORD attname_len; SDWORD attname_len;
char pktab[MAX_TABLE_LEN + 1]; char pktab[MAX_TABLE_LEN + 1];
Int2 result_cols; Int2 result_cols;
int qno, qstart, qend;
mylog("%s: entering...stmt=%u\n", func, stmt); mylog("%s: entering...stmt=%u\n", func, stmt);
...@@ -2511,37 +2513,6 @@ SQLPrimaryKeys( ...@@ -2511,37 +2513,6 @@ SQLPrimaryKeys(
return SQL_ERROR; return SQL_ERROR;
} }
#if 0
sprintf(tables_query, "select distinct on (attnum) a2.attname, a2.attnum from pg_attribute a1, pg_attribute a2, pg_class c, pg_index i where c.relname = '%s_pkey' AND c.oid = i.indexrelid AND a1.attrelid = c.oid AND a2.attrelid = c.oid AND (i.indkey[0] = a1.attnum OR i.indkey[1] = a1.attnum OR i.indkey[2] = a1.attnum OR i.indkey[3] = a1.attnum OR i.indkey[4] = a1.attnum OR i.indkey[5] = a1.attnum OR i.indkey[6] = a1.attnum OR i.indkey[7] = a1.attnum) order by a2.attnum", pktab);
#else
/*
* Simplified query to remove assumptions about number of possible
* index columns. Courtesy of Tom Lane - thomas 2000-03-21
*/
sprintf(tables_query, "select ta.attname, ia.attnum"
" from pg_attribute ta, pg_attribute ia, pg_class c, pg_index i"
" where c.relname = '%s_pkey'"
" AND c.oid = i.indexrelid"
" AND ia.attrelid = i.indexrelid"
" AND ta.attrelid = i.indrelid"
" AND ta.attnum = i.indkey[ia.attnum-1]"
" order by ia.attnum", pktab);
#endif
mylog("SQLPrimaryKeys: tables_query='%s'\n", tables_query);
result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
{
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR, result = SQLBindCol(htbl_stmt, 1, SQL_C_CHAR,
attname, MAX_INFO_STRING, &attname_len); attname, MAX_INFO_STRING, &attname_len);
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
...@@ -2553,7 +2524,61 @@ SQLPrimaryKeys( ...@@ -2553,7 +2524,61 @@ SQLPrimaryKeys(
return SQL_ERROR; return SQL_ERROR;
} }
result = SQLFetch(htbl_stmt); conn = (ConnectionClass *) (stmt->hdbc);
if (PG_VERSION_LE(conn, 6.4))
qstart = 2;
else
qstart = 1;
qend = 2;
for (qno = qstart; qno <= qend; qno++)
{
switch (qno)
{
case 1:
/*
* Simplified query to remove assumptions about number of possible
* index columns. Courtesy of Tom Lane - thomas 2000-03-21
*/
sprintf(tables_query, "select ta.attname, ia.attnum"
" from pg_attribute ta, pg_attribute ia, pg_class c, pg_index i"
" where c.relname = '%s'"
" AND c.oid = i.indrelid"
" AND i.indisprimary = 't'"
" AND ia.attrelid = i.indexrelid"
" AND ta.attrelid = i.indrelid"
" AND ta.attnum = i.indkey[ia.attnum-1]"
" order by ia.attnum", pktab);
break;
case 2:
/*
* Simplified query to search old fashoned primary key
*/
sprintf(tables_query, "select ta.attname, ia.attnum"
" from pg_attribute ta, pg_attribute ia, pg_class c, pg_index i"
" where c.relname = '%s_pkey'"
" AND c.oid = i.indexrelid"
" AND ia.attrelid = i.indexrelid"
" AND ta.attrelid = i.indrelid"
" AND ta.attnum = i.indkey[ia.attnum-1]"
" order by ia.attnum", pktab);
break;
}
mylog("SQLPrimaryKeys: tables_query='%s'\n", tables_query);
result = SQLExecDirect(htbl_stmt, tables_query, strlen(tables_query));
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
{
stmt->errormsg = SC_create_errormsg(htbl_stmt);
stmt->errornumber = tbl_stmt->errornumber;
SC_log_error(func, "", stmt);
SQLFreeStmt(htbl_stmt, SQL_DROP);
return SQL_ERROR;
}
result = SQLFetch(htbl_stmt);
if (result != SQL_NO_DATA_FOUND)
break;
}
while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO)) while ((result == SQL_SUCCESS) || (result == SQL_SUCCESS_WITH_INFO))
{ {
......
...@@ -309,7 +309,7 @@ SQLDescribeCol( ...@@ -309,7 +309,7 @@ SQLDescribeCol(
{ {
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
stmt->errornumber = STMT_TRUNCATED; stmt->errornumber = STMT_TRUNCATED;
stmt->errormsg = "The buffer was too small for the result."; stmt->errormsg = "The buffer was too small for the colName.";
} }
} }
...@@ -619,7 +619,7 @@ SQLColAttributes( ...@@ -619,7 +619,7 @@ SQLColAttributes(
{ {
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
stmt->errornumber = STMT_TRUNCATED; stmt->errornumber = STMT_TRUNCATED;
stmt->errormsg = "The buffer was too small for the result."; stmt->errormsg = "The buffer was too small for the rgbDesc.";
} }
} }
...@@ -799,7 +799,7 @@ SQLGetData( ...@@ -799,7 +799,7 @@ SQLGetData(
case COPY_RESULT_TRUNCATED: case COPY_RESULT_TRUNCATED:
stmt->errornumber = STMT_TRUNCATED; stmt->errornumber = STMT_TRUNCATED;
stmt->errormsg = "The buffer was too small for the result."; stmt->errormsg = "The buffer was too small for the GetData.";
return SQL_SUCCESS_WITH_INFO; return SQL_SUCCESS_WITH_INFO;
case COPY_GENERAL_ERROR: /* error msg already filled in */ case COPY_GENERAL_ERROR: /* error msg already filled in */
...@@ -1352,7 +1352,7 @@ SQLGetCursorName( ...@@ -1352,7 +1352,7 @@ SQLGetCursorName(
{ {
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
stmt->errornumber = STMT_TRUNCATED; stmt->errornumber = STMT_TRUNCATED;
stmt->errormsg = "The buffer was too small for the result."; stmt->errormsg = "The buffer was too small for the GetCursorName.";
} }
} }
......
...@@ -153,6 +153,7 @@ SQLFreeStmt(HSTMT hstmt, ...@@ -153,6 +153,7 @@ SQLFreeStmt(HSTMT hstmt,
SC_log_error(func, "", NULL); SC_log_error(func, "", NULL);
return SQL_INVALID_HANDLE; return SQL_INVALID_HANDLE;
} }
SC_clear_error(stmt);
if (fOption == SQL_DROP) if (fOption == SQL_DROP)
{ {
...@@ -299,6 +300,7 @@ char ...@@ -299,6 +300,7 @@ char
SC_Destructor(StatementClass *self) SC_Destructor(StatementClass *self)
{ {
mylog("SC_Destructor: self=%u, self->result=%u, self->hdbc=%u\n", self, self->result, self->hdbc); mylog("SC_Destructor: self=%u, self->result=%u, self->hdbc=%u\n", self, self->result, self->hdbc);
SC_clear_error(self);
if (STMT_EXECUTING == self->status) if (STMT_EXECUTING == self->status)
{ {
self->errornumber = STMT_SEQUENCE_ERROR; self->errornumber = STMT_SEQUENCE_ERROR;
...@@ -438,6 +440,7 @@ SC_recycle_statement(StatementClass *self) ...@@ -438,6 +440,7 @@ SC_recycle_statement(StatementClass *self)
mylog("recycle statement: self= %u\n", self); mylog("recycle statement: self= %u\n", self);
SC_clear_error(self);
/* This would not happen */ /* This would not happen */
if (self->status == STMT_EXECUTING) if (self->status == STMT_EXECUTING)
{ {
...@@ -446,10 +449,6 @@ SC_recycle_statement(StatementClass *self) ...@@ -446,10 +449,6 @@ SC_recycle_statement(StatementClass *self)
return FALSE; return FALSE;
} }
self->errormsg = NULL;
self->errornumber = 0;
self->errormsg_created = FALSE;
switch (self->status) switch (self->status)
{ {
case STMT_ALLOCATED: case STMT_ALLOCATED:
...@@ -836,7 +835,10 @@ SC_fetch(StatementClass *self) ...@@ -836,7 +835,10 @@ SC_fetch(StatementClass *self)
case COPY_RESULT_TRUNCATED: case COPY_RESULT_TRUNCATED:
self->errornumber = STMT_TRUNCATED; self->errornumber = STMT_TRUNCATED;
self->errormsg = "The buffer was too small for the result."; self->errormsg = "Fetched item was truncated.";
qlog("The %dth item was truncated\n", lf + 1);
qlog("The buffer size = %d", self->bindings[lf].buflen);
qlog(" and the value is '%s'\n", value);
result = SQL_SUCCESS_WITH_INFO; result = SQL_SUCCESS_WITH_INFO;
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment