Mantis - Quercus
Viewing Issue Advanced Details
2520 minor always 03-12-08 21:20 05-29-08 17:42
omnijared  
ferg  
normal  
closed  
fixed  
none    
none 3.2.0  
0002520: mysql_fetch_field / mysqli_fetch_fields; using DB name instead of Table name
It appears from my very basic tracing/handling that the fetch_field capabilities for both mysql/mysqli are using the DB name instead of the appropriate table name for meta data retrieval. I also tried using the other field related functions with the same results.


Initial Query:
SELECT `User`.`id`, `User`.`username`, `User`.`password` FROM `users` AS `User` WHERE 1 = 1 LIMIT 20
----------------------------

Resin: Resin-3.1.s080304 (built Tue, 04 Mar 2008 11:24:00 PST)
PHP Framework: CakePHP
Mysql Connector: mysql-connector-java-5.0.8-bin
[200801%D 01:01:48.196] com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'TestCake.COLUMNS' doesn't exist
[200801%D 01:01:48.196] at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
[200801%D 01:01:48.196] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
[200801%D 01:01:48.196] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
[200801%D 01:01:48.196] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
[200801%D 01:01:48.196] at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
[200801%D 01:01:48.196] at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
[200801%D 01:01:48.196] at com.mysql.jdbc.Statement.execute(Statement.java:727)
[200801%D 01:01:48.196] at com.mysql.jdbc.jdbc2.optional.StatementWrapper.execute(StatementWrapper.java:658)
[200801%D 01:01:48.196] at com.caucho.sql.UserStatement.execute(UserStatement.java:266)
[200801%D 01:01:48.196] at com.caucho.quercus.lib.db.Mysqli.metaQuery(Mysqli.java:1066)
[200801%D 01:01:48.196] at com.caucho.quercus.lib.db.MysqliResult.fetchFieldDirect(MysqliResult.java:278)
[200801%D 01:01:48.196] at com.caucho.quercus.lib.db.MysqliResult.getFieldDirectArray(MysqliResult.java:368)
[200801%D 01:01:48.196] at com.caucho.quercus.lib.db.MysqliResult.fetch_fields(MysqliResult.java:183)
[200801%D 01:01:48.196] at com.caucho.quercus.lib.db.MysqliModule.mysqli_fetch_fields(MysqliModule.java:341)
[200801%D 01:01:48.196] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[200801%D 01:01:48.196] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[200801%D 01:01:48.196] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[200801%D 01:01:48.196] at java.lang.reflect.Method.invoke(Method.java:597)
[200801%D 01:01:48.196] at com.caucho.quercus.module.StaticFunction.invoke(StaticFunction.java:129)
[200801%D 01:01:48.196] at com.caucho.quercus.env.JavaInvoker.callMethod(JavaInvoker.java:604)
[200801%D 01:01:48.196] at com.caucho.quercus.env.JavaInvoker.call(JavaInvoker.java:539)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.FunctionExpr.evalImpl(FunctionExpr.java:182)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.FunctionExpr.eval(FunctionExpr.java:126)
[200801%D 01:01:48.196] at com.caucho.quercus.env.JavaInvoker.evalArguments(JavaInvoker.java:415)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.FunctionExpr.evalImpl(FunctionExpr.java:170)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.FunctionExpr.eval(FunctionExpr.java:126)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.Expr.evalCopy(Expr.java:398)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.AssignExpr.eval(AssignExpr.java:86)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.Expr.evalBoolean(Expr.java:468)
[200801%D 01:01:48.196] at com.caucho.quercus.program.WhileStatement.execute(WhileStatement.java:59)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ReturnStatement.execute(ReturnStatement.java:68)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.Expr.evalCopy(Expr.java:398)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.AssignExpr.eval(AssignExpr.java:86)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.Expr.evalCopy(Expr.java:398)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.AssignExpr.eval(AssignExpr.java:86)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.QuercusClass.callNew(QuercusClass.java:656)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.VarNewExpr.eval(VarNewExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.Expr.evalRef(Expr.java:386)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.AssignRefExpr.eval(AssignRefExpr.java:74)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ForeachStatement.execute(ForeachStatement.java:175)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:557)
[200801%D 01:01:48.196] at com.caucho.quercus.env.QuercusClass.callMethod(QuercusClass.java:828)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.StaticMethodExpr.eval(StaticMethodExpr.java:148)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.Expr.evalCopy(Expr.java:398)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.AssignExpr.eval(AssignExpr.java:86)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:78)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:75)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.callImpl(Function.java:354)
[200801%D 01:01:48.196] at com.caucho.quercus.program.Function.call(Function.java:294)
[200801%D 01:01:48.196] at com.caucho.quercus.program.AbstractFunction.callMethod(AbstractFunction.java:309)
[200801%D 01:01:48.196] at com.caucho.quercus.env.ObjectExtValue.callMethod(ObjectExtValue.java:602)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.MethodCallExpr.eval(MethodCallExpr.java:104)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.IfStatement.execute(IfStatement.java:78)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.QuercusProgram.execute(QuercusProgram.java:239)
[200801%D 01:01:48.196] at com.caucho.quercus.page.InterpretedPage.execute(InterpretedPage.java:70)
[200801%D 01:01:48.196] at com.caucho.quercus.env.Env.include(Env.java:3633)
[200801%D 01:01:48.196] at com.caucho.quercus.expr.IncludeExpr.eval(IncludeExpr.java:86)
[200801%D 01:01:48.196] at com.caucho.quercus.program.ExprStatement.execute(ExprStatement.java:64)
[200801%D 01:01:48.196] at com.caucho.quercus.program.BlockStatement.execute(BlockStatement.java:107)
[200801%D 01:01:48.196] at com.caucho.quercus.program.QuercusProgram.execute(QuercusProgram.java:239)
[200801%D 01:01:48.196] at com.caucho.quercus.page.InterpretedPage.execute(InterpretedPage.java:70)
[200801%D 01:01:48.196] at com.caucho.quercus.page.QuercusPage.executeTop(QuercusPage.java:119)
[200801%D 01:01:48.196] at com.caucho.quercus.servlet.ResinQuercusServlet.service(ResinQuercusServlet.java:146)
[200801%D 01:01:48.196] at com.caucho.quercus.servlet.QuercusServlet.service(QuercusServlet.java:353)
[200801%D 01:01:48.196] at javax.servlet.http.HttpServlet.service(HttpServlet.java:91)
[200801%D 01:01:48.196] at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103)
[200801%D 01:01:48.196] at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)
[200801%D 01:01:48.196] at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:266)
[200801%D 01:01:48.196] at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:269)
[200801%D 01:01:48.196] at com.caucho.server.port.TcpConnection.run(TcpConnection.java:603)
[200801%D 01:01:48.196] at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:721)
[200801%D 01:01:48.196] at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:643)
[200801%D 01:01:48.196] at java.lang.Thread.run(Thread.java:619)

