Identifier
Core?
Description
Comment
B012
Embedded C
B021
Direct SQL
E011
Core
Numeric data types
E011-01
Core
INTEGER and SMALLINT data types
E011-02
Core
REAL, DOUBLE PRECISION, and FLOAT data types
E011-03
Core
DECIMAL and NUMERIC data types
E011-04
Core
Arithmetic operators
E011-05
Core
Numeric comparison
E011-06
Core
Implicit casting among the numeric data types
E021
Core
Character data types
E021-01
Core
CHARACTER data type
E021-02
Core
CHARACTER VARYING data type
E021-03
Core
Character literals
E021-04
Core
CHARACTER_LENGTH function
trims trailing spaces from CHARACTER values before counting
E021-05
Core
OCTET_LENGTH function
E021-06
Core
SUBSTRING function
E021-07
Core
Character concatenation
E021-08
Core
UPPER and LOWER functions
E021-09
Core
TRIM function
E021-10
Core
Implicit casting among the character string types
E021-11
Core
POSITION function
E021-12
Core
Character comparison
E031
Core
Identifiers
E031-01
Core
Delimited identifiers
E031-02
Core
Lower case identifiers
E031-03
Core
Trailing underscore
E051
Core
Basic query specification
E051-01
Core
SELECT DISTINCT
E051-02
Core
GROUP BY clause
E051-04
Core
GROUP BY can contain columns not in <select list>
E051-05
Core
Select list items can be renamed
E051-06
Core
HAVING clause
E051-07
Core
Qualified * in select list
E051-08
Core
Correlation names in the FROM clause
E051-09
Core
Rename columns in the FROM clause
E061
Core
Basic predicates and search conditions
E061-01
Core
Comparison predicate
E061-02
Core
BETWEEN predicate
E061-03
Core
IN predicate with list of values
E061-04
Core
LIKE predicate
E061-05
Core
LIKE predicate ESCAPE clause
E061-06
Core
NULL predicate
E061-07
Core
Quantified comparison predicate
E061-08
Core
EXISTS predicate
E061-09
Core
Subqueries in comparison predicate
E061-11
Core
Subqueries in IN predicate
E061-12
Core
Subqueries in quantified comparison predicate
E061-13
Core
Correlated subqueries
E061-14
Core
Search condition
E071
Core
Basic query expressions
E071-01
Core
UNION DISTINCT table operator
E071-02
Core
UNION ALL table operator
E071-03
Core
EXCEPT DISTINCT table operator
E071-05
Core
Columns combined via table operators need not have exactly the same data type
E071-06
Core
Table operators in subqueries
E081
Core
Basic Privileges
E081-01
Core
SELECT privilege
E081-02
Core
DELETE privilege
E081-03
Core
INSERT privilege at the table level
E081-04
Core
UPDATE privilege at the table level
E081-05
Core
UPDATE privilege at the column level
E081-06
Core
REFERENCES privilege at the table level
E081-07
Core
REFERENCES privilege at the column level
E081-08
Core
WITH GRANT OPTION
E081-09
Core
USAGE privilege
E081-10
Core
EXECUTE privilege
E091
Core
Set functions
E091-01
Core
AVG
E091-02
Core
COUNT
E091-03
Core
MAX
E091-04
Core
MIN
E091-05
Core
SUM
E091-06
Core
ALL quantifier
E091-07
Core
DISTINCT quantifier
E101
Core
Basic data manipulation
E101-01
Core
INSERT statement
E101-03
Core
Searched UPDATE statement
E101-04
Core
Searched DELETE statement
E111
Core
Single row SELECT statement
E121
Core
Basic cursor support
E121-01
Core
DECLARE CURSOR
E121-02
Core
ORDER BY columns need not be in select list
E121-03
Core
Value expressions in ORDER BY clause
E121-04
Core
OPEN statement
E121-06
Core
Positioned UPDATE statement
E121-07
Core
Positioned DELETE statement
E121-08
Core
CLOSE statement
E121-10
Core
FETCH statement implicit NEXT
E121-17
Core
WITH HOLD cursors
E131
Core
Null value support (nulls in lieu of values)
E141
Core
Basic integrity constraints
E141-01
Core
NOT NULL constraints
E141-02
Core
UNIQUE constraints of NOT NULL columns
E141-03
Core
PRIMARY KEY constraints
E141-04
Core
Basic FOREIGN KEY constraint with the NO ACTION default for both referential delete action and referential update action
E141-06
Core
CHECK constraints
E141-07
Core
Column defaults
E141-08
Core
NOT NULL inferred on PRIMARY KEY
E141-10
Core
Names in a foreign key can be specified in any order
E151
Core
Transaction support
E151-01
Core
COMMIT statement
E151-02
Core
ROLLBACK statement
E152
Core
Basic SET TRANSACTION statement
E152-01
Core
SET TRANSACTION statement: ISOLATION LEVEL SERIALIZABLE clause
E152-02
Core
SET TRANSACTION statement: READ ONLY and READ WRITE clauses
E153
Core
Updatable queries with subqueries
E161
Core
SQL comments using leading double minus
E171
Core
SQLSTATE support
E182
Core
Host language binding
F021
Core
Basic information schema
F021-01
Core
COLUMNS view
F021-02
Core
TABLES view
F021-03
Core
VIEWS view
F021-04
Core
TABLE_CONSTRAINTS view
F021-05
Core
REFERENTIAL_CONSTRAINTS view
F021-06
Core
CHECK_CONSTRAINTS view
F031
Core
Basic schema manipulation
F031-01
Core
CREATE TABLE statement to create persistent base tables
F031-02
Core
CREATE VIEW statement
F031-03
Core
GRANT statement
F031-04
Core
ALTER TABLE statement: ADD COLUMN clause
F031-13
Core
DROP TABLE statement: RESTRICT clause
F031-16
Core
DROP VIEW statement: RESTRICT clause
F031-19
Core
REVOKE statement: RESTRICT clause
F032
CASCADE drop behavior
F033
ALTER TABLE statement: DROP COLUMN clause
F034
Extended REVOKE statement
F034-01
REVOKE statement performed by other than the owner of a schema object
F034-02
REVOKE statement: GRANT OPTION FOR clause
F034-03
REVOKE statement to revoke a privilege that the grantee has WITH GRANT OPTION
F041
Core
Basic joined table
F041-01
Core
Inner join (but not necessarily the INNER keyword)
F041-02
Core
INNER keyword
F041-03
Core
LEFT OUTER JOIN
F041-04
Core
RIGHT OUTER JOIN
F041-05
Core
Outer joins can be nested
F041-07
Core
The inner table in a left or right outer join can also be used in an inner join
F041-08
Core
All comparison operators are supported (rather than just =)
F051
Core
Basic date and time
F051-01
Core
DATE data type (including support of DATE literal)
F051-02
Core
TIME data type (including support of TIME literal) with fractional seconds precision of at least 0
F051-03
Core
TIMESTAMP data type (including support of TIMESTAMP literal) with fractional seconds precision of at least 0 and 6
F051-04
Core
Comparison predicate on DATE, TIME, and TIMESTAMP data types
F051-05
Core
Explicit CAST between datetime types and character string types
F051-06
Core
CURRENT_DATE
F051-07
Core
LOCALTIME
F051-08
Core
LOCALTIMESTAMP
F052
Intervals and datetime arithmetic
F053
OVERLAPS predicate
F081
Core
UNION and EXCEPT in views
F111
Isolation levels other than SERIALIZABLE
F111-01
READ UNCOMMITTED isolation level
F111-02
READ COMMITTED isolation level
F111-03
REPEATABLE READ isolation level
F131
Core
Grouped operations
F131-01
Core
WHERE, GROUP BY, and HAVING clauses supported in queries with grouped views
F131-02
Core
Multiple tables supported in queries with grouped views
F131-03
Core
Set functions supported in queries with grouped views
F131-04
Core
Subqueries with GROUP BY and HAVING clauses and grouped views
F131-05
Core
Single row SELECT with GROUP BY and HAVING clauses and grouped views
F171
Multiple schemas per user
F181
Core
Multiple module support
F191
Referential delete actions
F200
TRUNCATE TABLE statement
F201
Core
CAST function
F202
TRUNCATE TABLE: identity column restart option
F221
Core
Explicit defaults
F222
INSERT statement: DEFAULT VALUES clause
F231
Privilege tables
F231-01
TABLE_PRIVILEGES view
F231-02
COLUMN_PRIVILEGES view
F231-03
USAGE_PRIVILEGES view
F251
Domain support
F261
Core
CASE expression
F261-01
Core
Simple CASE
F261-02
Core
Searched CASE
F261-03
Core
NULLIF
F261-04
Core
COALESCE
F262
Extended CASE expression
F271
Compound character literals
F281
LIKE enhancements
F302
INTERSECT table operator
F302-01
INTERSECT DISTINCT table operator
F302-02
INTERSECT ALL table operator
F304
EXCEPT ALL table operator
F311
Core
Schema definition statement
F311-01
Core
CREATE SCHEMA
F311-02
Core
CREATE TABLE for persistent base tables
F311-03
Core
CREATE VIEW
F311-04
Core
CREATE VIEW: WITH CHECK OPTION
F311-05
Core
GRANT statement
F321
User authorization
F361
Subprogram support
F381
Extended schema manipulation
F381-01
ALTER TABLE statement: ALTER COLUMN clause
F381-02
ALTER TABLE statement: ADD CONSTRAINT clause
F381-03
ALTER TABLE statement: DROP CONSTRAINT clause
F382
Alter column data type
F383
Set column not null clause
F384
Drop identity property clause
F385
Drop column generation expression clause
F386
Set identity column generation clause
F391
Long identifiers
F392
Unicode escapes in identifiers
F393
Unicode escapes in literals
F394
Optional normal form specification
F401
Extended joined table
F401-01
NATURAL JOIN
F401-02
FULL OUTER JOIN
F401-04
CROSS JOIN
F402
Named column joins for LOBs, arrays, and multisets
F411
Time zone specification
differences regarding literal interpretation
F421
National character
F431
Read-only scrollable cursors
F431-01
FETCH with explicit NEXT
F431-02
FETCH FIRST
F431-03
FETCH LAST
F431-04
FETCH PRIOR
F431-05
FETCH ABSOLUTE
F431-06
FETCH RELATIVE
F441
Extended set function support
F442
Mixed column references in set functions
F471
Core
Scalar subquery values
F481
Core
Expanded NULL predicate
F491
Constraint management
F501
Core
Features and conformance views
F501-01
Core
SQL_FEATURES view
F501-02
Core
SQL_SIZING view
F502
Enhanced documentation tables
F531
Temporary tables
F555
Enhanced seconds precision
F561
Full value expressions
F571
Truth value tests
F591
Derived tables
F611
Indicator data types
F641
Row and table constructors
F651
Catalog name qualifiers
F661
Simple tables
F672
Retrospective check constraints
F690
Collation support
but no character set support
F692
Extended collation support
F701
Referential update actions
F711
ALTER domain
F731
INSERT column privileges
F751
View CHECK enhancements
F761
Session management
F762
CURRENT_CATALOG
F763
CURRENT_SCHEMA
F771
Connection management
F781
Self-referencing operations
F791
Insensitive cursors
F801
Full set function
F850
Top-level <order by clause> in <query expression>
F851
<order by clause> in subqueries
F852
Top-level <order by clause> in views
F855
Nested <order by clause> in <query expression>
F856
Nested <fetch first clause> in <query expression>
F857
Top-level <fetch first clause> in <query expression>
F858
<fetch first clause> in subqueries
F859
Top-level <fetch first clause> in views
F860
<fetch first row count> in <fetch first clause>
F861
Top-level <result offset clause> in <query expression>
F862
<result offset clause> in subqueries
F863
Nested <result offset clause> in <query expression>
F864
Top-level <result offset clause> in views
F865
<offset row count> in <result offset clause>
F867
FETCH FIRST clause: WITH TIES option
S071
SQL paths in function and type name resolution
S092
Arrays of user-defined types
S095
Array constructors by query
S096
Optional array bounds
S098
ARRAY_AGG
S111
ONLY in query expressions
S201
SQL-invoked routines on arrays
S201-01
Array parameters
S201-02
Array as result type of functions
S211
User-defined cast functions
S301
Enhanced UNNEST
T031
BOOLEAN data type
T071
BIGINT data type
T121
WITH (excluding RECURSIVE) in query expression
T122
WITH (excluding RECURSIVE) in subquery
T131
Recursive query
T132
Recursive query in subquery
T141
SIMILAR predicate
T151
DISTINCT predicate
T152
DISTINCT predicate with negation
T171
LIKE clause in table definition
T172
AS subquery clause in table definition
T173
Extended LIKE clause in table definition
T174
Identity columns
T177
Sequence generator support: simple restart option
T178
Identity columns: simple restart option
T191
Referential action RESTRICT
T201
Comparable data types for referential constraints
T211-01
Triggers activated on UPDATE, INSERT, or DELETE of one base table
T211-02
BEFORE triggers
T211-03
AFTER triggers
T211-04
FOR EACH ROW triggers
T211-05
Ability to specify a search condition that must be true before the trigger is invoked
T211-07
TRIGGER privilege
T212
Enhanced trigger capability
T213
INSTEAD OF triggers
T231
Sensitive cursors
T241
START TRANSACTION statement
T261
Chained transactions
T271
Savepoints
T281
SELECT privilege with column granularity
T285
Enhanced derived column names
T312
OVERLAY function
T321-01
Core
User-defined functions with no overloading
T321-02
Core
User-defined stored procedures with no overloading
T321-03
Core
Function invocation
T321-04
Core
CALL statement
T321-06
Core
ROUTINES view
T321-07
Core
PARAMETERS view
T323
Explicit security for external routines
T325
Qualified SQL parameter references
T331
Basic roles
T341
Overloading of SQL-invoked functions and procedures
T351
Bracketed SQL comments (/*...*/ comments)
T431
Extended grouping capabilities
T432
Nested and concatenated GROUPING SETS
T433
Multiargument GROUPING function
T441
ABS and MOD functions
T461
Symmetric BETWEEN predicate
T491
LATERAL derived table
T501
Enhanced EXISTS predicate
T521
Named arguments in CALL statement
T523
Default values for INOUT parameters of SQL-invoked procedures
T524
Named arguments in routine invocations other than a CALL statement
T525
Default values for parameters of SQL-invoked functions
T551
Optional key words for default syntax
T581
Regular expression substring function
T591
UNIQUE constraints of possibly null columns
T611
Elementary OLAP operations
T612
Advanced OLAP operations
T613
Sampling
T614
NTILE function
T615
LEAD and LAG functions
T617
FIRST_VALUE and LAST_VALUE function
T620
WINDOW clause: GROUPS option
T621
Enhanced numeric functions
T622
Trigonometric functions
T623
General logarithm functions
T624
Common logarithm functions
T631
Core
IN predicate with one list element
T651
SQL-schema statements in SQL routines
T653
SQL-schema statements in external routines
T655
Cyclically dependent routines
T831
SQL/JSON path language: strict mode
T832
SQL/JSON path language: item method
T833
SQL/JSON path language: multiple subscripts
T834
SQL/JSON path language: wildcard member accessor
T835
SQL/JSON path language: filter expressions
T836
SQL/JSON path language: starts with predicate
T837
SQL/JSON path language: regex_like predicate
X010
XML type
X011
Arrays of XML type
X014
Attributes of XML type
X016
Persistent XML values
X020
XMLConcat
X031
XMLElement
X032
XMLForest
X034
XMLAgg
X035
XMLAgg: ORDER BY option
X036
XMLComment
X037
XMLPI
X040
Basic table mapping
X041
Basic table mapping: nulls absent
X042
Basic table mapping: null as nil
X043
Basic table mapping: table as forest
X044
Basic table mapping: table as element
X045
Basic table mapping: with target namespace
X046
Basic table mapping: data mapping
X047
Basic table mapping: metadata mapping
X048
Basic table mapping: base64 encoding of binary strings
X049
Basic table mapping: hex encoding of binary strings
X050
Advanced table mapping
X051
Advanced table mapping: nulls absent
X052
Advanced table mapping: null as nil
X053
Advanced table mapping: table as forest
X054
Advanced table mapping: table as element
X055
Advanced table mapping: with target namespace
X056
Advanced table mapping: data mapping
X057
Advanced table mapping: metadata mapping
X058
Advanced table mapping: base64 encoding of binary strings
X059
Advanced table mapping: hex encoding of binary strings
X060
XMLParse: character string input and CONTENT option
X061
XMLParse: character string input and DOCUMENT option
X070
XMLSerialize: character string serialization and CONTENT option
X071
XMLSerialize: character string serialization and DOCUMENT option
X072
XMLSerialize: character string serialization
X090
XML document predicate
X120
XML parameters in SQL routines
X121
XML parameters in external routines
X221
XML passing mechanism BY VALUE
X301
XMLTable: derived column list option
X302
XMLTable: ordinality column option
X303
XMLTable: column default option
X304
XMLTable: passing a context item
must be XML DOCUMENT
X400
Name and identifier mapping
X410
Alter column data type: XML type
本節試圖描述 PostgreSQL 在相當程度上符合目前的 SQL 標準。以下內容可能並非是完整且一致性聲明,但它以合理且對使用者有意義的方式詳細介紹了相關的主題。
The formal name of the SQL standard is ISO/IEC 9075 “Database Language SQL”. A revised version of the standard is released from time to time; the most recent update appearing in 2016. The 2016 version is referred to as ISO/IEC 9075:2016, or simply as SQL:2016. The versions prior to that were SQL:2011, SQL:2008, SQL:2006, SQL:2003, SQL:1999, and SQL-92. Each version replaces the previous one, so claims of conformance to earlier versions have no official merit. PostgreSQL development aims for conformance with the latest official version of the standard where such conformance does not contradict traditional features or common sense. Many of the features required by the SQL standard are supported, though sometimes with slightly differing syntax or function. Further moves towards conformance can be expected over time.
SQL-92 defined three feature sets for conformance: Entry, Intermediate, and Full. Most database management systems claiming SQL standard conformance were conforming at only the Entry level, since the entire set of features in the Intermediate and Full levels was either too voluminous or in conflict with legacy behaviors.
Starting with SQL:1999, the SQL standard defines a large set of individual features rather than the ineffectively broad three levels found in SQL-92. A large subset of these features represents the “Core” features, which every conforming SQL implementation must supply. The rest of the features are purely optional.
The standard versions beginning with SQL:2003 are also split into a number of parts. Each is known by a shorthand name. Note that these parts are not consecutively numbered.
ISO/IEC 9075-1 Framework (SQL/Framework)
ISO/IEC 9075-2 Foundation (SQL/Foundation)
ISO/IEC 9075-3 Call Level Interface (SQL/CLI)
ISO/IEC 9075-4 Persistent Stored Modules (SQL/PSM)
ISO/IEC 9075-9 Management of External Data (SQL/MED)
ISO/IEC 9075-10 Object Language Bindings (SQL/OLB)
ISO/IEC 9075-11 Information and Definition Schemas (SQL/Schemata)
ISO/IEC 9075-13 Routines and Types using the Java Language (SQL/JRT)
ISO/IEC 9075-14 XML-related specifications (SQL/XML)
ISO/IEC 9075-15 Multi-dimensional arrays (SQL/MDA)
The PostgreSQL core covers parts 1, 2, 9, 11, and 14. Part 3 is covered by the ODBC driver, and part 13 is covered by the PL/Java plug-in, but exact conformance is currently not being verified for these components. There are currently no implementations of parts 4, 10, and 15 for PostgreSQL.
PostgreSQL supports most of the major features of SQL:2016. Out of 177 mandatory features required for full Core conformance, PostgreSQL conforms to at least 170. In addition, there is a long list of supported optional features. It might be worth noting that at the time of writing, no current version of any database management system claims full conformance to Core SQL:2016.
In the following two sections, we provide a list of those features that PostgreSQL supports, followed by a list of the features defined in SQL:2016 which are not yet supported in PostgreSQL. Both of these lists are approximate: There might be minor details that are nonconforming for a feature that is listed as supported, and large parts of an unsupported feature might in fact be implemented. The main body of the documentation always contains the most accurate information about what does and does not work.
Feature codes containing a hyphen are subfeatures. Therefore, if a particular subfeature is not supported, the main feature is listed as unsupported even if some other subfeatures are supported.
Significant revisions to the XML-related specifications in ISO/IEC 9075-14 (SQL/XML) were introduced with SQL:2006. PostgreSQL's implementation of the XML data type and related functions largely follows the earlier 2003 edition, with some borrowing from later editions. In particular:
Where the current standard provides a family of XML data types to hold “document” or “content” in untyped or XML Schema-typed variants, and a type XML(SEQUENCE)
to hold arbitrary pieces of XML content, PostgreSQL provides the single xml
type, which can hold “document” or “content”. There is no equivalent of the standard's “sequence” type.
PostgreSQL provides two functions introduced in SQL:2006, but in variants that use the XPath 1.0 language, rather than XML Query as specified for them in the standard.
This section presents some of the resulting differences you may encounter.
The PostgreSQL-specific functions xpath()
and xpath_exists()
query XML documents using the XPath language. PostgreSQL also provides XPath-only variants of the standard functions XMLEXISTS
and XMLTABLE
, which officially use the XQuery language. For all of these functions, PostgreSQL relies on the libxml2 library, which provides only XPath 1.0.
There is a strong connection between the XQuery language and XPath versions 2.0 and later: any expression that is syntactically valid and executes successfully in both produces the same result (with a minor exception for expressions containing numeric character references or predefined entity references, which XQuery replaces with the corresponding character while XPath leaves them alone). But there is no such connection between these languages and XPath 1.0; it was an earlier language and differs in many respects.
There are two categories of limitation to keep in mind: the restriction from XQuery to XPath for the functions specified in the SQL standard, and the restriction of XPath to version 1.0 for both the standard and the PostgreSQL-specific functions.
Features of XQuery beyond those of XPath include:
XQuery expressions can construct and return new XML nodes, in addition to all possible XPath values. XPath can create and return values of the atomic types (numbers, strings, and so on) but can only return XML nodes that were already present in documents supplied as input to the expression.
XQuery has control constructs for iteration, sorting, and grouping.
XQuery allows declaration and use of local functions.
Recent XPath versions begin to offer capabilities overlapping with these (such as functional-style for-each
and sort
, anonymous functions, and parse-xml
to create a node from a string), but such features were not available before XPath 3.0.
For developers familiar with XQuery and XPath 2.0 or later, XPath 1.0 presents a number of differences to contend with:
The fundamental type of an XQuery/XPath expression, the sequence
, which can contain XML nodes, atomic values, or both, does not exist in XPath 1.0. A 1.0 expression can only produce a node-set (containing zero or more XML nodes), or a single atomic value.
Unlike an XQuery/XPath sequence, which can contain any desired items in any desired order, an XPath 1.0 node-set has no guaranteed order and, like any set, does not allow multiple appearances of the same item.
Note
The libxml2 library does seem to always return node-sets to PostgreSQL with their members in the same relative order they had in the input document. Its documentation does not commit to this behavior, and an XPath 1.0 expression cannot control it.
While XQuery/XPath provides all of the types defined in XML Schema and many operators and functions over those types, XPath 1.0 has only node-sets and the three atomic types boolean
, double
, and string
.
XPath 1.0 has no conditional operator. An XQuery/XPath expression such as if ( hat ) then hat/@size else "no hat"
has no XPath 1.0 equivalent.
XPath 1.0 has no ordering comparison operator for strings. Both "cat" < "dog"
and "cat" > "dog"
are false, because each is a numeric comparison of two NaN
s. In contrast, =
and !=
do compare the strings as strings.
XPath 1.0 blurs the distinction between value comparisons and general comparisons as XQuery/XPath define them. Both sale/@hatsize = 7
and sale/@customer = "alice"
are existentially quantified comparisons, true if there is any sale
with the given value for the attribute, but sale/@taxable = false()
is a value comparison to the effective boolean value of a whole node-set. It is true only if no sale
has a taxable
attribute at all.
In the XQuery/XPath data model, a document node can have either document form (i.e., exactly one top-level element, with only comments and processing instructions outside of it) or content form (with those constraints relaxed). Its equivalent in XPath 1.0, the root node, can only be in document form. This is part of the reason an xml
value passed as the context item to any PostgreSQL XPath-based function must be in document form.
The differences highlighted here are not all of them. In XQuery and the 2.0 and later versions of XPath, there is an XPath 1.0 compatibility mode, and the W3C lists of function library changes and language changes applied in that mode offer a more complete (but still not exhaustive) account of the differences. The compatibility mode cannot make the later languages exactly equivalent to XPath 1.0.
In SQL:2006 and later, both directions of conversion between standard SQL data types and the XML Schema types are specified precisely. However, the rules are expressed using the types and semantics of XQuery/XPath, and have no direct application to the different data model of XPath 1.0.
When PostgreSQL maps SQL data values to XML (as in xmlelement
), or XML to SQL (as in the output columns of xmltable
), except for a few cases treated specially, PostgreSQL simply assumes that the XML data type's XPath 1.0 string form will be valid as the text-input form of the SQL datatype, and conversely. This rule has the virtue of simplicity while producing, for many data types, results similar to the mappings specified in the standard.
Where interoperability with other systems is a concern, for some data types, it may be necessary to use data type formatting functions (such as those in Section 9.8) explicitly to produce the standard mappings.
This section concerns limits that are not inherent in the libxml2 library, but apply to the current implementation in PostgreSQL.
The SQL standard defines two passing mechanisms that apply when passing an XML argument from SQL to an XML function or receiving a result: BY REF
, in which a particular XML value retains its node identity, and BY VALUE
, in which the content of the XML is passed but node identity is not preserved. A mechanism can be specified before a list of parameters, as the default mechanism for all of them, or after any parameter, to override the default.
To illustrate the difference, if x
is an XML value, these two queries in an SQL:2006 environment would produce true and false, respectively:
PostgreSQL will accept BY VALUE
or BY REF
in an XMLEXISTS
or XMLTABLE
construct, but it ignores them. The xml
data type holds a character-string serialized representation, so there is no node identity to preserve, and passing is always effectively BY VALUE
.
The XPath-based functions support passing one parameter to serve as the XPath expression's context item, but do not support passing additional values to be available to the expression as named parameters.
The PostgreSQL xml
data type can only hold a value in DOCUMENT
or CONTENT
form. An XQuery/XPath expression context item must be a single XML node or atomic value, but XPath 1.0 further restricts it to be only an XML node, and has no node type allowing CONTENT
. The upshot is that a well-formed DOCUMENT
is the only form of XML value that PostgreSQL can supply as an XPath context item.
SQL:2016 中所定義的以下功能並未在此版本的 PostgreSQL 中實作。在某些情況下,有一些等效的功能可以使用。
Identifier | Core? | Description | Comment |
B011 | Embedded Ada |
B013 | Embedded COBOL |
B014 | Embedded Fortran |
B015 | Embedded MUMPS |
B016 | Embedded Pascal |
B017 | Embedded PL/I |
B031 | Basic dynamic SQL |
B032 | Extended dynamic SQL |
B032-01 | <describe input statement> |
B033 | Untyped SQL-invoked function arguments |
B034 | Dynamic specification of cursor attributes |
B035 | Non-extended descriptor names |
B041 | Extensions to embedded SQL exception declarations |
B051 | Enhanced execution rights |
B111 | Module language Ada |
B112 | Module language C |
B113 | Module language COBOL |
B114 | Module language Fortran |
B115 | Module language MUMPS |
B116 | Module language Pascal |
B117 | Module language PL/I |
B121 | Routine language Ada |
B122 | Routine language C |
B123 | Routine language COBOL |
B124 | Routine language Fortran |
B125 | Routine language MUMPS |
B126 | Routine language Pascal |
B127 | Routine language PL/I |
B128 | Routine language SQL |
B200 | Polymorphic table functions |
B201 | More than one PTF generic table parameter |
B202 | PTF Copartitioning |
B203 | More than one copartition specification |
B204 | PRUNE WHEN EMPTY |
B205 | Pass-through columns |
B206 | PTF descriptor parameters |
B207 | Cross products of partitionings |
B208 | PTF component procedure interface |
B209 | PTF extended names |
B211 | Module language Ada: VARCHAR and NUMERIC support |
B221 | Routine language Ada: VARCHAR and NUMERIC support |
F054 | TIMESTAMP in DATE type precedence list |
F121 | Basic diagnostics management |
F121-01 | GET DIAGNOSTICS statement |
F121-02 | SET TRANSACTION statement: DIAGNOSTICS SIZE clause |
F122 | Enhanced diagnostics management |
F123 | All diagnostics |
F263 | Comma-separated predicates in simple CASE expression |
F291 | UNIQUE predicate |
F301 | CORRESPONDING in query expressions |
F312 | MERGE statement | consider INSERT ... ON CONFLICT DO UPDATE |
F313 | Enhanced MERGE statement |
F314 | MERGE statement with DELETE branch |
F341 | Usage tables | no ROUTINE_*_USAGE tables |
F403 | Partitioned joined tables |
F404 | Range variable for common column names |
F451 | Character set definition |
F461 | Named character sets |
F492 | Optional table constraint enforcement |
F521 | Assertions |
F671 | Subqueries in CHECK | intentionally omitted |
F673 | Reads SQL-data routine invocations in CHECK constraints |
F693 | SQL-session and client module collations |
F695 | Translation support |
F696 | Additional translation documentation |
F721 | Deferrable constraints | foreign and unique keys only |
F741 | Referential MATCH types | no partial match yet |
F812 | Core | Basic flagging |
F813 | Extended flagging |
F821 | Local table references |
F831 | Full cursor update |
F831-01 | Updatable scrollable cursors |
F831-02 | Updatable ordered cursors |
F841 | LIKE_REGEX predicate |
F842 | OCCURRENCES_REGEX function |
F843 | POSITION_REGEX function |
F844 | SUBSTRING_REGEX function |
F845 | TRANSLATE_REGEX function |
F846 | Octet support in regular expression operators |
F847 | Nonconstant regular expressions |
F866 | FETCH FIRST clause: PERCENT option |
R010 | Row pattern recognition: FROM clause |
R020 | Row pattern recognition: WINDOW clause |
R030 | Row pattern recognition: full aggregate support |
S011 | Core | Distinct data types |
S011-01 | Core | USER_DEFINED_TYPES view |
S023 | Basic structured types |
S024 | Enhanced structured types |
S025 | Final structured types |
S026 | Self-referencing structured types |
S027 | Create method by specific method name |
S028 | Permutable UDT options list |
S041 | Basic reference types |
S043 | Enhanced reference types |
S051 | Create table of type | partially supported |
S081 | Subtables |
S091 | Basic array support | partially supported |
S091-01 | Arrays of built-in data types |
S091-02 | Arrays of distinct types |
S091-03 | Array expressions |
S094 | Arrays of reference types |
S097 | Array element assignment |
S151 | Type predicate |
S161 | Subtype treatment |
S162 | Subtype treatment for references |
S202 | SQL-invoked routines on multisets |
S231 | Structured type locators |
S232 | Array locators |
S233 | Multiset locators |
S241 | Transform functions |
S242 | Alter transform statement |
S251 | User-defined orderings |
S261 | Specific type method |
S271 | Basic multiset support |
S272 | Multisets of user-defined types |
S274 | Multisets of reference types |
S275 | Advanced multiset support |
S281 | Nested collection types |
S291 | Unique constraint on entire row |
S401 | Distinct types based on array types |
S402 | Distinct types based on distinct types |
S403 | ARRAY_MAX_CARDINALITY |
S404 | TRIM_ARRAY |
T011 | Timestamp in Information Schema |
T021 | BINARY and VARBINARY data types |
T022 | Advanced support for BINARY and VARBINARY data types |
T023 | Compound binary literal |
T024 | Spaces in binary literals |
T041 | Basic LOB data type support |
T041-01 | BLOB data type |
T041-02 | CLOB data type |
T041-03 | POSITION, LENGTH, LOWER, TRIM, UPPER, and SUBSTRING functions for LOB data types |
T041-04 | Concatenation of LOB data types |
T041-05 | LOB locator: non-holdable |
T042 | Extended LOB data type support |
T043 | Multiplier T |
T044 | Multiplier P |
T051 | Row types |
T053 | Explicit aliases for all-fields reference |
T061 | UCS support |
T076 | DECFLOAT data type |
T101 | Enhanced nullability determination |
T111 | Updatable joins, unions, and columns |
T175 | Generated columns | mostly supported |
T176 | Sequence generator support | supported except for NEXT VALUE FOR |
T180 | System-versioned tables |
T181 | Application-time period tables |
T211 | Basic trigger capability |
T211-06 | Support for run-time rules for the interaction of triggers and constraints |
T211-08 | Multiple triggers for the same event are executed in the order in which they were created in the catalog | intentionally omitted |
T251 | SET TRANSACTION statement: LOCAL option |
T272 | Enhanced savepoint management |
T301 | Functional dependencies | partially supported |
T321 | Core | Basic SQL-invoked routines |
T321-05 | Core | RETURN statement |
T322 | Declared data type attributes |
T324 | Explicit security for SQL routines |
T326 | Table functions |
T332 | Extended roles | mostly supported |
T434 | GROUP BY DISTINCT |
T471 | Result sets return value |
T472 | DESCRIBE CURSOR |
T495 | Combined data change and retrieval | different syntax |
T502 | Period predicates |
T511 | Transaction counts |
T522 | Default values for IN parameters of SQL-invoked procedures | supported except DEFAULT key word in invocation |
T561 | Holdable locators |
T571 | Array-returning external SQL-invoked functions |
T572 | Multiset-returning external SQL-invoked functions |
T601 | Local cursor references |
T616 | Null treatment option for LEAD and LAG functions |
T618 | NTH_VALUE function | function exists, but some options missing |
T619 | Nested window functions |
T625 | LISTAGG |
T641 | Multiple column assignment | only some syntax variants supported |
T652 | SQL-dynamic statements in SQL routines |
T654 | SQL-dynamic statements in external routines |
T811 | Basic SQL/JSON constructor functions |
T812 | SQL/JSON: JSON_OBJECTAGG |
T813 | SQL/JSON: JSON_ARRAYAGG with ORDER BY |
T814 | Colon in JSON_OBJECT or JSON_OBJECTAGG |
T821 | Basic SQL/JSON query operators |
T822 | SQL/JSON: IS JSON WITH UNIQUE KEYS predicate |
T823 | SQL/JSON: PASSING clause |
T824 | JSON_TABLE: specific PLAN clause |
T825 | SQL/JSON: ON EMPTY and ON ERROR clauses |
T826 | General value expression in ON ERROR or ON EMPTY clauses |
T827 | JSON_TABLE: sibling NESTED COLUMNS clauses |
T828 | JSON_QUERY |
T829 | JSON_QUERY: array wrapper options |
T830 | Enforcing unique keys in SQL/JSON constructor functions |
T838 | JSON_TABLE: PLAN DEFAULT clause |
T839 | Formatted cast of datetimes to/from character strings |
M001 | Datalinks |
M002 | Datalinks via SQL/CLI |
M003 | Datalinks via Embedded SQL |
M004 | Foreign data support | partially supported |
M005 | Foreign schema support |
M006 | GetSQLString routine |
M007 | TransmitRequest |
M009 | GetOpts and GetStatistics routines |
M010 | Foreign data wrapper support | different API |
M011 | Datalinks via Ada |
M012 | Datalinks via C |
M013 | Datalinks via COBOL |
M014 | Datalinks via Fortran |
M015 | Datalinks via M |
M016 | Datalinks via Pascal |
M017 | Datalinks via PL/I |
M018 | Foreign data wrapper interface routines in Ada |
M019 | Foreign data wrapper interface routines in C | different API |
M020 | Foreign data wrapper interface routines in COBOL |
M021 | Foreign data wrapper interface routines in Fortran |
M022 | Foreign data wrapper interface routines in MUMPS |
M023 | Foreign data wrapper interface routines in Pascal |
M024 | Foreign data wrapper interface routines in PL/I |
M030 | SQL-server foreign data support |
M031 | Foreign data wrapper general routines |
X012 | Multisets of XML type |
X013 | Distinct types of XML type |
X015 | Fields of XML type |
X025 | XMLCast |
X030 | XMLDocument |
X038 | XMLText |
X065 | XMLParse: BLOB input and CONTENT option |
X066 | XMLParse: BLOB input and DOCUMENT option |
X068 | XMLSerialize: BOM |
X069 | XMLSerialize: INDENT |
X073 | XMLSerialize: BLOB serialization and CONTENT option |
X074 | XMLSerialize: BLOB serialization and DOCUMENT option |
X075 | XMLSerialize: BLOB serialization |
X076 | XMLSerialize: VERSION |
X077 | XMLSerialize: explicit ENCODING option |
X078 | XMLSerialize: explicit XML declaration |
X080 | Namespaces in XML publishing |
X081 | Query-level XML namespace declarations |
X082 | XML namespace declarations in DML |
X083 | XML namespace declarations in DDL |
X084 | XML namespace declarations in compound statements |
X085 | Predefined namespace prefixes |
X086 | XML namespace declarations in XMLTable |
X091 | XML content predicate |
X096 | XMLExists | XPath 1.0 only |
X100 | Host language support for XML: CONTENT option |
X101 | Host language support for XML: DOCUMENT option |
X110 | Host language support for XML: VARCHAR mapping |
X111 | Host language support for XML: CLOB mapping |
X112 | Host language support for XML: BLOB mapping |
X113 | Host language support for XML: STRIP WHITESPACE option |
X114 | Host language support for XML: PRESERVE WHITESPACE option |
X131 | Query-level XMLBINARY clause |
X132 | XMLBINARY clause in DML |
X133 | XMLBINARY clause in DDL |
X134 | XMLBINARY clause in compound statements |
X135 | XMLBINARY clause in subqueries |
X141 | IS VALID predicate: data-driven case |
X142 | IS VALID predicate: ACCORDING TO clause |
X143 | IS VALID predicate: ELEMENT clause |
X144 | IS VALID predicate: schema location |
X145 | IS VALID predicate outside check constraints |
X151 | IS VALID predicate with DOCUMENT option |
X152 | IS VALID predicate with CONTENT option |
X153 | IS VALID predicate with SEQUENCE option |
X155 | IS VALID predicate: NAMESPACE without ELEMENT clause |
X157 | IS VALID predicate: NO NAMESPACE with ELEMENT clause |
X160 | Basic Information Schema for registered XML Schemas |
X161 | Advanced Information Schema for registered XML Schemas |
X170 | XML null handling options |
X171 | NIL ON NO CONTENT option |
X181 | XML(DOCUMENT(UNTYPED)) type |
X182 | XML(DOCUMENT(ANY)) type |
X190 | XML(SEQUENCE) type |
X191 | XML(DOCUMENT(XMLSCHEMA)) type |
X192 | XML(CONTENT(XMLSCHEMA)) type |
X200 | XMLQuery |
X201 | XMLQuery: RETURNING CONTENT |
X202 | XMLQuery: RETURNING SEQUENCE |
X203 | XMLQuery: passing a context item |
X204 | XMLQuery: initializing an XQuery variable |
X205 | XMLQuery: EMPTY ON EMPTY option |
X206 | XMLQuery: NULL ON EMPTY option |
X211 | XML 1.1 support |
X222 | XML passing mechanism BY REF | parser accepts BY REF but ignores it; passing is always BY VALUE |
X231 | XML(CONTENT(UNTYPED)) type |
X232 | XML(CONTENT(ANY)) type |
X241 | RETURNING CONTENT in XML publishing |
X242 | RETURNING SEQUENCE in XML publishing |
X251 | Persistent XML values of XML(DOCUMENT(UNTYPED)) type |
X252 | Persistent XML values of XML(DOCUMENT(ANY)) type |
X253 | Persistent XML values of XML(CONTENT(UNTYPED)) type |
X254 | Persistent XML values of XML(CONTENT(ANY)) type |
X255 | Persistent XML values of XML(SEQUENCE) type |
X256 | Persistent XML values of XML(DOCUMENT(XMLSCHEMA)) type |
X257 | Persistent XML values of XML(CONTENT(XMLSCHEMA)) type |
X260 | XML type: ELEMENT clause |
X261 | XML type: NAMESPACE without ELEMENT clause |
X263 | XML type: NO NAMESPACE with ELEMENT clause |
X264 | XML type: schema location |
X271 | XMLValidate: data-driven case |
X272 | XMLValidate: ACCORDING TO clause |
X273 | XMLValidate: ELEMENT clause |
X274 | XMLValidate: schema location |
X281 | XMLValidate with DOCUMENT option |
X282 | XMLValidate with CONTENT option |
X283 | XMLValidate with SEQUENCE option |
X284 | XMLValidate: NAMESPACE without ELEMENT clause |
X286 | XMLValidate: NO NAMESPACE with ELEMENT clause |
X300 | XMLTable | XPath 1.0 only |
X305 | XMLTable: initializing an XQuery variable |