mirror of
https://github.com/php/php-src.git
synced 2024-10-03 07:46:12 +00:00
Merge branch 'PHP-5.5'
* PHP-5.5: Fixed bug #64609 (pg_convert enum type support)
This commit is contained in:
commit
ab25fcb2a1
@ -4998,7 +4998,7 @@ PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, z
|
|||||||
}
|
}
|
||||||
|
|
||||||
smart_str_appends(&querystr,
|
smart_str_appends(&querystr,
|
||||||
"SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotNULL, a.atthasdef, a.attndims "
|
"SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotnull, a.atthasdef, a.attndims, t.typtype = 'e' "
|
||||||
"FROM pg_class as c, pg_attribute a, pg_type t, pg_namespace n "
|
"FROM pg_class as c, pg_attribute a, pg_type t, pg_namespace n "
|
||||||
"WHERE a.attnum > 0 AND a.attrelid = c.oid AND c.relname = '");
|
"WHERE a.attnum > 0 AND a.attrelid = c.oid AND c.relname = '");
|
||||||
tmp_name2 = php_addslashes(tmp_name2, strlen(tmp_name2), &new_len, 0 TSRMLS_CC);
|
tmp_name2 = php_addslashes(tmp_name2, strlen(tmp_name2), &new_len, 0 TSRMLS_CC);
|
||||||
@ -5044,6 +5044,12 @@ PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, z
|
|||||||
add_assoc_bool(elem, "has default", 0);
|
add_assoc_bool(elem, "has default", 0);
|
||||||
}
|
}
|
||||||
add_assoc_long(elem, "array dims", atoi(PQgetvalue(pg_result,i,6)));
|
add_assoc_long(elem, "array dims", atoi(PQgetvalue(pg_result,i,6)));
|
||||||
|
if (!strcmp(PQgetvalue(pg_result,i,7), "t")) {
|
||||||
|
add_assoc_bool(elem, "is enum", 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
add_assoc_bool(elem, "is enum", 0);
|
||||||
|
}
|
||||||
name = PQgetvalue(pg_result,i,0);
|
name = PQgetvalue(pg_result,i,0);
|
||||||
add_assoc_zval(meta, name, elem);
|
add_assoc_zval(meta, name, elem);
|
||||||
}
|
}
|
||||||
@ -5077,6 +5083,17 @@ PHP_FUNCTION(pg_meta_data)
|
|||||||
zval_dtor(return_value); /* destroy array */
|
zval_dtor(return_value); /* destroy array */
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
HashPosition pos;
|
||||||
|
zval **val;
|
||||||
|
|
||||||
|
for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(return_value), &pos);
|
||||||
|
zend_hash_get_current_data_ex(Z_ARRVAL_P(return_value), (void **)&val, &pos) == SUCCESS;
|
||||||
|
zend_hash_move_forward_ex(Z_ARRVAL_P(return_value), &pos)) {
|
||||||
|
/* delete newly added entry, in order to keep BC */
|
||||||
|
zend_hash_del_key_or_index(Z_ARRVAL_PP(val), "is enum", sizeof("is enum"), 0, HASH_DEL_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
@ -5259,8 +5276,9 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
|
|||||||
char *field = NULL;
|
char *field = NULL;
|
||||||
uint field_len = -1;
|
uint field_len = -1;
|
||||||
ulong num_idx = -1;
|
ulong num_idx = -1;
|
||||||
zval *meta, **def, **type, **not_null, **has_default, **val, *new_val;
|
zval *meta, **def, **type, **not_null, **has_default, **is_enum, **val, *new_val;
|
||||||
int new_len, key_type, err = 0, skip_field;
|
int new_len, key_type, err = 0, skip_field;
|
||||||
|
php_pgsql_data_type data_type;
|
||||||
|
|
||||||
assert(pg_link != NULL);
|
assert(pg_link != NULL);
|
||||||
assert(Z_TYPE_P(values) == IS_ARRAY);
|
assert(Z_TYPE_P(values) == IS_ARRAY);
|
||||||
@ -5311,17 +5329,30 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
|
|||||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected broken meta data. Missing 'has default'");
|
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected broken meta data. Missing 'has default'");
|
||||||
err = 1;
|
err = 1;
|
||||||
}
|
}
|
||||||
|
if (!err && zend_hash_find(Z_ARRVAL_PP(def), "is enum", sizeof("is enum"), (void **)&is_enum) == FAILURE) {
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected broken meta data. Missing 'is enum'");
|
||||||
|
err = 1;
|
||||||
|
}
|
||||||
if (!err && (Z_TYPE_PP(val) == IS_ARRAY ||
|
if (!err && (Z_TYPE_PP(val) == IS_ARRAY ||
|
||||||
Z_TYPE_PP(val) == IS_OBJECT ||
|
Z_TYPE_PP(val) == IS_OBJECT ||
|
||||||
Z_TYPE_PP(val) == IS_CONSTANT_ARRAY)) {
|
Z_TYPE_PP(val) == IS_CONSTANT_ARRAY)) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Expects scaler values as field values");
|
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Expects scalar values as field values");
|
||||||
err = 1;
|
err = 1;
|
||||||
}
|
}
|
||||||
if (err) {
|
if (err) {
|
||||||
break; /* break out for() */
|
break; /* break out for() */
|
||||||
}
|
}
|
||||||
ALLOC_INIT_ZVAL(new_val);
|
ALLOC_INIT_ZVAL(new_val);
|
||||||
switch(php_pgsql_get_data_type(Z_STRVAL_PP(type), Z_STRLEN_PP(type)))
|
|
||||||
|
if (Z_BVAL_PP(is_enum)) {
|
||||||
|
/* enums need to be treated like strings */
|
||||||
|
data_type = PG_TEXT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data_type = php_pgsql_get_data_type(Z_STRVAL_PP(type), Z_STRLEN_PP(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(data_type)
|
||||||
{
|
{
|
||||||
case PG_BOOL:
|
case PG_BOOL:
|
||||||
switch (Z_TYPE_PP(val)) {
|
switch (Z_TYPE_PP(val)) {
|
||||||
|
30
ext/pgsql/tests/bug64609.phpt
Normal file
30
ext/pgsql/tests/bug64609.phpt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
--TEST--
|
||||||
|
Bug #64609 (pg_convert enum type support)
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
include("skipif.inc");
|
||||||
|
skip_server_version('8.3', '<');
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
|
||||||
|
include 'config.inc';
|
||||||
|
|
||||||
|
$db = pg_connect($conn_str);
|
||||||
|
pg_query("BEGIN");
|
||||||
|
pg_query("CREATE TYPE t_enum AS ENUM ('ok', 'ko')");
|
||||||
|
pg_query("CREATE TABLE test_enum (a t_enum)");
|
||||||
|
|
||||||
|
$fields = array('a' => 'ok');
|
||||||
|
$converted = pg_convert($db, 'test_enum', $fields);
|
||||||
|
|
||||||
|
pg_query("ROLLBACK");
|
||||||
|
|
||||||
|
var_dump($converted);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
array(1) {
|
||||||
|
["a"]=>
|
||||||
|
string(4) "'ok'"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user