Skip to content

Commit 61b08e4

Browse files
committed
Introduce allow_parametrize to ValueWrapper
1 parent 485b854 commit 61b08e4

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

pypika/terms.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,12 @@ class Parameter(Term):
333333
is_aggregate = None
334334

335335
def __init__(self, placeholder: str | None = None, idx: int | None = None) -> None:
336-
if not placeholder and not idx:
336+
if not placeholder and idx is None:
337337
raise ValueError("Must provide either a placeholder or an idx")
338338

339+
if idx is not None and idx < 1:
340+
raise ValueError("idx must start at 1")
341+
339342
if placeholder and idx:
340343
raise ValueError("Cannot provide both a placeholder and an idx")
341344

@@ -403,9 +406,23 @@ def get_sql(self, **kwargs: Any) -> str:
403406
class ValueWrapper(Term):
404407
is_aggregate = None
405408

406-
def __init__(self, value: Any, alias: str | None = None) -> None:
409+
def __init__(
410+
self, value: Any, alias: str | None = None, allow_parametrize: bool = True
411+
) -> None:
412+
"""
413+
A wrapper for a constant value such as a string or number.
414+
415+
:param value:
416+
The value to be wrapped.
417+
:param alias:
418+
An optional alias for the value.
419+
:param allow_parametrize:
420+
Whether the value should be replaced with a parameter in the query if parameterizer
421+
is used.
422+
"""
407423
super().__init__(alias)
408424
self.value = value
425+
self.allow_parametrize = allow_parametrize
409426

410427
def get_value_sql(self, **kwargs: Any) -> str:
411428
return self.get_formatted_value(self.value, **kwargs)
@@ -443,7 +460,11 @@ def get_sql(
443460
parameterizer: Parameterizer | None = None,
444461
**kwargs: Any,
445462
) -> str:
446-
if parameterizer is None or not parameterizer.should_parameterize(self.value):
463+
if (
464+
parameterizer is None
465+
or not parameterizer.should_parameterize(self.value)
466+
or not self.allow_parametrize
467+
):
447468
sql = self.get_value_sql(
448469
quote_char=quote_char, secondary_quote_char=secondary_quote_char, **kwargs
449470
)

tests/test_terms.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from unittest import TestCase
22

33
from pypika import Field, Query, Table
4-
from pypika.terms import AtTimezone
4+
from pypika.terms import AtTimezone, Parameterizer, ValueWrapper
55

66

77
class FieldAliasTests(TestCase):
@@ -49,3 +49,15 @@ def test_passes_kwargs_to_field_get_sql(self):
4949
'FROM "customers" JOIN "accounts" ON "customers"."account_id"="accounts"."account_id"',
5050
query.get_sql(with_namespace=True),
5151
)
52+
53+
54+
class ValueWrapperTests(TestCase):
55+
def test_allow_parametrize(self):
56+
value = ValueWrapper("foo")
57+
self.assertEqual("'foo'", value.get_sql())
58+
59+
value = ValueWrapper("foo")
60+
self.assertEqual("?", value.get_sql(parameterizer=Parameterizer()))
61+
62+
value = ValueWrapper("foo", allow_parametrize=False)
63+
self.assertEqual("'foo'", value.get_sql(parameterizer=Parameterizer()))

0 commit comments

Comments
 (0)