/src/gdal/ogr/swq_op_registrar.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Component: OGR SQL Engine |
4 | | * Purpose: Implementation of the swq_op_registrar class used to |
5 | | * represent operations possible in an SQL expression. |
6 | | * Author: Frank Warmerdam <warmerdam@pobox.com> |
7 | | * |
8 | | ****************************************************************************** |
9 | | * Copyright (C) 2010 Frank Warmerdam <warmerdam@pobox.com> |
10 | | * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com> |
11 | | * |
12 | | * SPDX-License-Identifier: MIT |
13 | | ****************************************************************************/ |
14 | | |
15 | | #include "cpl_port.h" |
16 | | #include "ogr_swq.h" |
17 | | |
18 | | #include <cstddef> |
19 | | |
20 | | #include "cpl_conv.h" |
21 | | #include "cpl_error.h" |
22 | | |
23 | | //! @cond Doxygen_Suppress |
24 | | static swq_field_type |
25 | | SWQColumnFuncChecker(swq_expr_node *poNode, |
26 | | int bAllowMismatchTypeOnFieldComparison); |
27 | | |
28 | | static const swq_operation swq_apsOperations[] = { |
29 | | {"OR", SWQ_OR, SWQGeneralEvaluator, SWQGeneralChecker}, |
30 | | {"AND", SWQ_AND, SWQGeneralEvaluator, SWQGeneralChecker}, |
31 | | {"NOT", SWQ_NOT, SWQGeneralEvaluator, SWQGeneralChecker}, |
32 | | {"=", SWQ_EQ, SWQGeneralEvaluator, SWQGeneralChecker}, |
33 | | {"<>", SWQ_NE, SWQGeneralEvaluator, SWQGeneralChecker}, |
34 | | {">=", SWQ_GE, SWQGeneralEvaluator, SWQGeneralChecker}, |
35 | | {"<=", SWQ_LE, SWQGeneralEvaluator, SWQGeneralChecker}, |
36 | | {"<", SWQ_LT, SWQGeneralEvaluator, SWQGeneralChecker}, |
37 | | {">", SWQ_GT, SWQGeneralEvaluator, SWQGeneralChecker}, |
38 | | {"LIKE", SWQ_LIKE, SWQGeneralEvaluator, SWQGeneralChecker}, |
39 | | {"ILIKE", SWQ_ILIKE, SWQGeneralEvaluator, SWQGeneralChecker}, |
40 | | {"IS NULL", SWQ_ISNULL, SWQGeneralEvaluator, SWQGeneralChecker}, |
41 | | {"IN", SWQ_IN, SWQGeneralEvaluator, SWQGeneralChecker}, |
42 | | {"BETWEEN", SWQ_BETWEEN, SWQGeneralEvaluator, SWQGeneralChecker}, |
43 | | {"+", SWQ_ADD, SWQGeneralEvaluator, SWQGeneralChecker}, |
44 | | {"-", SWQ_SUBTRACT, SWQGeneralEvaluator, SWQGeneralChecker}, |
45 | | {"*", SWQ_MULTIPLY, SWQGeneralEvaluator, SWQGeneralChecker}, |
46 | | {"/", SWQ_DIVIDE, SWQGeneralEvaluator, SWQGeneralChecker}, |
47 | | {"%", SWQ_MODULUS, SWQGeneralEvaluator, SWQGeneralChecker}, |
48 | | {"CONCAT", SWQ_CONCAT, SWQGeneralEvaluator, SWQGeneralChecker}, |
49 | | {"SUBSTR", SWQ_SUBSTR, SWQGeneralEvaluator, SWQGeneralChecker}, |
50 | | {"HSTORE_GET_VALUE", SWQ_HSTORE_GET_VALUE, SWQGeneralEvaluator, |
51 | | SWQGeneralChecker}, |
52 | | |
53 | | {"AVG", SWQ_AVG, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
54 | | {"MIN", SWQ_MIN, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
55 | | {"MAX", SWQ_MAX, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
56 | | {"COUNT", SWQ_COUNT, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
57 | | {"SUM", SWQ_SUM, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
58 | | {"STDDEV_POP", SWQ_STDDEV_POP, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
59 | | {"STDDEV_SAMP", SWQ_STDDEV_SAMP, SWQGeneralEvaluator, SWQColumnFuncChecker}, |
60 | | |
61 | | {"CAST", SWQ_CAST, SWQCastEvaluator, SWQCastChecker}}; |
62 | | |
63 | | /************************************************************************/ |
64 | | /* GetOperator() */ |
65 | | /************************************************************************/ |
66 | | |
67 | | const swq_operation *swq_op_registrar::GetOperator(const char *pszName) |
68 | | |
69 | 0 | { |
70 | 0 | for (const auto &op : swq_apsOperations) |
71 | 0 | { |
72 | 0 | if (EQUAL(pszName, op.pszName)) |
73 | 0 | return &op; |
74 | 0 | } |
75 | | |
76 | 0 | return nullptr; |
77 | 0 | } |
78 | | |
79 | | /************************************************************************/ |
80 | | /* GetOperator() */ |
81 | | /************************************************************************/ |
82 | | |
83 | | const swq_operation *swq_op_registrar::GetOperator(swq_op eOperator) |
84 | | |
85 | 0 | { |
86 | 0 | for (const auto &op : swq_apsOperations) |
87 | 0 | { |
88 | 0 | if (eOperator == op.eOperation) |
89 | 0 | return &op; |
90 | 0 | } |
91 | | |
92 | 0 | return nullptr; |
93 | 0 | } |
94 | | |
95 | | /************************************************************************/ |
96 | | /* SWQColumnFuncChecker() */ |
97 | | /* */ |
98 | | /* Column summary functions are not legal in any context except */ |
99 | | /* as a root operator on column definitions. They are removed */ |
100 | | /* from this tree before checking so we just need to issue an */ |
101 | | /* error if they are used in any other context. */ |
102 | | /************************************************************************/ |
103 | | |
104 | | static swq_field_type |
105 | | SWQColumnFuncChecker(swq_expr_node *poNode, |
106 | | int /* bAllowMismatchTypeOnFieldComparison */) |
107 | 0 | { |
108 | 0 | const swq_operation *poOp = |
109 | 0 | swq_op_registrar::GetOperator(static_cast<swq_op>(poNode->nOperation)); |
110 | 0 | CPLError(CE_Failure, CPLE_AppDefined, |
111 | 0 | "Column Summary Function '%s' found in an inappropriate context.", |
112 | 0 | poOp != nullptr ? poOp->pszName : ""); |
113 | 0 | return SWQ_ERROR; |
114 | 0 | } |
115 | | |
116 | | //! @endcond |