/* MariaDB Connector/ODBC: SQL_C_TYPE_DATE parameter array fails with PCALLBACK=1 */
#include <stdio.h>
#include <string.h>
#include <sql.h>
#include <sqlext.h>

static void check(SQLSMALLINT type, SQLHANDLE h, const char *what, SQLRETURN rc) {
    SQLCHAR state[6], msg[512]; SQLINTEGER native; SQLSMALLINT len;
    printf("%s: rc=%d", what, rc);
    if (rc != SQL_SUCCESS && SQLGetDiagRec(type, h, 1, state, &native, msg, sizeof msg, &len) == SQL_SUCCESS)
        printf(" [%s] %s", state, msg);
    printf("\n");
}

int main(int argc, char **argv) {
    SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN rc;
    SQL_DATE_STRUCT dates[3] = { {2026, 2, 1}, {2026, 2, 2}, {1999, 12, 31} };
    SQLINTEGER ids[3] = { 1, 2, 3 };
    SQLLEN idInd[3] = { 0, 0, 0 }, dateInd[3] = { 0, 0, 0 };
    SQLLEN count = 0;

    if (argc < 4) { fprintf(stderr, "usage: %s DSN user password\n", argv[0]); return 2; }
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
    SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
    rc = SQLConnect(dbc, (SQLCHAR*)argv[1], SQL_NTS, (SQLCHAR*)argv[2], SQL_NTS, (SQLCHAR*)argv[3], SQL_NTS);
    check(SQL_HANDLE_DBC, dbc, "SQLConnect", rc);

    SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    SQLExecDirect(stmt, (SQLCHAR*)"DROP TABLE IF EXISTS odbc_date_arr", SQL_NTS);
    rc = SQLExecDirect(stmt, (SQLCHAR*)"CREATE TABLE odbc_date_arr (id INT, d DATE)", SQL_NTS);
    check(SQL_HANDLE_STMT, stmt, "CREATE TABLE", rc);

    rc = SQLPrepare(stmt, (SQLCHAR*)"INSERT INTO odbc_date_arr (id, d) VALUES (?, ?)", SQL_NTS);
    check(SQL_HANDLE_STMT, stmt, "SQLPrepare", rc);
    SQLSetStmtAttr(stmt, SQL_ATTR_PARAM_BIND_TYPE, (SQLPOINTER)SQL_PARAM_BIND_BY_COLUMN, 0);
    SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)3, 0);
    SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, ids, 0, idInd);
    SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 10, 0, dates, 0, dateInd);
    rc = SQLExecute(stmt);
    check(SQL_HANDLE_STMT, stmt, "SQLExecute (3 rows)", rc);
    SQLFreeStmt(stmt, SQL_RESET_PARAMS);
    SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)1, 0);

    SQLExecDirect(stmt, (SQLCHAR*)"SELECT COUNT(*) FROM odbc_date_arr", SQL_NTS);
    SQLFetch(stmt);
    SQLGetData(stmt, 1, SQL_C_SLONG, &count, sizeof(SQLINTEGER), NULL);
    printf("rows inserted: %ld (expected 3)\n", (long)count);
    SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    SQLDisconnect(dbc);
    return 0;
}
