Skip to content

Commit f027858

Browse files
committed
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5: Undo inadvertent commit of php_version Corrected patch for bug #60616
2 parents a7dad26 + ab4c4c3 commit f027858

File tree

5 files changed

+121
-26
lines changed

5 files changed

+121
-26
lines changed

ext/odbc/php_odbc.c

+44-19
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,9 @@ PHP_MINIT_FUNCTION(odbc)
780780
REGISTER_LONG_CONSTANT("SQL_TYPE_DATE", SQL_TYPE_DATE, CONST_PERSISTENT | CONST_CS);
781781
REGISTER_LONG_CONSTANT("SQL_TYPE_TIME", SQL_TYPE_TIME, CONST_PERSISTENT | CONST_CS);
782782
REGISTER_LONG_CONSTANT("SQL_TYPE_TIMESTAMP", SQL_TYPE_TIMESTAMP, CONST_PERSISTENT | CONST_CS);
783-
REGISTER_LONG_CONSTANT("SQL_TYPE_WVARCHAR", SQL_TYPE_WVARCHAR, CONST_PERSISTENT | CONST_CS);
784-
REGISTER_LONG_CONSTANT("SQL_TYPE_WLONGVARCHAR", SQL_TYPE_WLONGVARCHAR, CONST_PERSISTENT | CONST_CS);
783+
REGISTER_LONG_CONSTANT("SQL_WCHAR", SQL_WCHAR, CONST_PERSISTENT | CONST_CS);
784+
REGISTER_LONG_CONSTANT("SQL_WVARCHAR", SQL_WVARCHAR, CONST_PERSISTENT | CONST_CS);
785+
REGISTER_LONG_CONSTANT("SQL_WLONGVARCHAR", SQL_WLONGVARCHAR, CONST_PERSISTENT | CONST_CS);
785786

786787
/*
787788
* SQLSpecialColumns values
@@ -945,9 +946,13 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
945946
{
946947
RETCODE rc;
947948
int i;
948-
SQLSMALLINT colnamelen; /* Not used */
949-
SQLLEN displaysize;
949+
SQLSMALLINT colnamelen; /* Not used */
950+
SQLLEN displaysize;
951+
SQLUSMALLINT colfieldid;
952+
int charextraalloc;
950953

954+
colfieldid = SQL_COLUMN_DISPLAY_SIZE;
955+
charextraalloc = 0;
951956
result->values = (odbc_result_value *) safe_emalloc(sizeof(odbc_result_value), result->numcols, 0);
952957

953958
result->longreadlen = ODBCG(defaultlrl);
@@ -968,8 +973,9 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
968973
case SQL_VARBINARY:
969974
case SQL_LONGVARBINARY:
970975
case SQL_LONGVARCHAR:
971-
case SQL_WVARCHAR:
976+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
972977
case SQL_WLONGVARCHAR:
978+
#endif
973979
result->values[i].value = NULL;
974980
break;
975981