Notes
(0002858)
omnijared   
03-20-08 05:36   
The real issue appears to be that the (*)_fetch_fields and fetch_field_direct are actually working for normal SELECT statements but are not working with resultsets for DESCRIBE statements.

** This was verified with the trunk head revision on 03/20/08
(0002986)
ferg   
04-16-08 16:00   
php/141p for mysql

mysqli (php/1f2u) still does not work (unable to get the underlying table)
(0002996)
nam   
04-17-08 19:44   
Affected:
MySQL Connector/J 5.1

Not Affected:
MySQL Connector/J 3.1

From mysql JDBC 3.1 to 5.0/5.1, the mysql guys changed what ResultSetMetaData
returns for getTableName(). As a result, table name aliasing does
not work for mysql JDBC 5.1.6, but works in 3.1.x. The workaround
is to set "useOldAliasMetadataBehavior=true" in the JDBC url,
but that option itself is broken in 5.1.6!

http://bugs.mysql.com/bug.php?id=35753 [^]
http://bugs.mysql.com/bug.php?id=36327 [^]

(0003021)
omnijared   
04-29-08 08:31   
I tried this with MySql JDBC 3.1.14, and resin head from 04/22/08 and I still see the same error. If Quercus is getting the DESCRIBE values returned from JDBC 3.1.x correctly it is not returning it to fetchFieldDirect properly
(0003119)
ferg   
05-29-08 17:42   
php/1453

Note, this fix is for the DESCRIBE, not the table alias. The mysql jdbc driver does not support table aliases for fetch in the current driver.