diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2018-04-03 18:24:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-03 18:24:04 +0200 |
| commit | 6141c752fe7091d2197f5ac061300a9e0a36b09b (patch) | |
| tree | 30ca645d5c1b0e5d17d59c988332235d833d8a58 /django/db/models | |
| parent | 4f7467b6905482a5d826c2815dcf8c6dd332340d (diff) | |
Fixed #29251 -- Added bytes to str conversion in LPad/RPad database functions on MySQL.
Thanks Tim Graham for the review.
Diffstat (limited to 'django/db/models')
| -rw-r--r-- | django/db/models/functions/text.py | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/django/db/models/functions/text.py b/django/db/models/functions/text.py index c57545bc6a..aecf64e28e 100644 --- a/django/db/models/functions/text.py +++ b/django/db/models/functions/text.py @@ -2,6 +2,22 @@ from django.db.models import Func, IntegerField, Transform, Value, fields from django.db.models.functions import Coalesce +class BytesToCharFieldConversionMixin: + """ + Convert CharField results from bytes to str. + + MySQL returns long data types (bytes) instead of chars when it can't + determine the length of the result string. For example: + LPAD(column1, CHAR_LENGTH(column2), ' ') + returns the LONGTEXT (bytes) instead of VARCHAR. + """ + def convert_value(self, value, expression, connection): + if connection.features.db_functions_convert_bytes_to_str: + if self.output_field.get_internal_type() == 'CharField' and isinstance(value, bytes): + return value.decode() + return super().convert_value(value, expression, connection) + + class Chr(Transform): function = 'CHR' lookup_name = 'chr' @@ -110,7 +126,7 @@ class Lower(Transform): lookup_name = 'lower' -class LPad(Func): +class LPad(BytesToCharFieldConversionMixin, Func): function = 'LPAD' def __init__(self, expression, length, fill_text=Value(' '), **extra): |
