gitlab-pg_query 1.3.1 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +217 -99
- data/README.md +92 -69
- data/Rakefile +85 -5
- data/ext/pg_query/extconf.rb +3 -40
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +246 -0
- data/ext/pg_query/include/access/attmap.h +52 -0
- data/ext/pg_query/include/access/attnum.h +64 -0
- data/ext/pg_query/include/access/clog.h +61 -0
- data/ext/pg_query/include/access/commit_ts.h +77 -0
- data/ext/pg_query/include/access/detoast.h +92 -0
- data/ext/pg_query/include/access/genam.h +228 -0
- data/ext/pg_query/include/access/gin.h +78 -0
- data/ext/pg_query/include/access/htup.h +89 -0
- data/ext/pg_query/include/access/htup_details.h +819 -0
- data/ext/pg_query/include/access/itup.h +161 -0
- data/ext/pg_query/include/access/parallel.h +82 -0
- data/ext/pg_query/include/access/printtup.h +35 -0
- data/ext/pg_query/include/access/relation.h +28 -0
- data/ext/pg_query/include/access/relscan.h +176 -0
- data/ext/pg_query/include/access/rmgr.h +35 -0
- data/ext/pg_query/include/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/access/sdir.h +58 -0
- data/ext/pg_query/include/access/skey.h +151 -0
- data/ext/pg_query/include/access/stratnum.h +83 -0
- data/ext/pg_query/include/access/sysattr.h +29 -0
- data/ext/pg_query/include/access/table.h +27 -0
- data/ext/pg_query/include/access/tableam.h +1825 -0
- data/ext/pg_query/include/access/transam.h +265 -0
- data/ext/pg_query/include/access/tupconvert.h +51 -0
- data/ext/pg_query/include/access/tupdesc.h +154 -0
- data/ext/pg_query/include/access/tupmacs.h +247 -0
- data/ext/pg_query/include/access/twophase.h +61 -0
- data/ext/pg_query/include/access/xact.h +463 -0
- data/ext/pg_query/include/access/xlog.h +398 -0
- data/ext/pg_query/include/access/xlog_internal.h +330 -0
- data/ext/pg_query/include/access/xlogdefs.h +109 -0
- data/ext/pg_query/include/access/xloginsert.h +64 -0
- data/ext/pg_query/include/access/xlogreader.h +327 -0
- data/ext/pg_query/include/access/xlogrecord.h +227 -0
- data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
- data/ext/pg_query/include/c.h +1322 -0
- data/ext/pg_query/include/catalog/catalog.h +42 -0
- data/ext/pg_query/include/catalog/catversion.h +58 -0
- data/ext/pg_query/include/catalog/dependency.h +275 -0
- data/ext/pg_query/include/catalog/genbki.h +64 -0
- data/ext/pg_query/include/catalog/index.h +199 -0
- data/ext/pg_query/include/catalog/indexing.h +366 -0
- data/ext/pg_query/include/catalog/namespace.h +188 -0
- data/ext/pg_query/include/catalog/objectaccess.h +197 -0
- data/ext/pg_query/include/catalog/objectaddress.h +84 -0
- data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
- data/ext/pg_query/include/catalog/pg_am.h +60 -0
- data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
- data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
- data/ext/pg_query/include/catalog/pg_authid.h +58 -0
- data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_class.h +200 -0
- data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
- data/ext/pg_query/include/catalog/pg_collation.h +73 -0
- data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
- data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
- data/ext/pg_query/include/catalog/pg_control.h +250 -0
- data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
- data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_depend.h +73 -0
- data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_index.h +80 -0
- data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
- data/ext/pg_query/include/catalog/pg_language.h +67 -0
- data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
- data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
- data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
- data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_operator.h +102 -0
- data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_proc.h +211 -0
- data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
- data/ext/pg_query/include/catalog/pg_publication.h +115 -0
- data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
- data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
- data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
- data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
- data/ext/pg_query/include/catalog/pg_transform.h +45 -0
- data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
- data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
- data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_type.h +372 -0
- data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
- data/ext/pg_query/include/catalog/storage.h +48 -0
- data/ext/pg_query/include/commands/async.h +54 -0
- data/ext/pg_query/include/commands/dbcommands.h +35 -0
- data/ext/pg_query/include/commands/defrem.h +173 -0
- data/ext/pg_query/include/commands/event_trigger.h +88 -0
- data/ext/pg_query/include/commands/explain.h +127 -0
- data/ext/pg_query/include/commands/prepare.h +61 -0
- data/ext/pg_query/include/commands/tablespace.h +67 -0
- data/ext/pg_query/include/commands/trigger.h +277 -0
- data/ext/pg_query/include/commands/user.h +37 -0
- data/ext/pg_query/include/commands/vacuum.h +293 -0
- data/ext/pg_query/include/commands/variable.h +38 -0
- data/ext/pg_query/include/common/file_perm.h +56 -0
- data/ext/pg_query/include/common/hashfn.h +104 -0
- data/ext/pg_query/include/common/ip.h +37 -0
- data/ext/pg_query/include/common/keywords.h +33 -0
- data/ext/pg_query/include/common/kwlookup.h +44 -0
- data/ext/pg_query/include/common/relpath.h +90 -0
- data/ext/pg_query/include/common/string.h +19 -0
- data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
- data/ext/pg_query/include/datatype/timestamp.h +197 -0
- data/ext/pg_query/include/executor/execdesc.h +70 -0
- data/ext/pg_query/include/executor/executor.h +614 -0
- data/ext/pg_query/include/executor/functions.h +41 -0
- data/ext/pg_query/include/executor/instrument.h +101 -0
- data/ext/pg_query/include/executor/spi.h +175 -0
- data/ext/pg_query/include/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/executor/tuptable.h +487 -0
- data/ext/pg_query/include/fmgr.h +775 -0
- data/ext/pg_query/include/funcapi.h +348 -0
- data/ext/pg_query/include/getaddrinfo.h +162 -0
- data/ext/pg_query/include/jit/jit.h +105 -0
- data/ext/pg_query/include/kwlist_d.h +1072 -0
- data/ext/pg_query/include/lib/ilist.h +727 -0
- data/ext/pg_query/include/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/lib/simplehash.h +1059 -0
- data/ext/pg_query/include/lib/stringinfo.h +161 -0
- data/ext/pg_query/include/libpq/auth.h +29 -0
- data/ext/pg_query/include/libpq/crypt.h +46 -0
- data/ext/pg_query/include/libpq/hba.h +140 -0
- data/ext/pg_query/include/libpq/libpq-be.h +326 -0
- data/ext/pg_query/include/libpq/libpq.h +133 -0
- data/ext/pg_query/include/libpq/pqcomm.h +208 -0
- data/ext/pg_query/include/libpq/pqformat.h +210 -0
- data/ext/pg_query/include/libpq/pqsignal.h +42 -0
- data/ext/pg_query/include/mb/pg_wchar.h +672 -0
- data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/miscadmin.h +476 -0
- data/ext/pg_query/include/nodes/bitmapset.h +122 -0
- data/ext/pg_query/include/nodes/execnodes.h +2520 -0
- data/ext/pg_query/include/nodes/extensible.h +160 -0
- data/ext/pg_query/include/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/nodes/makefuncs.h +108 -0
- data/ext/pg_query/include/nodes/memnodes.h +108 -0
- data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
- data/ext/pg_query/include/nodes/nodes.h +842 -0
- data/ext/pg_query/include/nodes/params.h +170 -0
- data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
- data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
- data/ext/pg_query/include/nodes/pg_list.h +605 -0
- data/ext/pg_query/include/nodes/plannodes.h +1251 -0
- data/ext/pg_query/include/nodes/primnodes.h +1541 -0
- data/ext/pg_query/include/nodes/print.h +34 -0
- data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/nodes/value.h +61 -0
- data/ext/pg_query/include/optimizer/cost.h +206 -0
- data/ext/pg_query/include/optimizer/geqo.h +88 -0
- data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/optimizer/optimizer.h +199 -0
- data/ext/pg_query/include/optimizer/paths.h +249 -0
- data/ext/pg_query/include/optimizer/planmain.h +119 -0
- data/ext/pg_query/include/parser/analyze.h +49 -0
- data/ext/pg_query/include/parser/gram.h +1067 -0
- data/ext/pg_query/include/parser/gramparse.h +75 -0
- data/ext/pg_query/include/parser/kwlist.h +477 -0
- data/ext/pg_query/include/parser/parse_agg.h +68 -0
- data/ext/pg_query/include/parser/parse_clause.h +54 -0
- data/ext/pg_query/include/parser/parse_coerce.h +97 -0
- data/ext/pg_query/include/parser/parse_collate.h +27 -0
- data/ext/pg_query/include/parser/parse_expr.h +26 -0
- data/ext/pg_query/include/parser/parse_func.h +73 -0
- data/ext/pg_query/include/parser/parse_node.h +327 -0
- data/ext/pg_query/include/parser/parse_oper.h +67 -0
- data/ext/pg_query/include/parser/parse_relation.h +123 -0
- data/ext/pg_query/include/parser/parse_target.h +46 -0
- data/ext/pg_query/include/parser/parse_type.h +60 -0
- data/ext/pg_query/include/parser/parser.h +41 -0
- data/ext/pg_query/include/parser/parsetree.h +61 -0
- data/ext/pg_query/include/parser/scanner.h +152 -0
- data/ext/pg_query/include/parser/scansup.h +30 -0
- data/ext/pg_query/include/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/pg_config.h +989 -0
- data/ext/pg_query/include/pg_config_ext.h +8 -0
- data/ext/pg_query/include/pg_config_manual.h +350 -0
- data/ext/pg_query/include/pg_config_os.h +8 -0
- data/ext/pg_query/include/pg_getopt.h +56 -0
- data/ext/pg_query/include/pg_query.h +121 -0
- data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
- data/ext/pg_query/include/pg_query_json_helper.c +61 -0
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
- data/ext/pg_query/include/pg_trace.h +17 -0
- data/ext/pg_query/include/pgstat.h +1487 -0
- data/ext/pg_query/include/pgtime.h +84 -0
- data/ext/pg_query/include/pl_gram.h +385 -0
- data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/plerrcodes.h +990 -0
- data/ext/pg_query/include/plpgsql.h +1347 -0
- data/ext/pg_query/include/port.h +524 -0
- data/ext/pg_query/include/port/atomics.h +524 -0
- data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
- data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
- data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
- data/ext/pg_query/include/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
- data/ext/pg_query/include/port/atomics/generic.h +401 -0
- data/ext/pg_query/include/port/pg_bitutils.h +226 -0
- data/ext/pg_query/include/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/port/pg_crc32c.h +101 -0
- data/ext/pg_query/include/portability/instr_time.h +256 -0
- data/ext/pg_query/include/postgres.h +764 -0
- data/ext/pg_query/include/postgres_ext.h +74 -0
- data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
- data/ext/pg_query/include/postmaster/bgworker.h +161 -0
- data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
- data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postmaster/fork_process.h +17 -0
- data/ext/pg_query/include/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postmaster/pgarch.h +39 -0
- data/ext/pg_query/include/postmaster/postmaster.h +77 -0
- data/ext/pg_query/include/postmaster/syslogger.h +98 -0
- data/ext/pg_query/include/postmaster/walwriter.h +21 -0
- data/ext/pg_query/include/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
- data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
- data/ext/pg_query/include/regex/regex.h +184 -0
- data/ext/pg_query/include/replication/logicallauncher.h +31 -0
- data/ext/pg_query/include/replication/logicalproto.h +110 -0
- data/ext/pg_query/include/replication/logicalworker.h +19 -0
- data/ext/pg_query/include/replication/origin.h +73 -0
- data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
- data/ext/pg_query/include/replication/slot.h +219 -0
- data/ext/pg_query/include/replication/syncrep.h +115 -0
- data/ext/pg_query/include/replication/walreceiver.h +340 -0
- data/ext/pg_query/include/replication/walsender.h +74 -0
- data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
- data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
- data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/storage/backendid.h +37 -0
- data/ext/pg_query/include/storage/block.h +121 -0
- data/ext/pg_query/include/storage/buf.h +46 -0
- data/ext/pg_query/include/storage/bufmgr.h +292 -0
- data/ext/pg_query/include/storage/bufpage.h +459 -0
- data/ext/pg_query/include/storage/condition_variable.h +62 -0
- data/ext/pg_query/include/storage/dsm.h +61 -0
- data/ext/pg_query/include/storage/dsm_impl.h +75 -0
- data/ext/pg_query/include/storage/fd.h +168 -0
- data/ext/pg_query/include/storage/ipc.h +81 -0
- data/ext/pg_query/include/storage/item.h +19 -0
- data/ext/pg_query/include/storage/itemid.h +184 -0
- data/ext/pg_query/include/storage/itemptr.h +206 -0
- data/ext/pg_query/include/storage/large_object.h +100 -0
- data/ext/pg_query/include/storage/latch.h +190 -0
- data/ext/pg_query/include/storage/lmgr.h +114 -0
- data/ext/pg_query/include/storage/lock.h +612 -0
- data/ext/pg_query/include/storage/lockdefs.h +59 -0
- data/ext/pg_query/include/storage/lwlock.h +232 -0
- data/ext/pg_query/include/storage/lwlocknames.h +51 -0
- data/ext/pg_query/include/storage/off.h +57 -0
- data/ext/pg_query/include/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/storage/pg_shmem.h +90 -0
- data/ext/pg_query/include/storage/pmsignal.h +94 -0
- data/ext/pg_query/include/storage/predicate.h +87 -0
- data/ext/pg_query/include/storage/proc.h +333 -0
- data/ext/pg_query/include/storage/proclist_types.h +51 -0
- data/ext/pg_query/include/storage/procsignal.h +75 -0
- data/ext/pg_query/include/storage/relfilenode.h +99 -0
- data/ext/pg_query/include/storage/s_lock.h +1047 -0
- data/ext/pg_query/include/storage/sharedfileset.h +45 -0
- data/ext/pg_query/include/storage/shm_mq.h +85 -0
- data/ext/pg_query/include/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/storage/shmem.h +81 -0
- data/ext/pg_query/include/storage/sinval.h +153 -0
- data/ext/pg_query/include/storage/sinvaladt.h +43 -0
- data/ext/pg_query/include/storage/smgr.h +109 -0
- data/ext/pg_query/include/storage/spin.h +77 -0
- data/ext/pg_query/include/storage/standby.h +91 -0
- data/ext/pg_query/include/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/storage/sync.h +62 -0
- data/ext/pg_query/include/tcop/cmdtag.h +58 -0
- data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
- data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/tcop/dest.h +149 -0
- data/ext/pg_query/include/tcop/fastpath.h +21 -0
- data/ext/pg_query/include/tcop/pquery.h +45 -0
- data/ext/pg_query/include/tcop/tcopprot.h +89 -0
- data/ext/pg_query/include/tcop/utility.h +108 -0
- data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
- data/ext/pg_query/include/utils/acl.h +312 -0
- data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/utils/array.h +458 -0
- data/ext/pg_query/include/utils/builtins.h +127 -0
- data/ext/pg_query/include/utils/bytea.h +27 -0
- data/ext/pg_query/include/utils/catcache.h +231 -0
- data/ext/pg_query/include/utils/date.h +90 -0
- data/ext/pg_query/include/utils/datetime.h +343 -0
- data/ext/pg_query/include/utils/datum.h +68 -0
- data/ext/pg_query/include/utils/dsa.h +123 -0
- data/ext/pg_query/include/utils/dynahash.h +19 -0
- data/ext/pg_query/include/utils/elog.h +439 -0
- data/ext/pg_query/include/utils/errcodes.h +352 -0
- data/ext/pg_query/include/utils/expandeddatum.h +159 -0
- data/ext/pg_query/include/utils/expandedrecord.h +231 -0
- data/ext/pg_query/include/utils/float.h +356 -0
- data/ext/pg_query/include/utils/fmgroids.h +2657 -0
- data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
- data/ext/pg_query/include/utils/fmgrtab.h +48 -0
- data/ext/pg_query/include/utils/guc.h +443 -0
- data/ext/pg_query/include/utils/guc_tables.h +272 -0
- data/ext/pg_query/include/utils/hsearch.h +149 -0
- data/ext/pg_query/include/utils/inval.h +64 -0
- data/ext/pg_query/include/utils/lsyscache.h +197 -0
- data/ext/pg_query/include/utils/memdebug.h +82 -0
- data/ext/pg_query/include/utils/memutils.h +225 -0
- data/ext/pg_query/include/utils/numeric.h +76 -0
- data/ext/pg_query/include/utils/palloc.h +136 -0
- data/ext/pg_query/include/utils/partcache.h +102 -0
- data/ext/pg_query/include/utils/pg_locale.h +119 -0
- data/ext/pg_query/include/utils/pg_lsn.h +29 -0
- data/ext/pg_query/include/utils/pidfile.h +56 -0
- data/ext/pg_query/include/utils/plancache.h +235 -0
- data/ext/pg_query/include/utils/portal.h +241 -0
- data/ext/pg_query/include/utils/probes.h +114 -0
- data/ext/pg_query/include/utils/ps_status.h +25 -0
- data/ext/pg_query/include/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/utils/regproc.h +28 -0
- data/ext/pg_query/include/utils/rel.h +644 -0
- data/ext/pg_query/include/utils/relcache.h +151 -0
- data/ext/pg_query/include/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/utils/resowner.h +86 -0
- data/ext/pg_query/include/utils/rls.h +50 -0
- data/ext/pg_query/include/utils/ruleutils.h +44 -0
- data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/utils/snapmgr.h +158 -0
- data/ext/pg_query/include/utils/snapshot.h +206 -0
- data/ext/pg_query/include/utils/sortsupport.h +276 -0
- data/ext/pg_query/include/utils/syscache.h +219 -0
- data/ext/pg_query/include/utils/timeout.h +88 -0
- data/ext/pg_query/include/utils/timestamp.h +116 -0
- data/ext/pg_query/include/utils/tuplesort.h +277 -0
- data/ext/pg_query/include/utils/tuplestore.h +91 -0
- data/ext/pg_query/include/utils/typcache.h +202 -0
- data/ext/pg_query/include/utils/tzparser.h +39 -0
- data/ext/pg_query/include/utils/varlena.h +39 -0
- data/ext/pg_query/include/utils/xml.h +84 -0
- data/ext/pg_query/include/xxhash.h +5445 -0
- data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
- data/ext/pg_query/pg_query.c +104 -0
- data/ext/pg_query/pg_query.pb-c.c +37628 -0
- data/ext/pg_query/pg_query_deparse.c +9959 -0
- data/ext/pg_query/pg_query_fingerprint.c +295 -0
- data/ext/pg_query/pg_query_fingerprint.h +8 -0
- data/ext/pg_query/pg_query_internal.h +24 -0
- data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
- data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
- data/ext/pg_query/pg_query_normalize.c +439 -0
- data/ext/pg_query/pg_query_outfuncs.h +10 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
- data/ext/pg_query/pg_query_parse.c +148 -0
- data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
- data/ext/pg_query/pg_query_readfuncs.h +11 -0
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
- data/ext/pg_query/pg_query_ruby.c +108 -12
- data/ext/pg_query/pg_query_scan.c +173 -0
- data/ext/pg_query/pg_query_split.c +221 -0
- data/ext/pg_query/protobuf-c.c +3660 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
- data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
- data/ext/pg_query/src_backend_commands_define.c +117 -0
- data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
- data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
- data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
- data/ext/pg_query/src_backend_nodes_list.c +922 -0
- data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
- data/ext/pg_query/src_backend_nodes_value.c +84 -0
- data/ext/pg_query/src_backend_parser_gram.c +47456 -0
- data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
- data/ext/pg_query/src_backend_parser_parser.c +497 -0
- data/ext/pg_query/src_backend_parser_scan.c +7091 -0
- data/ext/pg_query/src_backend_parser_scansup.c +160 -0
- data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
- data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
- data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
- data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
- data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
- data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
- data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
- data/ext/pg_query/src_common_encnames.c +158 -0
- data/ext/pg_query/src_common_keywords.c +39 -0
- data/ext/pg_query/src_common_kwlist_d.h +1081 -0
- data/ext/pg_query/src_common_kwlookup.c +91 -0
- data/ext/pg_query/src_common_psprintf.c +158 -0
- data/ext/pg_query/src_common_string.c +86 -0
- data/ext/pg_query/src_common_stringinfo.c +336 -0
- data/ext/pg_query/src_common_wchar.c +1651 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
- data/ext/pg_query/src_port_erand48.c +127 -0
- data/ext/pg_query/src_port_pg_bitutils.c +246 -0
- data/ext/pg_query/src_port_pgsleep.c +69 -0
- data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
- data/ext/pg_query/src_port_qsort.c +240 -0
- data/ext/pg_query/src_port_random.c +31 -0
- data/ext/pg_query/src_port_snprintf.c +1449 -0
- data/ext/pg_query/src_port_strerror.c +324 -0
- data/ext/pg_query/src_port_strnlen.c +39 -0
- data/ext/pg_query/xxhash.c +43 -0
- data/lib/pg_query.rb +7 -4
- data/lib/pg_query/constants.rb +21 -0
- data/lib/pg_query/deparse.rb +15 -1581
- data/lib/pg_query/filter_columns.rb +88 -85
- data/lib/pg_query/fingerprint.rb +122 -87
- data/lib/pg_query/json_field_names.rb +1402 -0
- data/lib/pg_query/node.rb +31 -0
- data/lib/pg_query/param_refs.rb +42 -37
- data/lib/pg_query/parse.rb +220 -203
- data/lib/pg_query/parse_error.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +3211 -0
- data/lib/pg_query/scan.rb +23 -0
- data/lib/pg_query/treewalker.rb +24 -40
- data/lib/pg_query/truncate.rb +71 -42
- data/lib/pg_query/version.rb +2 -2
- metadata +472 -11
- data/ext/pg_query/pg_query_ruby.h +0 -10
- data/lib/pg_query/deep_dup.rb +0 -16
- data/lib/pg_query/deparse/alter_table.rb +0 -42
- data/lib/pg_query/deparse/interval.rb +0 -105
- data/lib/pg_query/deparse/keywords.rb +0 -159
- data/lib/pg_query/deparse/rename.rb +0 -41
- data/lib/pg_query/legacy_parsetree.rb +0 -109
- data/lib/pg_query/node_types.rb +0 -296
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/*--------------------------------------------------------------------
|
|
2
|
+
* Symbols referenced in this file:
|
|
3
|
+
* - operator_precedence_warning
|
|
4
|
+
*--------------------------------------------------------------------
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/*-------------------------------------------------------------------------
|
|
8
|
+
*
|
|
9
|
+
* parse_expr.c
|
|
10
|
+
* handle expressions in parser
|
|
11
|
+
*
|
|
12
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
13
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
14
|
+
*
|
|
15
|
+
*
|
|
16
|
+
* IDENTIFICATION
|
|
17
|
+
* src/backend/parser/parse_expr.c
|
|
18
|
+
*
|
|
19
|
+
*-------------------------------------------------------------------------
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
#include "postgres.h"
|
|
23
|
+
|
|
24
|
+
#include "catalog/pg_type.h"
|
|
25
|
+
#include "commands/dbcommands.h"
|
|
26
|
+
#include "miscadmin.h"
|
|
27
|
+
#include "nodes/makefuncs.h"
|
|
28
|
+
#include "nodes/nodeFuncs.h"
|
|
29
|
+
#include "optimizer/optimizer.h"
|
|
30
|
+
#include "parser/analyze.h"
|
|
31
|
+
#include "parser/parse_agg.h"
|
|
32
|
+
#include "parser/parse_clause.h"
|
|
33
|
+
#include "parser/parse_coerce.h"
|
|
34
|
+
#include "parser/parse_collate.h"
|
|
35
|
+
#include "parser/parse_expr.h"
|
|
36
|
+
#include "parser/parse_func.h"
|
|
37
|
+
#include "parser/parse_oper.h"
|
|
38
|
+
#include "parser/parse_relation.h"
|
|
39
|
+
#include "parser/parse_target.h"
|
|
40
|
+
#include "parser/parse_type.h"
|
|
41
|
+
#include "utils/builtins.h"
|
|
42
|
+
#include "utils/date.h"
|
|
43
|
+
#include "utils/lsyscache.h"
|
|
44
|
+
#include "utils/timestamp.h"
|
|
45
|
+
#include "utils/xml.h"
|
|
46
|
+
|
|
47
|
+
/* GUC parameters */
|
|
48
|
+
__thread bool operator_precedence_warning = false;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* Node-type groups for operator precedence warnings
|
|
54
|
+
* We use zero for everything not otherwise classified
|
|
55
|
+
*/
|
|
56
|
+
#define PREC_GROUP_POSTFIX_IS 1 /* postfix IS tests (NullTest, etc) */
|
|
57
|
+
#define PREC_GROUP_INFIX_IS 2 /* infix IS (IS DISTINCT FROM, etc) */
|
|
58
|
+
#define PREC_GROUP_LESS 3 /* < > */
|
|
59
|
+
#define PREC_GROUP_EQUAL 4 /* = */
|
|
60
|
+
#define PREC_GROUP_LESS_EQUAL 5 /* <= >= <> */
|
|
61
|
+
#define PREC_GROUP_LIKE 6 /* LIKE ILIKE SIMILAR */
|
|
62
|
+
#define PREC_GROUP_BETWEEN 7 /* BETWEEN */
|
|
63
|
+
#define PREC_GROUP_IN 8 /* IN */
|
|
64
|
+
#define PREC_GROUP_NOT_LIKE 9 /* NOT LIKE/ILIKE/SIMILAR */
|
|
65
|
+
#define PREC_GROUP_NOT_BETWEEN 10 /* NOT BETWEEN */
|
|
66
|
+
#define PREC_GROUP_NOT_IN 11 /* NOT IN */
|
|
67
|
+
#define PREC_GROUP_POSTFIX_OP 12 /* generic postfix operators */
|
|
68
|
+
#define PREC_GROUP_INFIX_OP 13 /* generic infix operators */
|
|
69
|
+
#define PREC_GROUP_PREFIX_OP 14 /* generic prefix operators */
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* Map precedence groupings to old precedence ordering
|
|
73
|
+
*
|
|
74
|
+
* Old precedence order:
|
|
75
|
+
* 1. NOT
|
|
76
|
+
* 2. =
|
|
77
|
+
* 3. < >
|
|
78
|
+
* 4. LIKE ILIKE SIMILAR
|
|
79
|
+
* 5. BETWEEN
|
|
80
|
+
* 6. IN
|
|
81
|
+
* 7. generic postfix Op
|
|
82
|
+
* 8. generic Op, including <= => <>
|
|
83
|
+
* 9. generic prefix Op
|
|
84
|
+
* 10. IS tests (NullTest, BooleanTest, etc)
|
|
85
|
+
*
|
|
86
|
+
* NOT BETWEEN etc map to BETWEEN etc when considered as being on the left,
|
|
87
|
+
* but to NOT when considered as being on the right, because of the buggy
|
|
88
|
+
* precedence handling of those productions in the old grammar.
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
static Node *transformExprRecurse(ParseState *pstate, Node *expr);
|
|
94
|
+
static Node *transformParamRef(ParseState *pstate, ParamRef *pref);
|
|
95
|
+
static Node *transformAExprOp(ParseState *pstate, A_Expr *a);
|
|
96
|
+
static Node *transformAExprOpAny(ParseState *pstate, A_Expr *a);
|
|
97
|
+
static Node *transformAExprOpAll(ParseState *pstate, A_Expr *a);
|
|
98
|
+
static Node *transformAExprDistinct(ParseState *pstate, A_Expr *a);
|
|
99
|
+
static Node *transformAExprNullIf(ParseState *pstate, A_Expr *a);
|
|
100
|
+
static Node *transformAExprOf(ParseState *pstate, A_Expr *a);
|
|
101
|
+
static Node *transformAExprIn(ParseState *pstate, A_Expr *a);
|
|
102
|
+
static Node *transformAExprBetween(ParseState *pstate, A_Expr *a);
|
|
103
|
+
static Node *transformBoolExpr(ParseState *pstate, BoolExpr *a);
|
|
104
|
+
static Node *transformFuncCall(ParseState *pstate, FuncCall *fn);
|
|
105
|
+
static Node *transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref);
|
|
106
|
+
static Node *transformCaseExpr(ParseState *pstate, CaseExpr *c);
|
|
107
|
+
static Node *transformSubLink(ParseState *pstate, SubLink *sublink);
|
|
108
|
+
static Node *transformArrayExpr(ParseState *pstate, A_ArrayExpr *a,
|
|
109
|
+
Oid array_type, Oid element_type, int32 typmod);
|
|
110
|
+
static Node *transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault);
|
|
111
|
+
static Node *transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c);
|
|
112
|
+
static Node *transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m);
|
|
113
|
+
static Node *transformSQLValueFunction(ParseState *pstate,
|
|
114
|
+
SQLValueFunction *svf);
|
|
115
|
+
static Node *transformXmlExpr(ParseState *pstate, XmlExpr *x);
|
|
116
|
+
static Node *transformXmlSerialize(ParseState *pstate, XmlSerialize *xs);
|
|
117
|
+
static Node *transformBooleanTest(ParseState *pstate, BooleanTest *b);
|
|
118
|
+
static Node *transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr);
|
|
119
|
+
static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref);
|
|
120
|
+
static Node *transformWholeRowRef(ParseState *pstate,
|
|
121
|
+
ParseNamespaceItem *nsitem,
|
|
122
|
+
int sublevels_up, int location);
|
|
123
|
+
static Node *transformIndirection(ParseState *pstate, A_Indirection *ind);
|
|
124
|
+
static Node *transformTypeCast(ParseState *pstate, TypeCast *tc);
|
|
125
|
+
static Node *transformCollateClause(ParseState *pstate, CollateClause *c);
|
|
126
|
+
static Node *make_row_comparison_op(ParseState *pstate, List *opname,
|
|
127
|
+
List *largs, List *rargs, int location);
|
|
128
|
+
static Node *make_row_distinct_op(ParseState *pstate, List *opname,
|
|
129
|
+
RowExpr *lrow, RowExpr *rrow, int location);
|
|
130
|
+
static Expr *make_distinct_op(ParseState *pstate, List *opname,
|
|
131
|
+
Node *ltree, Node *rtree, int location);
|
|
132
|
+
static Node *make_nulltest_from_distinct(ParseState *pstate,
|
|
133
|
+
A_Expr *distincta, Node *arg);
|
|
134
|
+
static int operator_precedence_group(Node *node, const char **nodename);
|
|
135
|
+
static void emit_precedence_warnings(ParseState *pstate,
|
|
136
|
+
int opgroup, const char *opname,
|
|
137
|
+
Node *lchild, Node *rchild,
|
|
138
|
+
int location);
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* transformExpr -
|
|
143
|
+
* Analyze and transform expressions. Type checking and type casting is
|
|
144
|
+
* done here. This processing converts the raw grammar output into
|
|
145
|
+
* expression trees with fully determined semantics.
|
|
146
|
+
*/
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* helper routine for delivering "column does not exist" error message
|
|
153
|
+
*
|
|
154
|
+
* (Usually we don't have to work this hard, but the general case of field
|
|
155
|
+
* selection from an arbitrary node needs it.)
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
/*
|
|
162
|
+
* Transform a ColumnRef.
|
|
163
|
+
*
|
|
164
|
+
* If you find yourself changing this code, see also ExpandColumnRefStar.
|
|
165
|
+
*/
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
/* Test whether an a_expr is a plain NULL constant or not */
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
/*
|
|
184
|
+
* Checking an expression for match to a list of type names. Will result
|
|
185
|
+
* in a boolean constant node.
|
|
186
|
+
*/
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
/*
|
|
204
|
+
* transformArrayExpr
|
|
205
|
+
*
|
|
206
|
+
* If the caller specifies the target type, the resulting array will
|
|
207
|
+
* be of exactly that type. Otherwise we try to infer a common type
|
|
208
|
+
* for the elements using select_common_type().
|
|
209
|
+
*/
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* Construct a whole-row reference to represent the notation "relation.*".
|
|
230
|
+
*/
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
/*
|
|
234
|
+
* Handle an explicit CAST construct.
|
|
235
|
+
*
|
|
236
|
+
* Transform the argument, look up the type name, and apply any necessary
|
|
237
|
+
* coercion function(s).
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
/*
|
|
242
|
+
* Handle an explicit COLLATE clause.
|
|
243
|
+
*
|
|
244
|
+
* Transform the argument, and look up the collation name.
|
|
245
|
+
*/
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
/*
|
|
249
|
+
* Transform a "row compare-op row" construct
|
|
250
|
+
*
|
|
251
|
+
* The inputs are lists of already-transformed expressions.
|
|
252
|
+
* As with coerce_type, pstate may be NULL if no special unknown-Param
|
|
253
|
+
* processing is wanted.
|
|
254
|
+
*
|
|
255
|
+
* The output may be a single OpExpr, an AND or OR combination of OpExprs,
|
|
256
|
+
* or a RowCompareExpr. In all cases it is guaranteed to return boolean.
|
|
257
|
+
* The AND, OR, and RowCompareExpr cases further imply things about the
|
|
258
|
+
* behavior of the operators (ie, they behave as =, <>, or < <= > >=).
|
|
259
|
+
*/
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
/*
|
|
263
|
+
* Transform a "row IS DISTINCT FROM row" construct
|
|
264
|
+
*
|
|
265
|
+
* The input RowExprs are already transformed
|
|
266
|
+
*/
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
/*
|
|
270
|
+
* make the node for an IS DISTINCT FROM operator
|
|
271
|
+
*/
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
/*
|
|
275
|
+
* Produce a NullTest node from an IS [NOT] DISTINCT FROM NULL construct
|
|
276
|
+
*
|
|
277
|
+
* "arg" is the untransformed other argument
|
|
278
|
+
*/
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
/*
|
|
282
|
+
* Identify node's group for operator precedence warnings
|
|
283
|
+
*
|
|
284
|
+
* For items in nonzero groups, also return a suitable node name into *nodename
|
|
285
|
+
*
|
|
286
|
+
* Note: group zero is used for nodes that are higher or lower precedence
|
|
287
|
+
* than everything that changed precedence; we need never issue warnings
|
|
288
|
+
* related to such nodes.
|
|
289
|
+
*/
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
/*
|
|
293
|
+
* helper routine for delivering 9.4-to-9.5 operator precedence warnings
|
|
294
|
+
*
|
|
295
|
+
* opgroup/opname/location represent some parent node
|
|
296
|
+
* lchild, rchild are its left and right children (either could be NULL)
|
|
297
|
+
*
|
|
298
|
+
* This should be called before transforming the child nodes, since if a
|
|
299
|
+
* precedence-driven parsing change has occurred in a query that used to work,
|
|
300
|
+
* it's quite possible that we'll get a semantic failure while analyzing the
|
|
301
|
+
* child expression. We want to produce the warning before that happens.
|
|
302
|
+
* In any case, operator_precedence_group() expects untransformed input.
|
|
303
|
+
*/
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
/*
|
|
307
|
+
* Produce a string identifying an expression by kind.
|
|
308
|
+
*
|
|
309
|
+
* Note: when practical, use a simple SQL keyword for the result. If that
|
|
310
|
+
* doesn't work well, check call sites to see whether custom error message
|
|
311
|
+
* strings are required.
|
|
312
|
+
*/
|
|
313
|
+
|
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
/*--------------------------------------------------------------------
|
|
2
|
+
* Symbols referenced in this file:
|
|
3
|
+
* - raw_parser
|
|
4
|
+
* - base_yylex
|
|
5
|
+
* - check_uescapechar
|
|
6
|
+
* - str_udeescape
|
|
7
|
+
* - hexval
|
|
8
|
+
* - check_unicode_value
|
|
9
|
+
* - raw_parser
|
|
10
|
+
*--------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/*-------------------------------------------------------------------------
|
|
14
|
+
*
|
|
15
|
+
* parser.c
|
|
16
|
+
* Main entry point/driver for PostgreSQL grammar
|
|
17
|
+
*
|
|
18
|
+
* Note that the grammar is not allowed to perform any table access
|
|
19
|
+
* (since we need to be able to do basic parsing even while inside an
|
|
20
|
+
* aborted transaction). Therefore, the data structures returned by
|
|
21
|
+
* the grammar are "raw" parsetrees that still need to be analyzed by
|
|
22
|
+
* analyze.c and related files.
|
|
23
|
+
*
|
|
24
|
+
*
|
|
25
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
26
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
27
|
+
*
|
|
28
|
+
* IDENTIFICATION
|
|
29
|
+
* src/backend/parser/parser.c
|
|
30
|
+
*
|
|
31
|
+
*-------------------------------------------------------------------------
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
#include "postgres.h"
|
|
35
|
+
|
|
36
|
+
#include "mb/pg_wchar.h"
|
|
37
|
+
#include "parser/gramparse.h"
|
|
38
|
+
#include "parser/parser.h"
|
|
39
|
+
#include "parser/scansup.h"
|
|
40
|
+
|
|
41
|
+
static bool check_uescapechar(unsigned char escape);
|
|
42
|
+
static char *str_udeescape(const char *str, char escape,
|
|
43
|
+
int position, core_yyscan_t yyscanner);
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* raw_parser
|
|
48
|
+
* Given a query in string form, do lexical and grammatical analysis.
|
|
49
|
+
*
|
|
50
|
+
* Returns a list of raw (un-analyzed) parse trees. The immediate elements
|
|
51
|
+
* of the list are always RawStmt nodes.
|
|
52
|
+
*/
|
|
53
|
+
List *
|
|
54
|
+
raw_parser(const char *str)
|
|
55
|
+
{
|
|
56
|
+
core_yyscan_t yyscanner;
|
|
57
|
+
base_yy_extra_type yyextra;
|
|
58
|
+
int yyresult;
|
|
59
|
+
|
|
60
|
+
/* initialize the flex scanner */
|
|
61
|
+
yyscanner = scanner_init(str, &yyextra.core_yy_extra,
|
|
62
|
+
&ScanKeywords, ScanKeywordTokens);
|
|
63
|
+
|
|
64
|
+
/* base_yylex() only needs this much initialization */
|
|
65
|
+
yyextra.have_lookahead = false;
|
|
66
|
+
|
|
67
|
+
/* initialize the bison parser */
|
|
68
|
+
parser_init(&yyextra);
|
|
69
|
+
|
|
70
|
+
/* Parse! */
|
|
71
|
+
yyresult = base_yyparse(yyscanner);
|
|
72
|
+
|
|
73
|
+
/* Clean up (release memory) */
|
|
74
|
+
scanner_finish(yyscanner);
|
|
75
|
+
|
|
76
|
+
if (yyresult) /* error */
|
|
77
|
+
return NIL;
|
|
78
|
+
|
|
79
|
+
return yyextra.parsetree;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
* Intermediate filter between parser and core lexer (core_yylex in scan.l).
|
|
85
|
+
*
|
|
86
|
+
* This filter is needed because in some cases the standard SQL grammar
|
|
87
|
+
* requires more than one token lookahead. We reduce these cases to one-token
|
|
88
|
+
* lookahead by replacing tokens here, in order to keep the grammar LALR(1).
|
|
89
|
+
*
|
|
90
|
+
* Using a filter is simpler than trying to recognize multiword tokens
|
|
91
|
+
* directly in scan.l, because we'd have to allow for comments between the
|
|
92
|
+
* words. Furthermore it's not clear how to do that without re-introducing
|
|
93
|
+
* scanner backtrack, which would cost more performance than this filter
|
|
94
|
+
* layer does.
|
|
95
|
+
*
|
|
96
|
+
* We also use this filter to convert UIDENT and USCONST sequences into
|
|
97
|
+
* plain IDENT and SCONST tokens. While that could be handled by additional
|
|
98
|
+
* productions in the main grammar, it's more efficient to do it like this.
|
|
99
|
+
*
|
|
100
|
+
* The filter also provides a convenient place to translate between
|
|
101
|
+
* the core_YYSTYPE and YYSTYPE representations (which are really the
|
|
102
|
+
* same thing anyway, but notationally they're different).
|
|
103
|
+
*/
|
|
104
|
+
int
|
|
105
|
+
base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner)
|
|
106
|
+
{
|
|
107
|
+
base_yy_extra_type *yyextra = pg_yyget_extra(yyscanner);
|
|
108
|
+
int cur_token;
|
|
109
|
+
int next_token;
|
|
110
|
+
int cur_token_length;
|
|
111
|
+
YYLTYPE cur_yylloc;
|
|
112
|
+
|
|
113
|
+
/* Get next token --- we might already have it */
|
|
114
|
+
if (yyextra->have_lookahead)
|
|
115
|
+
{
|
|
116
|
+
cur_token = yyextra->lookahead_token;
|
|
117
|
+
lvalp->core_yystype = yyextra->lookahead_yylval;
|
|
118
|
+
*llocp = yyextra->lookahead_yylloc;
|
|
119
|
+
*(yyextra->lookahead_end) = yyextra->lookahead_hold_char;
|
|
120
|
+
yyextra->have_lookahead = false;
|
|
121
|
+
}
|
|
122
|
+
else
|
|
123
|
+
cur_token = core_yylex(&(lvalp->core_yystype), llocp, yyscanner);
|
|
124
|
+
|
|
125
|
+
/*
|
|
126
|
+
* If this token isn't one that requires lookahead, just return it. If it
|
|
127
|
+
* does, determine the token length. (We could get that via strlen(), but
|
|
128
|
+
* since we have such a small set of possibilities, hardwiring seems
|
|
129
|
+
* feasible and more efficient --- at least for the fixed-length cases.)
|
|
130
|
+
*/
|
|
131
|
+
switch (cur_token)
|
|
132
|
+
{
|
|
133
|
+
case NOT:
|
|
134
|
+
cur_token_length = 3;
|
|
135
|
+
break;
|
|
136
|
+
case NULLS_P:
|
|
137
|
+
cur_token_length = 5;
|
|
138
|
+
break;
|
|
139
|
+
case WITH:
|
|
140
|
+
cur_token_length = 4;
|
|
141
|
+
break;
|
|
142
|
+
case UIDENT:
|
|
143
|
+
case USCONST:
|
|
144
|
+
cur_token_length = strlen(yyextra->core_yy_extra.scanbuf + *llocp);
|
|
145
|
+
break;
|
|
146
|
+
case SQL_COMMENT:
|
|
147
|
+
case C_COMMENT:
|
|
148
|
+
return base_yylex(lvalp, llocp, yyscanner);
|
|
149
|
+
default:
|
|
150
|
+
return cur_token;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* Identify end+1 of current token. core_yylex() has temporarily stored a
|
|
155
|
+
* '\0' here, and will undo that when we call it again. We need to redo
|
|
156
|
+
* it to fully revert the lookahead call for error reporting purposes.
|
|
157
|
+
*/
|
|
158
|
+
yyextra->lookahead_end = yyextra->core_yy_extra.scanbuf +
|
|
159
|
+
*llocp + cur_token_length;
|
|
160
|
+
Assert(*(yyextra->lookahead_end) == '\0');
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
* Save and restore *llocp around the call. It might look like we could
|
|
164
|
+
* avoid this by just passing &lookahead_yylloc to core_yylex(), but that
|
|
165
|
+
* does not work because flex actually holds onto the last-passed pointer
|
|
166
|
+
* internally, and will use that for error reporting. We need any error
|
|
167
|
+
* reports to point to the current token, not the next one.
|
|
168
|
+
*/
|
|
169
|
+
cur_yylloc = *llocp;
|
|
170
|
+
|
|
171
|
+
/* Get next token, saving outputs into lookahead variables */
|
|
172
|
+
next_token = core_yylex(&(yyextra->lookahead_yylval), llocp, yyscanner);
|
|
173
|
+
yyextra->lookahead_token = next_token;
|
|
174
|
+
yyextra->lookahead_yylloc = *llocp;
|
|
175
|
+
|
|
176
|
+
*llocp = cur_yylloc;
|
|
177
|
+
|
|
178
|
+
/* Now revert the un-truncation of the current token */
|
|
179
|
+
yyextra->lookahead_hold_char = *(yyextra->lookahead_end);
|
|
180
|
+
*(yyextra->lookahead_end) = '\0';
|
|
181
|
+
|
|
182
|
+
yyextra->have_lookahead = true;
|
|
183
|
+
|
|
184
|
+
/* Replace cur_token if needed, based on lookahead */
|
|
185
|
+
switch (cur_token)
|
|
186
|
+
{
|
|
187
|
+
case NOT:
|
|
188
|
+
/* Replace NOT by NOT_LA if it's followed by BETWEEN, IN, etc */
|
|
189
|
+
switch (next_token)
|
|
190
|
+
{
|
|
191
|
+
case BETWEEN:
|
|
192
|
+
case IN_P:
|
|
193
|
+
case LIKE:
|
|
194
|
+
case ILIKE:
|
|
195
|
+
case SIMILAR:
|
|
196
|
+
cur_token = NOT_LA;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
break;
|
|
200
|
+
|
|
201
|
+
case NULLS_P:
|
|
202
|
+
/* Replace NULLS_P by NULLS_LA if it's followed by FIRST or LAST */
|
|
203
|
+
switch (next_token)
|
|
204
|
+
{
|
|
205
|
+
case FIRST_P:
|
|
206
|
+
case LAST_P:
|
|
207
|
+
cur_token = NULLS_LA;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
break;
|
|
211
|
+
|
|
212
|
+
case WITH:
|
|
213
|
+
/* Replace WITH by WITH_LA if it's followed by TIME or ORDINALITY */
|
|
214
|
+
switch (next_token)
|
|
215
|
+
{
|
|
216
|
+
case TIME:
|
|
217
|
+
case ORDINALITY:
|
|
218
|
+
cur_token = WITH_LA;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
|
|
223
|
+
case UIDENT:
|
|
224
|
+
case USCONST:
|
|
225
|
+
/* Look ahead for UESCAPE */
|
|
226
|
+
if (next_token == UESCAPE)
|
|
227
|
+
{
|
|
228
|
+
/* Yup, so get third token, which had better be SCONST */
|
|
229
|
+
const char *escstr;
|
|
230
|
+
|
|
231
|
+
/* Again save and restore *llocp */
|
|
232
|
+
cur_yylloc = *llocp;
|
|
233
|
+
|
|
234
|
+
/* Un-truncate current token so errors point to third token */
|
|
235
|
+
*(yyextra->lookahead_end) = yyextra->lookahead_hold_char;
|
|
236
|
+
|
|
237
|
+
/* Get third token */
|
|
238
|
+
next_token = core_yylex(&(yyextra->lookahead_yylval),
|
|
239
|
+
llocp, yyscanner);
|
|
240
|
+
|
|
241
|
+
/* If we throw error here, it will point to third token */
|
|
242
|
+
if (next_token != SCONST)
|
|
243
|
+
scanner_yyerror("UESCAPE must be followed by a simple string literal",
|
|
244
|
+
yyscanner);
|
|
245
|
+
|
|
246
|
+
escstr = yyextra->lookahead_yylval.str;
|
|
247
|
+
if (strlen(escstr) != 1 || !check_uescapechar(escstr[0]))
|
|
248
|
+
scanner_yyerror("invalid Unicode escape character",
|
|
249
|
+
yyscanner);
|
|
250
|
+
|
|
251
|
+
/* Now restore *llocp; errors will point to first token */
|
|
252
|
+
*llocp = cur_yylloc;
|
|
253
|
+
|
|
254
|
+
/* Apply Unicode conversion */
|
|
255
|
+
lvalp->core_yystype.str =
|
|
256
|
+
str_udeescape(lvalp->core_yystype.str,
|
|
257
|
+
escstr[0],
|
|
258
|
+
*llocp,
|
|
259
|
+
yyscanner);
|
|
260
|
+
|
|
261
|
+
/*
|
|
262
|
+
* We don't need to revert the un-truncation of UESCAPE. What
|
|
263
|
+
* we do want to do is clear have_lookahead, thereby consuming
|
|
264
|
+
* all three tokens.
|
|
265
|
+
*/
|
|
266
|
+
yyextra->have_lookahead = false;
|
|
267
|
+
}
|
|
268
|
+
else
|
|
269
|
+
{
|
|
270
|
+
/* No UESCAPE, so convert using default escape character */
|
|
271
|
+
lvalp->core_yystype.str =
|
|
272
|
+
str_udeescape(lvalp->core_yystype.str,
|
|
273
|
+
'\\',
|
|
274
|
+
*llocp,
|
|
275
|
+
yyscanner);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (cur_token == UIDENT)
|
|
279
|
+
{
|
|
280
|
+
/* It's an identifier, so truncate as appropriate */
|
|
281
|
+
truncate_identifier(lvalp->core_yystype.str,
|
|
282
|
+
strlen(lvalp->core_yystype.str),
|
|
283
|
+
true);
|
|
284
|
+
cur_token = IDENT;
|
|
285
|
+
}
|
|
286
|
+
else if (cur_token == USCONST)
|
|
287
|
+
{
|
|
288
|
+
cur_token = SCONST;
|
|
289
|
+
}
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return cur_token;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* convert hex digit (caller should have verified that) to value */
|
|
297
|
+
static unsigned int
|
|
298
|
+
hexval(unsigned char c)
|
|
299
|
+
{
|
|
300
|
+
if (c >= '0' && c <= '9')
|
|
301
|
+
return c - '0';
|
|
302
|
+
if (c >= 'a' && c <= 'f')
|
|
303
|
+
return c - 'a' + 0xA;
|
|
304
|
+
if (c >= 'A' && c <= 'F')
|
|
305
|
+
return c - 'A' + 0xA;
|
|
306
|
+
elog(ERROR, "invalid hexadecimal digit");
|
|
307
|
+
return 0; /* not reached */
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* is Unicode code point acceptable? */
|
|
311
|
+
static void
|
|
312
|
+
check_unicode_value(pg_wchar c)
|
|
313
|
+
{
|
|
314
|
+
if (!is_valid_unicode_codepoint(c))
|
|
315
|
+
ereport(ERROR,
|
|
316
|
+
(errcode(ERRCODE_SYNTAX_ERROR),
|
|
317
|
+
errmsg("invalid Unicode escape value")));
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* is 'escape' acceptable as Unicode escape character (UESCAPE syntax) ? */
|
|
321
|
+
static bool
|
|
322
|
+
check_uescapechar(unsigned char escape)
|
|
323
|
+
{
|
|
324
|
+
if (isxdigit(escape)
|
|
325
|
+
|| escape == '+'
|
|
326
|
+
|| escape == '\''
|
|
327
|
+
|| escape == '"'
|
|
328
|
+
|| scanner_isspace(escape))
|
|
329
|
+
return false;
|
|
330
|
+
else
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/*
|
|
335
|
+
* Process Unicode escapes in "str", producing a palloc'd plain string
|
|
336
|
+
*
|
|
337
|
+
* escape: the escape character to use
|
|
338
|
+
* position: start position of U&'' or U&"" string token
|
|
339
|
+
* yyscanner: context information needed for error reports
|
|
340
|
+
*/
|
|
341
|
+
static char *
|
|
342
|
+
str_udeescape(const char *str, char escape,
|
|
343
|
+
int position, core_yyscan_t yyscanner)
|
|
344
|
+
{
|
|
345
|
+
const char *in;
|
|
346
|
+
char *new,
|
|
347
|
+
*out;
|
|
348
|
+
size_t new_len;
|
|
349
|
+
pg_wchar pair_first = 0;
|
|
350
|
+
ScannerCallbackState scbstate;
|
|
351
|
+
|
|
352
|
+
/*
|
|
353
|
+
* Guesstimate that result will be no longer than input, but allow enough
|
|
354
|
+
* padding for Unicode conversion.
|
|
355
|
+
*/
|
|
356
|
+
new_len = strlen(str) + MAX_UNICODE_EQUIVALENT_STRING + 1;
|
|
357
|
+
new = palloc(new_len);
|
|
358
|
+
|
|
359
|
+
in = str;
|
|
360
|
+
out = new;
|
|
361
|
+
while (*in)
|
|
362
|
+
{
|
|
363
|
+
/* Enlarge string if needed */
|
|
364
|
+
size_t out_dist = out - new;
|
|
365
|
+
|
|
366
|
+
if (out_dist > new_len - (MAX_UNICODE_EQUIVALENT_STRING + 1))
|
|
367
|
+
{
|
|
368
|
+
new_len *= 2;
|
|
369
|
+
new = repalloc(new, new_len);
|
|
370
|
+
out = new + out_dist;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (in[0] == escape)
|
|
374
|
+
{
|
|
375
|
+
/*
|
|
376
|
+
* Any errors reported while processing this escape sequence will
|
|
377
|
+
* have an error cursor pointing at the escape.
|
|
378
|
+
*/
|
|
379
|
+
setup_scanner_errposition_callback(&scbstate, yyscanner,
|
|
380
|
+
in - str + position + 3); /* 3 for U&" */
|
|
381
|
+
if (in[1] == escape)
|
|
382
|
+
{
|
|
383
|
+
if (pair_first)
|
|
384
|
+
goto invalid_pair;
|
|
385
|
+
*out++ = escape;
|
|
386
|
+
in += 2;
|
|
387
|
+
}
|
|
388
|
+
else if (isxdigit((unsigned char) in[1]) &&
|
|
389
|
+
isxdigit((unsigned char) in[2]) &&
|
|
390
|
+
isxdigit((unsigned char) in[3]) &&
|
|
391
|
+
isxdigit((unsigned char) in[4]))
|
|
392
|
+
{
|
|
393
|
+
pg_wchar unicode;
|
|
394
|
+
|
|
395
|
+
unicode = (hexval(in[1]) << 12) +
|
|
396
|
+
(hexval(in[2]) << 8) +
|
|
397
|
+
(hexval(in[3]) << 4) +
|
|
398
|
+
hexval(in[4]);
|
|
399
|
+
check_unicode_value(unicode);
|
|
400
|
+
if (pair_first)
|
|
401
|
+
{
|
|
402
|
+
if (is_utf16_surrogate_second(unicode))
|
|
403
|
+
{
|
|
404
|
+
unicode = surrogate_pair_to_codepoint(pair_first, unicode);
|
|
405
|
+
pair_first = 0;
|
|
406
|
+
}
|
|
407
|
+
else
|
|
408
|
+
goto invalid_pair;
|
|
409
|
+
}
|
|
410
|
+
else if (is_utf16_surrogate_second(unicode))
|
|
411
|
+
goto invalid_pair;
|
|
412
|
+
|
|
413
|
+
if (is_utf16_surrogate_first(unicode))
|
|
414
|
+
pair_first = unicode;
|
|
415
|
+
else
|
|
416
|
+
{
|
|
417
|
+
pg_unicode_to_server(unicode, (unsigned char *) out);
|
|
418
|
+
out += strlen(out);
|
|
419
|
+
}
|
|
420
|
+
in += 5;
|
|
421
|
+
}
|
|
422
|
+
else if (in[1] == '+' &&
|
|
423
|
+
isxdigit((unsigned char) in[2]) &&
|
|
424
|
+
isxdigit((unsigned char) in[3]) &&
|
|
425
|
+
isxdigit((unsigned char) in[4]) &&
|
|
426
|
+
isxdigit((unsigned char) in[5]) &&
|
|
427
|
+
isxdigit((unsigned char) in[6]) &&
|
|
428
|
+
isxdigit((unsigned char) in[7]))
|
|
429
|
+
{
|
|
430
|
+
pg_wchar unicode;
|
|
431
|
+
|
|
432
|
+
unicode = (hexval(in[2]) << 20) +
|
|
433
|
+
(hexval(in[3]) << 16) +
|
|
434
|
+
(hexval(in[4]) << 12) +
|
|
435
|
+
(hexval(in[5]) << 8) +
|
|
436
|
+
(hexval(in[6]) << 4) +
|
|
437
|
+
hexval(in[7]);
|
|
438
|
+
check_unicode_value(unicode);
|
|
439
|
+
if (pair_first)
|
|
440
|
+
{
|
|
441
|
+
if (is_utf16_surrogate_second(unicode))
|
|
442
|
+
{
|
|
443
|
+
unicode = surrogate_pair_to_codepoint(pair_first, unicode);
|
|
444
|
+
pair_first = 0;
|
|
445
|
+
}
|
|
446
|
+
else
|
|
447
|
+
goto invalid_pair;
|
|
448
|
+
}
|
|
449
|
+
else if (is_utf16_surrogate_second(unicode))
|
|
450
|
+
goto invalid_pair;
|
|
451
|
+
|
|
452
|
+
if (is_utf16_surrogate_first(unicode))
|
|
453
|
+
pair_first = unicode;
|
|
454
|
+
else
|
|
455
|
+
{
|
|
456
|
+
pg_unicode_to_server(unicode, (unsigned char *) out);
|
|
457
|
+
out += strlen(out);
|
|
458
|
+
}
|
|
459
|
+
in += 8;
|
|
460
|
+
}
|
|
461
|
+
else
|
|
462
|
+
ereport(ERROR,
|
|
463
|
+
(errcode(ERRCODE_SYNTAX_ERROR),
|
|
464
|
+
errmsg("invalid Unicode escape"),
|
|
465
|
+
errhint("Unicode escapes must be \\XXXX or \\+XXXXXX.")));
|
|
466
|
+
|
|
467
|
+
cancel_scanner_errposition_callback(&scbstate);
|
|
468
|
+
}
|
|
469
|
+
else
|
|
470
|
+
{
|
|
471
|
+
if (pair_first)
|
|
472
|
+
goto invalid_pair;
|
|
473
|
+
|
|
474
|
+
*out++ = *in++;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/* unfinished surrogate pair? */
|
|
479
|
+
if (pair_first)
|
|
480
|
+
goto invalid_pair;
|
|
481
|
+
|
|
482
|
+
*out = '\0';
|
|
483
|
+
return new;
|
|
484
|
+
|
|
485
|
+
/*
|
|
486
|
+
* We might get here with the error callback active, or not. Call
|
|
487
|
+
* scanner_errposition to make sure an error cursor appears; if the
|
|
488
|
+
* callback is active, this is duplicative but harmless.
|
|
489
|
+
*/
|
|
490
|
+
invalid_pair:
|
|
491
|
+
ereport(ERROR,
|
|
492
|
+
(errcode(ERRCODE_SYNTAX_ERROR),
|
|
493
|
+
errmsg("invalid Unicode surrogate pair"),
|
|
494
|
+
scanner_errposition(in - str + position + 3, /* 3 for U&" */
|
|
495
|
+
yyscanner)));
|
|
496
|
+
return NULL; /* keep compiler quiet */
|
|
497
|
+
}
|