diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2018-04-03 19:36:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-03 19:36:12 +0200 |
| commit | 55cc26941a1eb6093bf9602e67a2b5fdf7e68683 (patch) | |
| tree | a7e74536922b6bc467538966e795434dc03ad40a /django | |
| parent | 6141c752fe7091d2197f5ac061300a9e0a36b09b (diff) | |
Refs #28643 -- Added Repeat database function.
Thanks Tim Graham and Nick Pope for reviews.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/backends/sqlite3/base.py | 2 | ||||
| -rw-r--r-- | django/db/models/functions/__init__.py | 8 | ||||
| -rw-r--r-- | django/db/models/functions/text.py | 14 |
3 files changed, 20 insertions, 4 deletions
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 3989028930..b644f4d42a 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -4,6 +4,7 @@ SQLite3 backend for the sqlite3 module in the standard library. import datetime import decimal import math +import operator import re import warnings from sqlite3 import dbapi2 as Database @@ -170,6 +171,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): conn.create_function("django_format_dtdelta", 3, _sqlite_format_dtdelta) conn.create_function("django_power", 2, _sqlite_power) conn.create_function('LPAD', 3, _sqlite_lpad) + conn.create_function('REPEAT', 2, operator.mul) conn.create_function('RPAD', 3, _sqlite_rpad) conn.execute('PRAGMA foreign_keys = ON') return conn diff --git a/django/db/models/functions/__init__.py b/django/db/models/functions/__init__.py index a0f5a9e8b2..7515cc67d9 100644 --- a/django/db/models/functions/__init__.py +++ b/django/db/models/functions/__init__.py @@ -6,8 +6,8 @@ from .datetime import ( TruncQuarter, TruncSecond, TruncTime, TruncWeek, TruncYear, ) from .text import ( - Chr, Concat, ConcatPair, Left, Length, Lower, LPad, LTrim, Ord, Replace, - Right, RPad, RTrim, StrIndex, Substr, Trim, Upper, + Chr, Concat, ConcatPair, Left, Length, Lower, LPad, LTrim, Ord, Repeat, + Replace, Right, RPad, RTrim, StrIndex, Substr, Trim, Upper, ) from .window import ( CumeDist, DenseRank, FirstValue, Lag, LastValue, Lead, NthValue, Ntile, @@ -25,8 +25,8 @@ __all__ = [ 'TruncWeek', 'TruncYear', # text 'Chr', 'Concat', 'ConcatPair', 'Left', 'Length', 'Lower', 'LPad', 'LTrim', - 'Ord', 'Replace', 'Right', 'RPad', 'RTrim', 'StrIndex', 'Substr', 'Trim', - 'Upper', + 'Ord', 'Repeat', 'Replace', 'Right', 'RPad', 'RTrim', 'StrIndex', 'Substr', + 'Trim', 'Upper', # window 'CumeDist', 'DenseRank', 'FirstValue', 'Lag', 'LastValue', 'Lead', 'NthValue', 'Ntile', 'PercentRank', 'Rank', 'RowNumber', diff --git a/django/db/models/functions/text.py b/django/db/models/functions/text.py index aecf64e28e..1f04842153 100644 --- a/django/db/models/functions/text.py +++ b/django/db/models/functions/text.py @@ -152,6 +152,20 @@ class Ord(Transform): return super().as_sql(compiler, connection, function='UNICODE', **extra_context) +class Repeat(BytesToCharFieldConversionMixin, Func): + function = 'REPEAT' + + def __init__(self, expression, number, **extra): + if not hasattr(number, 'resolve_expression') and number < 0: + raise ValueError("'number' must be greater or equal to 0.") + super().__init__(expression, number, **extra) + + def as_oracle(self, compiler, connection, **extra_context): + expression, number = self.source_expressions + rpad = RPad(expression, Length(expression) * number, expression) + return rpad.as_sql(compiler, connection, **extra_context) + + class Replace(Func): function = 'REPLACE' |
