diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index 7ed681644f..f007c4874b 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -3,6 +3,7 @@ """build query for doclistview and return results""" import frappe.defaults +from frappe.query_builder.utils import Column import frappe.share from frappe import _ import frappe.permissions @@ -546,8 +547,12 @@ class DatabaseQuery(object): value = flt(f.value) fallback = 0 + if isinstance(f.value, Column): + quote = '"' if frappe.conf.db_type == 'postgres' else "`" + value = f"{tname}.{quote}{f.value}{quote}" + # escape value - if isinstance(value, str) and not f.operator.lower() == 'between': + elif isinstance(value, str) and not f.operator.lower() == 'between': value = f"{frappe.db.escape(value, percent=False)}" if ( diff --git a/frappe/query_builder/__init__.py b/frappe/query_builder/__init__.py index 798c34b6cc..cf39550100 100644 --- a/frappe/query_builder/__init__.py +++ b/frappe/query_builder/__init__.py @@ -1 +1 @@ -from frappe.query_builder.utils import get_query_builder +from frappe.query_builder.utils import Column, Data, get_query_builder diff --git a/frappe/query_builder/utils.py b/frappe/query_builder/utils.py index b52a3606e8..30e48f7e60 100644 --- a/frappe/query_builder/utils.py +++ b/frappe/query_builder/utils.py @@ -4,9 +4,26 @@ from typing import Any, Callable, Dict from pypika import Query import frappe + from .builder import MariaDB, Postgres +class Column: + """Represents a Database Column""" + def __init__(self, name) -> None: + self.name = name + + def __str__(self) -> str: + return self.name + +class Data: + """Represents a Data value...Specifically non column types""" + def __init__(self, name) -> None: + self.name = name + + def __str__(self) -> str: + return self.name + class db_type_is(Enum): MARIADB = "mariadb" POSTGRES = "postgres"