File: typeconv2629.html

package info (click to toggle)
mpsql 2.1-2
  • links: PTS
  • area: non-free
  • in suites: potato
  • size: 3,528 kB
  • ctags: 4,886
  • sloc: ansic: 35,184; makefile: 3,761; sh: 44
file content (332 lines) | stat: -rw-r--r-- 5,491 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML
><HEAD
><TITLE
>Functions</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet version 1.19"><LINK
REL="HOME"
TITLE="PostgreSQL User's Guide"
HREF="user.html"><LINK
REL="UP"
TITLE="Type Conversion"
HREF="typeconv.html"><LINK
REL="PREVIOUS"
TITLE="Operators"
HREF="typeconv2564.html"><LINK
REL="NEXT"
TITLE="Query Targets"
HREF="typeconv2683.html"></HEAD
><BODY
BGCOLOR="#FFFFFF"
TEXT="#000000"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>PostgreSQL User's Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="typeconv2564.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 8. Type Conversion</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="typeconv2683.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><H1
CLASS="SECT1"
><A
NAME="AEN2629"
>Functions</A
></H1
><P
></P
><DIV
CLASS="PROCEDURE"
><P
><B
>Function Evaluation</B
></P
><OL
TYPE="1"
><LI
><P
>Check for an exact match in the pg_proc system catalog.&#13;</P
></LI
><LI
><P
>Look for the best match.&#13;</P
><OL
CLASS="SUBSTEPS"
TYPE="a"
><LI
><P
>Make a list of all functions of the same name with the same number of arguments.&#13;</P
></LI
><LI
><P
>If only one function is in the list, use it if the input types can be coerced,
and throw an error if the types cannot be coerced.&#13;</P
></LI
><LI
><P
>Keep all functions with the most explicit matches for types. Keep all if there
are no explicit matches and move to the next step.
If only one candidate remains, use it if the type can be coerced.&#13;</P
></LI
><LI
><P
>If any input arguments are "unknown", categorize the input candidate arguments as
boolean, numeric, string, geometric, or user-defined. If there is a mix of
categories, or more than one user-defined type, throw an error because
the correct choice cannot be deduced without more clues.
If only one category is present, then assign the "preferred type"
to the input column which had been previously "unknown".&#13;</P
></LI
><LI
><P
>Choose the candidate with the most exact type matches, and which matches
the "preferred type" for each column category from the previous step.
If there is still more than one candidate, or if there are none,
then throw an error.</P
></LI
></OL
></LI
></OL
></DIV
><H2
CLASS="SECT2"
><A
NAME="AEN2649"
>Examples</A
></H2
><H3
CLASS="SECT3"
><A
NAME="AEN2651"
>Factorial Function</A
></H3
><P
>There is only one factorial function defined in the pg_proc catalog.
So the following query automatically converts the <SPAN
CLASS="TYPE"
>int2</SPAN
> argument
to <SPAN
CLASS="TYPE"
>int4</SPAN
>:

<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select int4fac(int2 '4');
int4fac
-------
     24
(1 row)</PRE
>

and is actually transformed by the parser to
<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select int4fac(int4(int2 '4'));
int4fac
-------
     24
(1 row)</PRE
>&#13;</P
><H3
CLASS="SECT3"
><A
NAME="AEN2658"
>Substring Function</A
></H3
><P
>There are two <TT
CLASS="FUNCTION"
>substr</TT
> functions declared in pg_proc. However,
only one takes two arguments, of types <SPAN
CLASS="TYPE"
>text</SPAN
> and <SPAN
CLASS="TYPE"
>int4</SPAN
>.&#13;</P
><P
>If called with a string constant of unspecified type, the type is matched up
directly with the only candidate function type:
<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select substr('1234', 3);
substr
------
    34
(1 row)</PRE
>&#13;</P
><P
>If the string is declared to be of type <SPAN
CLASS="TYPE"
>varchar</SPAN
>, as might be the case
if it comes from a table, then the parser will try to coerce it to become <SPAN
CLASS="TYPE"
>text</SPAN
>:
<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select substr(varchar '1234', 3);
substr
------
    34
(1 row)</PRE
>
which is transformed by the parser to become
<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select substr(text(varchar '1234'), 3);
substr
------
    34
(1 row)</PRE
>
<BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>There are some heuristics in the parser to optimize the relationship between the
<SPAN
CLASS="TYPE"
>char</SPAN
>, <SPAN
CLASS="TYPE"
>varchar</SPAN
>, and <SPAN
CLASS="TYPE"
>text</SPAN
> types.
For this case, <TT
CLASS="FUNCTION"
>substr</TT
> is called directly with the <SPAN
CLASS="TYPE"
>varchar</SPAN
> string
rather than inserting an explicit conversion call.</P
></BLOCKQUOTE
>&#13;</P
><P
>And, if the function is called with an <SPAN
CLASS="TYPE"
>int4</SPAN
>, the parser will
try to convert that to <SPAN
CLASS="TYPE"
>text</SPAN
>:
<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select substr(1234, 3);
substr
------
    34
(1 row)</PRE
>
actually executes as
<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; select substr(text(1234), 3);
substr
------
    34
(1 row)</PRE
>&#13;</P
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="typeconv2564.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="user.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="typeconv2683.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Operators</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="typeconv.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Query Targets</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>