Re: [jira] Updated: (CAY-1298) String no longer works in query when column type is Integer

From: Andrey Razumovsky (razumovsky.andre..mail.com)
Date: Mon Jan 11 2010 - 14:39:23 EST

  • Next message: Andrus Adamchik: "Re: [jira] Updated: (CAY-1298) String no longer works in query when column type is Integer"

    Actually I've been using such syntax myself (we also talked about that when
    discussing generified expressions). I really want this ability to stay in
    some way, since it saves time and unnecessary code. Currently it works for
    me in MySQL when id column is BIGINT (and I'm searching by a string). Most
    DBMS allow comparing string to an int, why shouldn't we?

    2010/1/11 Andrus Adamchik <andru..bjectstyle.org>

    > I think this is working as advertised now, and was working purely by
    > accident before. E.g.:
    >
    > http://cayenne.apache.org/doc/path-expressions.html
    >
    > "As described in the following chapters a path expression is usually
    > matched against some value (see for example ExpressionFactory API - the
    > first argument to each method is a path, and a second - an object value that
    > is matched against the path). A type of such value must be compatible with
    > the type of the property pointed to by the path. E.g. toArtist.artistName
    > can only be matched against a String, and toArtist - against instances of
    > Artist."
    >
    > Andrus
    >
    >
    > On Jan 11, 2010, at 8:38 PM, Andrey Razumovsky (JIRA) wrote:
    >
    >
    >> [
    >> https://issues.apache.org/jira/browse/CAY-1298?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
    >> ]
    >>
    >> Andrey Razumovsky updated CAY-1298:
    >> -----------------------------------
    >>
    >> Fix Version/s: 3.0RC2
    >>
    >> This is a regression and should be addressed before final release
    >>
    >> String no longer works in query when column type is Integer
    >>> -----------------------------------------------------------
    >>>
    >>> Key: CAY-1298
    >>> URL: https://issues.apache.org/jira/browse/CAY-1298
    >>> Project: Cayenne
    >>> Issue Type: Bug
    >>> Components: Core Library
    >>> Affects Versions: 3.0 beta 1
    >>> Environment: IcedTea6 1.6.1
    >>> PostgreSQL 8.3
    >>> JDBC 8.3-603.jdbc4
    >>> Reporter: Dave Dombrosky
    >>> Priority: Minor
    >>> Fix For: 3.0RC2
    >>>
    >>> Attachments: CharType.diff
    >>>
    >>>
    >>> I have queries that no longer work in 3.0B1, because of a change that was
    >>> made in revision 813661. For example, a query like this used to work:
    >>> DataObjectUtils.objectForPK(db, Artist.class, "1");
    >>> But now, I get the following error:
    >>> org.postgresql.util.PSQLException: ERROR: operator does not exist:
    >>> smallint = character varying
    >>> at
    >>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
    >>> at
    >>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
    >>> at
    >>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
    >>> at
    >>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
    >>> at
    >>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
    >>> at
    >>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
    >>> at
    >>> org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:71)
    >>> at
    >>> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
    >>> at
    >>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:274)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:418)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:65)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:391)
    >>> at
    >>> org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:850)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:388)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.interceptOIDQuery(DataDomainQueryAction.java:155)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:112)
    >>> at
    >>> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:743)
    >>> at
    >>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:333)
    >>> at
    >>> org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
    >>> at
    >>> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1278)
    >>> at
    >>> org.apache.cayenne.access.DataContext.performQuery(DataContext.java:1267)
    >>> at
    >>> org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java:273)
    >>> at
    >>> org.apache.cayenne.DataObjectUtils.objectForPK(DataObjectUtils.java:259)
    >>> at
    >>> org.apache.cayenne.DataObjectUtils.objectForPK(DataObjectUtils.java:170)
    >>> at Test.main(Test.java:9)
    >>> Exception in thread "main" org.apache.cayenne.CayenneRuntimeException:
    >>> [v.3.0-SNAPSHOT Oct 30 2009 10:19:35] Query exception.
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java:545)
    >>> at
    >>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:281)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:418)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:65)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:391)
    >>> at
    >>> org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:850)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:388)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.interceptOIDQuery(DataDomainQueryAction.java:155)
    >>> at
    >>> org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:112)
    >>> at
    >>> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:743)
    >>> at
    >>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:333)
    >>> at
    >>> org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
    >>> at
    >>> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1278)
    >>> at
    >>> org.apache.cayenne.access.DataContext.performQuery(DataContext.java:1267)
    >>> at
    >>> org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java:273)
    >>> at
    >>> org.apache.cayenne.DataObjectUtils.objectForPK(DataObjectUtils.java:259)
    >>> at
    >>> org.apache.cayenne.DataObjectUtils.objectForPK(DataObjectUtils.java:170)
    >>> at Test.main(Test.java:9)
    >>> Caused by: org.postgresql.util.PSQLException: ERROR: operator does not
    >>> exist: smallint = character varying
    >>> at
    >>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
    >>> at
    >>> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
    >>> at
    >>> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
    >>> at
    >>> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
    >>> at
    >>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
    >>> at
    >>> org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
    >>> at
    >>> org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:71)
    >>> at
    >>> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
    >>> at
    >>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:274)
    >>> ... 16 more
    >>> The strange part is that the logger shows the query as SELECT t0.name,
    >>> t0.id FROM lookup.color t0 WHERE t0.id = ? [bind: 1->id:'1'], both
    >>> before and after the change. Postgres can usually deal with using a
    >>> character type to match on an integer column. Something must have changed
    >>> with the JDBC binding that is not showing up in the textual representation
    >>> of the query.
    >>>
    >>
    >> --
    >> This message is automatically generated by JIRA.
    >> -
    >> You can reply to this email to add a comment to the issue online.
    >>
    >>
    >>
    >

    -- 
    Andrey
    



    This archive was generated by hypermail 2.0.0 : Mon Jan 11 2010 - 14:40:20 EST