diff --git a/.travis.yml b/.travis.yml index 6fe7cef..54929a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,211 +1,21 @@ sudo: false language: python python: - - 2.6 - 2.7 - - 3.2 - - 3.3 - - 3.4 - - 3.5 - 3.6 env: - - SQLOBJECT='sqlobject>=1.5.0,<1.6.0' DB='all' - - SQLOBJECT='sqlobject>=1.6.0,<1.7.0' DB='all' - - SQLOBJECT='sqlobject>=1.7.0,<1.8.0' DB='all' - - SQLOBJECT='sqlobject>=2.0.0,<2.1.0' DB='all' - - SQLOBJECT='sqlobject>=2.1.0,<2.2.0' DB='all' - - SQLOBJECT='sqlobject>=2.2.0,<2.3.0' DB='all' - - SQLOBJECT='sqlobject>=3.0.0,<3.1.0' DB='all' - - SQLOBJECT='sqlobject>=3.1.0,<3.2.0' DB='all' - - SQLOBJECT='sqlobject>=3.2.0,<3.3.0' DB='all' - - SQLOBJECT='sqlobject>=3.3.0,<3.4.0' DB='all' - - PEEWEE='peewee>=2.2.0,<2.3.0' DB='all' - - PEEWEE='peewee>=2.3.0,<2.4.0' DB='all' - - PEEWEE='peewee>=2.4.0,<2.5.0' DB='all' - - PEEWEE='peewee>=2.5.0,<2.6.0' DB='all' - - PEEWEE='peewee>=2.6.0,<2.7.0' DB='all' - - PEEWEE='peewee>=2.7.0,<2.8.0' DB='all' - - PEEWEE='peewee>=2.8.0,<2.9.0' DB='all' - - PEEWEE='peewee>=2.9.0,<2.10.0' DB='all' - - PONY='pony>=0.5.0,<0.6.0' DB='all' - - PONY='pony>=0.6.0,<0.7.0' DB='all' - - PONY='pony>=0.7.0,<0.8.0' DB='all' - - SQLALCHEMY='sqlalchemy>=0.8.0,<0.9.0' DB='all' - - SQLALCHEMY='sqlalchemy>=0.9.0,<0.10.0' DB='all' - - SQLALCHEMY='sqlalchemy>=1.0.0,<1.1.0' DB='all' - SQLALCHEMY='sqlalchemy>=1.1.0,<1.2.0' DB='all' - - DJANGO='django>=1.4.0,<1.5.0' DB='all' - - DJANGO='django>=1.5.0,<1.6.0' DB='all' - - DJANGO='django>=1.6.0,<1.7.0' DB='all' - - DJANGO='django>=1.7.0,<1.8.0' DB='all' - - DJANGO='django>=1.8.0,<1.9.0' DB='all' - - DJANGO='django>=1.9.0,<1.10.0' DB='all' - - DJANGO='django>=1.10.0,<1.11.0' DB='all' - DJANGO='django>=1.11.0,<1.12.0' DB='all' matrix: fast_finish: true - exclude: - - python: 3.2 - env: SQLOBJECT='sqlobject>=1.5.0,<1.6.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=1.6.0,<1.7.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=1.7.0,<1.8.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=2.0.0,<2.1.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=2.1.0,<2.2.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=2.2.0,<2.3.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=3.0.0,<3.1.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=3.1.0,<3.2.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=3.2.0,<3.3.0' DB='all' - - python: 3.2 - env: SQLOBJECT='sqlobject>=3.3.0,<3.4.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=1.5.0,<1.6.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=1.6.0,<1.7.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=1.7.0,<1.8.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=2.0.0,<2.1.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=2.1.0,<2.2.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=2.2.0,<2.3.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=3.0.0,<3.1.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=3.1.0,<3.2.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=3.2.0,<3.3.0' DB='all' - - python: 3.3 - env: SQLOBJECT='sqlobject>=3.3.0,<3.4.0' DB='all' - - python: 3.4 - env: SQLOBJECT='sqlobject>=1.5.0,<1.6.0' DB='all' - - python: 3.4 - env: SQLOBJECT='sqlobject>=1.6.0,<1.7.0' DB='all' - - python: 3.4 - env: SQLOBJECT='sqlobject>=1.7.0,<1.8.0' DB='all' - - python: 3.4 - env: SQLOBJECT='sqlobject>=2.0.0,<2.1.0' DB='all' - - python: 3.4 - env: SQLOBJECT='sqlobject>=2.1.0,<2.2.0' DB='all' - - python: 3.4 - env: SQLOBJECT='sqlobject>=2.2.0,<2.3.0' DB='all' - - python: 3.5 - env: SQLOBJECT='sqlobject>=1.5.0,<1.6.0' DB='all' - - python: 3.5 - env: SQLOBJECT='sqlobject>=1.6.0,<1.7.0' DB='all' - - python: 3.5 - env: SQLOBJECT='sqlobject>=1.7.0,<1.8.0' DB='all' - - python: 3.5 - env: SQLOBJECT='sqlobject>=2.0.0,<2.1.0' DB='all' - - python: 3.5 - env: SQLOBJECT='sqlobject>=2.1.0,<2.2.0' DB='all' - - python: 3.5 - env: SQLOBJECT='sqlobject>=2.2.0,<2.3.0' DB='all' - - python: 3.6 - env: SQLOBJECT='sqlobject>=1.5.0,<1.6.0' DB='all' - - python: 3.6 - env: SQLOBJECT='sqlobject>=1.6.0,<1.7.0' DB='all' - - python: 3.6 - env: SQLOBJECT='sqlobject>=1.7.0,<1.8.0' DB='all' - - python: 3.6 - env: SQLOBJECT='sqlobject>=2.0.0,<2.1.0' DB='all' - - python: 3.6 - env: SQLOBJECT='sqlobject>=2.1.0,<2.2.0' DB='all' - - python: 3.6 - env: SQLOBJECT='sqlobject>=2.2.0,<2.3.0' DB='all' - - python: 2.6 - env: DJANGO='django>=1.7.0,<1.8.0' DB='all' - - python: 2.6 - env: DJANGO='django>=1.8.0,<1.9.0' DB='all' - - python: 2.6 - env: DJANGO='django>=1.9.0,<1.10.0' DB='all' - - python: 2.6 - env: DJANGO='django>=1.10.0,<1.11.0' DB='all' - - python: 2.6 - env: DJANGO='django>=1.11.0,<1.12.0' DB='all' - - python: 3.2 - env: DJANGO='django>=1.4.0,<1.5.0' DB='all' - - python: 3.2 - env: DJANGO='django>=1.9.0,<1.10.0' DB='all' - - python: 3.2 - env: DJANGO='django>=1.10.0,<1.11.0' DB='all' - - python: 3.2 - env: DJANGO='django>=1.11.0,<1.12.0' DB='all' - - python: 3.3 - env: DJANGO='django>=1.4.0,<1.5.0' DB='all' - - python: 3.3 - env: DJANGO='django>=1.9.0,<1.10.0' DB='all' - - python: 3.3 - env: DJANGO='django>=1.10.0,<1.11.0' DB='all' - - python: 3.3 - env: DJANGO='django>=1.11.0,<1.12.0' DB='all' - - python: 3.4 - env: DJANGO='django>=1.4.0,<1.5.0' DB='all' - - python: 3.5 - env: DJANGO='django>=1.4.0,<1.5.0' DB='all' - - python: 3.5 - env: DJANGO='django>=1.5.0,<1.6.0' DB='all' - - python: 3.5 - env: DJANGO='django>=1.6.0,<1.7.0' DB='all' - - python: 3.5 - env: DJANGO='django>=1.7.0,<1.8.0' DB='all' - - python: 3.6 - env: DJANGO='django>=1.4.0,<1.5.0' DB='all' - - python: 3.6 - env: DJANGO='django>=1.5.0,<1.6.0' DB='all' - - python: 3.6 - env: DJANGO='django>=1.6.0,<1.7.0' DB='all' - - python: 3.6 - env: DJANGO='django>=1.7.0,<1.8.0' DB='all' - - python: 2.6 - env: PONY='pony>=0.6.0,<0.7.0' DB='all' - - python: 2.6 - env: PONY='pony>=0.7.0,<0.8.0' DB='all' - - python: 3.2 - env: PONY='pony>=0.5.0,<0.6.0' DB='all' - - python: 3.2 - env: PONY='pony>=0.6.0,<0.7.0' DB='all' - - python: 3.2 - env: PONY='pony>=0.7.0,<0.8.0' DB='all' - - python: 3.3 - env: PONY='pony>=0.5.0,<0.6.0' DB='all' - - python: 3.4 - env: PONY='pony>=0.5.0,<0.6.0' DB='all' - - python: 3.5 - env: PONY='pony>=0.5.0,<0.6.0' DB='all' - - python: 3.6 - env: PONY='pony>=0.5.0,<0.6.0' DB='all' - - python: 3.6 - env: PONY='pony>=0.6.0,<0.7.0' DB='all' - - python: 3.2 - env: PEEWEE='peewee>=2.8.0,<2.9.0' DB='all' - - python: 3.2 - env: PEEWEE='peewee>=2.9.0,<2.10.0' DB='all' - - python: 3.3 - env: PEEWEE='peewee>=2.8.0,<2.9.0' DB='all' - - python: 3.3 - env: PEEWEE='peewee>=2.9.0,<2.10.0' DB='all' before_script: - psql -c 'create database architect;' -U postgres - mysql -e 'create database architect;' -u root install: - travis_retry pip install -r tests/requirements.txt - travis_retry pip install coveralls psycopg2 pymysql - - if [[ $TRAVIS_PYTHON_VERSION == '2.6' ]]; then travis_retry pip install unittest2 argparse; fi - - if [[ $TRAVIS_PYTHON_VERSION == '3.2' ]]; then travis_retry pip install 'coverage<4.0' 'pymysql<0.7.0'; fi - if [[ $DJANGO ]]; then travis_retry pip install $DJANGO; fi - - if [[ $PEEWEE ]]; then travis_retry pip install $PEEWEE; fi - - if [[ $PONY ]]; then travis_retry pip install $PONY; fi - if [[ $SQLALCHEMY ]]; then travis_retry pip install $SQLALCHEMY; fi - - if [[ $SQLOBJECT ]]; then travis_retry pip install $SQLOBJECT; fi script: - nosetests --with-coverage --cover-erase --cover-package=architect after_success: diff --git a/architect/databases/bases.py b/architect/databases/bases.py index e0efab7..5ad6729 100644 --- a/architect/databases/bases.py +++ b/architect/databases/bases.py @@ -19,6 +19,7 @@ def __init__(self, model, **meta): self.column_value = meta['column_value'] self.column_name = meta['column'] self.pks = meta['pk'] if isinstance(meta['pk'], list) else [meta['pk']] + self.return_null = meta.get('return_null', False) def prepare(self): """ diff --git a/architect/databases/postgresql/partition.py b/architect/databases/postgresql/partition.py index b8cc5a3..3419eed 100644 --- a/architect/databases/postgresql/partition.py +++ b/architect/databases/postgresql/partition.py @@ -45,7 +45,7 @@ def prepare(self): definitions[definition] = '\n'.join(definitions[definition]).format(**formatters) - return self.database.execute(""" + execute_sql = """ -- We need to create a before insert function CREATE OR REPLACE FUNCTION {{safe_tablename}}_insert_child() RETURNS TRIGGER AS $$ @@ -72,7 +72,7 @@ def prepare(self): END; EXECUTE 'INSERT INTO ' || tablename || ' VALUES (($1).*);' USING NEW; - RETURN NEW; + RETURN {{return_val}}; END; $$ LANGUAGE plpgsql SECURITY DEFINER; @@ -90,7 +90,9 @@ def prepare(self): FOR EACH ROW EXECUTE PROCEDURE {{safe_tablename}}_insert_child(); END IF; END $$; - + """ + if not self.return_null: + execute_sql += """ -- Then we create a function to delete duplicate row from the master table after insert CREATE OR REPLACE FUNCTION {{safe_tablename}}_delete_master() RETURNS TRIGGER AS $$ @@ -114,11 +116,14 @@ def prepare(self): FOR EACH ROW EXECUTE PROCEDURE {{safe_tablename}}_delete_master(); END IF; END $$; - """.format(**definitions).format( + """ + + return self.database.execute(execute_sql.format(**definitions).format( pk=' AND '.join('{pk} = NEW.{pk}'.format(pk=pk) for pk in self.pks), parent_table=self.table, column='"{0}"'.format(self.column_name), - safe_tablename=self.safe_tablename + safe_tablename=self.safe_tablename, + return_val='NULL' if self.return_null else 'NEW' )) def exists(self): diff --git a/tests/models/django.py b/tests/models/django.py index 54f23b9..b3e775e 100644 --- a/tests/models/django.py +++ b/tests/models/django.py @@ -51,55 +51,58 @@ # Generation of entities for date range partitioning for item in ('day', 'week', 'month', 'year'): - class Meta(object): - app_label = 'test' - db_table = 'test_rangedate{0}'.format(item) - - name = '{0}RangeDate{1}'.format(dbname, item.capitalize()) - partition = install('partition', type='range', subtype='date', constraint=item, column='created') - - locals()[name] = partition(type(name, (models.Model,), { - '__module__': 'test.models', - 'name': models.CharField(max_length=255), - 'created': models.DateTimeField(null=True), - 'Meta': Meta, - 'db': database, - })) - - if database == 'pgsql': - # Generation of entities for integer range partitioning - for item in ('2', '5'): + for return_null in (True, False): class Meta(object): app_label = 'test' - db_table = 'test_rangeinteger{0}'.format(item) + db_table = 'test_rangedate{0}{1}'.format(item, '_return_null' if return_null else '') - name = '{0}RangeInteger{1}'.format(dbname, item) - partition = install('partition', type='range', subtype='integer', constraint=item, column='num') + name = '{0}RangeDate{1}{2}'.format(dbname, item.capitalize(), 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype='date', constraint=item, column='created', return_null=return_null) locals()[name] = partition(type(name, (models.Model,), { '__module__': 'test.models', 'name': models.CharField(max_length=255), - 'num': models.IntegerField(null=True), + 'created': models.DateTimeField(null=True), 'Meta': Meta, 'db': database, })) - # Generation of entities for string range partitioning - for subtype in ('string_firstchars', 'string_lastchars'): - for item in ('2', '5'): + if database == 'pgsql': + # Generation of entities for integer range partitioning + for item in ('2', '5'): + for return_null in (True, False): class Meta(object): app_label = 'test' - db_table = 'test_range{0}{1}'.format(subtype, item) + db_table = 'test_rangeinteger{0}{1}'.format(item, '_return_null' if return_null else '') - name = '{0}Range{1}{2}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item) - partition = install('partition', type='range', subtype=subtype, constraint=item, column='title') + name = '{0}RangeInteger{1}{2}'.format(dbname, item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype='integer', constraint=item, column='num', return_null=return_null) locals()[name] = partition(type(name, (models.Model,), { '__module__': 'test.models', 'name': models.CharField(max_length=255), - 'title': models.CharField(max_length=255, null=True), + 'num': models.IntegerField(null=True), 'Meta': Meta, 'db': database, })) + # Generation of entities for string range partitioning + for subtype in ('string_firstchars', 'string_lastchars'): + for item in ('2', '5'): + for return_null in (True, False): + class Meta(object): + app_label = 'test' + db_table = 'test_range{0}{1}{2}'.format(subtype, item, '_return_null' if return_null else '') + + name = '{0}Range{1}{2}{3}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype=subtype, constraint=item, column='title', return_null=return_null) + + locals()[name] = partition(type(name, (models.Model,), { + '__module__': 'test.models', + 'name': models.CharField(max_length=255), + 'title': models.CharField(max_length=255, null=True), + 'Meta': Meta, + 'db': database, + })) + management.call_command(command, database=database, run_syncdb=True, verbosity=0, interactive=False) diff --git a/tests/models/pony.py b/tests/models/pony.py index 6c3ea43..a614393 100644 --- a/tests/models/pony.py +++ b/tests/models/pony.py @@ -20,37 +20,40 @@ # Generation of entities for date range partitioning for item in ('day', 'week', 'month', 'year'): - name = '{0}RangeDate{1}'.format(dbname, item.capitalize()) - partition = install('partition', type='range', subtype='date', constraint=item, column='created') + for return_null in (True, False): + name = '{0}RangeDate{1}{2}'.format(dbname, item.capitalize(), 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype='date', constraint=item, column='created', return_null=return_null) - locals()[name] = partition(type(name, (db.Entity,), { - '_table_': 'test_rangedate{0}'.format(item), - 'name': Required(unicode), - 'created': Optional(datetime.datetime, nullable=True), - })) + locals()[name] = partition(type(name, (db.Entity,), { + '_table_': 'test_rangedate{0}{1}'.format(item, '_return_null' if return_null else ''), + 'name': Required(unicode), + 'created': Optional(datetime.datetime, nullable=True), + })) if database == 'pgsql': # Generation of entities for integer range partitioning for item in ('2', '5'): - name = '{0}RangeInteger{1}'.format(dbname, item) - partition = install('partition', type='range', subtype='integer', constraint=item, column='num') + for return_null in (True, False): + name = '{0}RangeInteger{1}{2}'.format(dbname, item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype='integer', constraint=item, column='num', return_null=return_null) - locals()[name] = partition(type(name, (db.Entity,), { - '_table_': 'test_rangeinteger{0}'.format(item), - 'name': Required(unicode), - 'num': Optional(int, nullable=True) - })) + locals()[name] = partition(type(name, (db.Entity,), { + '_table_': 'test_rangeinteger{0}{1}'.format(item, '_return_null' if return_null else ''), + 'name': Required(unicode), + 'num': Optional(int, nullable=True) + })) # Generation of entities for string range partitioning for subtype in ('string_firstchars', 'string_lastchars'): for item in ('2', '5'): - name = '{0}Range{1}{2}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item) - partition = install('partition', type='range', subtype=subtype, constraint=item, column='title') - - locals()[name] = partition(type(name, (db.Entity,), { - '_table_': 'test_range{0}{1}'.format(subtype, item), - 'name': Required(unicode), - 'title': Optional(unicode, nullable=True), - })) + for return_null in (True, False): + name = '{0}Range{1}{2}{3}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype=subtype, constraint=item, column='title', return_null=return_null) + + locals()[name] = partition(type(name, (db.Entity,), { + '_table_': 'test_range{0}{1}{2}'.format(subtype, item, '_return_null' if return_null else ''), + 'name': Required(unicode), + 'title': Optional(unicode, nullable=True), + })) db.generate_mapping(create_tables=True) diff --git a/tests/models/sqlalchemy.py b/tests/models/sqlalchemy.py index 372d4af..5e52274 100644 --- a/tests/models/sqlalchemy.py +++ b/tests/models/sqlalchemy.py @@ -22,16 +22,17 @@ # Generation of entities for date range partitioning for item in ('day', 'week', 'month', 'year'): - name = '{0}RangeDate{1}'.format(dbname, item.capitalize()) - partition = install( - 'partition', type='range', subtype='date', constraint=item, column='created', db=engine.url) + for return_null in (True, False): + name = '{0}RangeDate{1}{2}'.format(dbname, item.capitalize(), 'ReturnNULL' if return_null else '') + partition = install( + 'partition', type='range', subtype='date', constraint=item, column='created', db=engine.url, return_null=return_null) - locals()[name] = partition(type(name, (Base,), { - '__tablename__': 'test_rangedate{0}'.format(item), - 'id': Column(Integer, primary_key=True), - 'name': Column(String(length=255)), - 'created': Column(DateTime, nullable=True) - })) + locals()[name] = partition(type(name, (Base,), { + '__tablename__': 'test_rangedate{0}{1}'.format(item, '_return_null' if return_null else ''), + 'id': Column(Integer, primary_key=True), + 'name': Column(String(length=255)), + 'created': Column(DateTime, nullable=True) + })) if database == 'pgsql': # Use a very long table name @@ -58,31 +59,33 @@ 'created': Column(DateTime, nullable=True) })) + if database == 'pgsql': # Generation of entities for integer range partitioning for item in ('2', '5'): - name = '{0}RangeInteger{1}'.format(dbname, item) - partition = install( - 'partition', type='range', subtype='integer', constraint=item, column='num', db=engine.url) - - locals()[name] = partition(type(name, (Base,), { - '__tablename__': 'test_rangeinteger{0}'.format(item), - 'id': Column(Integer, primary_key=True), - 'name': Column(String(length=255)), - 'num': Column(Integer, nullable=True) - })) - - # Generation of entities for string range partitioning - for subtype in ('string_firstchars', 'string_lastchars'): - for item in ('2', '5'): - name = '{0}Range{1}{2}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item) + for return_null in (True, False): + name = '{0}RangeInteger{1}{2}'.format(dbname, item, 'ReturnNULL' if return_null else '') partition = install( - 'partition', type='range', subtype=subtype, constraint=item, column='title', db=engine.url) + 'partition', type='range', subtype='integer', constraint=item, column='num', db=engine.url, return_null=return_null) locals()[name] = partition(type(name, (Base,), { - '__tablename__': 'test_range{0}{1}'.format(subtype, item), + '__tablename__': 'test_rangeinteger{0}{1}'.format(item, '_return_null' if return_null else ''), 'id': Column(Integer, primary_key=True), 'name': Column(String(length=255)), - 'title': Column(String(length=255), nullable=True) + 'num': Column(Integer, nullable=True) })) + # Generation of entities for string range partitioning + for subtype in ('string_firstchars', 'string_lastchars'): + for item in ('2', '5'): + for return_null in (True, False): + name = '{0}Range{1}{2}{3}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype=subtype, constraint=item, column='title', db=engine.url, return_null=return_null) + + locals()[name] = partition(type(name, (Base,), { + '__tablename__': 'test_range{0}{1}{2}'.format(subtype, item, '_return_null' if return_null else ''), + 'id': Column(Integer, primary_key=True), + 'name': Column(String(length=255)), + 'title': Column(String(length=255), nullable=True) + })) + Base.metadata.create_all(engine) diff --git a/tests/models/sqlobject.py b/tests/models/sqlobject.py index 0dad852..693a953 100644 --- a/tests/models/sqlobject.py +++ b/tests/models/sqlobject.py @@ -22,53 +22,57 @@ # Generation of entities for date range partitioning for item in ('day', 'week', 'month', 'year'): - class sqlmeta(object): - table = 'test_rangedate{0}'.format(item) - - name = '{0}RangeDate{1}'.format(dbname, item.capitalize()) - partition = install('partition', type='range', subtype='date', constraint=item, column='created') - - locals()[name] = partition(type(name, (SQLObject,), { - 'name': StringCol(), - 'created': DateTimeCol(default=None), - 'sqlmeta': sqlmeta, - '_connection': connection - })) - - locals()[name].createTable(True) - - if database == 'pgsql': - # Generation of entities for integer range partitioning - for item in ('2', '5'): + for return_null in (True, False): class sqlmeta(object): - table = 'test_rangeinteger{0}'.format(item) + table = 'test_rangedate{0}{1}'.format(item, '_return_null' if return_null else '') + - name = '{0}RangeInteger{1}'.format(dbname, item) - partition = install('partition', type='range', subtype='integer', constraint=item, column='num') + name = '{0}RangeDate{1}{2}'.format(dbname, item.capitalize(), 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype='date', constraint=item, column='created', return_null=return_null) locals()[name] = partition(type(name, (SQLObject,), { 'name': StringCol(), - 'num': IntCol(default=None), + 'created': DateTimeCol(default=None), 'sqlmeta': sqlmeta, '_connection': connection })) locals()[name].createTable(True) - # Generation of entities for string range partitioning - for subtype in ('string_firstchars', 'string_lastchars'): - for item in ('2', '5'): + if database == 'pgsql': + # Generation of entities for integer range partitioning + for item in ('2', '5'): + for return_null in (True, False): class sqlmeta(object): - table = 'test_range{0}{1}'.format(subtype, item) + table = 'test_rangeinteger{0}{1}'.format(item, '_return_null' if return_null else '') - name = '{0}Range{1}{2}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item) - partition = install('partition', type='range', subtype=subtype, constraint=item, column='title') + name = '{0}RangeInteger{1}{2}'.format(dbname, item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype='integer', constraint=item, column='num', return_null=return_null) locals()[name] = partition(type(name, (SQLObject,), { 'name': StringCol(), - 'title': StringCol(default=None), + 'num': IntCol(default=None), 'sqlmeta': sqlmeta, '_connection': connection })) locals()[name].createTable(True) + + # Generation of entities for string range partitioning + for subtype in ('string_firstchars', 'string_lastchars'): + for item in ('2', '5'): + for return_null in (True, False): + class sqlmeta(object): + table = 'test_range{0}{1}{2}'.format(subtype, item, '_return_null' if return_null else '') + + name = '{0}Range{1}{2}{3}'.format(dbname, ''.join(s.capitalize() for s in subtype.split('_')), item, 'ReturnNULL' if return_null else '') + partition = install('partition', type='range', subtype=subtype, constraint=item, column='title', return_null=return_null) + + locals()[name] = partition(type(name, (SQLObject,), { + 'name': StringCol(), + 'title': StringCol(default=None), + 'sqlmeta': sqlmeta, + '_connection': connection + })) + + locals()[name].createTable(True) diff --git a/tests/test_django.py b/tests/test_django.py index 9cbaf7a..6fe592a 100644 --- a/tests/test_django.py +++ b/tests/test_django.py @@ -80,6 +80,13 @@ def test_range_date_day_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_day_return_null(self): + object1 = PgsqlRangeDateDayReturnNULL.objects.create(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateDayReturnNULL.objects.raw( + 'SELECT * FROM test_rangedateday_return_null_y2014d105 WHERE id = %s', [object1.id])[0] + + self.assertTrue(object1.name, object2.name) + def test_range_date_week(self): object1 = PgsqlRangeDateWeek.objects.create(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) object2 = PgsqlRangeDateWeek.objects.raw( @@ -94,6 +101,13 @@ def test_range_date_week_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_week_return_null(self): + object1 = PgsqlRangeDateWeekReturnNULL.objects.create(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateWeekReturnNULL.objects.raw( + 'SELECT * FROM test_rangedateweek_return_null_y2014w16 WHERE id = %s', [object1.id])[0] + + self.assertTrue(object1.name, object2.name) + def test_range_date_month(self): object1 = PgsqlRangeDateMonth.objects.create(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) object2 = PgsqlRangeDateMonth.objects.raw( @@ -108,6 +122,13 @@ def test_range_date_month_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_month_return_null(self): + object1 = PgsqlRangeDateMonthReturnNULL.objects.create(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateMonthReturnNULL.objects.raw( + 'SELECT * FROM test_rangedatemonth_return_null_y2014m04 WHERE id = %s', [object1.id])[0] + + self.assertTrue(object1.name, object2.name) + def test_range_date_year(self): object1 = PgsqlRangeDateYear.objects.create(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) object2 = PgsqlRangeDateYear.objects.raw( @@ -122,6 +143,13 @@ def test_range_date_year_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_year_return_null(self): + object1 = PgsqlRangeDateYearReturnNULL.objects.create(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateYearReturnNULL.objects.raw( + 'SELECT * FROM test_rangedateyear_return_null_y2014 WHERE id = %s', [object1.id])[0] + + self.assertTrue(object1.name, object2.name) + def test_range_integer_positive(self): object1 = PgsqlRangeInteger2.objects.create(name='foo', num=3) object2 = PgsqlRangeInteger2.objects.raw('SELECT * FROM test_rangeinteger2_3_4 WHERE id = %s', [object1.id])[0] @@ -160,6 +188,15 @@ def test_range_integer_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_integer_positive_return_null(self): + object1 = PgsqlRangeInteger2ReturnNULL.objects.create(id=1, name='foo', num=3) + object2 = PgsqlRangeInteger2ReturnNULL.objects.raw('SELECT * FROM test_rangeinteger2_return_null_3_4 WHERE id = %s', [object1.id])[0] + object3 = PgsqlRangeInteger5ReturnNULL.objects.create(id=1, name='foo', num=3) + object4 = PgsqlRangeInteger5ReturnNULL.objects.raw('SELECT * FROM test_rangeinteger5_return_null_1_5 WHERE id = %s', [object3.id])[0] + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + def test_range_string_firstchars(self): object1 = PgsqlRangeStringFirstchars2.objects.create(name='foo', title='abcdef') object2 = PgsqlRangeStringFirstchars2.objects.raw( @@ -193,6 +230,17 @@ def test_range_string_firstchars_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_string_firstchars_return_null(self): + object1 = PgsqlRangeStringFirstchars2ReturnNULL.objects.create(id=1, name='foo', title='abcdef') + object2 = PgsqlRangeStringFirstchars2ReturnNULL.objects.raw( + 'SELECT * FROM tbl_a90c0c0e1882e3b0495c0463cc628794_ab WHERE id = %s', [object1.id])[0] + object3 = PgsqlRangeStringFirstchars5ReturnNULL.objects.create(id=1, name='foo', title='abcdef') + object4 = PgsqlRangeStringFirstchars5ReturnNULL.objects.raw( + 'SELECT * FROM tbl_a56c045d05b09ad40cb8e4790d32768f_abcde WHERE id = %s', [object3.id])[0] + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + def test_range_string_lastchars(self): object1 = PgsqlRangeStringLastchars2.objects.create(name='foo', title='abcdef') object2 = PgsqlRangeStringLastchars2.objects.raw( @@ -226,6 +274,17 @@ def test_range_string_lastchars_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_string_lastchars_return_null(self): + object1 = PgsqlRangeStringLastchars2ReturnNULL.objects.create(id=1, name='foo', title='abcdef') + object2 = PgsqlRangeStringLastchars2ReturnNULL.objects.raw( + 'SELECT * FROM tbl_16021a4feb7b46a0d93b4b662de198ef_ef WHERE id = %s', [object1.id])[0] + object3 = PgsqlRangeStringLastchars5ReturnNULL.objects.create(id=1, name='foo', title='abcdef') + object4 = PgsqlRangeStringLastchars5ReturnNULL.objects.raw( + 'SELECT * FROM tbl_1dc5f79e73f07b17d7023aa395390f14_bcdef WHERE id = %s', [object3.id])[0] + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + @unittest.skipUnless(os.environ['DB'] in ('mysql', 'all'), 'Not a MySQL build') class MysqlDjangoPartitionTestCase(unittest.TestCase): diff --git a/tests/test_pony.py b/tests/test_pony.py index 7652fe0..bff9dfe 100644 --- a/tests/test_pony.py +++ b/tests/test_pony.py @@ -58,6 +58,14 @@ def test_range_date_day_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_day_return_null(self): + with db_session: + object1 = PgsqlRangeDateDayReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + commit() + object2 = PgsqlRangeDateDayReturnNULL.get_by_sql('SELECT * FROM test_rangedateday_return_null_y2014d105 WHERE id = $object1.id') + + self.assertTrue(object1.name, object2.name) + def test_range_date_week(self): with db_session: object1 = PgsqlRangeDateWeek(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) @@ -74,6 +82,14 @@ def test_range_date_week_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_week_return_null(self): + with db_session: + object1 = PgsqlRangeDateWeekReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + commit() + object2 = PgsqlRangeDateWeekReturnNULL.get_by_sql('SELECT * FROM test_rangedateweek_return_null_y2014w16 WHERE id = $object1.id') + + self.assertTrue(object1.name, object2.name) + def test_range_date_month(self): with db_session: object1 = PgsqlRangeDateMonth(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) @@ -91,6 +107,15 @@ def test_range_date_month_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_month_return_null(self): + with db_session: + object1 = PgsqlRangeDateMonthReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + commit() + object2 = PgsqlRangeDateMonthReturnNULL.get_by_sql( + 'SELECT * FROM test_rangedatemonth_return_null_y2014m04 WHERE id = $object1.id') + + self.assertTrue(object1.name, object2.name) + def test_range_date_year(self): with db_session: object1 = PgsqlRangeDateYear(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) @@ -107,6 +132,14 @@ def test_range_date_year_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_year_return_null(self): + with db_session: + object1 = PgsqlRangeDateYearReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + commit() + object2 = PgsqlRangeDateYearReturnNULL.get_by_sql('SELECT * FROM test_rangedateyear_return_null_y2014 WHERE id = $object1.id') + + self.assertTrue(object1.name, object2.name) + def test_range_integer_positive(self): with db_session: object1 = PgsqlRangeInteger2(name='foo', num=3) @@ -151,6 +184,17 @@ def test_range_integer_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_integer_positive_return_null(self): + with db_session: + object1 = PgsqlRangeInteger2ReturnNULL(id=1, name='foo', num=3) + object3 = PgsqlRangeInteger5ReturnNULL(id=1, name='foo', num=3) + commit() + object2 = PgsqlRangeInteger2ReturnNULL.get_by_sql('SELECT * FROM test_rangeinteger2_return_null_3_4 WHERE id = $object1.id') + object4 = PgsqlRangeInteger5ReturnNULL.get_by_sql('SELECT * FROM test_rangeinteger5_return_null_1_5 WHERE id = $object3.id') + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + def test_range_string_firstchars(self): with db_session: object1 = PgsqlRangeStringFirstchars2(name='foo', title='abcdef') @@ -190,6 +234,19 @@ def test_range_string_firstchars_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_string_firstchars_return_null(self): + with db_session: + object1 = PgsqlRangeStringFirstchars2ReturnNULL(id=1, name='foo', title='abcdef') + object3 = PgsqlRangeStringFirstchars5ReturnNULL(id=1, name='foo', title='abcdef') + commit() + object2 = PgsqlRangeStringFirstchars2ReturnNULL.get_by_sql( + 'SELECT * FROM test_rangestring_firstchars2_return_null_ab WHERE id = $object1.id') + object4 = PgsqlRangeStringFirstchars5ReturnNULL.get_by_sql( + 'SELECT * FROM test_rangestring_firstchars5_return_null_abcde WHERE id = $object3.id') + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + def test_range_string_lastchars(self): with db_session: object1 = PgsqlRangeStringLastchars2(name='foo', title='abcdef') @@ -229,6 +286,19 @@ def test_range_string_lastchars_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_string_lastchars_return_null(self): + with db_session: + object1 = PgsqlRangeStringLastchars2ReturnNULL(id=1, name='foo', title='abcdef') + object3 = PgsqlRangeStringLastchars5ReturnNULL(id=1, name='foo', title='abcdef') + commit() + object2 = PgsqlRangeStringLastchars2ReturnNULL.get_by_sql( + 'SELECT * FROM test_rangestring_lastchars2_return_null_ef WHERE id = $object1.id') + object4 = PgsqlRangeStringLastchars5ReturnNULL.get_by_sql( + 'SELECT * FROM test_rangestring_lastchars5_return_null_bcdef WHERE id = $object3.id') + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + @unittest.skipUnless(os.environ['DB'] in ('mysql', 'all'), 'Not a MySQL build') class MysqlPonyPartitionTestCase(unittest.TestCase): diff --git a/tests/test_sqlalchemy.py b/tests/test_sqlalchemy.py index 2fbb3ad..7628038 100644 --- a/tests/test_sqlalchemy.py +++ b/tests/test_sqlalchemy.py @@ -137,6 +137,17 @@ def test_range_date_day_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_day_return_null(self): + object1 = PgsqlRangeDateDayReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + self.session.add(object1) + self.session.commit() + + object2 = self.session.query(PgsqlRangeDateDayReturnNULL).from_statement( + text('SELECT * FROM tbl_667814817492d1843c9d91d06f3555c5_y2014d105 WHERE id = :id') + ).params(id=object1.id).first() + + self.assertTrue(object1.name, object2.name) + def test_range_date_week(self): object1 = PgsqlRangeDateWeek(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) self.session.add(object1) @@ -159,6 +170,17 @@ def test_range_date_week_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_week_return_null(self): + object1 = PgsqlRangeDateWeekReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + self.session.add(object1) + self.session.commit() + + object2 = self.session.query(PgsqlRangeDateWeekReturnNULL).from_statement( + text('SELECT * FROM test_rangedateweek_return_null_y2014w16 WHERE id = :id') + ).params(id=object1.id).first() + + self.assertTrue(object1.name, object2.name) + def test_range_date_month(self): object1 = PgsqlRangeDateMonth(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) self.session.add(object1) @@ -181,6 +203,17 @@ def test_range_date_month_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_month_return_null(self): + object1 = PgsqlRangeDateMonthReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + self.session.add(object1) + self.session.commit() + + object2 = self.session.query(PgsqlRangeDateMonthReturnNULL).from_statement( + text('SELECT * FROM test_rangedatemonth_return_null_y2014m04 WHERE id = :id') + ).params(id=object1.id).first() + + self.assertTrue(object1.name, object2.name) + def test_range_date_year(self): object1 = PgsqlRangeDateYear(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) self.session.add(object1) @@ -203,6 +236,17 @@ def test_range_date_year_null(self): self.assertTrue(object1.name, object2.name) + def test_range_date_year_return_null(self): + object1 = PgsqlRangeDateYearReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + self.session.add(object1) + self.session.commit() + + object2 = self.session.query(PgsqlRangeDateYearReturnNULL).from_statement( + text('SELECT * FROM test_rangedateyear_return_null_y2014 WHERE id = :id') + ).params(id=object1.id).first() + + self.assertTrue(object1.name, object2.name) + def test_range_integer_positive(self): object1 = PgsqlRangeInteger2(name='foo', num=3) object3 = PgsqlRangeInteger5(name='foo', num=3) @@ -267,6 +311,22 @@ def test_range_integer_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_integer_positive_return_null(self): + object1 = PgsqlRangeInteger2ReturnNULL(id=1, name='foo', num=3) + object3 = PgsqlRangeInteger5ReturnNULL(id=1, name='foo', num=3) + self.session.add_all([object1, object3]) + self.session.commit() + + object2 = self.session.query(PgsqlRangeInteger2ReturnNULL).from_statement( + text('SELECT * FROM test_rangeinteger2_return_null_3_4 WHERE id = :id') + ).params(id=object1.id).first() + object4 = self.session.query(PgsqlRangeInteger5ReturnNULL).from_statement( + text('SELECT * FROM test_rangeinteger5_return_null_1_5 WHERE id = :id') + ).params(id=object3.id).first() + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + def test_range_string_firstchars(self): object1 = PgsqlRangeStringFirstchars2(name='foo', title='abcdef') object3 = PgsqlRangeStringFirstchars5(name='foo', title='abcdef') @@ -315,6 +375,22 @@ def test_range_string_firstchars_null(self): self.assertTrue(object1.name, object2.name) self.assertTrue(object3.name, object4.name) + def test_range_string_firstchars_return_null(self): + object1 = PgsqlRangeStringFirstchars2ReturnNULL(id=1, name='foo', title='abcdef') + object3 = PgsqlRangeStringFirstchars5ReturnNULL(id=1, name='foo', title='abcdef') + self.session.add_all([object1, object3]) + self.session.commit() + + object2 = self.session.query(PgsqlRangeStringFirstchars2ReturnNULL).from_statement( + text('SELECT * FROM tbl_a90c0c0e1882e3b0495c0463cc628794_ab WHERE id = :id') + ).params(id=object1.id).first() + object4 = self.session.query(PgsqlRangeStringFirstchars5ReturnNULL).from_statement( + text('SELECT * FROM tbl_a56c045d05b09ad40cb8e4790d32768f_abcde WHERE id = :id') + ).params(id=object3.id).first() + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + def test_range_string_lastchars(self): object1 = PgsqlRangeStringLastchars2(name='foo', title='abcdef') object3 = PgsqlRangeStringLastchars5(name='foo', title='abcdef') @@ -391,6 +467,22 @@ def test_range_date_day_long_tablename(self): self.assertTrue(object1.name, object3.name) + def test_range_string_lastchars_return_null(self): + object1 = PgsqlRangeStringLastchars2ReturnNULL(id=1, name='foo', title='abcdef') + object3 = PgsqlRangeStringLastchars5ReturnNULL(id=1, name='foo', title='abcdef') + self.session.add_all([object1, object3]) + self.session.commit() + + object2 = self.session.query(PgsqlRangeStringLastchars2ReturnNULL).from_statement( + text('SELECT * FROM tbl_16021a4feb7b46a0d93b4b662de198ef_ef WHERE id = :id') + ).params(id=object1.id).first() + object4 = self.session.query(PgsqlRangeStringLastchars5ReturnNULL).from_statement( + text('SELECT * FROM tbl_1dc5f79e73f07b17d7023aa395390f14_bcdef WHERE id = :id') + ).params(id=object3.id).first() + + self.assertTrue(object1.name, object2.name) + self.assertTrue(object3.name, object4.name) + @unittest.skipUnless(os.environ['DB'] in ('mysql', 'all'), 'Not a MySQL build') class MysqlSqlAlchemyPartitionTestCase(unittest.TestCase): diff --git a/tests/test_sqlobject.py b/tests/test_sqlobject.py index 06fdf59..292df42 100644 --- a/tests/test_sqlobject.py +++ b/tests/test_sqlobject.py @@ -46,6 +46,13 @@ def test_range_date_day_null(self): self.assertTrue(object1.name, object2[1]) + def test_range_date_day_return_null(self): + object1 = PgsqlRangeDateDayReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateDayReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangedateday_return_null_y2014d105 WHERE id = %s' % object1.id) + + self.assertTrue(object1.name, object2[1]) + def test_range_date_week(self): object1 = PgsqlRangeDateWeek(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) object2 = PgsqlRangeDateWeek._connection.queryOne( @@ -60,6 +67,13 @@ def test_range_date_week_null(self): self.assertTrue(object1.name, object2[1]) + def test_range_date_week_return_null(self): + object1 = PgsqlRangeDateWeekReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateWeekReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangedateweek_return_null_y2014w16 WHERE id = %s' % object1.id) + + self.assertTrue(object1.name, object2[1]) + def test_range_date_month(self): object1 = PgsqlRangeDateMonth(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) object2 = PgsqlRangeDateMonth._connection.queryOne( @@ -74,6 +88,13 @@ def test_range_date_month_null(self): self.assertTrue(object1.name, object2[1]) + def test_range_date_month_return_null(self): + object1 = PgsqlRangeDateMonthReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateMonthReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangedatemonth_return_null_y2014m04 WHERE id = %s' % object1.id) + + self.assertTrue(object1.name, object2[1]) + def test_range_date_year(self): object1 = PgsqlRangeDateYear(name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) object2 = PgsqlRangeDateYear._connection.queryOne( @@ -88,6 +109,13 @@ def test_range_date_year_null(self): self.assertTrue(object1.name, object2[1]) + def test_range_date_year_return_null(self): + object1 = PgsqlRangeDateYearReturnNULL(id=1, name='foo', created=datetime.datetime(2014, 4, 15, 18, 44, 23)) + object2 = PgsqlRangeDateYearReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangedateyear_return_null_y2014 WHERE id = %s' % object1.id) + + self.assertTrue(object1.name, object2[1]) + def test_range_integer_positive(self): object1 = PgsqlRangeInteger2(name='foo', num=3) object3 = PgsqlRangeInteger5(name='foo', num=3) @@ -132,6 +160,17 @@ def test_range_integer_null(self): self.assertTrue(object1.name, object2[1]) self.assertTrue(object3.name, object4[1]) + def test_range_integer_positive_return_null(self): + object1 = PgsqlRangeInteger2ReturnNULL(id=1, name='foo', num=3) + object3 = PgsqlRangeInteger5ReturnNULL(id=1, name='foo', num=3) + object2 = PgsqlRangeInteger2ReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangeinteger2_return_null_3_4 WHERE id = %s' % object1.id) + object4 = PgsqlRangeInteger5ReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangeinteger5_return_null_1_5 WHERE id = %s' % object3.id) + + self.assertTrue(object1.name, object2[1]) + self.assertTrue(object3.name, object4[1]) + def test_range_string_firstchars(self): object1 = PgsqlRangeStringFirstchars2(name='foo', title='abcdef') object3 = PgsqlRangeStringFirstchars5(name='foo', title='abcdef') @@ -165,6 +204,17 @@ def test_range_string_firstchars_null(self): self.assertTrue(object1.name, object2[1]) self.assertTrue(object3.name, object4[1]) + def test_range_string_firstchars_return_null(self): + object1 = PgsqlRangeStringFirstchars2ReturnNULL(id=1, name='foo', title='abcdef') + object3 = PgsqlRangeStringFirstchars5ReturnNULL(id=1, name='foo', title='abcdef') + object2 = PgsqlRangeStringFirstchars2ReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangestring_firstchars2_return_null_ab WHERE id = %s' % object1.id) + object4 = PgsqlRangeStringFirstchars5ReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangestring_firstchars5_return_null_abcde WHERE id = %s' % object3.id) + + self.assertTrue(object1.name, object2[1]) + self.assertTrue(object3.name, object4[1]) + def test_range_string_lastchars(self): object1 = PgsqlRangeStringLastchars2(name='foo', title='abcdef') object3 = PgsqlRangeStringLastchars5(name='foo', title='abcdef') @@ -198,6 +248,17 @@ def test_range_string_lastchars_null(self): self.assertTrue(object1.name, object2[1]) self.assertTrue(object3.name, object4[1]) + def test_range_string_lastchars_return_null(self): + object1 = PgsqlRangeStringLastchars2ReturnNULL(id=1, name='foo', title='abcdef') + object3 = PgsqlRangeStringLastchars5ReturnNULL(id=1, name='foo', title='abcdef') + object2 = PgsqlRangeStringLastchars2ReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangestring_lastchars2_return_null_ef WHERE id = %s' % object1.id) + object4 = PgsqlRangeStringLastchars5ReturnNULL._connection.queryOne( + 'SELECT * FROM test_rangestring_lastchars5_return_null_bcdef WHERE id = %s' % object3.id) + + self.assertTrue(object1.name, object2[1]) + self.assertTrue(object3.name, object4[1]) + @unittest.skipUnless(os.environ['DB'] in ('mysql', 'all'), 'Not a MySQL build') class MysqlSqlObjectPartitionTestCase(unittest.TestCase):