Hello:
  I was getting incorrect SQL from statements like:

db(db.paper.authors.contains(person.id)).select()

where

db.define_table('paper',
    Field('title'),
    Field('authors', 'list:reference person'),
    )


  so I rewrote dal.MySQLAdapter.CONTAINS from:

    def CONTAINS(self, first, second):
        if first.type in ('string', 'text'):
            key = '%'+str(second).replace('%','%%')+'%'
        elif first.type.startswith('list:'):
            key = '%|'+str(second).replace('|','||').replace('%','%%')+'|%'
        return '(%s LIKE %s)' % 
(self.expand(first),self.expand(key,'string'))

into:

    def CONTAINS(self, first, second):
        if first.type in ('string', 'text'):
            key = '%'+str(second).replace('%','%%')+'%'
        elif first.type.startswith('list:reference'):
            return 'INSTR(%s, %s)'%(first, str(second))
        elif first.type.startswith('list:'):
            key = '%|'+str(second).replace('|','||').replace('%','%%')+'|%'
        return '(%s LIKE %s)' % 
(self.expand(first),self.expand(key,'string'))

now the above query works, but that's in MySQL, not SQLite, which 
apparently does not have  a INSTR operation, despite the fact that it is 
advertised!

https://www.sqlite.org/lang_corefunc.html

Can anybody think of a solution that works in more databases

-- 



Reply via email to