What are the data types, string lengths, nullability, etc. of columns returned by the following query:
SELECT CONCAT(a.first_name, ' ', a.last_name) AS full_name,
GROUP_CONCAT(b.bug_id) AS bug_id_list,
COUNT(*) AS num_bugs,
SUM(b.status = 'OPEN')/COUNT(*) AS percent_of_open_bugs
FROM bugs b JOIN accounts a ON a.account_id = b.reported_by
GROUP BY a.account_id;
Result set metadata is about query results, not tables on disk. Queries may have expressions of different data types than any that occur in the underlying tables. If you capture that query and create a temp table based on it, you can see what I mean:
CREATE TEMPORARY TABLE foo SELECT ...query above...
DESCRIBE foo;
+----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+-------+
| full_name | varchar(41) | YES | | NULL | |
| bug_id_list | longblob | YES | | NULL | |
| num_bugs | bigint(21) | NO | | 0 | |
| percent_of_open_bugs | decimal(27,4) | YES | | NULL | |
+----------------------+---------------+------+-----+---------+-------+
I logged this feature request a long time ago because the PDOStatement interface had a new function getColumnMeta() that Zend_Db_Statement didn't implement.
However, that PDO statement is experimental and most (all?) PDO drivers don't implement it. Surfacing result set metadata through Zend_Db_Statement is therefore impossible, since the underlying drivers don't supply the information. So I would recommend postponing this Zend_Db feature request indefinitely, or simply close it as "won't fix."
Notes:
PDO has a method getColumnMeta() but it is noted as "experimental" in the PDO docs. Not all PDO drivers are guaranteed to support it. I haven't checked the status of support for this method in the PDO drivers we use in ZF.
The PDO getColumnMeta() method returns an associative array for a single column (specified by the 0-indexed ordinal number of the column), with the following keys:
MySQLi stmts have a result_metadata() method, so this could support result set metadata. The result_metadata() method returns a result-set object, which is an iterable collection of fields. Each field is an object. The documentation does not specify the members of this object.
The OCI API for Oracle has individual methods for metadata. So this could support result set metadata. The methods are:
- native_type
- driver:decl_type
- flags
- name
- len
- precision
- pdo_type
MySQLi stmts have a result_metadata() method, so this could support result set metadata. The result_metadata() method returns a result-set object, which is an iterable collection of fields. Each field is an object. The documentation does not specify the members of this object. The OCI API for Oracle has individual methods for metadata. So this could support result set metadata. The methods are: