mirror of
				https://github.com/django/django.git
				synced 2025-11-04 05:35:37 +00:00 
			
		
		
		
	Fixed #12818. SQLite now properly quotes strings for date extraction and truncation. Thanks, SmilyChris.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12573 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		
							parent
							
								
									d76fc2c2a0
								
							
						
					
					
						commit
						2f45af6f58
					
				
					 3 changed files with 45 additions and 4 deletions
				
			
		| 
						 | 
					@ -63,13 +63,17 @@ class DatabaseFeatures(BaseDatabaseFeatures):
 | 
				
			||||||
class DatabaseOperations(BaseDatabaseOperations):
 | 
					class DatabaseOperations(BaseDatabaseOperations):
 | 
				
			||||||
    def date_extract_sql(self, lookup_type, field_name):
 | 
					    def date_extract_sql(self, lookup_type, field_name):
 | 
				
			||||||
        # sqlite doesn't support extract, so we fake it with the user-defined
 | 
					        # sqlite doesn't support extract, so we fake it with the user-defined
 | 
				
			||||||
        # function django_extract that's registered in connect().
 | 
					        # function django_extract that's registered in connect(). Note that
 | 
				
			||||||
        return 'django_extract("%s", %s)' % (lookup_type.lower(), field_name)
 | 
					        # single quotes are used because this is a string (and could otherwise
 | 
				
			||||||
 | 
					        # cause a collision with a field name).
 | 
				
			||||||
 | 
					        return "django_extract('%s', %s)" % (lookup_type.lower(), field_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def date_trunc_sql(self, lookup_type, field_name):
 | 
					    def date_trunc_sql(self, lookup_type, field_name):
 | 
				
			||||||
        # sqlite doesn't support DATE_TRUNC, so we fake it with a user-defined
 | 
					        # sqlite doesn't support DATE_TRUNC, so we fake it with a user-defined
 | 
				
			||||||
        # function django_date_trunc that's registered in connect().
 | 
					        # function django_date_trunc that's registered in connect(). Note that
 | 
				
			||||||
        return 'django_date_trunc("%s", %s)' % (lookup_type.lower(), field_name)
 | 
					        # single quotes are used because this is a string (and could otherwise
 | 
				
			||||||
 | 
					        # cause a collision with a field name).
 | 
				
			||||||
 | 
					        return "django_date_trunc('%s', %s)" % (lookup_type.lower(), field_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def drop_foreignkey_sql(self):
 | 
					    def drop_foreignkey_sql(self):
 | 
				
			||||||
        return ""
 | 
					        return ""
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,11 @@ class Person(models.Model):
 | 
				
			||||||
    def __unicode__(self):
 | 
					    def __unicode__(self):
 | 
				
			||||||
        return u'%s %s' % (self.first_name, self.last_name)
 | 
					        return u'%s %s' % (self.first_name, self.last_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SchoolClass(models.Model):
 | 
				
			||||||
 | 
					    year = models.PositiveIntegerField()
 | 
				
			||||||
 | 
					    day = models.CharField(max_length=9, blank=True)
 | 
				
			||||||
 | 
					    last_updated = models.DateTimeField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qn = connection.ops.quote_name
 | 
					qn = connection.ops.quote_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__test__ = {'API_TESTS': """
 | 
					__test__ = {'API_TESTS': """
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,12 @@
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
# Unit and doctests for specific database backends.
 | 
					# Unit and doctests for specific database backends.
 | 
				
			||||||
 | 
					import datetime
 | 
				
			||||||
 | 
					import models
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
from django.db import backend, connection, DEFAULT_DB_ALIAS
 | 
					from django.db import backend, connection, DEFAULT_DB_ALIAS
 | 
				
			||||||
from django.db.backends.signals import connection_created
 | 
					from django.db.backends.signals import connection_created
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.test import TestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Callproc(unittest.TestCase):
 | 
					class Callproc(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +37,35 @@ class LongString(unittest.TestCase):
 | 
				
			||||||
            c.execute('DROP TABLE ltext')
 | 
					            c.execute('DROP TABLE ltext')
 | 
				
			||||||
            self.assertEquals(long_str, row[0].read())
 | 
					            self.assertEquals(long_str, row[0].read())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DateQuotingTest(TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_django_date_trunc(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Test the custom ``django_date_trunc method``, in particular against
 | 
				
			||||||
 | 
					        fields which clash with strings passed to it (e.g. 'year') - see
 | 
				
			||||||
 | 
					        #12818__.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        __: http://code.djangoproject.com/ticket/12818
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        updated = datetime.datetime(2010, 2, 20)
 | 
				
			||||||
 | 
					        models.SchoolClass.objects.create(year=2009, last_updated=updated)
 | 
				
			||||||
 | 
					        years = models.SchoolClass.objects.dates('last_updated', 'year')
 | 
				
			||||||
 | 
					        self.assertEqual(list(years), [datetime.datetime(2010, 1, 1, 0, 0)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_django_extract(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Test the custom ``django_extract method``, in particular against fields
 | 
				
			||||||
 | 
					        which clash with strings passed to it (e.g. 'day') - see #12818__.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        __: http://code.djangoproject.com/ticket/12818
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        updated = datetime.datetime(2010, 2, 20)
 | 
				
			||||||
 | 
					        models.SchoolClass.objects.create(year=2009, last_updated=updated)
 | 
				
			||||||
 | 
					        classes = models.SchoolClass.objects.filter(last_updated__day=20)
 | 
				
			||||||
 | 
					        self.assertEqual(len(classes), 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def connection_created_test(sender, **kwargs):
 | 
					def connection_created_test(sender, **kwargs):
 | 
				
			||||||
    print 'connection_created signal'
 | 
					    print 'connection_created signal'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue