1 /*-------------------------------------------------------------------------
2  *
3  * parse_oper.c
4  *		handle operator things for parser
5  *
6  * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  *	  src/backend/parser/parse_oper.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 
16 #include "postgres.h"
17 
18 #include "access/htup_details.h"
19 #include "catalog/pg_operator.h"
20 #include "catalog/pg_type.h"
21 #include "lib/stringinfo.h"
22 #include "nodes/nodeFuncs.h"
23 #include "parser/parse_coerce.h"
24 #include "parser/parse_func.h"
25 #include "parser/parse_oper.h"
26 #include "parser/parse_type.h"
27 #include "utils/builtins.h"
28 #include "utils/inval.h"
29 #include "utils/lsyscache.h"
30 #include "utils/syscache.h"
31 #include "utils/typcache.h"
32 
33 
34 /*
35  * The lookup key for the operator lookaside hash table.  Unused bits must be
36  * zeroes to ensure hashing works consistently --- in particular, oprname
37  * must be zero-padded and any unused entries in search_path must be zero.
38  *
39  * search_path contains the actual search_path with which the entry was
40  * derived (minus temp namespace if any), or else the single specified
41  * schema OID if we are looking up an explicitly-qualified operator name.
42  *
43  * search_path has to be fixed-length since the hashtable code insists on
44  * fixed-size keys.  If your search path is longer than that, we just punt
45  * and don't cache anything.
46  */
47 
48 /* If your search_path is longer than this, sucks to be you ... */
49 #define MAX_CACHED_PATH_LEN		16
50 
51 typedef struct OprCacheKey
52 {
53 	char		oprname[NAMEDATALEN];
54 	Oid			left_arg;		/* Left input OID, or 0 if prefix op */
55 	Oid			right_arg;		/* Right input OID, or 0 if postfix op */
56 	Oid			search_path[MAX_CACHED_PATH_LEN];
57 } OprCacheKey;
58 
59 typedef struct OprCacheEntry
60 {
61 	/* the hash lookup key MUST BE FIRST */
62 	OprCacheKey key;
63 
64 	Oid			opr_oid;		/* OID of the resolved operator */
65 } OprCacheEntry;
66 
67 
68 static Oid	binary_oper_exact(List *opname, Oid arg1, Oid arg2);
69 static FuncDetailCode oper_select_candidate(int nargs,
70 											Oid *input_typeids,
71 											FuncCandidateList candidates,
72 											Oid *operOid);
73 static const char *op_signature_string(List *op, char oprkind,
74 									   Oid arg1, Oid arg2);
75 static void op_error(ParseState *pstate, List *op, char oprkind,
76 					 Oid arg1, Oid arg2,
77 					 FuncDetailCode fdresult, int location);
78 static bool make_oper_cache_key(ParseState *pstate, OprCacheKey *key,
79 								List *opname, Oid ltypeId, Oid rtypeId,
80 								int location);
81 static Oid	find_oper_cache_entry(OprCacheKey *key);
82 static void make_oper_cache_entry(OprCacheKey *key, Oid opr_oid);
83 static void InvalidateOprCacheCallBack(Datum arg, int cacheid, uint32 hashvalue);
84 
85 
86 /*
87  * LookupOperName
88  *		Given a possibly-qualified operator name and exact input datatypes,
89  *		look up the operator.
90  *
91  * Pass oprleft = InvalidOid for a prefix op, oprright = InvalidOid for
92  * a postfix op.
93  *
94  * If the operator name is not schema-qualified, it is sought in the current
95  * namespace search path.
96  *
97  * If the operator is not found, we return InvalidOid if noError is true,
98  * else raise an error.  pstate and location are used only to report the
99  * error position; pass NULL/-1 if not available.
100  */
101 Oid
LookupOperName(ParseState * pstate,List * opername,Oid oprleft,Oid oprright,bool noError,int location)102 LookupOperName(ParseState *pstate, List *opername, Oid oprleft, Oid oprright,
103 			   bool noError, int location)
104 {
105 	Oid			result;
106 
107 	result = OpernameGetOprid(opername, oprleft, oprright);
108 	if (OidIsValid(result))
109 		return result;
110 
111 	/* we don't use op_error here because only an exact match is wanted */
112 	if (!noError)
113 	{
114 		char		oprkind;
115 
116 		if (!OidIsValid(oprleft))
117 			oprkind = 'l';
118 		else if (!OidIsValid(oprright))
119 			oprkind = 'r';
120 		else
121 			oprkind = 'b';
122 
123 		ereport(ERROR,
124 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
125 				 errmsg("operator does not exist: %s",
126 						op_signature_string(opername, oprkind,
127 											oprleft, oprright)),
128 				 parser_errposition(pstate, location)));
129 	}
130 
131 	return InvalidOid;
132 }
133 
134 /*
135  * LookupOperWithArgs
136  *		Like LookupOperName, but the argument types are specified by
137  *		a ObjectWithArgs node.
138  */
139 Oid
LookupOperWithArgs(ObjectWithArgs * oper,bool noError)140 LookupOperWithArgs(ObjectWithArgs *oper, bool noError)
141 {
142 	TypeName   *oprleft,
143 			   *oprright;
144 	Oid			leftoid,
145 				rightoid;
146 
147 	Assert(list_length(oper->objargs) == 2);
148 	oprleft = linitial(oper->objargs);
149 	oprright = lsecond(oper->objargs);
150 
151 	if (oprleft == NULL)
152 		leftoid = InvalidOid;
153 	else
154 		leftoid = LookupTypeNameOid(NULL, oprleft, noError);
155 
156 	if (oprright == NULL)
157 		rightoid = InvalidOid;
158 	else
159 		rightoid = LookupTypeNameOid(NULL, oprright, noError);
160 
161 	return LookupOperName(NULL, oper->objname, leftoid, rightoid,
162 						  noError, -1);
163 }
164 
165 /*
166  * get_sort_group_operators - get default sorting/grouping operators for type
167  *
168  * We fetch the "<", "=", and ">" operators all at once to reduce lookup
169  * overhead (knowing that most callers will be interested in at least two).
170  * However, a given datatype might have only an "=" operator, if it is
171  * hashable but not sortable.  (Other combinations of present and missing
172  * operators shouldn't happen, unless the system catalogs are messed up.)
173  *
174  * If an operator is missing and the corresponding needXX flag is true,
175  * throw a standard error message, else return InvalidOid.
176  *
177  * In addition to the operator OIDs themselves, this function can identify
178  * whether the "=" operator is hashable.
179  *
180  * Callers can pass NULL pointers for any results they don't care to get.
181  *
182  * Note: the results are guaranteed to be exact or binary-compatible matches,
183  * since most callers are not prepared to cope with adding any run-time type
184  * coercion steps.
185  */
186 void
get_sort_group_operators(Oid argtype,bool needLT,bool needEQ,bool needGT,Oid * ltOpr,Oid * eqOpr,Oid * gtOpr,bool * isHashable)187 get_sort_group_operators(Oid argtype,
188 						 bool needLT, bool needEQ, bool needGT,
189 						 Oid *ltOpr, Oid *eqOpr, Oid *gtOpr,
190 						 bool *isHashable)
191 {
192 	TypeCacheEntry *typentry;
193 	int			cache_flags;
194 	Oid			lt_opr;
195 	Oid			eq_opr;
196 	Oid			gt_opr;
197 	bool		hashable;
198 
199 	/*
200 	 * Look up the operators using the type cache.
201 	 *
202 	 * Note: the search algorithm used by typcache.c ensures that the results
203 	 * are consistent, ie all from matching opclasses.
204 	 */
205 	if (isHashable != NULL)
206 		cache_flags = TYPECACHE_LT_OPR | TYPECACHE_EQ_OPR | TYPECACHE_GT_OPR |
207 			TYPECACHE_HASH_PROC;
208 	else
209 		cache_flags = TYPECACHE_LT_OPR | TYPECACHE_EQ_OPR | TYPECACHE_GT_OPR;
210 
211 	typentry = lookup_type_cache(argtype, cache_flags);
212 	lt_opr = typentry->lt_opr;
213 	eq_opr = typentry->eq_opr;
214 	gt_opr = typentry->gt_opr;
215 	hashable = OidIsValid(typentry->hash_proc);
216 
217 	/* Report errors if needed */
218 	if ((needLT && !OidIsValid(lt_opr)) ||
219 		(needGT && !OidIsValid(gt_opr)))
220 		ereport(ERROR,
221 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
222 				 errmsg("could not identify an ordering operator for type %s",
223 						format_type_be(argtype)),
224 				 errhint("Use an explicit ordering operator or modify the query.")));
225 	if (needEQ && !OidIsValid(eq_opr))
226 		ereport(ERROR,
227 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
228 				 errmsg("could not identify an equality operator for type %s",
229 						format_type_be(argtype))));
230 
231 	/* Return results as needed */
232 	if (ltOpr)
233 		*ltOpr = lt_opr;
234 	if (eqOpr)
235 		*eqOpr = eq_opr;
236 	if (gtOpr)
237 		*gtOpr = gt_opr;
238 	if (isHashable)
239 		*isHashable = hashable;
240 }
241 
242 
243 /* given operator tuple, return the operator OID */
244 Oid
oprid(Operator op)245 oprid(Operator op)
246 {
247 	return ((Form_pg_operator) GETSTRUCT(op))->oid;
248 }
249 
250 /* given operator tuple, return the underlying function's OID */
251 Oid
oprfuncid(Operator op)252 oprfuncid(Operator op)
253 {
254 	Form_pg_operator pgopform = (Form_pg_operator) GETSTRUCT(op);
255 
256 	return pgopform->oprcode;
257 }
258 
259 
260 /* binary_oper_exact()
261  * Check for an "exact" match to the specified operand types.
262  *
263  * If one operand is an unknown literal, assume it should be taken to be
264  * the same type as the other operand for this purpose.  Also, consider
265  * the possibility that the other operand is a domain type that needs to
266  * be reduced to its base type to find an "exact" match.
267  */
268 static Oid
binary_oper_exact(List * opname,Oid arg1,Oid arg2)269 binary_oper_exact(List *opname, Oid arg1, Oid arg2)
270 {
271 	Oid			result;
272 	bool		was_unknown = false;
273 
274 	/* Unspecified type for one of the arguments? then use the other */
275 	if ((arg1 == UNKNOWNOID) && (arg2 != InvalidOid))
276 	{
277 		arg1 = arg2;
278 		was_unknown = true;
279 	}
280 	else if ((arg2 == UNKNOWNOID) && (arg1 != InvalidOid))
281 	{
282 		arg2 = arg1;
283 		was_unknown = true;
284 	}
285 
286 	result = OpernameGetOprid(opname, arg1, arg2);
287 	if (OidIsValid(result))
288 		return result;
289 
290 	if (was_unknown)
291 	{
292 		/* arg1 and arg2 are the same here, need only look at arg1 */
293 		Oid			basetype = getBaseType(arg1);
294 
295 		if (basetype != arg1)
296 		{
297 			result = OpernameGetOprid(opname, basetype, basetype);
298 			if (OidIsValid(result))
299 				return result;
300 		}
301 	}
302 
303 	return InvalidOid;
304 }
305 
306 
307 /* oper_select_candidate()
308  *		Given the input argtype array and one or more candidates
309  *		for the operator, attempt to resolve the conflict.
310  *
311  * Returns FUNCDETAIL_NOTFOUND, FUNCDETAIL_MULTIPLE, or FUNCDETAIL_NORMAL.
312  * In the success case the Oid of the best candidate is stored in *operOid.
313  *
314  * Note that the caller has already determined that there is no candidate
315  * exactly matching the input argtype(s).  Incompatible candidates are not yet
316  * pruned away, however.
317  */
318 static FuncDetailCode
oper_select_candidate(int nargs,Oid * input_typeids,FuncCandidateList candidates,Oid * operOid)319 oper_select_candidate(int nargs,
320 					  Oid *input_typeids,
321 					  FuncCandidateList candidates,
322 					  Oid *operOid) /* output argument */
323 {
324 	int			ncandidates;
325 
326 	/*
327 	 * Delete any candidates that cannot actually accept the given input
328 	 * types, whether directly or by coercion.
329 	 */
330 	ncandidates = func_match_argtypes(nargs, input_typeids,
331 									  candidates, &candidates);
332 
333 	/* Done if no candidate or only one candidate survives */
334 	if (ncandidates == 0)
335 	{
336 		*operOid = InvalidOid;
337 		return FUNCDETAIL_NOTFOUND;
338 	}
339 	if (ncandidates == 1)
340 	{
341 		*operOid = candidates->oid;
342 		return FUNCDETAIL_NORMAL;
343 	}
344 
345 	/*
346 	 * Use the same heuristics as for ambiguous functions to resolve the
347 	 * conflict.
348 	 */
349 	candidates = func_select_candidate(nargs, input_typeids, candidates);
350 
351 	if (candidates)
352 	{
353 		*operOid = candidates->oid;
354 		return FUNCDETAIL_NORMAL;
355 	}
356 
357 	*operOid = InvalidOid;
358 	return FUNCDETAIL_MULTIPLE; /* failed to select a best candidate */
359 }
360 
361 
362 /* oper() -- search for a binary operator
363  * Given operator name, types of arg1 and arg2, return oper struct.
364  *
365  * IMPORTANT: the returned operator (if any) is only promised to be
366  * coercion-compatible with the input datatypes.  Do not use this if
367  * you need an exact- or binary-compatible match; see compatible_oper.
368  *
369  * If no matching operator found, return NULL if noError is true,
370  * raise an error if it is false.  pstate and location are used only to report
371  * the error position; pass NULL/-1 if not available.
372  *
373  * NOTE: on success, the returned object is a syscache entry.  The caller
374  * must ReleaseSysCache() the entry when done with it.
375  */
376 Operator
oper(ParseState * pstate,List * opname,Oid ltypeId,Oid rtypeId,bool noError,int location)377 oper(ParseState *pstate, List *opname, Oid ltypeId, Oid rtypeId,
378 	 bool noError, int location)
379 {
380 	Oid			operOid;
381 	OprCacheKey key;
382 	bool		key_ok;
383 	FuncDetailCode fdresult = FUNCDETAIL_NOTFOUND;
384 	HeapTuple	tup = NULL;
385 
386 	/*
387 	 * Try to find the mapping in the lookaside cache.
388 	 */
389 	key_ok = make_oper_cache_key(pstate, &key, opname, ltypeId, rtypeId, location);
390 
391 	if (key_ok)
392 	{
393 		operOid = find_oper_cache_entry(&key);
394 		if (OidIsValid(operOid))
395 		{
396 			tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
397 			if (HeapTupleIsValid(tup))
398 				return (Operator) tup;
399 		}
400 	}
401 
402 	/*
403 	 * First try for an "exact" match.
404 	 */
405 	operOid = binary_oper_exact(opname, ltypeId, rtypeId);
406 	if (!OidIsValid(operOid))
407 	{
408 		/*
409 		 * Otherwise, search for the most suitable candidate.
410 		 */
411 		FuncCandidateList clist;
412 
413 		/* Get binary operators of given name */
414 		clist = OpernameGetCandidates(opname, 'b', false);
415 
416 		/* No operators found? Then fail... */
417 		if (clist != NULL)
418 		{
419 			/*
420 			 * Unspecified type for one of the arguments? then use the other
421 			 * (XXX this is probably dead code?)
422 			 */
423 			Oid			inputOids[2];
424 
425 			if (rtypeId == InvalidOid)
426 				rtypeId = ltypeId;
427 			else if (ltypeId == InvalidOid)
428 				ltypeId = rtypeId;
429 			inputOids[0] = ltypeId;
430 			inputOids[1] = rtypeId;
431 			fdresult = oper_select_candidate(2, inputOids, clist, &operOid);
432 		}
433 	}
434 
435 	if (OidIsValid(operOid))
436 		tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
437 
438 	if (HeapTupleIsValid(tup))
439 	{
440 		if (key_ok)
441 			make_oper_cache_entry(&key, operOid);
442 	}
443 	else if (!noError)
444 		op_error(pstate, opname, 'b', ltypeId, rtypeId, fdresult, location);
445 
446 	return (Operator) tup;
447 }
448 
449 /* compatible_oper()
450  *	given an opname and input datatypes, find a compatible binary operator
451  *
452  *	This is tighter than oper() because it will not return an operator that
453  *	requires coercion of the input datatypes (but binary-compatible operators
454  *	are accepted).  Otherwise, the semantics are the same.
455  */
456 Operator
compatible_oper(ParseState * pstate,List * op,Oid arg1,Oid arg2,bool noError,int location)457 compatible_oper(ParseState *pstate, List *op, Oid arg1, Oid arg2,
458 				bool noError, int location)
459 {
460 	Operator	optup;
461 	Form_pg_operator opform;
462 
463 	/* oper() will find the best available match */
464 	optup = oper(pstate, op, arg1, arg2, noError, location);
465 	if (optup == (Operator) NULL)
466 		return (Operator) NULL; /* must be noError case */
467 
468 	/* but is it good enough? */
469 	opform = (Form_pg_operator) GETSTRUCT(optup);
470 	if (IsBinaryCoercible(arg1, opform->oprleft) &&
471 		IsBinaryCoercible(arg2, opform->oprright))
472 		return optup;
473 
474 	/* nope... */
475 	ReleaseSysCache(optup);
476 
477 	if (!noError)
478 		ereport(ERROR,
479 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
480 				 errmsg("operator requires run-time type coercion: %s",
481 						op_signature_string(op, 'b', arg1, arg2)),
482 				 parser_errposition(pstate, location)));
483 
484 	return (Operator) NULL;
485 }
486 
487 /* compatible_oper_opid() -- get OID of a binary operator
488  *
489  * This is a convenience routine that extracts only the operator OID
490  * from the result of compatible_oper().  InvalidOid is returned if the
491  * lookup fails and noError is true.
492  */
493 Oid
compatible_oper_opid(List * op,Oid arg1,Oid arg2,bool noError)494 compatible_oper_opid(List *op, Oid arg1, Oid arg2, bool noError)
495 {
496 	Operator	optup;
497 	Oid			result;
498 
499 	optup = compatible_oper(NULL, op, arg1, arg2, noError, -1);
500 	if (optup != NULL)
501 	{
502 		result = oprid(optup);
503 		ReleaseSysCache(optup);
504 		return result;
505 	}
506 	return InvalidOid;
507 }
508 
509 
510 /* right_oper() -- search for a unary right operator (postfix operator)
511  * Given operator name and type of arg, return oper struct.
512  *
513  * IMPORTANT: the returned operator (if any) is only promised to be
514  * coercion-compatible with the input datatype.  Do not use this if
515  * you need an exact- or binary-compatible match.
516  *
517  * If no matching operator found, return NULL if noError is true,
518  * raise an error if it is false.  pstate and location are used only to report
519  * the error position; pass NULL/-1 if not available.
520  *
521  * NOTE: on success, the returned object is a syscache entry.  The caller
522  * must ReleaseSysCache() the entry when done with it.
523  */
524 Operator
right_oper(ParseState * pstate,List * op,Oid arg,bool noError,int location)525 right_oper(ParseState *pstate, List *op, Oid arg, bool noError, int location)
526 {
527 	Oid			operOid;
528 	OprCacheKey key;
529 	bool		key_ok;
530 	FuncDetailCode fdresult = FUNCDETAIL_NOTFOUND;
531 	HeapTuple	tup = NULL;
532 
533 	/*
534 	 * Try to find the mapping in the lookaside cache.
535 	 */
536 	key_ok = make_oper_cache_key(pstate, &key, op, arg, InvalidOid, location);
537 
538 	if (key_ok)
539 	{
540 		operOid = find_oper_cache_entry(&key);
541 		if (OidIsValid(operOid))
542 		{
543 			tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
544 			if (HeapTupleIsValid(tup))
545 				return (Operator) tup;
546 		}
547 	}
548 
549 	/*
550 	 * First try for an "exact" match.
551 	 */
552 	operOid = OpernameGetOprid(op, arg, InvalidOid);
553 	if (!OidIsValid(operOid))
554 	{
555 		/*
556 		 * Otherwise, search for the most suitable candidate.
557 		 */
558 		FuncCandidateList clist;
559 
560 		/* Get postfix operators of given name */
561 		clist = OpernameGetCandidates(op, 'r', false);
562 
563 		/* No operators found? Then fail... */
564 		if (clist != NULL)
565 		{
566 			/*
567 			 * We must run oper_select_candidate even if only one candidate,
568 			 * otherwise we may falsely return a non-type-compatible operator.
569 			 */
570 			fdresult = oper_select_candidate(1, &arg, clist, &operOid);
571 		}
572 	}
573 
574 	if (OidIsValid(operOid))
575 		tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
576 
577 	if (HeapTupleIsValid(tup))
578 	{
579 		if (key_ok)
580 			make_oper_cache_entry(&key, operOid);
581 	}
582 	else if (!noError)
583 		op_error(pstate, op, 'r', arg, InvalidOid, fdresult, location);
584 
585 	return (Operator) tup;
586 }
587 
588 
589 /* left_oper() -- search for a unary left operator (prefix operator)
590  * Given operator name and type of arg, return oper struct.
591  *
592  * IMPORTANT: the returned operator (if any) is only promised to be
593  * coercion-compatible with the input datatype.  Do not use this if
594  * you need an exact- or binary-compatible match.
595  *
596  * If no matching operator found, return NULL if noError is true,
597  * raise an error if it is false.  pstate and location are used only to report
598  * the error position; pass NULL/-1 if not available.
599  *
600  * NOTE: on success, the returned object is a syscache entry.  The caller
601  * must ReleaseSysCache() the entry when done with it.
602  */
603 Operator
left_oper(ParseState * pstate,List * op,Oid arg,bool noError,int location)604 left_oper(ParseState *pstate, List *op, Oid arg, bool noError, int location)
605 {
606 	Oid			operOid;
607 	OprCacheKey key;
608 	bool		key_ok;
609 	FuncDetailCode fdresult = FUNCDETAIL_NOTFOUND;
610 	HeapTuple	tup = NULL;
611 
612 	/*
613 	 * Try to find the mapping in the lookaside cache.
614 	 */
615 	key_ok = make_oper_cache_key(pstate, &key, op, InvalidOid, arg, location);
616 
617 	if (key_ok)
618 	{
619 		operOid = find_oper_cache_entry(&key);
620 		if (OidIsValid(operOid))
621 		{
622 			tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
623 			if (HeapTupleIsValid(tup))
624 				return (Operator) tup;
625 		}
626 	}
627 
628 	/*
629 	 * First try for an "exact" match.
630 	 */
631 	operOid = OpernameGetOprid(op, InvalidOid, arg);
632 	if (!OidIsValid(operOid))
633 	{
634 		/*
635 		 * Otherwise, search for the most suitable candidate.
636 		 */
637 		FuncCandidateList clist;
638 
639 		/* Get prefix operators of given name */
640 		clist = OpernameGetCandidates(op, 'l', false);
641 
642 		/* No operators found? Then fail... */
643 		if (clist != NULL)
644 		{
645 			/*
646 			 * The returned list has args in the form (0, oprright). Move the
647 			 * useful data into args[0] to keep oper_select_candidate simple.
648 			 * XXX we are assuming here that we may scribble on the list!
649 			 */
650 			FuncCandidateList clisti;
651 
652 			for (clisti = clist; clisti != NULL; clisti = clisti->next)
653 			{
654 				clisti->args[0] = clisti->args[1];
655 			}
656 
657 			/*
658 			 * We must run oper_select_candidate even if only one candidate,
659 			 * otherwise we may falsely return a non-type-compatible operator.
660 			 */
661 			fdresult = oper_select_candidate(1, &arg, clist, &operOid);
662 		}
663 	}
664 
665 	if (OidIsValid(operOid))
666 		tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
667 
668 	if (HeapTupleIsValid(tup))
669 	{
670 		if (key_ok)
671 			make_oper_cache_entry(&key, operOid);
672 	}
673 	else if (!noError)
674 		op_error(pstate, op, 'l', InvalidOid, arg, fdresult, location);
675 
676 	return (Operator) tup;
677 }
678 
679 /*
680  * op_signature_string
681  *		Build a string representing an operator name, including arg type(s).
682  *		The result is something like "integer + integer".
683  *
684  * This is typically used in the construction of operator-not-found error
685  * messages.
686  */
687 static const char *
op_signature_string(List * op,char oprkind,Oid arg1,Oid arg2)688 op_signature_string(List *op, char oprkind, Oid arg1, Oid arg2)
689 {
690 	StringInfoData argbuf;
691 
692 	initStringInfo(&argbuf);
693 
694 	if (oprkind != 'l')
695 		appendStringInfo(&argbuf, "%s ", format_type_be(arg1));
696 
697 	appendStringInfoString(&argbuf, NameListToString(op));
698 
699 	if (oprkind != 'r')
700 		appendStringInfo(&argbuf, " %s", format_type_be(arg2));
701 
702 	return argbuf.data;			/* return palloc'd string buffer */
703 }
704 
705 /*
706  * op_error - utility routine to complain about an unresolvable operator
707  */
708 static void
op_error(ParseState * pstate,List * op,char oprkind,Oid arg1,Oid arg2,FuncDetailCode fdresult,int location)709 op_error(ParseState *pstate, List *op, char oprkind,
710 		 Oid arg1, Oid arg2,
711 		 FuncDetailCode fdresult, int location)
712 {
713 	if (fdresult == FUNCDETAIL_MULTIPLE)
714 		ereport(ERROR,
715 				(errcode(ERRCODE_AMBIGUOUS_FUNCTION),
716 				 errmsg("operator is not unique: %s",
717 						op_signature_string(op, oprkind, arg1, arg2)),
718 				 errhint("Could not choose a best candidate operator. "
719 						 "You might need to add explicit type casts."),
720 				 parser_errposition(pstate, location)));
721 	else
722 		ereport(ERROR,
723 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
724 				 errmsg("operator does not exist: %s",
725 						op_signature_string(op, oprkind, arg1, arg2)),
726 				 (!arg1 || !arg2) ?
727 				 errhint("No operator matches the given name and argument type. "
728 						 "You might need to add an explicit type cast.") :
729 				 errhint("No operator matches the given name and argument types. "
730 						 "You might need to add explicit type casts."),
731 				 parser_errposition(pstate, location)));
732 }
733 
734 /*
735  * make_op()
736  *		Operator expression construction.
737  *
738  * Transform operator expression ensuring type compatibility.
739  * This is where some type conversion happens.
740  *
741  * last_srf should be a copy of pstate->p_last_srf from just before we
742  * started transforming the operator's arguments; this is used for nested-SRF
743  * detection.  If the caller will throw an error anyway for a set-returning
744  * expression, it's okay to cheat and just pass pstate->p_last_srf.
745  */
746 Expr *
make_op(ParseState * pstate,List * opname,Node * ltree,Node * rtree,Node * last_srf,int location)747 make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree,
748 		Node *last_srf, int location)
749 {
750 	Oid			ltypeId,
751 				rtypeId;
752 	Operator	tup;
753 	Form_pg_operator opform;
754 	Oid			actual_arg_types[2];
755 	Oid			declared_arg_types[2];
756 	int			nargs;
757 	List	   *args;
758 	Oid			rettype;
759 	OpExpr	   *result;
760 
761 	/* Select the operator */
762 	if (rtree == NULL)
763 	{
764 		/* right operator */
765 		ltypeId = exprType(ltree);
766 		rtypeId = InvalidOid;
767 		tup = right_oper(pstate, opname, ltypeId, false, location);
768 	}
769 	else if (ltree == NULL)
770 	{
771 		/* left operator */
772 		rtypeId = exprType(rtree);
773 		ltypeId = InvalidOid;
774 		tup = left_oper(pstate, opname, rtypeId, false, location);
775 	}
776 	else
777 	{
778 		/* otherwise, binary operator */
779 		ltypeId = exprType(ltree);
780 		rtypeId = exprType(rtree);
781 		tup = oper(pstate, opname, ltypeId, rtypeId, false, location);
782 	}
783 
784 	opform = (Form_pg_operator) GETSTRUCT(tup);
785 
786 	/* Check it's not a shell */
787 	if (!RegProcedureIsValid(opform->oprcode))
788 		ereport(ERROR,
789 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
790 				 errmsg("operator is only a shell: %s",
791 						op_signature_string(opname,
792 											opform->oprkind,
793 											opform->oprleft,
794 											opform->oprright)),
795 				 parser_errposition(pstate, location)));
796 
797 	/* Do typecasting and build the expression tree */
798 	if (rtree == NULL)
799 	{
800 		/* right operator */
801 		args = list_make1(ltree);
802 		actual_arg_types[0] = ltypeId;
803 		declared_arg_types[0] = opform->oprleft;
804 		nargs = 1;
805 	}
806 	else if (ltree == NULL)
807 	{
808 		/* left operator */
809 		args = list_make1(rtree);
810 		actual_arg_types[0] = rtypeId;
811 		declared_arg_types[0] = opform->oprright;
812 		nargs = 1;
813 	}
814 	else
815 	{
816 		/* otherwise, binary operator */
817 		args = list_make2(ltree, rtree);
818 		actual_arg_types[0] = ltypeId;
819 		actual_arg_types[1] = rtypeId;
820 		declared_arg_types[0] = opform->oprleft;
821 		declared_arg_types[1] = opform->oprright;
822 		nargs = 2;
823 	}
824 
825 	/*
826 	 * enforce consistency with polymorphic argument and return types,
827 	 * possibly adjusting return type or declared_arg_types (which will be
828 	 * used as the cast destination by make_fn_arguments)
829 	 */
830 	rettype = enforce_generic_type_consistency(actual_arg_types,
831 											   declared_arg_types,
832 											   nargs,
833 											   opform->oprresult,
834 											   false);
835 
836 	/* perform the necessary typecasting of arguments */
837 	make_fn_arguments(pstate, args, actual_arg_types, declared_arg_types);
838 
839 	/* and build the expression node */
840 	result = makeNode(OpExpr);
841 	result->opno = oprid(tup);
842 	result->opfuncid = opform->oprcode;
843 	result->opresulttype = rettype;
844 	result->opretset = get_func_retset(opform->oprcode);
845 	/* opcollid and inputcollid will be set by parse_collate.c */
846 	result->args = args;
847 	result->location = location;
848 
849 	/* if it returns a set, check that's OK */
850 	if (result->opretset)
851 	{
852 		check_srf_call_placement(pstate, last_srf, location);
853 		/* ... and remember it for error checks at higher levels */
854 		pstate->p_last_srf = (Node *) result;
855 	}
856 
857 	ReleaseSysCache(tup);
858 
859 	return (Expr *) result;
860 }
861 
862 /*
863  * make_scalar_array_op()
864  *		Build expression tree for "scalar op ANY/ALL (array)" construct.
865  */
866 Expr *
make_scalar_array_op(ParseState * pstate,List * opname,bool useOr,Node * ltree,Node * rtree,int location)867 make_scalar_array_op(ParseState *pstate, List *opname,
868 					 bool useOr,
869 					 Node *ltree, Node *rtree,
870 					 int location)
871 {
872 	Oid			ltypeId,
873 				rtypeId,
874 				atypeId,
875 				res_atypeId;
876 	Operator	tup;
877 	Form_pg_operator opform;
878 	Oid			actual_arg_types[2];
879 	Oid			declared_arg_types[2];
880 	List	   *args;
881 	Oid			rettype;
882 	ScalarArrayOpExpr *result;
883 
884 	ltypeId = exprType(ltree);
885 	atypeId = exprType(rtree);
886 
887 	/*
888 	 * The right-hand input of the operator will be the element type of the
889 	 * array.  However, if we currently have just an untyped literal on the
890 	 * right, stay with that and hope we can resolve the operator.
891 	 */
892 	if (atypeId == UNKNOWNOID)
893 		rtypeId = UNKNOWNOID;
894 	else
895 	{
896 		rtypeId = get_base_element_type(atypeId);
897 		if (!OidIsValid(rtypeId))
898 			ereport(ERROR,
899 					(errcode(ERRCODE_WRONG_OBJECT_TYPE),
900 					 errmsg("op ANY/ALL (array) requires array on right side"),
901 					 parser_errposition(pstate, location)));
902 	}
903 
904 	/* Now resolve the operator */
905 	tup = oper(pstate, opname, ltypeId, rtypeId, false, location);
906 	opform = (Form_pg_operator) GETSTRUCT(tup);
907 
908 	/* Check it's not a shell */
909 	if (!RegProcedureIsValid(opform->oprcode))
910 		ereport(ERROR,
911 				(errcode(ERRCODE_UNDEFINED_FUNCTION),
912 				 errmsg("operator is only a shell: %s",
913 						op_signature_string(opname,
914 											opform->oprkind,
915 											opform->oprleft,
916 											opform->oprright)),
917 				 parser_errposition(pstate, location)));
918 
919 	args = list_make2(ltree, rtree);
920 	actual_arg_types[0] = ltypeId;
921 	actual_arg_types[1] = rtypeId;
922 	declared_arg_types[0] = opform->oprleft;
923 	declared_arg_types[1] = opform->oprright;
924 
925 	/*
926 	 * enforce consistency with polymorphic argument and return types,
927 	 * possibly adjusting return type or declared_arg_types (which will be
928 	 * used as the cast destination by make_fn_arguments)
929 	 */
930 	rettype = enforce_generic_type_consistency(actual_arg_types,
931 											   declared_arg_types,
932 											   2,
933 											   opform->oprresult,
934 											   false);
935 
936 	/*
937 	 * Check that operator result is boolean
938 	 */
939 	if (rettype != BOOLOID)
940 		ereport(ERROR,
941 				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
942 				 errmsg("op ANY/ALL (array) requires operator to yield boolean"),
943 				 parser_errposition(pstate, location)));
944 	if (get_func_retset(opform->oprcode))
945 		ereport(ERROR,
946 				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
947 				 errmsg("op ANY/ALL (array) requires operator not to return a set"),
948 				 parser_errposition(pstate, location)));
949 
950 	/*
951 	 * Now switch back to the array type on the right, arranging for any
952 	 * needed cast to be applied.  Beware of polymorphic operators here;
953 	 * enforce_generic_type_consistency may or may not have replaced a
954 	 * polymorphic type with a real one.
955 	 */
956 	if (IsPolymorphicType(declared_arg_types[1]))
957 	{
958 		/* assume the actual array type is OK */
959 		res_atypeId = atypeId;
960 	}
961 	else
962 	{
963 		res_atypeId = get_array_type(declared_arg_types[1]);
964 		if (!OidIsValid(res_atypeId))
965 			ereport(ERROR,
966 					(errcode(ERRCODE_UNDEFINED_OBJECT),
967 					 errmsg("could not find array type for data type %s",
968 							format_type_be(declared_arg_types[1])),
969 					 parser_errposition(pstate, location)));
970 	}
971 	actual_arg_types[1] = atypeId;
972 	declared_arg_types[1] = res_atypeId;
973 
974 	/* perform the necessary typecasting of arguments */
975 	make_fn_arguments(pstate, args, actual_arg_types, declared_arg_types);
976 
977 	/* and build the expression node */
978 	result = makeNode(ScalarArrayOpExpr);
979 	result->opno = oprid(tup);
980 	result->opfuncid = opform->oprcode;
981 	result->useOr = useOr;
982 	/* inputcollid will be set by parse_collate.c */
983 	result->args = args;
984 	result->location = location;
985 
986 	ReleaseSysCache(tup);
987 
988 	return (Expr *) result;
989 }
990 
991 
992 /*
993  * Lookaside cache to speed operator lookup.  Possibly this should be in
994  * a separate module under utils/cache/ ?
995  *
996  * The idea here is that the mapping from operator name and given argument
997  * types is constant for a given search path (or single specified schema OID)
998  * so long as the contents of pg_operator and pg_cast don't change.  And that
999  * mapping is pretty expensive to compute, especially for ambiguous operators;
1000  * this is mainly because there are a *lot* of instances of popular operator
1001  * names such as "=", and we have to check each one to see which is the
1002  * best match.  So once we have identified the correct mapping, we save it
1003  * in a cache that need only be flushed on pg_operator or pg_cast change.
1004  * (pg_cast must be considered because changes in the set of implicit casts
1005  * affect the set of applicable operators for any given input datatype.)
1006  *
1007  * XXX in principle, ALTER TABLE ... INHERIT could affect the mapping as
1008  * well, but we disregard that since there's no convenient way to find out
1009  * about it, and it seems a pretty far-fetched corner-case anyway.
1010  *
1011  * Note: at some point it might be worth doing a similar cache for function
1012  * lookups.  However, the potential gain is a lot less since (a) function
1013  * names are generally not overloaded as heavily as operator names, and
1014  * (b) we'd have to flush on pg_proc updates, which are probably a good
1015  * deal more common than pg_operator updates.
1016  */
1017 
1018 /* The operator cache hashtable */
1019 static HTAB *OprCacheHash = NULL;
1020 
1021 
1022 /*
1023  * make_oper_cache_key
1024  *		Fill the lookup key struct given operator name and arg types.
1025  *
1026  * Returns true if successful, false if the search_path overflowed
1027  * (hence no caching is possible).
1028  *
1029  * pstate/location are used only to report the error position; pass NULL/-1
1030  * if not available.
1031  */
1032 static bool
make_oper_cache_key(ParseState * pstate,OprCacheKey * key,List * opname,Oid ltypeId,Oid rtypeId,int location)1033 make_oper_cache_key(ParseState *pstate, OprCacheKey *key, List *opname,
1034 					Oid ltypeId, Oid rtypeId, int location)
1035 {
1036 	char	   *schemaname;
1037 	char	   *opername;
1038 
1039 	/* deconstruct the name list */
1040 	DeconstructQualifiedName(opname, &schemaname, &opername);
1041 
1042 	/* ensure zero-fill for stable hashing */
1043 	MemSet(key, 0, sizeof(OprCacheKey));
1044 
1045 	/* save operator name and input types into key */
1046 	strlcpy(key->oprname, opername, NAMEDATALEN);
1047 	key->left_arg = ltypeId;
1048 	key->right_arg = rtypeId;
1049 
1050 	if (schemaname)
1051 	{
1052 		ParseCallbackState pcbstate;
1053 
1054 		/* search only in exact schema given */
1055 		setup_parser_errposition_callback(&pcbstate, pstate, location);
1056 		key->search_path[0] = LookupExplicitNamespace(schemaname, false);
1057 		cancel_parser_errposition_callback(&pcbstate);
1058 	}
1059 	else
1060 	{
1061 		/* get the active search path */
1062 		if (fetch_search_path_array(key->search_path,
1063 									MAX_CACHED_PATH_LEN) > MAX_CACHED_PATH_LEN)
1064 			return false;		/* oops, didn't fit */
1065 	}
1066 
1067 	return true;
1068 }
1069 
1070 /*
1071  * find_oper_cache_entry
1072  *
1073  * Look for a cache entry matching the given key.  If found, return the
1074  * contained operator OID, else return InvalidOid.
1075  */
1076 static Oid
find_oper_cache_entry(OprCacheKey * key)1077 find_oper_cache_entry(OprCacheKey *key)
1078 {
1079 	OprCacheEntry *oprentry;
1080 
1081 	if (OprCacheHash == NULL)
1082 	{
1083 		/* First time through: initialize the hash table */
1084 		HASHCTL		ctl;
1085 
1086 		MemSet(&ctl, 0, sizeof(ctl));
1087 		ctl.keysize = sizeof(OprCacheKey);
1088 		ctl.entrysize = sizeof(OprCacheEntry);
1089 		OprCacheHash = hash_create("Operator lookup cache", 256,
1090 								   &ctl, HASH_ELEM | HASH_BLOBS);
1091 
1092 		/* Arrange to flush cache on pg_operator and pg_cast changes */
1093 		CacheRegisterSyscacheCallback(OPERNAMENSP,
1094 									  InvalidateOprCacheCallBack,
1095 									  (Datum) 0);
1096 		CacheRegisterSyscacheCallback(CASTSOURCETARGET,
1097 									  InvalidateOprCacheCallBack,
1098 									  (Datum) 0);
1099 	}
1100 
1101 	/* Look for an existing entry */
1102 	oprentry = (OprCacheEntry *) hash_search(OprCacheHash,
1103 											 (void *) key,
1104 											 HASH_FIND, NULL);
1105 	if (oprentry == NULL)
1106 		return InvalidOid;
1107 
1108 	return oprentry->opr_oid;
1109 }
1110 
1111 /*
1112  * make_oper_cache_entry
1113  *
1114  * Insert a cache entry for the given key.
1115  */
1116 static void
make_oper_cache_entry(OprCacheKey * key,Oid opr_oid)1117 make_oper_cache_entry(OprCacheKey *key, Oid opr_oid)
1118 {
1119 	OprCacheEntry *oprentry;
1120 
1121 	Assert(OprCacheHash != NULL);
1122 
1123 	oprentry = (OprCacheEntry *) hash_search(OprCacheHash,
1124 											 (void *) key,
1125 											 HASH_ENTER, NULL);
1126 	oprentry->opr_oid = opr_oid;
1127 }
1128 
1129 /*
1130  * Callback for pg_operator and pg_cast inval events
1131  */
1132 static void
InvalidateOprCacheCallBack(Datum arg,int cacheid,uint32 hashvalue)1133 InvalidateOprCacheCallBack(Datum arg, int cacheid, uint32 hashvalue)
1134 {
1135 	HASH_SEQ_STATUS status;
1136 	OprCacheEntry *hentry;
1137 
1138 	Assert(OprCacheHash != NULL);
1139 
1140 	/* Currently we just flush all entries; hard to be smarter ... */
1141 	hash_seq_init(&status, OprCacheHash);
1142 
1143 	while ((hentry = (OprCacheEntry *) hash_seq_search(&status)) != NULL)
1144 	{
1145 		if (hash_search(OprCacheHash,
1146 						(void *) &hentry->key,
1147 						HASH_REMOVE, NULL) == NULL)
1148 			elog(ERROR, "hash table corrupted");
1149 	}
1150 }
1151