diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index f432dcd..657e98b 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -972,6 +972,11 @@ int odbc_bindcols(odbc_result *result) /* Don't bind LONG / BINARY columns, so that fetch behaviour can * be controlled by odbc_binmode() / odbc_longreadlen() */ + + if (result->values[i].vallen <= 0) { + // Probably SQL_NO_TOTAL (-4) or not returned (0). FreeTDS is returning this for SQL_VARCHAR, but we need the SQL_LONGVARCHAR branch triggered + result->values[i].coltype = SQL_LONGVARCHAR; + } switch(result->values[i].coltype) { case SQL_BINARY: @@ -1775,6 +1780,11 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type) for(i = 0; i < result->numcols; i++) { sql_c_type = SQL_C_CHAR; + if (result->values[i].vallen <= 0) { + // Probably SQL_NO_TOTAL (-4) or not returned (0). FreeTDS is returning this for SQL_VARCHAR, but we need the SQL_LONGVARCHAR branch triggered + result->values[i].coltype = SQL_LONGVARCHAR; + } + switch(result->values[i].coltype) { case SQL_BINARY: case SQL_VARBINARY: @@ -1929,6 +1939,11 @@ PHP_FUNCTION(odbc_fetch_into) for(i = 0; i < result->numcols; i++) { sql_c_type = SQL_C_CHAR; + if (result->values[i].vallen <= 0) { + // Probably SQL_NO_TOTAL (-4) or not returned (0). FreeTDS is returning this for SQL_VARCHAR, but we need the SQL_LONGVARCHAR branch triggered + result->values[i].coltype = SQL_LONGVARCHAR; + } + switch(result->values[i].coltype) { case SQL_BINARY: case SQL_VARBINARY: @@ -2155,6 +2170,11 @@ PHP_FUNCTION(odbc_result) result->fetched++; } + if (result->values[field_ind].vallen <= 0) { + // Probably SQL_NO_TOTAL (-4) or not returned (0). FreeTDS is returning this for SQL_VARCHAR, but we need the SQL_LONGVARCHAR branch triggered + result->values[field_ind].coltype = SQL_LONGVARCHAR; + } + switch(result->values[field_ind].coltype) { case SQL_BINARY: case SQL_VARBINARY: @@ -2320,6 +2340,11 @@ PHP_FUNCTION(odbc_result_all) result->fetched++; php_printf("