@@ -980,15 +986,27 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
980986
27, &result->values[i].vallen);
981987
break;
982988
#endif /* HAVE_ADABAS */
989+
case SQL_CHAR:
990+
case SQL_VARCHAR:
991+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
992+
case SQL_WCHAR:
993+
case SQL_WVARCHAR:
994+
colfieldid = SQL_DESC_OCTET_LENGTH;
995+
#else
996+
charextraalloc = 1;
997+
#endif
983998
default:
984-
rc = SQLColAttributes(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_DISPLAY_SIZE,
985-
NULL, 0, NULL, &displaysize);
986-
displaysize = displaysize <= result->longreadlen ? displaysize :
987-
result->longreadlen;
999+
rc = SQLColAttributes(result->stmt, (SQLUSMALLINT)(i+1), colfieldid,
1000+
NULL, 0, NULL, &displaysize);
9881001
/* Workaround for Oracle ODBC Driver bug (#50162) when fetching TIMESTAMP column */
9891002
if (result->values[i].coltype == SQL_TIMESTAMP) {
9901003
displaysize += 3;
9911004
}
1005+
1006+
if (charextraalloc) {
1007+
/* Since we don't know the exact # of bytes, allocate extra */
1008+
displaysize *= 4;
1009+
}
9921010
result->values[i].value = (char *)emalloc(displaysize + 1);
9931011
rc = SQLBindCol(result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR, result->values[i].value,
9941012
displaysize + 1, &result->values[i].vallen);
@@ -1728,9 +1746,10 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
17281746
if (result->binmode == 1) {
17291747
sql_c_type = SQL_C_BINARY;
17301748
}
1731-
case SQL_WVARCHAR:
1732-
case SQL_WLONGVARCHAR:
17331749
case SQL_LONGVARCHAR:
1750+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
1751+
case SQL_WLONGVARCHAR:
1752+
#endif
17341753
if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) {
17351754
Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC();
17361755
break;
@@ -1882,9 +1901,11 @@ PHP_FUNCTION(odbc_fetch_into)
18821901
break;
18831902
}
18841903
if (result->binmode == 1) sql_c_type = SQL_C_BINARY;
1885-
case SQL_WVARCHAR:
1886-
case SQL_WLONGVARCHAR:
1904+
18871905
case SQL_LONGVARCHAR:
1906+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
1907+
case SQL_WLONGVARCHAR:
1908+
#endif
18881909
if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) {
18891910
Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC();
18901911
break;
@@ -2103,8 +2124,9 @@ PHP_FUNCTION(odbc_result)
21032124
break;
21042125
}
21052126
case SQL_LONGVARCHAR:
2106-
case SQL_WVARCHAR:
2127+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
21072128
case SQL_WLONGVARCHAR:
2129+
#endif
21082130
if (IS_SQL_LONG(result->values[field_ind].coltype)) {
21092131
if (result->longreadlen <= 0) {
21102132
break;
@@ -2142,9 +2164,11 @@ PHP_FUNCTION(odbc_result)
21422164
}
21432165
/* Reduce fieldlen by 1 if we have char data. One day we might
21442166
have binary strings... */
2145-
if ((result->values[field_ind].coltype == SQL_LONGVARCHAR) ||
2146-
(result->values[field_ind].coltype == SQL_WVARCHAR) ||
2147-
(result->values[field_ind].coltype == SQL_WLONGVARCHAR)) {
2167+
if ((result->values[field_ind].coltype == SQL_LONGVARCHAR)
2168+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
2169+
|| (result->values[field_ind].coltype == SQL_WLONGVARCHAR)
2170+
#endif
2171+
) {
21482172
fieldsize -= 1;
21492173
}
21502174
/* Don't duplicate result, saves one emalloc.
@@ -2259,9 +2283,10 @@ PHP_FUNCTION(odbc_result_all)
22592283
break;
22602284
}
22612285
if (result->binmode <= 1) sql_c_type = SQL_C_BINARY;
2262-
case SQL_WVARCHAR:
2263-
case SQL_WLONGVARCHAR:
22642286
case SQL_LONGVARCHAR:
2287+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
2288+
case SQL_WLONGVARCHAR:
2289+
#endif
22652290
if (IS_SQL_LONG(result->values[i].coltype) &&
22662291
result->longreadlen <= 0) {
22672292
php_printf("<td>Not printable</td>");

ext/odbc/php_odbc_includes.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ PHP_FUNCTION(solid_fetch_prev);
115115
#endif
116116

117117
#define ODBC_TYPE "unixODBC"
118+
#undef ODBCVER
118119
#include <sql.h>
119120
#include <sqlext.h>
120121
#define HAVE_SQL_EXTENDED_FETCH 1
@@ -284,7 +285,11 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC);
284285

285286
void odbc_sql_error(ODBC_SQL_ERROR_PARAMS);
286287

287-
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || x == SQL_WVARCHAR || x == SQL_WLONGVARCHAR)
288+
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
289+
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || x == SQL_WLONGVARCHAR)
290+
#else
291+
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR)
292+
#endif
288293
#define IS_SQL_BINARY(x) (x == SQL_BINARY || x == SQL_VARBINARY || x == SQL_LONGVARBINARY)
289294

290295
#ifdef ZTS

ext/odbc/tests/bug60616.phpt

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
--TEST--
2+
odbc_exec(): Getting accurate unicode data from query
3+
--SKIPIF--
4+
<?php include 'skipif.inc'; ?>
5+
--FILE--
6+
<?php
7+
8+
// Test strings
9+
mb_internal_encoding("EUC_JP");
10+
$euc_jp_base64 = 'pdal6aWkpcCl676uyqo=';
11+
$euc_jp = base64_decode($euc_jp_base64);
12+
$ascii = 'abcdefghijklmnopqrstuvwxyz;]=#0123456789';
13+
14+
include 'config.inc';
15+
ini_set("odbc.defaultlrl", 4); // Set artifically low
16+
17+
$conn = odbc_connect($dsn, $user, $pass);
18+
19+
odbc_exec($conn, 'CREATE DATABASE odbcTEST ENCODING=\'EUC_JP\'');
20+
21+
odbc_exec($conn, 'CREATE TABLE FOO (ID INT, CHAR_COL CHAR(200), VARCHAR_COL VARCHAR(200), TEXT_COL TEXT)');
22+
23+
odbc_exec($conn, "INSERT INTO FOO(ID, CHAR_COL, VARCHAR_COL, TEXT_COL) VALUES (1, '$euc_jp', '$euc_jp', '$euc_jp')");
24+
odbc_exec($conn, "INSERT INTO FOO(ID, CHAR_COL, VARCHAR_COL, TEXT_COL) VALUES (2, '$ascii', '$ascii', '$ascii')");
25+
26+
$res = odbc_exec($conn, 'SELECT * FROM FOO ORDER BY ID ASC');
27+
28+
while(odbc_fetch_row($res)) {
29+
$char_col = odbc_result($res, "CHAR_COL");
30+
$varchar_col = odbc_result($res, "VARCHAR_COL");
31+
$id = odbc_result($res, "ID");
32+
$text_col = "";
33+
while (($chunk=odbc_result($res, "TEXT_COL")) !== false) {
34+
$text_col .= $chunk;
35+
}
36+
37+
if ($id == 1) {
38+
$euc_jp_check = $euc_jp . str_repeat(" ", (200 - mb_strlen($euc_jp)));
39+
if (strcmp($char_col, $euc_jp_check) == 0 && strcmp($varchar_col, $euc_jp) == 0 &&
40+
strcmp($text_col, $euc_jp) == 0) {
41+
print "EUC-JP matched\n";
42+
} else {
43+
print "EUC-JP mismatched\n";
44+
}
45+
} else {
46+
$ascii_check = $ascii . str_repeat(" ", (200 - strlen($ascii)));
47+
if (strcmp($char_col, $ascii_check) == 0 && strcmp($varchar_col, $ascii) == 0 &&
48+
strcmp($text_col, $ascii) == 0) {
49+
print "ASCII matched\n";
50+
} else {
51+
print "ASCII mismatched\n";
52+
}
53+
}
54+
}
55+
56+
?>
57+
--EXPECT--
58+
EUC-JP matched
59+
ASCII matched
60+
--CLEAN--
61+
<?php
62+
include 'config.inc';
63+
64+
$conn = odbc_connect($dsn, $user, $pass);
65+
66+
odbc_exec($conn, 'DROP TABLE FOO');
67+
odbc_exec($conn, 'DROP DATABASE odbcTEST');
68+
69+
?>

ext/odbc/tests/odbc_columns_001.phpt

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,5 @@ resource(%d) of type (odbc result)
2424
bool(false)
2525
resource(%d) of type (odbc result)
2626
bool(false)
27-
28-
Warning: odbc_columns(): SQL error: Failed to fetch error message, SQL state HY000 in SQLColumns in %s on line %d
27+
resource(%d) of type (odbc result)
2928
bool(false)
30-
31-
Warning: odbc_fetch_row() expects parameter 1 to be resource, boolean given in %s on line %d
32-
NULL

ext/odbc/tests/odbc_free_result_001.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ $conn = odbc_connect($dsn, $user, $pass);
1212
odbc_exec($conn, 'CREATE DATABASE odbcTEST');
1313

1414
odbc_exec($conn, 'CREATE TABLE FOO (TEST INT)');
15-
odbc_exec($conn, 'ALTER TABLE FOO ADD PRIMARY KEY FOO(TEST)');
15+
odbc_exec($conn, 'ALTER TABLE FOO ADD PRIMARY KEY (TEST)');
1616

1717
odbc_exec($conn, 'INSERT INTO FOO VALUES (1)');
1818
odbc_exec($conn, 'INSERT INTO FOO VALUES (2)');

0 commit comments

Comments
 (0)