File: typeconv.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 (410 lines) | stat: -rw-r--r-- 9,196 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
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML
><HEAD
><TITLE
>Type Conversion</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="PREVIOUS"
TITLE="IP V4 Functions"
HREF="functions2446.html"><LINK
REL="NEXT"
TITLE="Operators"
HREF="typeconv2564.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="functions2446.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="typeconv2564.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><H1
><A
NAME="TYPECONV"
>Chapter 8. Type Conversion</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="typeconv.html#AEN2501"
>Overview</A
></DT
><DT
><A
HREF="typeconv2564.html"
>Operators</A
></DT
><DT
><A
HREF="typeconv2629.html"
>Functions</A
></DT
><DT
><A
HREF="typeconv2683.html"
>Query Targets</A
></DT
><DT
><A
HREF="typeconv2704.html"
>UNION Queries</A
></DT
></DL
></DIV
><P
><SPAN
CLASS="ACRONYM"
>SQL</SPAN
> queries can, intentionally or not, require
mixing of different data types in the same expression. 
<SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> has extensive facilities for
evaluating mixed-type expressions.&#13;</P
><P
>In many cases a user will not need
to understand the details of the type conversion mechanism.
However, the implicit conversions done by <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
>
can affect the apparent results of a query, and these results
can be tailored by a user or programmer
using <I
CLASS="EMPHASIS"
>explicit</I
> type coersion.&#13;</P
><P
>This chapter introduces the <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
>
 type conversion mechanisms and conventions.
Refer to the relevant sections in the User's Guide and Programmer's Guide
for more information on specific data types and allowed functions and operators.&#13;</P
><P
>The Programmer's Guide has more details on the exact algorithms used for
implicit type conversion and coersion.&#13;</P
><H1
CLASS="SECT1"
><A
NAME="AEN2501"
>Overview</A
></H1
><P
><SPAN
CLASS="ACRONYM"
>SQL</SPAN
> is a strongly typed language. That is, every data item
has an associated data type which determines its behavior and allowed usage.
<SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> has an extensible type system which is
much more general and flexible than other <SPAN
CLASS="ACRONYM"
>RDBMS</SPAN
> implementations.
Hence, most type conversion behavior in <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
>
should be governed by general rules rather than by ad-hoc heuristics to allow
mixed-type expressions to be meaningful, even with user-defined types.&#13;</P
><P
>The <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> scanner/parser decodes lexical elements
into only five fundamental categories: integers, floats, strings, names, and keywords.
Most extended types are first tokenized into strings. The <SPAN
CLASS="ACRONYM"
>SQL</SPAN
>
language definition allows specifying type names with strings, and this mechanism
is used by <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
>
to start the parser down the correct path. For example, the query

<PRE
CLASS="PROGRAMLISTING"
>tgl=&#62; SELECT text 'Origin' AS "Label", point '(0,0)' AS "Value";
Label |Value
------+-----
Origin|(0,0)
(1 row)</PRE
>

has two strings, of type <SPAN
CLASS="TYPE"
>text</SPAN
> and <SPAN
CLASS="TYPE"
>point</SPAN
>.
If a type is not specified, then the placeholder type <SPAN
CLASS="TYPE"
>unknown</SPAN
>
is assigned initially, to be resolved in later stages as described below.&#13;</P
><P
>There are four fundamental <SPAN
CLASS="ACRONYM"
>SQL</SPAN
> constructs requiring
distinct type conversion rules in the <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
>
parser:

<P
></P
></P><DL
><DT
>Operators</DT
><DD
><P
><SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> allows expressions with
left- and right-unary (one argument) operators,
as well as binary (two argument) operators.</P
></DD
><DT
>Function calls</DT
><DD
><P
>Much of the <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> type system is built around a rich set of
functions. Function calls have one or more arguments which, for any specific query,
must be matched to the functions available in the system catalog.</P
></DD
><DT
>Query targets</DT
><DD
><P
><SPAN
CLASS="ACRONYM"
>SQL</SPAN
> INSERT statements place the results of query into a table. The expressions
in the query must be matched up with, and perhaps converted to, the target columns of the insert.</P
></DD
><DT
>UNION queries</DT
><DD
><P
>Since all select results from a UNION SELECT statement must appear in a single set of columns, the types
of each SELECT clause must be matched up and converted to a uniform set.</P
></DD
></DL
><P>&#13;</P
><P
>Many of the general type conversion rules use simple conventions built on
the <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> function and operator system tables.
There are some heuristics included in the conversion rules to better support
conventions for the <SPAN
CLASS="ACRONYM"
>SQL92</SPAN
> standard native types such as
<SPAN
CLASS="TYPE"
>smallint</SPAN
>, <SPAN
CLASS="TYPE"
>integer</SPAN
>, and <SPAN
CLASS="TYPE"
>float</SPAN
>.&#13;</P
><P
>The <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
> parser uses the convention that all
type conversion functions take a single argument of the source type and are
named with the same name as the target type. Any function meeting this
criteria is considered to be a valid conversion function, and may be used
by the parser as such. This simple assumption gives the parser the power
to explore type conversion possibilities without hardcoding, allowing
extended user-defined types to use these same features transparently.&#13;</P
><P
>An additional heuristic is provided in the parser to allow better guesses
at proper behavior for <SPAN
CLASS="ACRONYM"
>SQL</SPAN
> standard types. There are
five categories of types defined: boolean, string, numeric, geometric,
and user-defined. Each category, with the exception of user-defined, has
a "preferred type" which is used to resolve ambiguities in candidates.
Each "user-defined" type is its own "preferred type", so ambiguous
expressions (those with multiple candidate parsing solutions)
with only one user-defined type can resolve to a single best choice, while those with
multiple user-defined types will remain ambiguous and throw an error.&#13;</P
><P
>Ambiguous expressions which have candidate solutions within only one type category are
likely to resolve, while ambiguous expressions with candidates spanning multiple
categories are likely to throw an error and ask for clarification from the user.&#13;</P
><H2
CLASS="SECT2"
><A
NAME="AEN2550"
>Guidelines</A
></H2
><P
>All type conversion rules are designed with several principles in mind:

<P
></P
></P><UL
COMPACT="COMPACT"
><LI
STYLE="list-style-type: disc"
><P
>Implicit conversions should never have suprising or unpredictable outcomes.&#13;</P
></LI
><LI
STYLE="list-style-type: disc"
><P
>User-defined types, of which the parser has no apriori knowledge, should be
"higher" in the type heirarchy. In mixed-type expressions, native types shall always
be converted to a user-defined type (of course, only if conversion is necessary).&#13;</P
></LI
><LI
STYLE="list-style-type: disc"
><P
>User-defined types are not related. Currently, <SPAN
CLASS="PRODUCTNAME"
>Postgres</SPAN
>
does not have information available to it on relationships between types, other than
hardcoded heuristics for built-in types and implicit relationships based on available functions
in the catalog.&#13;</P
></LI
><LI
STYLE="list-style-type: disc"
><P
>There should be no extra overhead from the parser or executor
if a query does not need implicit type conversion.
That is, if a query is well formulated and the types already match up, then the query should proceed
without spending extra time in the parser and without introducing unnecessary implicit conversion
functions into the query.&#13;</P
><P
>Additionally, if a query usually requires an implicit conversion for a function, and
if then the user defines an explicit function with the correct argument types, the parser
should use this new function and will no longer do the implicit conversion using the old function.</P
></LI
></UL
><P>&#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="functions2446.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="typeconv2564.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>IP V4 Functions</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Operators</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>