I disagree. this SELECT * FROM table where field ILIKE '%|featured|%';
is valid SQL. % does not need to be escaped in SQL and, in fact, it is used for pattern patching: http://www.postgresql.org/docs/7.4/static/functions-matching.html Perhaps new-relic may have a bug. On Dec 14, 5:30 pm, pbreit <pbreitenb...@gmail.com> wrote: > I have been trying out New Relic and have found that any queries that > include '%' are breaking. > > This is what Graham at New Relic advised: > > As far as I can tell: > > ILIKE '%|featured|%' > > would cause a problem because the mogrify() function in psycopg2 cursor > which does variable substitution doesn't care about quoted values and will > try and do a % substitution where ever it sees one. The only time it will > not is when is actually %% meaning a single escaped %, which it would then > replace with just a single %. > > So right now to me looks like Web2Py is generating incorrect SQL. > > In general it is regarded as best practice to never do full SQL > construction yourself and to always rely on DBAPI module to do variable > text interpolation and Web2Py isn't doing that. > > The errors I get look like this: > > Traceback (most recent call last): > File "/opt/web2py/gluon/restricted.py", line 204, in restricted > exec ccode in environment > File "/opt/web2py/applications/init/controllers/default.py" > <https://test.pricetack.com/admin/edit/init/controllers/default.py>, line > 129, in <module> > File "/opt/web2py/gluon/globals.py", line 162, in <lambda> > self._caller = lambda f: f() > File "/opt/web2py/applications/init/controllers/default.py" > <https://test.pricetack.com/admin/edit/init/controllers/default.py>, line 20, > in home > (db.auth_user.id==db.item.seller)).select(limitby=(0,4), > orderby='<random>') > File "/opt/web2py/gluon/dal.py", line 5825, in select > return self.db._adapter.select(self.query,fields,attributes) > File "/opt/web2py/gluon/dal.py", line 1275, in select > rows = response(sql) > File "/opt/web2py/gluon/dal.py", line 1265, in response > self.execute(sql) > File "/opt/web2py/gluon/dal.py", line 1351, in execute > return self.log_execute(*a, **b) > File "/opt/web2py/gluon/dal.py", line 1345, in log_execute > ret = self.cursor.execute(*a, **b) > File > "/usr/local/lib/python2.6/dist-packages/newrelic-1.0.5.156-py2.6.egg/newrel > ic/hooks/database_dbapi2.py", line 38, in execute > return self._nr_cursor.execute(sql, parameters) > IndexError: tuple index out of range > > *File > /usr/local/lib/python2.6/dist-packages/newrelic-1.0.5.156-py2.6.egg/newreli > c/hooks/database_dbapi2.py > in execute at line 38* code argumentsvariables > Function argument list > > (self=<newrelic.hooks.database_dbapi2.CursorWrapper object>, sql='SELECT > item.id, item.title, item.seller, item.s...item.seller)) ORDER BY RANDOM() > LIMIT 4 OFFSET 0;', parameters=()) > Code listing > > 33. > 34. > 35. > 36. > 37. > 38. > > 39. > 40. > 41. > 42. > > transaction = newrelic.api.transaction.transaction() > if not transaction: > return self._nr_cursor.execute(sql, parameters) > with newrelic.api.database_trace.DatabaseTrace( > transaction, sql, module): > return self._nr_cursor.execute(sql, parameters) > > def executemany(self, sql, seq_of_parameters=[]): > transaction = newrelic.api.transaction.transaction() > if not transaction: > > Variablesself._nr_cursor.execute<built-in method execute of > psycopg2._psycopg.cursor > object>self<newrelic.hooks.database_dbapi2.CursorWrapper > object>self._nr_cursor<cursor object at 0x29ffc18; closed: > 0>parameters()sql'SELECT > item.id, item.title, item.seller, item.s...item.seller)) ORDER BY RANDOM() > LIMIT 4 OFFSET 0;'