Index: driver/catalog.c =================================================================== --- driver/catalog.c (revision 1012) +++ driver/catalog.c (working copy) @@ -452,8 +452,9 @@ if (user_tables || views) { pthread_mutex_lock(&stmt->dbc->lock); - stmt->result= mysql_table_status(stmt, szTableQualifier, cbTableQualifier, - szTableName, cbTableName, TRUE); + stmt->result= mysql_table_status(stmt, TableQualifier, cbTableQualifier, + szTableName ? TableName : NULL, + cbTableName, TRUE); if (!stmt->result && mysql_errno(&stmt->dbc->mysql)) { @@ -1438,19 +1439,27 @@ MEM_ROOT *alloc; uint field_count; my_bool primary_key; + char *TableQualifier, *TableName; + char Qualifier_buff[NAME_LEN+1],Table_buff[NAME_LEN+1]; CLEAR_STMT_ERROR(hstmt); + TableQualifier=myodbc_get_valid_buffer( Qualifier_buff, szTableQualifier, cbTableQualifier ); + TableName= myodbc_get_valid_buffer( Table_buff, szTableName, cbTableName ); + + escape_input_parameter(&stmt->dbc->mysql, TableQualifier); + escape_input_parameter(&stmt->dbc->mysql, TableName); + if (cbTableQualifier == SQL_NTS) - cbTableQualifier= szTableQualifier ? strlen((char *)szTableQualifier) : 0; + cbTableQualifier= TableQualifier ? strlen((char *)TableQualifier) : 0; if (cbTableName == SQL_NTS) - cbTableName= szTableName ? strlen((char *)szTableName) : 0; + cbTableName= TableName ? strlen((char *)TableName) : 0; /* Reset the statement in order to avoid memory leaks when working with ADODB */ my_SQLFreeStmt(hstmt, MYSQL_RESET); - stmt->result= mysql_list_dbcolumns(stmt, szTableQualifier, cbTableQualifier, - szTableName, cbTableName, NULL, 0); + stmt->result= mysql_list_dbcolumns(stmt, TableQualifier, cbTableQualifier, + TableName, cbTableName, NULL, 0); if (!(result= stmt->result)) { return handle_connection_error(stmt); Index: test/my_catalog.c =================================================================== --- test/my_catalog.c (revision 1012) +++ test/my_catalog.c (working copy) @@ -1129,6 +1129,36 @@ } +/* + Bug #30965 - Crystal Report 10 can't verify databases with underscore in + MySQL-databasename +*/ +DECLARE_TEST(t_bug30965) +{ + SQLCHAR diagmsg[100]; + /* un-escaped unscores is valid, should return nothing */ + ok_stmt(hstmt, SQLTables(hstmt, "x__", SQL_NTS, "", 0, + "x__", SQL_NTS, "", 0)); + ok_stmt(hstmt, SQLFreeStmt(hstmt,SQL_CLOSE)); + /* Check that the backslashes don't cause an error */ + ok_stmt(hstmt, SQLTables(hstmt, "x\\_\\_", SQL_NTS, "", 0, + "x\\_\\_", SQL_NTS, "", 0)); + ok_stmt(hstmt, SQLFreeStmt(hstmt,SQL_CLOSE)); + /* Check also that SQLSpecialColumns() accepts backslashes */ + expect_stmt(hstmt, SQLSpecialColumns(hstmt, SQL_BEST_ROWID, "x\\_\\_", + SQL_NTS, "", 0, "x\\_\\_", SQL_NTS, + SQL_SCOPE_SESSION, SQL_NULLABLE), + SQL_ERROR); + is(check_sqlstate(hstmt, "HY000") == OK); + ok_stmt(hstmt, SQLGetDiagField(SQL_HANDLE_STMT, hstmt, 1, + SQL_DIAG_MESSAGE_TEXT, diagmsg, 100, NULL)); + /* Check that we get an error for the non-escaped table name */ + is(NULL != strstr(diagmsg, "Table 'x__.x__' doesn't exist")); + ok_stmt(hstmt, SQLFreeStmt(hstmt,SQL_CLOSE)); + return OK; +} + + BEGIN_TESTS ADD_TEST(my_columns_null) ADD_TEST(my_drop_table) @@ -1151,6 +1181,7 @@ ADD_TEST(t_bug26934) ADD_TEST(t_bug29888) ADD_TEST(t_bug14407) + ADD_TEST(t_bug30965) END_TESTS