﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
2149	ProgrammingError : PostgreSQL backend : missing a cast to handle inet with the ILIKE operator	guillaume.pratte@…	Adrian Holovaty	"Django SVN version and PostgreSQL 8.0

How to reproduce : 

1. Define the following model :

{{{
class Session(models.Model):
    username = models.CharField(maxlength = 30)
    ip = models.IPAddressField()
    class Meta:
        unique_together = ((""username"", ""ip""),)
}}}

2. Go in the admin interface

3. Add a new row for Sessions

It will fail :


{{{
Traceback (most recent call last):
File ""/usr/lib/python2.4/site-packages/django/core/handlers/base.py"" in get_response
  75. response = callback(request, *callback_args, **callback_kwargs)
File ""/usr/lib/python2.4/site-packages/django/contrib/admin/views/decorators.py"" in _checklogin
  54. return view_func(request, *args, **kwargs)
File ""/usr/lib/python2.4/site-packages/django/views/decorators/cache.py"" in _wrapped_view_func
  40. response = view_func(request, *args, **kwargs)
File ""/usr/lib/python2.4/site-packages/django/contrib/admin/views/main.py"" in add_stage
  253. errors = manipulator.get_validation_errors(new_data)
File ""/usr/lib/python2.4/site-packages/django/forms/__init__.py"" in get_validation_errors
  58. errors.update(field.get_validation_errors(new_data))
File ""/usr/lib/python2.4/site-packages/django/forms/__init__.py"" in get_validation_errors
  351. self.run_validator(new_data, validator)
File ""/usr/lib/python2.4/site-packages/django/forms/__init__.py"" in run_validator
  341. validator(new_data.get(self.field_name, ''), new_data)
File ""/usr/lib/python2.4/site-packages/django/db/models/manipulators.py"" in manipulator_validator_unique_together
  296. old_obj = self.manager.get(**kwargs)
File ""/usr/lib/python2.4/site-packages/django/db/models/manager.py"" in get
  66. return self.get_query_set().get(*args, **kwargs)
File ""/usr/lib/python2.4/site-packages/django/db/models/query.py"" in get
  202. obj_list = list(clone)
File ""/usr/lib/python2.4/site-packages/django/db/models/query.py"" in __iter__
  94. return iter(self._get_data())
File ""/usr/lib/python2.4/site-packages/django/db/models/query.py"" in _get_data
  412. self._result_cache = list(self.iterator())
File ""/usr/lib/python2.4/site-packages/django/db/models/query.py"" in iterator
  163. cursor.execute(""SELECT "" + (self._distinct and ""DISTINCT "" or """") + "","".join(select) + sql, params)
File ""/usr/lib/python2.4/site-packages/django/db/backends/util.py"" in execute
  12. return self.cursor.execute(sql, params)

  ProgrammingError at /admin/traffaccount/session/add/
  ERROR: operator does not exist: inet ~~* ""unknown"" HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts. SELECT ""traffaccount_session"".""id"",""traffaccount_session"".""username"",""traffaccount_session"".""ip"",""traffaccount_session"".""begin_tmst"",""traffaccount_session"".""end_tmst"",""traffaccount_session"".""in_octets"",""traffaccount_session"".""out_octets"",""traffaccount_session"".""in_delta"",""traffaccount_session"".""out_delta"" FROM ""traffaccount_session"" WHERE (""traffaccount_session"".""username"" ILIKE 'user' AND ""traffaccount_session"".""ip"" ILIKE '123.43.34.234')
}}}

I tried this manual SQL to debug:


{{{
select * from traffaccount_session where ip ilike cast('127.3.2.5' as inet);
ERROR:  operator does not exist: inet ~~* inet
HINT:  No operator matches the given name and argument type(s). You may need to add explicit type casts.
}}}


The correct way seems to be:


{{{
select * from traffaccount_session where cast(ip as char(15)) ilike '127.3.2.5';
}}}

"	defect	closed	Database layer (models, ORM)	dev	major	duplicate			Unreviewed	0	0	0	0	0	0
