From bed10f65b01cf67e78fe5adf5290a84f4b99d25c Mon Sep 17 00:00:00 2001 From: jarvis24young <749843026@qq.com> Date: Tue, 12 May 2026 09:31:49 +0800 Subject: [PATCH] Pass SQLSetDescRec field values correctly --- pgapi30.c | 12 ++++----- test/expected/descrec.out | 4 +++ test/expected/descrec_1.out | 4 +++ test/expected/descrec_2.out | 4 +++ test/src/descrec-test.c | 53 +++++++++++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/pgapi30.c b/pgapi30.c index 81161322..a17e5d9d 100644 --- a/pgapi30.c +++ b/pgapi30.c @@ -2211,28 +2211,28 @@ PGAPI_SetDescRec(SQLHDESC DescriptorHandle, - SQL_DESC_OCTET_LENGTH_PTR - SQL_DESC_INDICATOR_PTR */ - ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_TYPE, &Type, 0); + ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_TYPE, (PTR) (LONG_PTR) Type, 0); if (ret != SQL_SUCCESS) return ret; /* If Type is SQL_DATETIME or SQL_INTERVAL, the value of SQL_DESC_DATETIME_INTERVAL_CODE is set to SubType. */ if (Type == SQL_DATETIME || Type == SQL_INTERVAL) { - ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_DATETIME_INTERVAL_CODE, &SubType, 0); + ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_DATETIME_INTERVAL_CODE, (PTR) (LONG_PTR) SubType, 0); if (ret != SQL_SUCCESS) return ret; } - ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_OCTET_LENGTH, &Length, 0); + ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_OCTET_LENGTH, (PTR) (LONG_PTR) Length, 0); if (ret != SQL_SUCCESS) return ret; - ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_PRECISION, &Precision, 0); + ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_PRECISION, (PTR) (LONG_PTR) Precision, 0); if (ret != SQL_SUCCESS) return ret; - ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_SCALE, &Scale, 0); + ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_SCALE, (PTR) (LONG_PTR) Scale, 0); if (ret != SQL_SUCCESS) return ret; /* SQL_DESC_DATA_PTR is only for ARD or APD */ if (DC_get_desc_type(desc) != SQL_ATTR_IMP_PARAM_DESC) { - ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_DATA_PTR, &Data, 0); + ret = PGAPI_SetDescField(DescriptorHandle, RecNumber, SQL_DESC_DATA_PTR, Data, 0); if (ret != SQL_SUCCESS) return ret; } diff --git a/test/expected/descrec.out b/test/expected/descrec.out index 69a71b35..9b5785af 100644 --- a/test/expected/descrec.out +++ b/test/expected/descrec.out @@ -31,4 +31,8 @@ SQL_DESC_OCTET_LENGTH: 8 SQL_DESC_PRECISION: 0 SQL_DESC_SCALE: 0 SQL_DESC_NULLABLE: 0 + +-- SQLSetDescRec ARD binding -- +VALUE: 42 +INDICATOR: 2 disconnecting diff --git a/test/expected/descrec_1.out b/test/expected/descrec_1.out index 0990bd06..156e7e43 100644 --- a/test/expected/descrec_1.out +++ b/test/expected/descrec_1.out @@ -31,4 +31,8 @@ SQL_DESC_OCTET_LENGTH: 8 SQL_DESC_PRECISION: 0 SQL_DESC_SCALE: 0 SQL_DESC_NULLABLE: 0 + +-- SQLSetDescRec ARD binding -- +VALUE: 42 +INDICATOR: 2 disconnecting diff --git a/test/expected/descrec_2.out b/test/expected/descrec_2.out index 6f61c491..b0c85a7c 100644 --- a/test/expected/descrec_2.out +++ b/test/expected/descrec_2.out @@ -31,4 +31,8 @@ SQL_DESC_OCTET_LENGTH: 8 SQL_DESC_PRECISION: 0 SQL_DESC_SCALE: 0 SQL_DESC_NULLABLE: 0 + +-- SQLSetDescRec ARD binding -- +VALUE: 42 +INDICATOR: 2 disconnecting diff --git a/test/src/descrec-test.c b/test/src/descrec-test.c index 6f37bf0a..7504c672 100644 --- a/test/src/descrec-test.c +++ b/test/src/descrec-test.c @@ -1,8 +1,56 @@ #include #include +#include #include "common.h" +static void +test_setdescrec_ard_binding(void) +{ + SQLRETURN rc; + HSTMT hstmt = SQL_NULL_HSTMT; + SQLHDESC hDesc = SQL_NULL_HDESC; + char value[16] = ""; + SQLLEN ind = 0; + + rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt); + if (!SQL_SUCCEEDED(rc)) + { + print_diag("failed to allocate stmt handle", SQL_HANDLE_DBC, conn); + exit(1); + } + + rc = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hDesc, 0, NULL); + CHECK_STMT_RESULT(rc, "SQLGetStmtAttr failed", hstmt); + + rc = SQLSetDescRec(hDesc, 1, SQL_C_CHAR, 0, sizeof(value), 0, 0, + value, &ind, &ind); + if (!SQL_SUCCEEDED(rc)) + { + print_diag("SQLSetDescRec failed", SQL_HANDLE_DESC, hDesc); + exit(1); + } + + rc = SQLExecDirect(hstmt, (SQLCHAR *) "SELECT 42", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLExecDirect failed", hstmt); + + rc = SQLFetch(hstmt); + CHECK_STMT_RESULT(rc, "SQLFetch failed", hstmt); + + printf("\n-- SQLSetDescRec ARD binding --\n"); + printf("VALUE: %s\n", value); + printf("INDICATOR: %ld\n", (long) ind); + + if (strcmp(value, "42") != 0 || ind != 2) + { + printf("SQLSetDescRec ARD binding mismatch\n"); + exit(1); + } + + rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt); + CHECK_STMT_RESULT(rc, "SQLFreeHandle failed", hstmt); +} + int main(int argc, char **argv) { SQLRETURN rc; @@ -64,6 +112,11 @@ int main(int argc, char **argv) rc = SQLFreeStmt(hstmt, SQL_CLOSE); CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt); + CHECK_STMT_RESULT(rc, "SQLFreeHandle failed", hstmt); + + test_setdescrec_ard_binding(); + /* Clean up */ test_disconnect();