Skip to content

Commit 5493975

Browse files
committed
Fix of error in connstring in actions on MacOS
Fixed some testcases(merged from 3.2 and new fix). Added output of additional debug info to actions config and to failing tests. Changed some tests and the driver to eliminate (most of) failures in "direct linking" mode Added installation of WiX with choco(it looks like it is preinstalled though)
1 parent 9384c10 commit 5493975

20 files changed

+370
-181
lines changed

.github/workflows/ci.yml

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ env:
2020
MYSQL_TEST_USER: root
2121
MYSQL_TEST_PASSWD: "heyPassw+-_20oRd"
2222
MYSQL_TEST_DB: testo
23+
TEST_DSN: maodbc_test
24+
TEST_UID: root
25+
TEST_SERVER: mariadb.example.com
26+
TEST_PASSWORD: "heyPassw+-_20oRd"
27+
TEST_PORT: 3306
28+
TEST_SCHEMA: testo
29+
ODBCINI: "${{ github.workspace }}/test/odbc.ini"
30+
ODBCSYSINI: ${{ github.workspace }}/test
31+
ODBCINTSTINI: ${{ github.workspace }}/test/odbcinst.ini
2332

2433
jobs:
2534
setup:
@@ -69,13 +78,6 @@ jobs:
6978
sudo apt install unixodbc-dev
7079
cmake -DCONC_WITH_MSI=OFF -DCONC_WITH_UNIT_TESTS=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_SSL=OPENSSL .
7180
cmake --build . --config RelWithDebInfo
72-
env:
73-
TEST_DSN: maodbc_test
74-
TEST_UID: ${{ env.MYSQL_TEST_USER }}
75-
TEST_SERVER: ${{ env.MYSQL_TEST_HOST }}
76-
TEST_PASSWORD: ${{ env.MYSQL_TEST_PASSWD }}
77-
TEST_PORT: ${{ env.MYSQL_TEST_PORT }}
78-
TEST_SCHEMA: ${{ env.MYSQL_TEST_DB }}
7981
8082
- name: make macos
8183
if: ${{ startsWith(matrix.os, 'mac') }}
@@ -87,38 +89,46 @@ jobs:
8789
echo "TEST_DRIVER=${{ github.workspace }}/RelWithDebInfo/libmaodbc.dylib" >> $GITHUB_ENV
8890
cmake -G Xcode -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=NO -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO -DWITH_SIGNCODE=OFF -DODBC_LIB_DIR=/opt/homebrew/opt/libiodbc/lib -DODBC_INCLUDE_DIR=/opt/homebrew/opt/libiodbc/include -DCONC_WITH_MSI=OFF -DCONC_WITH_UNIT_TESTS=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_SSL=OPENSSL -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib -DWITH_EXTERNAL_ZLIB=On .
8991
cmake --build . --config RelWithDebInfo
90-
env:
91-
TEST_DSN: maodbc_test
92-
TEST_UID: ${{ env.MYSQL_TEST_USER }}
93-
TEST_SERVER: ${{ env.MYSQL_TEST_HOST }}
94-
TEST_PASSWORD: ${{ env.MYSQL_TEST_PASSWD }}
95-
TEST_PORT: ${{ env.MYSQL_TEST_PORT }}
96-
TEST_SCHEMA: ${{ env.MYSQL_TEST_DB }}
92+
93+
- name: Install WiX
94+
if: ${{ startsWith(matrix.os, 'windows') }}
95+
shell: powershell
96+
run: |
97+
choco install wixtoolset -y
9798
9899
- name: make windows
99100
if: ${{ startsWith(matrix.os, 'windows') }}
100101
shell: powershell
101102
run: |
102-
cmake -DCONC_WITH_MSI=OFF -DCONC_WITH_UNIT_TESTS=OFF -DWITH_MSI=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_SSL=SCHANNEL .
103+
cmake -DCONC_WITH_MSI=OFF -DCONC_WITH_UNIT_TESTS=OFF -DWITH_MSI=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_SSL=SCHANNEL . #-DDIRECT_LINK_TESTS=1 .
103104
cmake --build . --config RelWithDebInfo
104-
env:
105-
TEST_DSN: maodbc_test
106-
TEST_UID: ${{ env.MYSQL_TEST_USER }}
107-
TEST_SERVER: ${{ env.MYSQL_TEST_HOST }}
108-
TEST_PASSWORD: ${{ env.MYSQL_TEST_PASSWD }}
109-
TEST_PORT: ${{ env.MYSQL_TEST_PORT }}
110-
TEST_SCHEMA: ${{ env.MYSQL_TEST_DB }}
105+
106+
- name: Install generated MSI (Windows only)
107+
if: startsWith(matrix.os, 'windows')
108+
shell: powershell
109+
run: |
110+
pwd
111+
ls ${{ github.workspace }}\packaging\windows
112+
Get-ChildItem -Path ${{ github.workspace }}\packaging\windows\mariadb-connector-odbc-*.msi
113+
$log = "install.log"
114+
foreach ($msi in Get-ChildItem -Path ${{ github.workspace }}\packaging\windows\mariadb-connector-odbc-*.msi) {
115+
$procInstall= Start-Process msiexec.exe -ArgumentList "/i $($msi.FullName) /qn /norestart" -NoNewWindow -PassThru
116+
#$procLog = Start-Process "powershell" "Get-Content -Path `"$log`" -Wait" -NoNewWindow -PassThru
117+
#$procMain.WaitForExit()
118+
#$procLog.Kill()
119+
}
120+
Get-OdbcDriver -Platform "64-bit"
121+
Add-OdbcDsn -Name $env:TEST_DSN -DriverName "MariaDB ODBC 3.1 Driver" -DsnType "User" -SetPropertyValue @( "SERVER=$env:TEST_SERVER", "DATABASE=$env:TEST_SCHEMA", "USER=$env:TEST_UID", "PASSWORD=$env:TEST_PASSWORD", "PORT=$env:TEST_PORT" )
111122
112123
- name: Run test suite
113124
shell: bash
114125
run: |
115126
echo "$PWD"
116127
117-
118-
ls -lrt
128+
chmod 777 test
129+
ls -lrta
119130
cd ./test
120131
echo "$PWD"
121-
ls -lrt
122132
if [ "$DB_TYPE" = "mysql" ] ; then
123133
cp ../libmariadb/caching_sha2_password.* ../
124134
fi
@@ -127,16 +137,16 @@ jobs:
127137
TEST_DRIVER="MariaDB ODBC 3.1 Driver"
128138
# INSTALLFOLDER=''
129139
ls ./RelWithDebInfo
130-
cd ../wininstall && for msi in mariadb-connector-odbc-*.msi ; do msiexec /i $msi /qn /norestart; done
131140
set +x
132-
odbcconf CONFIGDSN "$TEST_DRIVER" "DSN=$TEST_DSN;SERVER=$TEST_SERVER;DATABASE=$TEST_SCHEMA;USER=$TEST_UID;PASSWORD=$TEST_PASSWORD;PORT=$TEST_PORT;$TEST_ADD_PARAM"
141+
#odbcconf CONFIGDSN "$TEST_DRIVER" "DSN=$TEST_DSN;SERVER=$TEST_SERVER;DATABASE=$TEST_SCHEMA;USER=$TEST_UID;PASSWORD=$TEST_PASSWORD;PORT=$TEST_PORT;$TEST_ADD_PARAM"
133142
set -ex
134143
else
135-
export ODBCINI="${{ github.workspace }}/test/odbc.ini"
136-
export ODBCSYSINI=${{ github.workspace }}/test
137144
138-
cat $ODBCSYSINI/odbcinst.ini
139-
cat $ODBCSYSINI/odbc.ini | grep -v PASSWORD
145+
cat $ODBCINSTINI
146+
cat $ODBCINI | grep -v PASSWORD
147+
148+
chmod 666 $ODBCINI $ODBCSYSINI/odbcinst.ini
149+
ls -lrt
140150
fi
141151
ctest --verbose
142152
@@ -147,13 +157,7 @@ jobs:
147157
DB_TYPE: ${{ matrix.db-type }}
148158
LOCAL_DB: ${{ steps.setup-env.outputs.database-type }}
149159
os: ${{ matrix.os }}
150-
TEST_DSN: maodbc_test
151160
TEST_DRIVER: ${{ env.TEST_DRIVER || 'maodbc_test' }}
152-
TEST_UID: ${{ env.MYSQL_TEST_USER }}
153-
TEST_SERVER: ${{ env.MYSQL_TEST_HOST }}
154-
TEST_PASSWORD: ${{ env.MYSQL_TEST_PASSWD }}
155-
TEST_PORT: ${{ env.MYSQL_TEST_PORT }}
156-
TEST_SCHEMA: ${{ env.MYSQL_TEST_DB }}
157161
TEST_SOCKET:
158162
SSLCERT: ${{ matrix.db-type == 'container' && format('{0}/.github/workflows/certs/server.crt', github.workspace) || '' }}
159163
MARIADB_PLUGIN_DIR: ${{ github.workspace }}

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,11 @@ ENDIF()
535535
# Tests. Should be verified by now, if we have them.
536536
IF(WITH_UNIT_TESTS)
537537
ADD_SUBDIRECTORY(test)
538+
539+
IF(DIRECT_LINK_TESTS)
540+
ADD_CUSTOM_COMMAND(TARGET ${LIBRARY_NAME} POST_BUILD
541+
COMMAND ${CMAKE_COMMAND} ARGS -E copy $<TARGET_FILE:${LIBRARY_NAME}> test)
542+
ENDIF()
538543
IF(NOT WIN32)
539544
# Configuring ini files for testing with UnixODBC
540545
MESSAGE(STATUS "Configurig Test Driver: ${TEST_DRIVER}, Test DSN: ${TEST_DSN}, tcp://${TEST_UID}@${TEST_SERVER}:${TEST_PORT}/${TEST_SCHEMA} socket: ${TEST_SOCKET}")

