CompileError after upgrading to r3866

Issue #894 resolved
Former user created an issue

I get following type of error after upgrading to r3866:

      File "c:\svn\sqlalchemy\lib\sqlalchemy\engine\base.py", line 796, in execute
        return Connection.executors[c](c)(self, object, multiparams, params)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\engine\base.py", line 847, in execute_clauseelement
        return self._execute_compiled(elem.compile(dialect=self.dialect, column_keys=keys, inline=len(params) > 1), distilled_params=params)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\expression.py", line 1040, in compile
        compiler.compile()
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 167, in compile
        self.string = self.process(self.statement)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 522, in visit_select
        t = self.process(whereclause)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 368, in visit_binary
        return self.process(binary.left) + " " + op + " " + self.process(binary.right)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 220, in visit_grouping
        return "(" + self.process(grouping.elem) + ")"
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 522, in visit_select
        t = self.process(whereclause)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 306, in visit_clauselist
        return sep.join([for s in [self.process(c) for c in clauselist.clauses](s) if s is not None])
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 368, in visit_binary
        return self.process(binary.left) + " " + op + " " + self.process(binary.right)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 175, in process
        return meth(obj, **kwargs)
      File "c:\svn\sqlalchemy\lib\sqlalchemy\sql\compiler.py", line 380, in visit_bindparam
        raise exceptions.CompileError("Bind parameter '%s' conflicts with unique bind parameter of the same name" % bindparam.key)
    sqlalchemy.exceptions.CompileError: Bind parameter '{ANON 37553072 object_properties_name}' conflicts with unique bind parameter of the same name

This query uses no explicit bind params, and prior to r3866 used to work fine. There are 2 implicit (from column==literal type criteria) bind params created by sqlalchemy though, one in subquery, which i suspect is somehow connected to reason for the error. Generated SQL (postgres) looked like this before r3866:

SELECT user_domains.name, 
  (SELECT object_properties.value FROM object_properties 
   WHERE object_properties.id = user_domains.id 
AND   object_properties.name = %(object_properties_name)s) 
AS anon_1 FROM user_domains 
    WHERE user_domains.name = %(user_domains_name)s

Comments (4)

  1. Mike Bayer repo owner

    i cant possibly do anything here without a working test script. over 1000 unit tests pass with the new code including hundreds of subqueries, so its not at all obvious what your specific situation is....

    reopen this ticket with a test case.

  2. Former user Account Deleted
    • changed status to open
    • removed status

    Shortest test case i was able to come up with. Works fine with 261e76259ae6d7c9b99ce2a858e86ec8115ad81d, fails with 541b6772e9b8a09b10bd7a16fa9e2b7f693d1194:

    from sqlalchemy import *
    metadata = MetaData()
    
    main = Table('main', metadata,
        Column('id', Integer, primary_key = True,  autoincrement=False),
        Column('name', Unicode, nullable = False),
    )
    sub = Table('sub', metadata,
        Column('id', Integer, ForeignKey(main.c.id), primary_key = True,  autoincrement=False),
        Column('name', Unicode, primary_key = True),
        Column('value', Unicode, nullable = False)
    )
    subquery = select(columns = [sub.c.name](sub.c.name),
                      whereclause = and_(sub.c.id==main.c.id,sub.c.value==u'test')).as_scalar()
    mainquery = select(columns = [subquery](main.c.name,),  whereclause = and_(subquery==u'test3'))
    print str(mainquery)
    
  3. Log in to comment