mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-29 22:49:41 +03:00 
			
		
		
		
	1) Fix SQLProcedures().
2) Handle timestamp without time zone. 3) Improve SQLForeignKeys() in multibyte mode.
This commit is contained in:
		| @@ -384,7 +384,7 @@ CC_begin(ConnectionClass *self) | |||||||
|  |  | ||||||
| 		if (res != NULL) | 		if (res != NULL) | ||||||
| 		{ | 		{ | ||||||
| 			ret = QR_command_successful(res); | 			ret = QR_command_maybe_successful(res); | ||||||
| 			QR_Destructor(res); | 			QR_Destructor(res); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| @@ -408,7 +408,7 @@ CC_commit(ConnectionClass *self) | |||||||
| 		mylog("CC_commit:  sending COMMIT!\n"); | 		mylog("CC_commit:  sending COMMIT!\n"); | ||||||
| 		if (res != NULL) | 		if (res != NULL) | ||||||
| 		{ | 		{ | ||||||
| 			ret = QR_command_successful(res); | 			ret = QR_command_maybe_successful(res); | ||||||
| 			QR_Destructor(res); | 			QR_Destructor(res); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
|   | |||||||
| @@ -169,6 +169,7 @@ timestamp2stime(const char *str, SIMPLE_TIME *st, BOOL *bZone, int *zone) | |||||||
| 	*bZone = FALSE; | 	*bZone = FALSE; | ||||||
| 	*zone = 0; | 	*zone = 0; | ||||||
| 	st->fr = 0; | 	st->fr = 0; | ||||||
|  | 	st->infinity = 0; | ||||||
| 	if ((scnt = sscanf(str, "%4d-%2d-%2d %2d:%2d:%2d%s", &st->y, &st->m, &st->d, &st->hh, &st->mm, &st->ss, rest)) < 6) | 	if ((scnt = sscanf(str, "%4d-%2d-%2d %2d:%2d:%2d%s", &st->y, &st->m, &st->d, &st->hh, &st->mm, &st->ss, rest)) < 6) | ||||||
| 		return FALSE; | 		return FALSE; | ||||||
| 	else if (scnt == 6) | 	else if (scnt == 6) | ||||||
| @@ -455,6 +456,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 | |||||||
|  |  | ||||||
| 		case PG_TYPE_ABSTIME: | 		case PG_TYPE_ABSTIME: | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| 			st.fr = 0; | 			st.fr = 0; | ||||||
| 			st.infinity = 0; | 			st.infinity = 0; | ||||||
| @@ -464,9 +466,9 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 | |||||||
| 				st.m = 12; | 				st.m = 12; | ||||||
| 				st.d = 31; | 				st.d = 31; | ||||||
| 				st.y = 9999; | 				st.y = 9999; | ||||||
| 				st.hh = 24; | 				st.hh = 23; | ||||||
| 				st.mm = 0; | 				st.mm = 59; | ||||||
| 				st.ss = 0; | 				st.ss = 59; | ||||||
| 			} | 			} | ||||||
| 			if (strnicmp(value, "-infinity", 9) == 0) | 			if (strnicmp(value, "-infinity", 9) == 0) | ||||||
| 			{ | 			{ | ||||||
| @@ -641,6 +643,7 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 | |||||||
|  |  | ||||||
| 			case PG_TYPE_ABSTIME: | 			case PG_TYPE_ABSTIME: | ||||||
| 			case PG_TYPE_DATETIME: | 			case PG_TYPE_DATETIME: | ||||||
|  | 			case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 			case PG_TYPE_TIMESTAMP: | 			case PG_TYPE_TIMESTAMP: | ||||||
| 				len = 19; | 				len = 19; | ||||||
| 				if (cbValueMax > len) | 				if (cbValueMax > len) | ||||||
| @@ -1810,7 +1813,7 @@ copy_statement_with_parameters(StatementClass *stmt) | |||||||
| 					st.ss = tss->second; | 					st.ss = tss->second; | ||||||
| 					st.fr = tss->fraction; | 					st.fr = tss->fraction; | ||||||
|  |  | ||||||
| 					mylog("m=%d,d=%d,y=%d,hh=%d,mm=%d,ss=%d\n", st.m, st.d, st.y, st.hh, st.mm, st.ss); | 					mylog("m=%d,d=%d,y=%d,hh=%d,mm=%d,ss=%d,fr=%d\n", st.m, st.d, st.y, st.hh, st.mm, st.ss, st.fr); | ||||||
|  |  | ||||||
| 					break; | 					break; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -553,7 +553,7 @@ PGAPI_Transact( | |||||||
| 			return SQL_ERROR; | 			return SQL_ERROR; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		ok = QR_command_successful(res); | 		ok = QR_command_maybe_successful(res); | ||||||
| 		QR_Destructor(res); | 		QR_Destructor(res); | ||||||
|  |  | ||||||
| 		if (!ok) | 		if (!ok) | ||||||
|   | |||||||
| @@ -2966,6 +2966,7 @@ isMultibyte(const unsigned char *str) | |||||||
| 	} | 	} | ||||||
| 	return FALSE; | 	return FALSE; | ||||||
| } | } | ||||||
|  | #ifdef NOT_USED | ||||||
| static char * | static char * | ||||||
| getClientTableName(ConnectionClass *conn, const char *serverSchemaName, char *serverTableName, BOOL *nameAlloced) | getClientTableName(ConnectionClass *conn, const char *serverSchemaName, char *serverTableName, BOOL *nameAlloced) | ||||||
| { | { | ||||||
| @@ -3106,6 +3107,73 @@ getClientColumnName(ConnectionClass *conn, const char * serverSchemaName, const | |||||||
| 	} | 	} | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  | #endif /* NOT_USED */ | ||||||
|  | static char * | ||||||
|  | getClientColumnName(ConnectionClass *conn, UInt4 relid, char *serverColumnName, BOOL *nameAlloced) | ||||||
|  | { | ||||||
|  | 	char		query[1024], saveattnum[16], | ||||||
|  | 			   *ret = serverColumnName; | ||||||
|  | 	BOOL		continueExec = TRUE, | ||||||
|  | 				bError = FALSE; | ||||||
|  | 	QResultClass *res; | ||||||
|  |  | ||||||
|  | 	*nameAlloced = FALSE; | ||||||
|  | 	if (!conn->client_encoding || !isMultibyte(serverColumnName)) | ||||||
|  | 		return ret; | ||||||
|  | 	if (!conn->server_encoding) | ||||||
|  | 	{ | ||||||
|  | 		if (res = CC_send_query(conn, "select getdatabaseencoding()", NULL, CLEAR_RESULT_ON_ABORT), res) | ||||||
|  | 		{ | ||||||
|  | 			if (QR_get_num_tuples(res) > 0) | ||||||
|  | 				conn->server_encoding = strdup(QR_get_value_backend_row(res, 0, 0)); | ||||||
|  | 			QR_Destructor(res); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if (!conn->server_encoding) | ||||||
|  | 		return ret; | ||||||
|  | 	sprintf(query, "SET CLIENT_ENCODING TO '%s'", conn->server_encoding); | ||||||
|  | 	bError = (CC_send_query(conn, query, NULL, CLEAR_RESULT_ON_ABORT) == NULL); | ||||||
|  | 	if (!bError && continueExec) | ||||||
|  | 	{ | ||||||
|  | 		sprintf(query, "select attnum from pg_attribute " | ||||||
|  | 			"where attrelid = %u and attname = '%s'", | ||||||
|  | 			relid, serverColumnName); | ||||||
|  | 		if (res = CC_send_query(conn, query, NULL, CLEAR_RESULT_ON_ABORT), res) | ||||||
|  | 		{ | ||||||
|  | 			if (QR_get_num_tuples(res) > 0) | ||||||
|  | 			{ | ||||||
|  | 				strcpy(saveattnum, QR_get_value_backend_row(res, 0, 0)); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 				continueExec = FALSE; | ||||||
|  | 			QR_Destructor(res); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			bError = TRUE; | ||||||
|  | 	} | ||||||
|  | 	continueExec = (continueExec && !bError); | ||||||
|  | 	if (bError && CC_is_in_trans(conn)) | ||||||
|  | 	{ | ||||||
|  | 		CC_abort(conn); | ||||||
|  | 		bError = FALSE; | ||||||
|  | 	} | ||||||
|  | 	/* restore the cleint encoding */ | ||||||
|  | 	sprintf(query, "SET CLIENT_ENCODING TO '%s'", conn->client_encoding); | ||||||
|  | 	bError = (CC_send_query(conn, query, NULL, CLEAR_RESULT_ON_ABORT) == NULL); | ||||||
|  | 	if (bError || !continueExec) | ||||||
|  | 		return ret; | ||||||
|  | 	sprintf(query, "select attname from pg_attribute where attrelid = %u and attnum = %s", relid, saveattnum); | ||||||
|  | 	if (res = CC_send_query(conn, query, NULL, CLEAR_RESULT_ON_ABORT), res) | ||||||
|  | 	{ | ||||||
|  | 		if (QR_get_num_tuples(res) > 0) | ||||||
|  | 		{ | ||||||
|  | 			ret = strdup(QR_get_value_backend_row(res, 0, 0)); | ||||||
|  | 			*nameAlloced = TRUE; | ||||||
|  | 		} | ||||||
|  | 		QR_Destructor(res); | ||||||
|  | 	} | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
|  |  | ||||||
| RETCODE		SQL_API | RETCODE		SQL_API | ||||||
| @@ -3140,23 +3208,20 @@ PGAPI_ForeignKeys( | |||||||
| 	char		upd_rule[MAX_TABLE_LEN], | 	char		upd_rule[MAX_TABLE_LEN], | ||||||
| 				del_rule[MAX_TABLE_LEN]; | 				del_rule[MAX_TABLE_LEN]; | ||||||
| 	char		pk_table_needed[MAX_TABLE_LEN + 1]; | 	char		pk_table_needed[MAX_TABLE_LEN + 1]; | ||||||
|  | char		fk_table_fetched[MAX_TABLE_LEN + 1]; | ||||||
| 	char		fk_table_needed[MAX_TABLE_LEN + 1]; | 	char		fk_table_needed[MAX_TABLE_LEN + 1]; | ||||||
| 	char		schema_needed[MAX_TABLE_LEN + 1]; | char		pk_table_fetched[MAX_TABLE_LEN + 1]; | ||||||
|  | 	char		schema_needed[MAX_SCHEMA_LEN + 1]; | ||||||
|  | char		schema_fetched[MAX_SCHEMA_LEN + 1]; | ||||||
| 	char	   *pkey_ptr, | 	char	   *pkey_ptr, | ||||||
| 			   *pkey_text, | 			   *pkey_text, | ||||||
| 			   *fkey_ptr, | 			   *fkey_ptr, | ||||||
| 			   *fkey_text, | 			   *fkey_text; | ||||||
| 			   *pk_table, |  | ||||||
| 			   *pkt_text, |  | ||||||
| 			   *fk_table, |  | ||||||
| 			   *fkt_text; |  | ||||||
|  |  | ||||||
| 	ConnectionClass *conn; | 	ConnectionClass *conn; | ||||||
| #ifdef	MULTIBYTE | #ifdef	MULTIBYTE | ||||||
| 	BOOL		pkey_alloced, | 	BOOL		pkey_alloced, | ||||||
| 				fkey_alloced, | 				fkey_alloced; | ||||||
| 				pkt_alloced, |  | ||||||
| 				fkt_alloced; |  | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
| 	int			i, | 	int			i, | ||||||
| 				j, | 				j, | ||||||
| @@ -3171,6 +3236,7 @@ PGAPI_ForeignKeys( | |||||||
| #endif | #endif | ||||||
| 	char		pkey[MAX_INFO_STRING]; | 	char		pkey[MAX_INFO_STRING]; | ||||||
| 	Int2		result_cols; | 	Int2		result_cols; | ||||||
|  | 	UInt4		relid1, relid2; | ||||||
|  |  | ||||||
| 	mylog("%s: entering...stmt=%u\n", func, stmt); | 	mylog("%s: entering...stmt=%u\n", func, stmt); | ||||||
|  |  | ||||||
| @@ -3251,14 +3317,15 @@ PGAPI_ForeignKeys( | |||||||
| 	pk_table_needed[0] = '\0'; | 	pk_table_needed[0] = '\0'; | ||||||
| 	fk_table_needed[0] = '\0'; | 	fk_table_needed[0] = '\0'; | ||||||
| 	schema_needed[0] = '\0'; | 	schema_needed[0] = '\0'; | ||||||
|  | 	schema_fetched[0] = '\0'; | ||||||
|  |  | ||||||
| 	make_string(szPkTableName, cbPkTableName, pk_table_needed); | 	make_string(szPkTableName, cbPkTableName, pk_table_needed); | ||||||
| 	make_string(szFkTableName, cbFkTableName, fk_table_needed); | 	make_string(szFkTableName, cbFkTableName, fk_table_needed); | ||||||
|  |  | ||||||
| 	conn = SC_get_conn(stmt); | 	conn = SC_get_conn(stmt); | ||||||
| #ifdef	MULTIBYTE | #ifdef	MULTIBYTE | ||||||
| 	pkey_text = fkey_text = pkt_text = fkt_text = NULL; | 	pkey_text = fkey_text = NULL; | ||||||
| 	pkey_alloced = fkey_alloced = pkt_alloced = fkt_alloced = FALSE; | 	pkey_alloced = fkey_alloced = FALSE; | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| @@ -3275,31 +3342,39 @@ PGAPI_ForeignKeys( | |||||||
| 				"		pt.tgnargs, " | 				"		pt.tgnargs, " | ||||||
| 				"		pt.tgdeferrable, " | 				"		pt.tgdeferrable, " | ||||||
| 				"		pt.tginitdeferred, " | 				"		pt.tginitdeferred, " | ||||||
| 				"		pg_proc.proname, " | 				"		pp1.proname, " | ||||||
| 				"		pg_proc_1.proname " | 				"		pp2.proname, " | ||||||
|  | 				"		pc.oid, " | ||||||
|  | 				"		pc1.oid, " | ||||||
|  | 				"		pc1.relname, " | ||||||
|  | 				"		pn.nspname " | ||||||
| 				"FROM	pg_class pc, " | 				"FROM	pg_class pc, " | ||||||
| 				"		pg_proc pg_proc, " | 				"		pg_proc pp1, " | ||||||
| 				"		pg_proc pg_proc_1, " | 				"		pg_proc pp2, " | ||||||
| 				"		pg_trigger pg_trigger, " | 				"		pg_trigger pt1, " | ||||||
| 				"		pg_trigger pg_trigger_1, " | 				"		pg_trigger pt2, " | ||||||
| 				"		pg_proc pp, " | 				"		pg_proc pp, " | ||||||
| 				"		pg_trigger pt " | 				"		pg_trigger pt, " | ||||||
|  | 				"		pg_class pc1, " | ||||||
|  | 				"		pg_namespace pn " | ||||||
| 				"WHERE	pt.tgrelid = pc.oid " | 				"WHERE	pt.tgrelid = pc.oid " | ||||||
| 				"AND pp.oid = pt.tgfoid " | 				"AND pp.oid = pt.tgfoid " | ||||||
| 				"AND pg_trigger.tgconstrrelid = pc.oid " | 				"AND pt1.tgconstrrelid = pc.oid " | ||||||
| 				"AND pg_proc.oid = pg_trigger.tgfoid " | 				"AND pp1.oid = pt1.tgfoid " | ||||||
| 				"AND pg_trigger_1.tgfoid = pg_proc_1.oid " | 				"AND pt2.tgfoid = pp2.oid " | ||||||
| 				"AND pg_trigger_1.tgconstrrelid = pc.oid " | 				"AND pt2.tgconstrrelid = pc.oid " | ||||||
| 				"AND ((pc.relname='%s') " | 				"AND ((pc.relname='%s') " | ||||||
| 				"AND (pg_namespace.oid = pc.relnamespace) " | 				"AND (pg_namespace.oid = pc.relnamespace) " | ||||||
| 				"AND (pg_namespace.nspname = '%s') " | 				"AND (pg_namespace.nspname = '%s') " | ||||||
| 				"AND (pp.proname LIKE '%%ins') " | 				"AND (pp.proname LIKE '%%ins') " | ||||||
| 				"AND (pg_proc.proname LIKE '%%upd') " | 				"AND (pp1.proname LIKE '%%upd') " | ||||||
| 				"AND (pg_proc_1.proname LIKE '%%del') " | 				"AND (pp2.proname LIKE '%%del') " | ||||||
| 				"AND (pg_trigger.tgrelid=pt.tgconstrrelid) " | 				"AND (pt1.tgrelid=pt.tgconstrrelid) " | ||||||
| 				"AND (pg_trigger.tgconstrname=pt.tgconstrname) " | 				"AND (pt1.tgconstrname=pt.tgconstrname) " | ||||||
| 				"AND (pg_trigger_1.tgrelid=pt.tgconstrrelid) " | 				"AND (pt2.tgrelid=pt.tgconstrrelid) " | ||||||
| 				"AND (pg_trigger_1.tgconstrname=pt.tgconstrname))", | 				"AND (pt2.tgconstrname=pt.tgconstrname) " | ||||||
|  | 				"AND (pt.tgconstrrelid=pc1.oid) " | ||||||
|  | 				"AND (pc1.relnamespace=pn.oid))", | ||||||
| 				fk_table_needed, schema_needed); | 				fk_table_needed, schema_needed); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| @@ -3307,29 +3382,34 @@ PGAPI_ForeignKeys( | |||||||
| 				"		pt.tgnargs, " | 				"		pt.tgnargs, " | ||||||
| 				"		pt.tgdeferrable, " | 				"		pt.tgdeferrable, " | ||||||
| 				"		pt.tginitdeferred, " | 				"		pt.tginitdeferred, " | ||||||
| 				"		pg_proc.proname, " | 				"		pp1.proname, " | ||||||
| 				"		pg_proc_1.proname " | 				"		pp2.proname, " | ||||||
|  | 				"		pc.oid, " | ||||||
|  | 				"		pc1.oid, " | ||||||
|  | 				"		pc1.relname " | ||||||
| 				"FROM	pg_class pc, " | 				"FROM	pg_class pc, " | ||||||
| 				"		pg_proc pg_proc, " | 				"		pg_proc pp1, " | ||||||
| 				"		pg_proc pg_proc_1, " | 				"		pg_proc pp2, " | ||||||
| 				"		pg_trigger pg_trigger, " | 				"		pg_trigger pt1, " | ||||||
| 				"		pg_trigger pg_trigger_1, " | 				"		pg_trigger pt2, " | ||||||
| 				"		pg_proc pp, " | 				"		pg_proc pp, " | ||||||
| 				"		pg_trigger pt " | 				"		pg_trigger pt, " | ||||||
|  | 				"		pg_class pc1 " | ||||||
| 				"WHERE	pt.tgrelid = pc.oid " | 				"WHERE	pt.tgrelid = pc.oid " | ||||||
| 				"AND pp.oid = pt.tgfoid " | 				"AND pp.oid = pt.tgfoid " | ||||||
| 				"AND pg_trigger.tgconstrrelid = pc.oid " | 				"AND pt1.tgconstrrelid = pc.oid " | ||||||
| 				"AND pg_proc.oid = pg_trigger.tgfoid " | 				"AND pp1.oid = pt1.tgfoid " | ||||||
| 				"AND pg_trigger_1.tgfoid = pg_proc_1.oid " | 				"AND pt2.tgfoid = pp2.oid " | ||||||
| 				"AND pg_trigger_1.tgconstrrelid = pc.oid " | 				"AND pt2.tgconstrrelid = pc.oid " | ||||||
| 				"AND ((pc.relname='%s') " | 				"AND ((pc.relname='%s') " | ||||||
| 				"AND (pp.proname LIKE '%%ins') " | 				"AND (pp.proname LIKE '%%ins') " | ||||||
| 				"AND (pg_proc.proname LIKE '%%upd') " | 				"AND (pp1.proname LIKE '%%upd') " | ||||||
| 				"AND (pg_proc_1.proname LIKE '%%del') " | 				"AND (pp2.proname LIKE '%%del') " | ||||||
| 				"AND (pg_trigger.tgrelid=pt.tgconstrrelid) " | 				"AND (pt1.tgrelid=pt.tgconstrrelid) " | ||||||
| 				"AND (pg_trigger.tgconstrname=pt.tgconstrname) " | 				"AND (pt1.tgconstrname=pt.tgconstrname) " | ||||||
| 				"AND (pg_trigger_1.tgrelid=pt.tgconstrrelid) " | 				"AND (pt2.tgrelid=pt.tgconstrrelid) " | ||||||
| 				"AND (pg_trigger_1.tgconstrname=pt.tgconstrname))", | 				"AND (pt2.tgconstrname=pt.tgconstrname) " | ||||||
|  | 				"AND (pt.tgconstrrelid=pc1.oid)) ", | ||||||
| 				fk_table_needed); | 				fk_table_needed); | ||||||
|  |  | ||||||
| 		result = PGAPI_ExecDirect(htbl_stmt, tables_query, strlen(tables_query)); | 		result = PGAPI_ExecDirect(htbl_stmt, tables_query, strlen(tables_query)); | ||||||
| @@ -3409,6 +3489,51 @@ PGAPI_ForeignKeys( | |||||||
| 			return SQL_ERROR; | 			return SQL_ERROR; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 7, SQL_C_ULONG, | ||||||
|  | 							   &relid1, sizeof(relid1), NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 8, SQL_C_ULONG, | ||||||
|  | 							   &relid2, sizeof(relid2), NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 9, SQL_C_CHAR, | ||||||
|  | 					pk_table_fetched, MAX_TABLE_LEN, NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | if (conn->schema_support) | ||||||
|  | { | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 10, SQL_C_CHAR, | ||||||
|  | 					schema_fetched, MAX_SCHEMA_LEN, NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  | } | ||||||
|  |  | ||||||
| 		result = PGAPI_Fetch(htbl_stmt); | 		result = PGAPI_Fetch(htbl_stmt); | ||||||
| 		if (result == SQL_NO_DATA_FOUND) | 		if (result == SQL_NO_DATA_FOUND) | ||||||
| 			return SQL_SUCCESS; | 			return SQL_SUCCESS; | ||||||
| @@ -3449,30 +3574,18 @@ PGAPI_ForeignKeys( | |||||||
|  |  | ||||||
| 			mylog("Foreign Key Case#2: trig_nargs = %d, num_keys = %d\n", trig_nargs, num_keys); | 			mylog("Foreign Key Case#2: trig_nargs = %d, num_keys = %d\n", trig_nargs, num_keys); | ||||||
|  |  | ||||||
| 			pk_table = trig_args; |  | ||||||
|  |  | ||||||
| 			/* Get to the PK Table Name */ |  | ||||||
| 			for (k = 0; k < 2; k++) |  | ||||||
| 				pk_table += strlen(pk_table) + 1; |  | ||||||
|  |  | ||||||
| #ifdef	MULTIBYTE |  | ||||||
| 			fk_table = trig_args + strlen(trig_args) + 1; |  | ||||||
| 			pkt_text = getClientTableName(conn, schema_needed, pk_table, &pkt_alloced); |  | ||||||
| #else |  | ||||||
| 			pkt_text = pk_table; |  | ||||||
| #endif   /* MULTIBYTE */ |  | ||||||
| 			/* If there is a pk table specified, then check it. */ | 			/* If there is a pk table specified, then check it. */ | ||||||
| 			if (pk_table_needed[0] != '\0') | 			if (pk_table_needed[0] != '\0') | ||||||
| 			{ | 			{ | ||||||
| 				/* If it doesn't match, then continue */ | 				/* If it doesn't match, then continue */ | ||||||
| 				if (strcmp(pkt_text, pk_table_needed)) | 				if (strcmp(pk_table_fetched, pk_table_needed)) | ||||||
| 				{ | 				{ | ||||||
| 					result = PGAPI_Fetch(htbl_stmt); | 					result = PGAPI_Fetch(htbl_stmt); | ||||||
| 					continue; | 					continue; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			keyresult = PGAPI_PrimaryKeys(hpkey_stmt, NULL, 0, schema_needed, SQL_NTS, pkt_text, SQL_NTS); | 			keyresult = PGAPI_PrimaryKeys(hpkey_stmt, NULL, 0, schema_fetched, SQL_NTS, pk_table_fetched, SQL_NTS); | ||||||
| 			if (keyresult != SQL_SUCCESS) | 			if (keyresult != SQL_SUCCESS) | ||||||
| 			{ | 			{ | ||||||
| 				stmt->errornumber = STMT_NO_MEMORY_ERROR; | 				stmt->errornumber = STMT_NO_MEMORY_ERROR; | ||||||
| @@ -3498,7 +3611,7 @@ PGAPI_ForeignKeys( | |||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| #ifdef	MULTIBYTE | #ifdef	MULTIBYTE | ||||||
| 				pkey_text = getClientColumnName(conn, schema_needed, pk_table, pkey_ptr, &pkey_alloced); | 				pkey_text = getClientColumnName(conn, relid2, pkey_ptr, &pkey_alloced); | ||||||
| #else | #else | ||||||
| 				pkey_text = pkey_ptr; | 				pkey_text = pkey_ptr; | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
| @@ -3566,16 +3679,16 @@ PGAPI_ForeignKeys( | |||||||
| 				row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) *sizeof(TupleField)); | 				row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) *sizeof(TupleField)); | ||||||
|  |  | ||||||
| #ifdef	MULTIBYTE | #ifdef	MULTIBYTE | ||||||
| 				pkey_text = getClientColumnName(conn, schema_needed, pk_table, pkey_ptr, &pkey_alloced); | 				pkey_text = getClientColumnName(conn, relid2, pkey_ptr, &pkey_alloced); | ||||||
| 				fkey_text = getClientColumnName(conn, schema_needed, fk_table, fkey_ptr, &fkey_alloced); | 				fkey_text = getClientColumnName(conn, relid1, fkey_ptr, &fkey_alloced); | ||||||
| #else | #else | ||||||
| 				pkey_text = pkey_ptr; | 				pkey_text = pkey_ptr; | ||||||
| 				fkey_text = fkey_ptr; | 				fkey_text = fkey_ptr; | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
| 				mylog("%s: pk_table = '%s', pkey_ptr = '%s'\n", func, pkt_text, pkey_text); | 				mylog("%s: pk_table = '%s', pkey_ptr = '%s'\n", func, pk_table_fetched, pkey_text); | ||||||
| 				set_tuplefield_null(&row->tuple[0]); | 				set_tuplefield_null(&row->tuple[0]); | ||||||
| 				set_tuplefield_string(&row->tuple[1], GET_SCHEMA_NAME(schema_needed)); | 				set_tuplefield_string(&row->tuple[1], GET_SCHEMA_NAME(schema_fetched)); | ||||||
| 				set_tuplefield_string(&row->tuple[2], pkt_text); | 				set_tuplefield_string(&row->tuple[2], pk_table_fetched); | ||||||
| 				set_tuplefield_string(&row->tuple[3], pkey_text); | 				set_tuplefield_string(&row->tuple[3], pkey_text); | ||||||
|  |  | ||||||
| 				mylog("%s: fk_table_needed = '%s', fkey_ptr = '%s'\n", func, fk_table_needed, fkey_text); | 				mylog("%s: fk_table_needed = '%s', fkey_ptr = '%s'\n", func, fk_table_needed, fkey_text); | ||||||
| @@ -3611,11 +3724,6 @@ PGAPI_ForeignKeys( | |||||||
| 					pkey_ptr += strlen(pkey_ptr) + 1; | 					pkey_ptr += strlen(pkey_ptr) + 1; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| #ifdef	MULTIBYTE |  | ||||||
| 			if (pkt_alloced) |  | ||||||
| 				free(pkt_text); |  | ||||||
| 			pkt_alloced = FALSE; |  | ||||||
| #endif   /* MULTIBYTE */ |  | ||||||
|  |  | ||||||
| 			result = PGAPI_Fetch(htbl_stmt); | 			result = PGAPI_Fetch(htbl_stmt); | ||||||
| 		} | 		} | ||||||
| @@ -3632,66 +3740,75 @@ PGAPI_ForeignKeys( | |||||||
| 		if (conn->schema_support) | 		if (conn->schema_support) | ||||||
| 		{ | 		{ | ||||||
| 			schema_strcat(schema_needed, "%.*s", szPkTableOwner, cbPkTableOwner, szPkTableName, cbPkTableName); 	 | 			schema_strcat(schema_needed, "%.*s", szPkTableOwner, cbPkTableOwner, szPkTableName, cbPkTableName); 	 | ||||||
| 			sprintf(tables_query, "SELECT	pg_trigger.tgargs, " | 			sprintf(tables_query, "SELECT	pt.tgargs, " | ||||||
| 				"		pg_trigger.tgnargs, " | 				"		pt.tgnargs, " | ||||||
| 				"		pg_trigger.tgdeferrable, " | 				"		pt.tgdeferrable, " | ||||||
| 				"		pg_trigger.tginitdeferred, " | 				"		pt.tginitdeferred, " | ||||||
| 				"		pg_proc.proname, " | 				"		pp.proname, " | ||||||
| 				"		pg_proc_1.proname " | 				"		pp1.proname, " | ||||||
| 				"FROM	pg_class pg_class, " | 				"		pc.oid, " | ||||||
| 				"		pg_class pg_class_1, " | 				"		pc1.oid, " | ||||||
| 				"		pg_class pg_class_2, " | 				"		pc1.relname, " | ||||||
| 				"		pg_proc pg_proc, " | 				"		pn.nspname " | ||||||
| 				"		pg_proc pg_proc_1, " | 				"FROM	pg_class pc, " | ||||||
| 				"		pg_trigger pg_trigger, " | 				"		pg_class pc1, " | ||||||
| 				"		pg_trigger pg_trigger_1, " | 				"		pg_class pc2, " | ||||||
| 				"		pg_trigger pg_trigger_2 " | 				"		pg_proc pp, " | ||||||
| 				"WHERE	pg_trigger.tgconstrrelid = pg_class.oid " | 				"		pg_proc pp1, " | ||||||
| 				"	AND pg_trigger.tgrelid = pg_class_1.oid " | 				"		pg_trigger pt, " | ||||||
| 				"	AND pg_trigger_1.tgfoid = pg_proc_1.oid " | 				"		pg_trigger pt1, " | ||||||
| 				"	AND pg_trigger_1.tgconstrrelid = pg_class_1.oid " | 				"		pg_trigger pt2, " | ||||||
| 				"	AND pg_trigger_2.tgconstrrelid = pg_class_2.oid " | 				"		pg_namespace pn " | ||||||
| 				"	AND pg_trigger_2.tgfoid = pg_proc.oid " | 				"WHERE	pt.tgconstrrelid = pc.oid " | ||||||
| 				"	AND pg_class_2.oid = pg_trigger.tgrelid " | 				"	AND pt.tgrelid = pc1.oid " | ||||||
|  | 				"	AND pt1.tgfoid = pp1.oid " | ||||||
|  | 				"	AND pt1.tgconstrrelid = pc1.oid " | ||||||
|  | 				"	AND pt2.tgconstrrelid = pc2.oid " | ||||||
|  | 				"	AND pt2.tgfoid = pp.oid " | ||||||
|  | 				"	AND pc2.oid = pt.tgrelid " | ||||||
| 				"	AND (" | 				"	AND (" | ||||||
| 				"		 (pg_class.relname='%s') " | 				"		 (pc.relname='%s') " | ||||||
| 				"	AND  (pg_namespace.oid = pg_class.relnamespace) " | 				"	AND  (pg_namespace.oid = pc.relnamespace) " | ||||||
| 				"	AND  (pg_namespace.nspname = '%s') " | 				"	AND  (pg_namespace.nspname = '%s') " | ||||||
| 				"	AND  (pg_proc.proname Like '%%upd') " | 				"	AND  (pp.proname Like '%%upd') " | ||||||
| 				"	AND  (pg_proc_1.proname Like '%%del')" | 				"	AND  (pp1.proname Like '%%del')" | ||||||
| 				"	AND	 (pg_trigger_1.tgrelid = pg_trigger.tgconstrrelid) " | 				"	AND	 (pt1.tgrelid = pt.tgconstrrelid) " | ||||||
| 				"	AND	 (pg_trigger_2.tgrelid = pg_trigger.tgconstrrelid) " | 				"	AND	 (pt2.tgrelid = pt.tgconstrrelid) " | ||||||
|  | 				"	AND (pn.oid = pc1.relnamespace) " | ||||||
| 				"		)", | 				"		)", | ||||||
| 				pk_table_needed, schema_needed); | 				pk_table_needed, schema_needed); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 			sprintf(tables_query, "SELECT	pg_trigger.tgargs, " | 			sprintf(tables_query, "SELECT	pt.tgargs, " | ||||||
| 				"		pg_trigger.tgnargs, " | 				"		pt.tgnargs, " | ||||||
| 				"		pg_trigger.tgdeferrable, " | 				"		pt.tgdeferrable, " | ||||||
| 				"		pg_trigger.tginitdeferred, " | 				"		pt.tginitdeferred, " | ||||||
| 				"		pg_proc.proname, " | 				"		pp.proname, " | ||||||
| 				"		pg_proc_1.proname " | 				"		pp1.proname, " | ||||||
| 				"FROM	pg_class pg_class, " | 				"		pc.oid, " | ||||||
| 				"		pg_class pg_class_1, " | 				"		pc1.oid, " | ||||||
| 				"		pg_class pg_class_2, " | 				"		pc1.relname " | ||||||
| 				"		pg_proc pg_proc, " | 				"FROM	pg_class pc, " | ||||||
| 				"		pg_proc pg_proc_1, " | 				"		pg_class pc1, " | ||||||
| 				"		pg_trigger pg_trigger, " | 				"		pg_class pc2, " | ||||||
| 				"		pg_trigger pg_trigger_1, " | 				"		pg_proc pp, " | ||||||
| 				"		pg_trigger pg_trigger_2 " | 				"		pg_proc pp1, " | ||||||
| 				"WHERE	pg_trigger.tgconstrrelid = pg_class.oid " | 				"		pg_trigger pt, " | ||||||
| 				"	AND pg_trigger.tgrelid = pg_class_1.oid " | 				"		pg_trigger pt1, " | ||||||
| 				"	AND pg_trigger_1.tgfoid = pg_proc_1.oid " | 				"		pg_trigger pt2 " | ||||||
| 				"	AND pg_trigger_1.tgconstrrelid = pg_class_1.oid " | 				"WHERE	pt.tgconstrrelid = pc.oid " | ||||||
| 				"	AND pg_trigger_2.tgconstrrelid = pg_class_2.oid " | 				"	AND pt.tgrelid = pc1.oid " | ||||||
| 				"	AND pg_trigger_2.tgfoid = pg_proc.oid " | 				"	AND pt1.tgfoid = pp1.oid " | ||||||
| 				"	AND pg_class_2.oid = pg_trigger.tgrelid " | 				"	AND pt1.tgconstrrelid = pc1.oid " | ||||||
|  | 				"	AND pt2.tgconstrrelid = pc2.oid " | ||||||
|  | 				"	AND pt2.tgfoid = pp.oid " | ||||||
|  | 				"	AND pc2.oid = pt.tgrelid " | ||||||
| 				"	AND (" | 				"	AND (" | ||||||
| 				"		 (pg_class.relname='%s') " | 				"		 (pc.relname='%s') " | ||||||
| 				"	AND  (pg_proc.proname Like '%%upd') " | 				"	AND  (pp.proname Like '%%upd') " | ||||||
| 				"	AND  (pg_proc_1.proname Like '%%del')" | 				"	AND  (pp1.proname Like '%%del')" | ||||||
| 				"	AND	 (pg_trigger_1.tgrelid = pg_trigger.tgconstrrelid) " | 				"	AND	 (pt1.tgrelid = pt.tgconstrrelid) " | ||||||
| 				"	AND	 (pg_trigger_2.tgrelid = pg_trigger.tgconstrrelid) " | 				"	AND	 (pt2.tgrelid = pt.tgconstrrelid) " | ||||||
| 				"		)", | 				"		)", | ||||||
| 				pk_table_needed); | 				pk_table_needed); | ||||||
|  |  | ||||||
| @@ -3771,6 +3888,51 @@ PGAPI_ForeignKeys( | |||||||
| 			return SQL_ERROR; | 			return SQL_ERROR; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 7, SQL_C_ULONG, | ||||||
|  | 						&relid1, sizeof(relid1), NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 8, SQL_C_ULONG, | ||||||
|  | 						&relid2, sizeof(relid2), NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 9, SQL_C_CHAR, | ||||||
|  | 					fk_table_fetched, MAX_TABLE_LEN, NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | if (conn->schema_support) | ||||||
|  | { | ||||||
|  | 		result = PGAPI_BindCol(htbl_stmt, 10, SQL_C_CHAR, | ||||||
|  | 					schema_fetched, MAX_SCHEMA_LEN, NULL); | ||||||
|  | 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) | ||||||
|  | 		{ | ||||||
|  | 			stmt->errormsg = tbl_stmt->errormsg; | ||||||
|  | 			stmt->errornumber = tbl_stmt->errornumber; | ||||||
|  | 			SC_log_error(func, "", stmt); | ||||||
|  | 			PGAPI_FreeStmt(htbl_stmt, SQL_DROP); | ||||||
|  | 			return SQL_ERROR; | ||||||
|  | 		} | ||||||
|  | } | ||||||
|  |  | ||||||
| 		result = PGAPI_Fetch(htbl_stmt); | 		result = PGAPI_Fetch(htbl_stmt); | ||||||
| 		if (result == SQL_NO_DATA_FOUND) | 		if (result == SQL_NO_DATA_FOUND) | ||||||
| 			return SQL_SUCCESS; | 			return SQL_SUCCESS; | ||||||
| @@ -3829,16 +3991,6 @@ PGAPI_ForeignKeys( | |||||||
| 			for (i = 0; i < 5; i++) | 			for (i = 0; i < 5; i++) | ||||||
| 				pkey_ptr += strlen(pkey_ptr) + 1; | 				pkey_ptr += strlen(pkey_ptr) + 1; | ||||||
|  |  | ||||||
| 			/* Get to first foreign table */ |  | ||||||
| 			fk_table = trig_args; |  | ||||||
| 			fk_table += strlen(fk_table) + 1; |  | ||||||
| #ifdef	MULTIBYTE |  | ||||||
| 			pk_table = fk_table + strlen(fk_table) + 1; |  | ||||||
| 			fkt_text = getClientTableName(conn, schema_needed, fk_table, &fkt_alloced); |  | ||||||
| #else |  | ||||||
| 			fkt_text = fk_table; |  | ||||||
| #endif   /* MULTIBYTE */ |  | ||||||
|  |  | ||||||
| 			/* Get to first foreign key */ | 			/* Get to first foreign key */ | ||||||
| 			fkey_ptr = trig_args; | 			fkey_ptr = trig_args; | ||||||
| 			for (k = 0; k < 4; k++) | 			for (k = 0; k < 4; k++) | ||||||
| @@ -3847,13 +3999,13 @@ PGAPI_ForeignKeys( | |||||||
| 			for (k = 0; k < num_keys; k++) | 			for (k = 0; k < num_keys; k++) | ||||||
| 			{ | 			{ | ||||||
| #ifdef	MULTIBYTE | #ifdef	MULTIBYTE | ||||||
| 				pkey_text = getClientColumnName(conn, schema_needed, pk_table, pkey_ptr, &pkey_alloced); | 				pkey_text = getClientColumnName(conn, relid1, pkey_ptr, &pkey_alloced); | ||||||
| 				fkey_text = getClientColumnName(conn, schema_needed, fk_table, fkey_ptr, &fkey_alloced); | 				fkey_text = getClientColumnName(conn, relid2, fkey_ptr, &fkey_alloced); | ||||||
| #else | #else | ||||||
| 				pkey_text = pkey_ptr; | 				pkey_text = pkey_ptr; | ||||||
| 				fkey_text = fkey_ptr; | 				fkey_text = fkey_ptr; | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
| 				mylog("pkey_ptr = '%s', fk_table = '%s', fkey_ptr = '%s'\n", pkey_text, fkt_text, fkey_text); | 				mylog("pkey_ptr = '%s', fk_table = '%s', fkey_ptr = '%s'\n", pkey_text, fk_table_fetched, fkey_text); | ||||||
|  |  | ||||||
| 				row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) *sizeof(TupleField)); | 				row = (TupleNode *) malloc(sizeof(TupleNode) + (result_cols - 1) *sizeof(TupleField)); | ||||||
|  |  | ||||||
| @@ -3863,10 +4015,10 @@ PGAPI_ForeignKeys( | |||||||
| 				set_tuplefield_string(&row->tuple[2], pk_table_needed); | 				set_tuplefield_string(&row->tuple[2], pk_table_needed); | ||||||
| 				set_tuplefield_string(&row->tuple[3], pkey_text); | 				set_tuplefield_string(&row->tuple[3], pkey_text); | ||||||
|  |  | ||||||
| 				mylog("fk_table = '%s', fkey_ptr = '%s'\n", fkt_text, fkey_text); | 				mylog("fk_table = '%s', fkey_ptr = '%s'\n", fk_table_fetched, fkey_text); | ||||||
| 				set_tuplefield_null(&row->tuple[4]); | 				set_tuplefield_null(&row->tuple[4]); | ||||||
| 				set_tuplefield_string(&row->tuple[5], GET_SCHEMA_NAME(schema_needed)); | 				set_tuplefield_string(&row->tuple[5], GET_SCHEMA_NAME(schema_fetched)); | ||||||
| 				set_tuplefield_string(&row->tuple[6], fkt_text); | 				set_tuplefield_string(&row->tuple[6], fk_table_fetched); | ||||||
| 				set_tuplefield_string(&row->tuple[7], fkey_text); | 				set_tuplefield_string(&row->tuple[7], fkey_text); | ||||||
|  |  | ||||||
| 				set_tuplefield_int2(&row->tuple[8], (Int2) (k + 1)); | 				set_tuplefield_int2(&row->tuple[8], (Int2) (k + 1)); | ||||||
| @@ -3902,11 +4054,6 @@ PGAPI_ForeignKeys( | |||||||
| 					fkey_ptr += strlen(fkey_ptr) + 1; | 					fkey_ptr += strlen(fkey_ptr) + 1; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| #ifdef	MULTIBYTE |  | ||||||
| 			if (fkt_alloced) |  | ||||||
| 				free(fkt_text); |  | ||||||
| 			fkt_alloced = FALSE; |  | ||||||
| #endif   /* MULTIBYTE */ |  | ||||||
| 			result = PGAPI_Fetch(htbl_stmt); | 			result = PGAPI_Fetch(htbl_stmt); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -3919,12 +4066,8 @@ PGAPI_ForeignKeys( | |||||||
| 		return SQL_ERROR; | 		return SQL_ERROR; | ||||||
| 	} | 	} | ||||||
| #ifdef	MULTIBYTE | #ifdef	MULTIBYTE | ||||||
| 	if (pkt_alloced) |  | ||||||
| 		free(pkt_text); |  | ||||||
| 	if (pkey_alloced) | 	if (pkey_alloced) | ||||||
| 		free(pkey_text); | 		free(pkey_text); | ||||||
| 	if (fkt_alloced) |  | ||||||
| 		free(fkt_text); |  | ||||||
| 	if (fkey_alloced) | 	if (fkey_alloced) | ||||||
| 		free(fkey_text); | 		free(fkey_text); | ||||||
| #endif   /* MULTIBYTE */ | #endif   /* MULTIBYTE */ | ||||||
| @@ -4002,15 +4145,15 @@ PGAPI_Procedures( | |||||||
| 		" proname as " "PROCEDURE_NAME" ", '' as " "NUM_INPUT_PARAMS" "," | 		" proname as " "PROCEDURE_NAME" ", '' as " "NUM_INPUT_PARAMS" "," | ||||||
| 		   " '' as " "NUM_OUTPUT_PARAMS" ", '' as " "NUM_RESULT_SETS" "," | 		   " '' as " "NUM_OUTPUT_PARAMS" ", '' as " "NUM_RESULT_SETS" "," | ||||||
| 		   " '' as " "REMARKS" "," | 		   " '' as " "REMARKS" "," | ||||||
| 		   " case when prorettype = 0 then 1::int2 else 2::int2 end as " "PROCEDURE_TYPE" " from pg_proc where"); | 		   " case when prorettype = 0 then 1::int2 else 2::int2 end as " "PROCEDURE_TYPE" " from pg_proc"); | ||||||
| 	if (conn->schema_support) | 	if (conn->schema_support) | ||||||
| 	{ | 	{ | ||||||
| 		strcat(proc_query, " pg_proc.namespace = pg_namespace.oid"); | 		strcat(proc_query, " where pg_proc.pronamespace = pg_namespace.oid"); | ||||||
| 		schema_strcat(proc_query, " and nspname like '%.*s'", szProcOwner, cbProcOwner, szProcName, cbProcName); | 		schema_strcat(proc_query, " and nspname like '%.*s'", szProcOwner, cbProcOwner, szProcName, cbProcName); | ||||||
| 		my_strcat(proc_query, " and proname like '%.*s'", szProcName, cbProcName); | 		my_strcat(proc_query, " and proname like '%.*s'", szProcName, cbProcName); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 		my_strcat(proc_query, " proname like '%.*s'", szProcName, cbProcName); | 		my_strcat(proc_query, " where proname like '%.*s'", szProcName, cbProcName); | ||||||
|  |  | ||||||
| 	if (res = CC_send_query(conn, proc_query, NULL, CLEAR_RESULT_ON_ABORT), !res) | 	if (res = CC_send_query(conn, proc_query, NULL, CLEAR_RESULT_ON_ABORT), !res) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
| @@ -55,6 +55,7 @@ Int4 pgtypes_defined[]	= { | |||||||
| 				PG_TYPE_TIME_WITH_TMZONE, | 				PG_TYPE_TIME_WITH_TMZONE, | ||||||
| 				PG_TYPE_DATETIME, | 				PG_TYPE_DATETIME, | ||||||
| 				PG_TYPE_ABSTIME, | 				PG_TYPE_ABSTIME, | ||||||
|  | 				PG_TYPE_TIMESTAMP_NO_TMZONE, | ||||||
| 				PG_TYPE_TIMESTAMP, | 				PG_TYPE_TIMESTAMP, | ||||||
| 				PG_TYPE_TEXT, | 				PG_TYPE_TEXT, | ||||||
| 				PG_TYPE_INT2, | 				PG_TYPE_INT2, | ||||||
| @@ -312,6 +313,7 @@ pgtype_to_concise_type(StatementClass *stmt, Int4 type) | |||||||
| 			return SQL_TIME; | 			return SQL_TIME; | ||||||
| 		case PG_TYPE_ABSTIME: | 		case PG_TYPE_ABSTIME: | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| #if (ODBCVER >= 0x0300) | #if (ODBCVER >= 0x0300) | ||||||
| 			if (EN_is_odbc3(env)) | 			if (EN_is_odbc3(env)) | ||||||
| @@ -416,6 +418,7 @@ pgtype_to_ctype(StatementClass *stmt, Int4 type) | |||||||
| 			return SQL_C_TIME; | 			return SQL_C_TIME; | ||||||
| 		case PG_TYPE_ABSTIME: | 		case PG_TYPE_ABSTIME: | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| #if (ODBCVER >= 0x0300) | #if (ODBCVER >= 0x0300) | ||||||
| 			if (EN_is_odbc3(env)) | 			if (EN_is_odbc3(env)) | ||||||
| @@ -491,6 +494,8 @@ pgtype_to_name(StatementClass *stmt, Int4 type) | |||||||
| 			return "abstime"; | 			return "abstime"; | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
| 			return "datetime"; | 			return "datetime"; | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
|  | 			return "timestamp_nozone"; | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| 			return "timestamp"; | 			return "timestamp"; | ||||||
| 		case PG_TYPE_MONEY: | 		case PG_TYPE_MONEY: | ||||||
| @@ -817,6 +822,7 @@ pgtype_column_size(StatementClass *stmt, Int4 type, int col, int handle_unknown_ | |||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| 			return 22; | 			return 22; | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 			/* return 22; */ | 			/* return 22; */ | ||||||
| 			return getTimestampColumnSize(stmt, type, col); | 			return getTimestampColumnSize(stmt, type, col); | ||||||
|  |  | ||||||
| @@ -851,6 +857,7 @@ pgtype_precision(StatementClass *stmt, Int4 type, int col, int handle_unknown_si | |||||||
| 		case PG_TYPE_NUMERIC: | 		case PG_TYPE_NUMERIC: | ||||||
| 			return getNumericColumnSize(stmt, type, col); | 			return getNumericColumnSize(stmt, type, col); | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 			return getTimestampDecimalDigits(stmt, type, col); | 			return getTimestampDecimalDigits(stmt, type, col); | ||||||
| 	} | 	} | ||||||
| 	return -1; | 	return -1; | ||||||
| @@ -938,6 +945,7 @@ pgtype_buffer_length(StatementClass *stmt, Int4 type, int col, int handle_unknow | |||||||
| 		case PG_TYPE_ABSTIME: | 		case PG_TYPE_ABSTIME: | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 			return 16;		/* sizeof(TIMESTAMP_STRUCT) */ | 			return 16;		/* sizeof(TIMESTAMP_STRUCT) */ | ||||||
|  |  | ||||||
| 			/* Character types use the default precision */ | 			/* Character types use the default precision */ | ||||||
| @@ -1001,6 +1009,7 @@ pgtype_desclength(StatementClass *stmt, Int4 type, int col, int handle_unknown_s | |||||||
| 		case PG_TYPE_TIME: | 		case PG_TYPE_TIME: | ||||||
| 		case PG_TYPE_ABSTIME: | 		case PG_TYPE_ABSTIME: | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| 		case PG_TYPE_VARCHAR: | 		case PG_TYPE_VARCHAR: | ||||||
| 		case PG_TYPE_BPCHAR: | 		case PG_TYPE_BPCHAR: | ||||||
| @@ -1073,6 +1082,7 @@ pgtype_decimal_digits(StatementClass *stmt, Int4 type, int col) | |||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| 			return 0; | 			return 0; | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 			/* return 0; */ | 			/* return 0; */ | ||||||
| 			return getTimestampDecimalDigits(stmt, type, col); | 			return getTimestampDecimalDigits(stmt, type, col); | ||||||
|  |  | ||||||
| @@ -1147,6 +1157,7 @@ pgtype_auto_increment(StatementClass *stmt, Int4 type) | |||||||
| 		case PG_TYPE_TIME: | 		case PG_TYPE_TIME: | ||||||
| 		case PG_TYPE_ABSTIME: | 		case PG_TYPE_ABSTIME: | ||||||
| 		case PG_TYPE_DATETIME: | 		case PG_TYPE_DATETIME: | ||||||
|  | 		case PG_TYPE_TIMESTAMP_NO_TMZONE: | ||||||
| 		case PG_TYPE_TIMESTAMP: | 		case PG_TYPE_TIMESTAMP: | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1964,7 +1964,7 @@ SC_pos_delete(StatementClass *stmt, | |||||||
| 	mylog("dltstr=%s\n", dltstr); | 	mylog("dltstr=%s\n", dltstr); | ||||||
| 	qres = CC_send_query(conn, dltstr, NULL, CLEAR_RESULT_ON_ABORT); | 	qres = CC_send_query(conn, dltstr, NULL, CLEAR_RESULT_ON_ABORT); | ||||||
| 	ret = SQL_SUCCESS; | 	ret = SQL_SUCCESS; | ||||||
| 	if (qres && QR_command_successful(qres)) | 	if (qres && QR_command_maybe_successful(qres)) | ||||||
| 	{ | 	{ | ||||||
| 		int			dltcnt; | 		int			dltcnt; | ||||||
| 		const char *cmdstr = QR_get_command(qres); | 		const char *cmdstr = QR_get_command(qres); | ||||||
|   | |||||||
| @@ -955,7 +955,7 @@ SC_execute(StatementClass *self) | |||||||
| 		/* send the declare/select */ | 		/* send the declare/select */ | ||||||
| 		res = CC_send_query(conn, self->stmt_with_params, NULL, qflag); | 		res = CC_send_query(conn, self->stmt_with_params, NULL, qflag); | ||||||
| 		if (SC_is_fetchcursor(self) && res != NULL && | 		if (SC_is_fetchcursor(self) && res != NULL && | ||||||
| 			QR_command_successful(res)) | 			QR_command_maybe_successful(res)) | ||||||
| 		{ | 		{ | ||||||
| 			QR_Destructor(res); | 			QR_Destructor(res); | ||||||
| 			qflag &= (~ GO_INTO_TRANSACTION); | 			qflag &= (~ GO_INTO_TRANSACTION); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user