ma_catalog.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ SQLRETURN MADB_StmtColumns(MADB_Stmt *Stmt,
584584
if (MADB_DYNAPPENDCONST(&StmtStr, "=DATABASE()"))
585585
goto dynerror;
586586

587-
if (TableName && NameLength3)
587+
if (TableName/* && NameLength3*/)
588588
{
589589
if (MADB_DynstrAppend(&StmtStr, "AND TABLE_NAME") ||
590590
AddPvOrIdCondition(Stmt, (void*)&StmtStr, (size_t)-1, TableName, NameLength3))
@@ -859,6 +859,14 @@ SQLRETURN MADB_StmtSpecialColumns(MADB_Stmt *Stmt, SQLUSMALLINT IdentifierType,
859859
}
860860
p+= _snprintf(p, sizeof(StmtStr) - (p - StmtStr), "ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_KEY");
861861
}
862+
#ifdef _ACTIONS_TRACE_
863+
#ifdef __APPLE__
864+
if (getenv("GITHUB_ACTIONS") != NULL && strncmp(getenv("GITHUB_ACTIONS"), "true", 4) == 0 && IdentifierType == SQL_ROWVER)
865+
{
866+
printf("# \"%s\"(%hu)\n", StmtStr, Nullable);
867+
}
868+
#endif // __APPLE__
869+
#endif
862870
return Stmt->Methods->ExecDirect(Stmt, StmtStr, SQL_NTS);
863871
}
864872
/* }}} */

