Skip to content

Commit d60520c

Browse files
committed
fix(functions): fix clickhouse functions
1 parent 5d8ee16 commit d60520c

File tree

5 files changed

+47
-9
lines changed

5 files changed

+47
-9
lines changed

clickhouse_backend/models/fields/tuple.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ def set_attributes_from_name(self, name):
145145
self.container_class = tuple
146146

147147
def _convert_type(self, value):
148+
# When used as Expression output_field
149+
if not hasattr(self, "container_class"):
150+
self.set_attributes_from_name("")
148151
if value is None or isinstance(value, self.container_class):
149152
return value
150153
if self.is_named_tuple:

clickhouse_backend/models/functions/datetime.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from django.conf import settings
21
from django.db import models
32

3+
from clickhouse_backend.models import fields
4+
from clickhouse_backend.utils.timezone import get_timezone
5+
46
from .base import Func
57

68
__all__ = [
@@ -11,7 +13,9 @@
1113

1214

1315
class toYYYYMM(Func):
14-
def __init__(self, *expressions, output_field=None, **extra):
16+
output_field = fields.UInt32Field()
17+
18+
def __init__(self, *expressions):
1519
arity = len(expressions)
1620
if arity < 1 or arity > 2:
1721
raise TypeError(
@@ -23,14 +27,15 @@ def __init__(self, *expressions, output_field=None, **extra):
2327
)
2428
if arity == 2 and isinstance(expressions[1], str):
2529
expressions = (expressions[0], models.Value(expressions[1]))
26-
elif settings.USE_TZ:
27-
expressions = (expressions[0], models.Value(settings.TIME_ZONE))
28-
super().__init__(*expressions, output_field=output_field, **extra)
30+
else:
31+
expressions = (expressions[0], models.Value(get_timezone()))
32+
33+
super().__init__(*expressions)
2934

3035

3136
class toYYYYMMDD(toYYYYMM):
3237
pass
3338

3439

3540
class toYYYYMMDDhhmmss(toYYYYMM):
36-
pass
41+
output_field = fields.UInt64Field()

clickhouse_backend/models/functions/other.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from clickhouse_backend.models import fields
2+
13
from .base import Func
24

35
__all__ = [
@@ -8,7 +10,9 @@
810

911
class currentDatabase(Func):
1012
arity = 0
13+
output_field = fields.StringField()
1114

1215

1316
class hostName(Func):
1417
arity = 0
18+
output_field = fields.StringField()

clickhouse_backend/models/functions/random.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from clickhouse_backend.models import fields
2+
13
from .base import Func
24

35
__all__ = [
@@ -7,3 +9,4 @@
79

810
class Rand(Func):
911
arity = 0
12+
output_field = fields.UInt32Field()

clickhouse_backend/models/functions/tuples.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from django.db.models.expressions import Value
22

3+
from clickhouse_backend.models import fields
4+
35
from .base import Func
46

57
__all__ = [
@@ -9,15 +11,36 @@
911

1012

1113
class Tuple(Func):
12-
pass
14+
function = "tuple"
15+
16+
def _resolve_output_field(self):
17+
"""
18+
Attempt to infer the output type of the expression.
19+
"""
20+
21+
sources_iter = (
22+
source for source in self.get_source_fields() if source is not None
23+
)
24+
return fields.TupleField(tuple(sources_iter))
1325

1426

1527
class tupleElement(Func):
1628
def __init__(self, *expressions, output_field=None, **extra):
1729
if len(expressions) == 2:
18-
expressions = (expressions[0], Value[1])
30+
expressions = (
31+
expressions[0],
32+
Value(expressions[1] + 1)
33+
if isinstance(expressions[1], int)
34+
else expressions[1],
35+
)
1936
elif len(expressions) == 3:
20-
expressions = (expressions[0], Value[1], expressions[2])
37+
expressions = (
38+
expressions[0],
39+
Value(expressions[1] + 1)
40+
if isinstance(expressions[1], int)
41+
else expressions[1],
42+
expressions[2],
43+
)
2144
else:
2245
raise TypeError(
2346
"'%s' takes 2 or 3 arguments (%s given)"

0 commit comments

Comments
 (0)