|
36 | 36 | #endif
|
37 | 37 |
|
38 | 38 | /* from postgresql/src/include/catalog/pg_type.h */
|
| 39 | +#define BOOLLABEL "bool" |
39 | 40 | #define BOOLOID 16
|
| 41 | +#define BYTEALABEL "bytea" |
40 | 42 | #define BYTEAOID 17
|
41 |
| -#define INT8OID 20 |
| 43 | +#define DATELABEL "date" |
| 44 | +#define DATEOID 1082 |
| 45 | +#define INT2LABEL "int2" |
42 | 46 | #define INT2OID 21
|
| 47 | +#define INT4LABEL "int4" |
43 | 48 | #define INT4OID 23
|
44 |
| -#define TEXTOID 25 |
| 49 | +#define INT8LABEL "int8" |
| 50 | +#define INT8OID 20 |
45 | 51 | #define OIDOID 26
|
| 52 | +#define TEXTLABEL "text" |
| 53 | +#define TEXTOID 25 |
| 54 | +#define TIMESTAMPLABEL "timestamp" |
| 55 | +#define TIMESTAMPOID 1114 |
| 56 | +#define VARCHARLABEL "varchar" |
| 57 | +#define VARCHAROID 1043 |
| 58 | + |
| 59 | + |
46 | 60 |
|
47 | 61 | static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
|
48 | 62 | {
|
@@ -591,29 +605,46 @@ static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, zend_long colno, zval *r
|
591 | 605 | array_init(return_value);
|
592 | 606 | add_assoc_long(return_value, "pgsql:oid", S->cols[colno].pgsql_type);
|
593 | 607 |
|
594 |
| - /* Fetch metadata from Postgres system catalogue */ |
595 |
| - spprintf(&q, 0, "SELECT TYPNAME FROM PG_TYPE WHERE OID=%u", S->cols[colno].pgsql_type); |
596 |
| - res = PQexec(S->H->server, q); |
597 |
| - efree(q); |
598 |
| - |
599 |
| - status = PQresultStatus(res); |
600 |
| - |
601 |
| - if (status != PGRES_TUPLES_OK) { |
602 |
| - /* Failed to get system catalogue, but return success |
603 |
| - * with the data we have collected so far |
604 |
| - */ |
605 |
| - goto done; |
606 |
| - } |
607 |
| - |
608 |
| - /* We want exactly one row returned */ |
609 |
| - if (1 != PQntuples(res)) { |
610 |
| - goto done; |
611 |
| - } |
612 |
| - |
613 |
| - add_assoc_string(return_value, "native_type", PQgetvalue(res, 0, 0)); |
614 |
| -done: |
615 |
| - PQclear(res); |
616 |
| - return 1; |
| 608 | + switch (S->cols[colno].pgsql_type) { |
| 609 | + case BOOLOID: |
| 610 | + add_assoc_string(return_value, "native_type", BOOLLABEL); |
| 611 | + break; |
| 612 | + case BYTEAOID: |
| 613 | + add_assoc_string(return_value, "native_type", BYTEALABEL); |
| 614 | + break; |
| 615 | + case INT8OID: |
| 616 | + add_assoc_string(return_value, "native_type", INT8LABEL); |
| 617 | + break; |
| 618 | + case INT2OID: |
| 619 | + add_assoc_string(return_value, "native_type", INT2LABEL); |
| 620 | + break; |
| 621 | + case INT4OID: |
| 622 | + add_assoc_string(return_value, "native_type", INT4LABEL); |
| 623 | + break; |
| 624 | + case TEXTOID: |
| 625 | + add_assoc_string(return_value, "native_type", TEXTLABEL); |
| 626 | + break; |
| 627 | + case VARCHAROID: |
| 628 | + add_assoc_string(return_value, "native_type", VARCHARLABEL); |
| 629 | + break; |
| 630 | + case DATEOID: |
| 631 | + add_assoc_string(return_value, "native_type", DATELABEL); |
| 632 | + break; |
| 633 | + case TIMESTAMPOID: |
| 634 | + add_assoc_string(return_value, "native_type", TIMESTAMPLABEL); |
| 635 | + break; |
| 636 | + default: |
| 637 | + /* Fetch metadata from Postgres system catalogue */ |
| 638 | + spprintf(&q, 0, "SELECT TYPNAME FROM PG_TYPE WHERE OID=%u", S->cols[colno].pgsql_type); |
| 639 | + res = PQexec(S->H->server, q); |
| 640 | + efree(q); |
| 641 | + status = PQresultStatus(res); |
| 642 | + if (status == PGRES_TUPLES_OK && 1 == PQntuples(res)) { |
| 643 | + add_assoc_string(return_value, "native_type", PQgetvalue(res, 0, 0)); |
| 644 | + } |
| 645 | + PQclear(res); |
| 646 | + } |
| 647 | + return 1; |
617 | 648 | }
|
618 | 649 |
|
619 | 650 | static int pdo_pgsql_stmt_cursor_closer(pdo_stmt_t *stmt)
|
|
0 commit comments