ma_connection.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/************************************************************************************
2-
Copyright (C) 2013,2023 MariaDB Corporation AB
2+
Copyright (C) 2013,2025 MariaDB Corporation plc
33
44
This library is free software; you can redistribute it and/or
55
modify it under the terms of the GNU Library General Public
@@ -252,6 +252,11 @@ SQLRETURN MADB_DbcSetAttr(MADB_Dbc *Dbc, SQLINTEGER Attribute, SQLPOINTER ValueP
252252
MADB_FREE(Dbc->CatalogName);
253253
if (isWChar)
254254
{
255+
/* This can happen with direct linking only */
256+
if (StringLength == SQL_NTS)
257+
{
258+
StringLength= (SQLINTEGER)(SqlwcsLen((SQLWCHAR*)ValuePtr, -1) * sizeof(SQLWCHAR));
259+
}
255260
/* IsAnsi will be set before this, even if it is set before connection
256261
StringLength from DM here is octets length */
257262
Dbc->CatalogName= MADB_ConvertFromWCharEx((SQLWCHAR *)ValuePtr, StringLength/ sizeof(SQLWCHAR), NULL, Dbc->ConnOrSrcCharset, NULL, TRUE);
@@ -411,6 +416,12 @@ SQLRETURN MADB_DbcGetAttr(MADB_Dbc *Dbc, SQLINTEGER Attribute, SQLPOINTER ValueP
411416
SQLSMALLINT StrLen;
412417
SQLRETURN ret;
413418

419+
/* This is normally cared by DM and this is only for direct linking case - if connection has not been established yet,
420+
returnring error */
421+
if (Dbc->mariadb == NULL && Dbc->CatalogName == NULL)
422+
{
423+
return MADB_SetError(&Dbc->Error, MADB_ERR_08003, NULL, 0);
424+
}
414425
ret= Dbc->Methods->GetCurrentDB(Dbc, ValuePtr, BufferLength, &StrLen, isWChar);
415426
/* if we weren't able to determine the current db, we will return the cached catalog name */
416427
if (!SQL_SUCCEEDED(ret) && Dbc->CatalogName)
@@ -436,7 +447,7 @@ SQLRETURN MADB_DbcGetAttr(MADB_Dbc *Dbc, SQLINTEGER Attribute, SQLPOINTER ValueP
436447
/* SQL_ATTR_METADATA_ID is SQLUINTEGER attribute on connection level, but SQLULEN on statement level :/ */
437448
*(SQLUINTEGER *)ValuePtr= Dbc->MetadataId;
438449
case SQL_ATTR_ODBC_CURSORS:
439-
*(SQLULEN*)ValuePtr= SQL_CUR_USE_ODBC;
450+
*(SQLULEN*)ValuePtr= SQL_CUR_USE_DRIVER;
440451
break;
441452
case SQL_ATTR_ENLIST_IN_DTC:
442453
/* MS Distributed Transaction Coordinator not supported */

ma_dsn.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ my_bool MADB_SaveDSN(MADB_Dsn *Dsn)
424424
}
425425
if (!SQLWriteDSNToIni(Dsn->DSNName, Dsn->Driver))
426426
{
427-
SQLInstallerError(1,&ErrNum, Dsn->ErrorMsg, SQL_MAX_MESSAGE_LENGTH, NULL);
427+
SQLInstallerError((WORD)1,&ErrNum, Dsn->ErrorMsg, (WORD)SQL_MAX_MESSAGE_LENGTH, NULL);
428428
return FALSE;
429429
}
430430

ma_environment.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ SQLRETURN MADB_EnvSetAttr(MADB_Env* Env, SQLINTEGER Attribute, SQLPOINTER ValueP
160160
case SQL_ATTR_ODBC_VERSION:
161161
if (Env->Dbcs)
162162
{
163-
MADB_SetError(&Env->Error, MADB_ERR_HYC00, NULL, 0);
163+
MADB_SetError(&Env->Error, MADB_ERR_HY010, NULL, 0);
164164
return Env->Error.ReturnValue;
165165
}
166166
Env->OdbcVersion= (SQLINTEGER)(SQLLEN)ValuePtr;

maodbc.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ SQLAllocHandle;
66
SQLAllocStmt;
77
SQLBindCol;
88
SQLBindParameter;
9+
SQLBindParam;
910
SQLBrowseConnect;
1011
SQLBrowseConnectW;
1112
SQLBulkOperations;

mariadb-odbc-driver.def.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ SQLAllocEnv
66
SQLAllocHandle
77
SQLAllocStmt
88
SQLBindCol
9+
SQLBindParam
910
SQLBindParameter
1011
SQLBrowseConnect
1112
SQLBrowseConnect@UNICODE@

odbc_3_api.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,7 @@ SQLRETURN SQL_API SQLSetParam(SQLHSTMT stmt,
26032603
/* }}} */
26042604

26052605
/* {{{ SQLBindParam - we need it for direct linking mainly */
2606-
SQLRETURN SQL_API SQLBindParam(SQLHSTMT StatementHandle,
2606+
SQLRETURN SQL_API SQLBindParam(SQLHSTMT StatementHandle,
26072607
SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType,
26082608
SQLSMALLINT ParameterType, SQLULEN LengthPrecision,
26092609
SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue,
@@ -2681,7 +2681,14 @@ SQLRETURN SQL_API SQLSpecialColumns(SQLHSTMT StatementHandle,
26812681
if (!Stmt)
26822682
return SQL_INVALID_HANDLE;
26832683
MADB_CLEAR_ERROR(&Stmt->Error);
2684-
2684+
#ifdef _ACTIONS_TRACE_
2685+
#ifdef __APPLE__
2686+
if (getenv("GITHUB_ACTIONS") != NULL && strncmp(getenv("GITHUB_ACTIONS"), "true", 4) == 0 && IdentifierType == SQL_ROWVER)
2687+
{
2688+
printf("# -- Nullable: %hu)\n", Nullable);
2689+
}
2690+
#endif // __APPLE__
2691+
#endif
26852692
return Stmt->Methods->SpecialColumns(Stmt,IdentifierType, (char *)CatalogName, NameLength1,
26862693
(char *)SchemaName, NameLength2,
26872694
(char *)TableName, NameLength3, Scope, Nullable);
@@ -2723,7 +2730,14 @@ SQLRETURN SQL_API SQLSpecialColumnsW(SQLHSTMT StatementHandle,
27232730
{
27242731
CpTable = MADB_ConvertFromWChar(TableName, NameLength3, &CpLength3, Stmt->Connection->ConnOrSrcCharset, NULL);
27252732
}
2726-
2733+
#ifdef _ACTIONS_TRACE_
2734+
#ifdef __APPLE__
2735+
if (getenv("GITHUB_ACTIONS") != NULL && strncmp(getenv("GITHUB_ACTIONS"), "true", 4) == 0 && IdentifierType == SQL_ROWVER)
2736+
{
2737+
printf("# -- Nullable: %hu)\n", Nullable);
2738+
}
2739+
#endif // __APPLE__
2740+
#endif
27272741
ret= Stmt->Methods->SpecialColumns(Stmt,IdentifierType, CpCatalog, (SQLSMALLINT)CpLength1, CpSchema,
27282742
(SQLSMALLINT)CpLength2, CpTable, (SQLSMALLINT)CpLength3, Scope, Nullable);
27292743
MADB_FREE(CpCatalog);

test/basic.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ ODBC_TEST(t_bug30840)
638638
SQLCHAR conn[512], conn_out[1024];
639639
SQLSMALLINT conn_out_len;
640640

641-
if (using_dm(Connection))
641+
if (using_dm())
642642
{
643643
diag("test doesn't work with (all) driver manager(s)");
644644
return SKIP;
@@ -1394,15 +1394,14 @@ ODBC_TEST(t_mysqld_stmt_reset)
13941394
ODBC_TEST(t_odbc32)
13951395
{
13961396
HDBC hdbc1;
1397-
SQLCHAR conn[512];
1397+
SQLCHAR conn[1024];
13981398
SQLUINTEGER packet_size= 0;
13991399

1400-
sprintf((char *)conn, "DSN=%s;PORT=%u", my_dsn, my_port);
1401-
14021400
CHECK_ENV_RC(Env, SQLAllocHandle(SQL_HANDLE_DBC, Env, &hdbc1));
14031401
CHECK_DBC_RC(hdbc1, SQLSetConnectAttr(hdbc1, SQL_ATTR_PACKET_SIZE, (SQLPOINTER)(4096*1024), 0));
14041402

1405-
CHECK_DBC_RC(hdbc1, SQLDriverConnect(hdbc1, NULL, conn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT));
1403+
CHECK_DBC_RC(hdbc1, SQLDriverConnect(hdbc1, NULL, ConnectionString(conn, FALSE, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL),
1404+
SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT));
14061405

14071406
CHECK_DBC_RC(hdbc1, SQLGetConnectAttr(hdbc1, SQL_ATTR_PACKET_SIZE, (SQLPOINTER)&packet_size, 0, NULL));
14081407

@@ -1722,8 +1721,8 @@ ODBC_TEST(t_odbc139)
17221721
skip("Waiting for the fix in Connector/C for servers > 10.2.0");
17231722
}
17241723
CHECK_ENV_RC(Env, SQLAllocConnect(Env, &Hdbc));
1725-
1726-
CHECK_DBC_RC(Hdbc, SQLSetConnectAttr(Hdbc, SQL_ATTR_CURRENT_CATALOG, (SQLPOINTER)"test", 4));
1724+
// Is it really needed for this test?
1725+
CHECK_DBC_RC(Hdbc, SQLSetConnectAttr(Hdbc, SQL_ATTR_CURRENT_CATALOG, (SQLPOINTER)my_schema, SQL_NTS));
17271726
Hstmt= DoConnect(Hdbc, FALSE, NULL, NULL, NULL, 0, NULL, &Compression, NULL, NULL);
17281727

17291728
FAIL_IF(Hstmt == NULL, "Connection with compression failed");

0 commit comments

Comments
 (0)