summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/Makefile3
-rw-r--r--src/include/access/amapi.h29
-rw-r--r--src/include/access/amvalidate.h2
-rw-r--r--src/include/access/attnum.h2
-rw-r--r--src/include/access/brin.h27
-rw-r--r--src/include/access/brin_internal.h5
-rw-r--r--src/include/access/brin_page.h2
-rw-r--r--src/include/access/brin_pageops.h2
-rw-r--r--src/include/access/brin_revmap.h3
-rw-r--r--src/include/access/brin_tuple.h14
-rw-r--r--src/include/access/brin_xlog.h23
-rw-r--r--src/include/access/bufmask.h32
-rw-r--r--src/include/access/clog.h10
-rw-r--r--src/include/access/commit_ts.h10
-rw-r--r--src/include/access/genam.h17
-rw-r--r--src/include/access/generic_xlog.h3
-rw-r--r--src/include/access/gin.h9
-rw-r--r--src/include/access/gin_private.h527
-rw-r--r--src/include/access/ginblock.h336
-rw-r--r--src/include/access/ginxlog.h217
-rw-r--r--src/include/access/gist.h2
-rw-r--r--src/include/access/gist_private.h82
-rw-r--r--src/include/access/gistscan.h2
-rw-r--r--src/include/access/gistxlog.h69
-rw-r--r--src/include/access/hash.h217
-rw-r--r--src/include/access/hash_xlog.h282
-rw-r--r--src/include/access/heapam.h6
-rw-r--r--src/include/access/heapam_xlog.h3
-rw-r--r--src/include/access/hio.h2
-rw-r--r--src/include/access/htup.h2
-rw-r--r--src/include/access/htup_details.h22
-rw-r--r--src/include/access/itup.h4
-rw-r--r--src/include/access/multixact.h5
-rw-r--r--src/include/access/nbtree.h260
-rw-r--r--src/include/access/nbtxlog.h255
-rw-r--r--src/include/access/parallel.h8
-rw-r--r--src/include/access/printsimple.h23
-rw-r--r--src/include/access/printtup.h2
-rw-r--r--src/include/access/reloptions.h5
-rw-r--r--src/include/access/relscan.h25
-rw-r--r--src/include/access/rewriteheap.h2
-rw-r--r--src/include/access/rmgr.h2
-rw-r--r--src/include/access/rmgrlist.h48
-rw-r--r--src/include/access/sdir.h2
-rw-r--r--src/include/access/skey.h2
-rw-r--r--src/include/access/slru.h7
-rw-r--r--src/include/access/spgist.h25
-rw-r--r--src/include/access/spgist_private.h234
-rw-r--r--src/include/access/spgxlog.h257
-rw-r--r--src/include/access/stratnum.h2
-rw-r--r--src/include/access/subtrans.h4
-rw-r--r--src/include/access/sysattr.h2
-rw-r--r--src/include/access/timeline.h4
-rw-r--r--src/include/access/transam.h9
-rw-r--r--src/include/access/tsmapi.h2
-rw-r--r--src/include/access/tupconvert.h6
-rw-r--r--src/include/access/tupdesc.h9
-rw-r--r--src/include/access/tupmacs.h2
-rw-r--r--src/include/access/tuptoaster.h15
-rw-r--r--src/include/access/twophase.h11
-rw-r--r--src/include/access/twophase_rmgr.h2
-rw-r--r--src/include/access/valid.h2
-rw-r--r--src/include/access/visibilitymap.h4
-rw-r--r--src/include/access/xact.h32
-rw-r--r--src/include/access/xlog.h45
-rw-r--r--src/include/access/xlog_fn.h37
-rw-r--r--src/include/access/xlog_internal.h20
-rw-r--r--src/include/access/xlogdefs.h4
-rw-r--r--src/include/access/xloginsert.h4
-rw-r--r--src/include/access/xlogreader.h25
-rw-r--r--src/include/access/xlogrecord.h16
-rw-r--r--src/include/access/xlogutils.h5
-rw-r--r--src/include/bootstrap/bootstrap.h2
-rw-r--r--src/include/c.h50
-rw-r--r--src/include/catalog/binary_upgrade.h2
-rw-r--r--src/include/catalog/catalog.h2
-rw-r--r--src/include/catalog/catversion.h4
-rw-r--r--src/include/catalog/dependency.h31
-rw-r--r--src/include/catalog/genbki.h2
-rw-r--r--src/include/catalog/heap.h13
-rw-r--r--src/include/catalog/index.h2
-rw-r--r--src/include/catalog/indexing.h48
-rw-r--r--src/include/catalog/namespace.h6
-rw-r--r--src/include/catalog/objectaccess.h2
-rw-r--r--src/include/catalog/objectaddress.h10
-rw-r--r--src/include/catalog/opfam_internal.h2
-rw-r--r--src/include/catalog/partition.h101
-rw-r--r--src/include/catalog/pg_aggregate.h2
-rw-r--r--src/include/catalog/pg_am.h2
-rw-r--r--src/include/catalog/pg_amop.h40
-rw-r--r--src/include/catalog/pg_amproc.h170
-rw-r--r--src/include/catalog/pg_attrdef.h2
-rw-r--r--src/include/catalog/pg_attribute.h26
-rw-r--r--src/include/catalog/pg_auth_members.h2
-rw-r--r--src/include/catalog/pg_authid.h18
-rw-r--r--src/include/catalog/pg_cast.h18
-rw-r--r--src/include/catalog/pg_class.h34
-rw-r--r--src/include/catalog/pg_collation.h28
-rw-r--r--src/include/catalog/pg_collation_fn.h7
-rw-r--r--src/include/catalog/pg_constraint.h2
-rw-r--r--src/include/catalog/pg_constraint_fn.h2
-rw-r--r--src/include/catalog/pg_control.h16
-rw-r--r--src/include/catalog/pg_conversion.h2
-rw-r--r--src/include/catalog/pg_conversion_fn.h2
-rw-r--r--src/include/catalog/pg_database.h2
-rw-r--r--src/include/catalog/pg_db_role_setting.h2
-rw-r--r--src/include/catalog/pg_default_acl.h3
-rw-r--r--src/include/catalog/pg_depend.h2
-rw-r--r--src/include/catalog/pg_description.h2
-rw-r--r--src/include/catalog/pg_enum.h4
-rw-r--r--src/include/catalog/pg_event_trigger.h2
-rw-r--r--src/include/catalog/pg_extension.h2
-rw-r--r--src/include/catalog/pg_foreign_data_wrapper.h2
-rw-r--r--src/include/catalog/pg_foreign_server.h2
-rw-r--r--src/include/catalog/pg_foreign_table.h4
-rw-r--r--src/include/catalog/pg_index.h2
-rw-r--r--src/include/catalog/pg_inherits.h2
-rw-r--r--src/include/catalog/pg_inherits_fn.h2
-rw-r--r--src/include/catalog/pg_init_privs.h2
-rw-r--r--src/include/catalog/pg_language.h2
-rw-r--r--src/include/catalog/pg_largeobject.h2
-rw-r--r--src/include/catalog/pg_largeobject_metadata.h2
-rw-r--r--src/include/catalog/pg_namespace.h2
-rw-r--r--src/include/catalog/pg_opclass.h38
-rw-r--r--src/include/catalog/pg_operator.h35
-rw-r--r--src/include/catalog/pg_operator_fn.h2
-rw-r--r--src/include/catalog/pg_opfamily.h7
-rw-r--r--src/include/catalog/pg_partitioned_table.h74
-rw-r--r--src/include/catalog/pg_pltemplate.h2
-rw-r--r--src/include/catalog/pg_policy.h18
-rw-r--r--src/include/catalog/pg_proc.h317
-rw-r--r--src/include/catalog/pg_proc_fn.h2
-rw-r--r--src/include/catalog/pg_publication.h104
-rw-r--r--src/include/catalog/pg_publication_rel.h52
-rw-r--r--src/include/catalog/pg_range.h2
-rw-r--r--src/include/catalog/pg_replication_origin.h2
-rw-r--r--src/include/catalog/pg_rewrite.h2
-rw-r--r--src/include/catalog/pg_seclabel.h2
-rw-r--r--src/include/catalog/pg_sequence.h32
-rw-r--r--src/include/catalog/pg_shdepend.h2
-rw-r--r--src/include/catalog/pg_shdescription.h2
-rw-r--r--src/include/catalog/pg_shseclabel.h2
-rw-r--r--src/include/catalog/pg_statistic.h4
-rw-r--r--src/include/catalog/pg_statistic_ext.h80
-rw-r--r--src/include/catalog/pg_subscription.h96
-rw-r--r--src/include/catalog/pg_subscription_rel.h82
-rw-r--r--src/include/catalog/pg_tablespace.h2
-rw-r--r--src/include/catalog/pg_transform.h2
-rw-r--r--src/include/catalog/pg_trigger.h15
-rw-r--r--src/include/catalog/pg_ts_config.h2
-rw-r--r--src/include/catalog/pg_ts_config_map.h2
-rw-r--r--src/include/catalog/pg_ts_dict.h2
-rw-r--r--src/include/catalog/pg_ts_parser.h2
-rw-r--r--src/include/catalog/pg_ts_template.h2
-rw-r--r--src/include/catalog/pg_type.h16
-rw-r--r--src/include/catalog/pg_type_fn.h2
-rw-r--r--src/include/catalog/pg_user_mapping.h2
-rw-r--r--src/include/catalog/storage.h2
-rw-r--r--src/include/catalog/storage_xlog.h2
-rw-r--r--src/include/catalog/toasting.h3
-rw-r--r--src/include/commands/alter.h2
-rw-r--r--src/include/commands/async.h7
-rw-r--r--src/include/commands/cluster.h2
-rw-r--r--src/include/commands/collationcmds.h5
-rw-r--r--src/include/commands/comment.h2
-rw-r--r--src/include/commands/conversioncmds.h2
-rw-r--r--src/include/commands/copy.h15
-rw-r--r--src/include/commands/createas.h5
-rw-r--r--src/include/commands/dbcommands.h6
-rw-r--r--src/include/commands/dbcommands_xlog.h2
-rw-r--r--src/include/commands/defrem.h25
-rw-r--r--src/include/commands/discard.h2
-rw-r--r--src/include/commands/event_trigger.h2
-rw-r--r--src/include/commands/explain.h15
-rw-r--r--src/include/commands/extension.h19
-rw-r--r--src/include/commands/lockcmds.h2
-rw-r--r--src/include/commands/matview.h2
-rw-r--r--src/include/commands/policy.h2
-rw-r--r--src/include/commands/portalcmds.h4
-rw-r--r--src/include/commands/prepare.h9
-rw-r--r--src/include/commands/progress.h2
-rw-r--r--src/include/commands/publicationcmds.h29
-rw-r--r--src/include/commands/schemacmds.h12
-rw-r--r--src/include/commands/seclabel.h2
-rw-r--r--src/include/commands/sequence.h46
-rw-r--r--src/include/commands/subscriptioncmds.h29
-rw-r--r--src/include/commands/tablecmds.h4
-rw-r--r--src/include/commands/tablespace.h2
-rw-r--r--src/include/commands/trigger.h6
-rw-r--r--src/include/commands/typecmds.h6
-rw-r--r--src/include/commands/user.h11
-rw-r--r--src/include/commands/vacuum.h2
-rw-r--r--src/include/commands/variable.h2
-rw-r--r--src/include/commands/view.h5
-rw-r--r--src/include/common/base64.h19
-rw-r--r--src/include/common/config_info.h2
-rw-r--r--src/include/common/controldata_utils.h4
-rw-r--r--src/include/common/fe_memutils.h2
-rw-r--r--src/include/common/file_utils.h27
-rw-r--r--src/include/common/int128.h276
-rw-r--r--src/include/common/ip.h (renamed from src/include/libpq/ip.h)20
-rw-r--r--src/include/common/keywords.h2
-rw-r--r--src/include/common/md5.h (renamed from src/include/libpq/md5.h)8
-rw-r--r--src/include/common/relpath.h2
-rw-r--r--src/include/common/restricted_token.h2
-rw-r--r--src/include/common/saslprep.h30
-rw-r--r--src/include/common/scram-common.h59
-rw-r--r--src/include/common/sha2.h115
-rw-r--r--src/include/common/string.h2
-rw-r--r--src/include/common/unicode_norm.h21
-rw-r--r--src/include/common/unicode_norm_table.h8859
-rw-r--r--src/include/common/username.h2
-rw-r--r--src/include/datatype/timestamp.h57
-rw-r--r--src/include/executor/execExpr.h650
-rw-r--r--src/include/executor/execParallel.h6
-rw-r--r--src/include/executor/execdebug.h25
-rw-r--r--src/include/executor/execdesc.h15
-rw-r--r--src/include/executor/executor.h229
-rw-r--r--src/include/executor/functions.h2
-rw-r--r--src/include/executor/hashjoin.h2
-rw-r--r--src/include/executor/instrument.h2
-rw-r--r--src/include/executor/nodeAgg.h2
-rw-r--r--src/include/executor/nodeAppend.h2
-rw-r--r--src/include/executor/nodeBitmapAnd.h2
-rw-r--r--src/include/executor/nodeBitmapHeapscan.h9
-rw-r--r--src/include/executor/nodeBitmapIndexscan.h2
-rw-r--r--src/include/executor/nodeBitmapOr.h2
-rw-r--r--src/include/executor/nodeCtescan.h2
-rw-r--r--src/include/executor/nodeCustom.h3
-rw-r--r--src/include/executor/nodeForeignscan.h3
-rw-r--r--src/include/executor/nodeFunctionscan.h2
-rw-r--r--src/include/executor/nodeGather.h2
-rw-r--r--src/include/executor/nodeGatherMerge.h27
-rw-r--r--src/include/executor/nodeGroup.h2
-rw-r--r--src/include/executor/nodeHash.h2
-rw-r--r--src/include/executor/nodeHashjoin.h2
-rw-r--r--src/include/executor/nodeIndexonlyscan.h11
-rw-r--r--src/include/executor/nodeIndexscan.h6
-rw-r--r--src/include/executor/nodeLimit.h2
-rw-r--r--src/include/executor/nodeLockRows.h2
-rw-r--r--src/include/executor/nodeMaterial.h2
-rw-r--r--src/include/executor/nodeMergeAppend.h2
-rw-r--r--src/include/executor/nodeMergejoin.h2
-rw-r--r--src/include/executor/nodeModifyTable.h2
-rw-r--r--src/include/executor/nodeNamedtuplestorescan.h24
-rw-r--r--src/include/executor/nodeNestloop.h2
-rw-r--r--src/include/executor/nodeProjectSet.h24
-rw-r--r--src/include/executor/nodeRecursiveunion.h2
-rw-r--r--src/include/executor/nodeResult.h2
-rw-r--r--src/include/executor/nodeSamplescan.h2
-rw-r--r--src/include/executor/nodeSeqscan.h2
-rw-r--r--src/include/executor/nodeSetOp.h2
-rw-r--r--src/include/executor/nodeSort.h2
-rw-r--r--src/include/executor/nodeSubplan.h6
-rw-r--r--src/include/executor/nodeSubqueryscan.h2
-rw-r--r--src/include/executor/nodeTableFuncscan.h24
-rw-r--r--src/include/executor/nodeTidscan.h2
-rw-r--r--src/include/executor/nodeUnique.h2
-rw-r--r--src/include/executor/nodeValuesscan.h2
-rw-r--r--src/include/executor/nodeWindowAgg.h2
-rw-r--r--src/include/executor/nodeWorktablescan.h2
-rw-r--r--src/include/executor/spi.h24
-rw-r--r--src/include/executor/spi_priv.h4
-rw-r--r--src/include/executor/tablefunc.h67
-rw-r--r--src/include/executor/tqueue.h2
-rw-r--r--src/include/executor/tstoreReceiver.h2
-rw-r--r--src/include/executor/tuptable.h2
-rw-r--r--src/include/fe_utils/mbprint.h2
-rw-r--r--src/include/fe_utils/print.h2
-rw-r--r--src/include/fe_utils/psqlscan.h18
-rw-r--r--src/include/fe_utils/psqlscan_int.h8
-rw-r--r--src/include/fe_utils/simple_list.h2
-rw-r--r--src/include/fe_utils/string_utils.h8
-rw-r--r--src/include/fmgr.h84
-rw-r--r--src/include/foreign/fdwapi.h4
-rw-r--r--src/include/foreign/foreign.h4
-rw-r--r--src/include/funcapi.h2
-rw-r--r--src/include/getaddrinfo.h6
-rw-r--r--src/include/getopt_long.h2
-rw-r--r--src/include/lib/binaryheap.h2
-rw-r--r--src/include/lib/bipartite_match.h2
-rw-r--r--src/include/lib/hyperloglog.h2
-rw-r--r--src/include/lib/ilist.h2
-rw-r--r--src/include/lib/knapsack.h17
-rw-r--r--src/include/lib/pairingheap.h2
-rw-r--r--src/include/lib/rbtree.h24
-rw-r--r--src/include/lib/simplehash.h956
-rw-r--r--src/include/lib/stringinfo.h2
-rw-r--r--src/include/libpq/auth.h2
-rw-r--r--src/include/libpq/be-fsstubs.h33
-rw-r--r--src/include/libpq/crypt.h33
-rw-r--r--src/include/libpq/hba.h22
-rw-r--r--src/include/libpq/ifaddr.h30
-rw-r--r--src/include/libpq/libpq-be.h15
-rw-r--r--src/include/libpq/libpq-fs.h2
-rw-r--r--src/include/libpq/libpq.h8
-rw-r--r--src/include/libpq/pqcomm.h7
-rw-r--r--src/include/libpq/pqformat.h2
-rw-r--r--src/include/libpq/pqmq.h2
-rw-r--r--src/include/libpq/pqsignal.h2
-rw-r--r--src/include/libpq/scram.h34
-rw-r--r--src/include/mb/pg_wchar.h92
-rw-r--r--src/include/miscadmin.h9
-rw-r--r--src/include/nodes/bitmapset.h8
-rw-r--r--src/include/nodes/execnodes.h776
-rw-r--r--src/include/nodes/extensible.h3
-rw-r--r--src/include/nodes/lockoptions.h2
-rw-r--r--src/include/nodes/makefuncs.h6
-rw-r--r--src/include/nodes/memnodes.h4
-rw-r--r--src/include/nodes/nodeFuncs.h2
-rw-r--r--src/include/nodes/nodes.h136
-rw-r--r--src/include/nodes/params.h2
-rw-r--r--src/include/nodes/parsenodes.h447
-rw-r--r--src/include/nodes/pg_list.h23
-rw-r--r--src/include/nodes/plannodes.h118
-rw-r--r--src/include/nodes/primnodes.h90
-rw-r--r--src/include/nodes/print.h2
-rw-r--r--src/include/nodes/readfuncs.h2
-rw-r--r--src/include/nodes/relation.h199
-rw-r--r--src/include/nodes/replnodes.h14
-rw-r--r--src/include/nodes/tidbitmap.h12
-rw-r--r--src/include/nodes/value.h2
-rw-r--r--src/include/optimizer/clauses.h6
-rw-r--r--src/include/optimizer/cost.h38
-rw-r--r--src/include/optimizer/geqo.h2
-rw-r--r--src/include/optimizer/geqo_copy.h2
-rw-r--r--src/include/optimizer/geqo_gene.h2
-rw-r--r--src/include/optimizer/geqo_misc.h2
-rw-r--r--src/include/optimizer/geqo_mutation.h2
-rw-r--r--src/include/optimizer/geqo_pool.h2
-rw-r--r--src/include/optimizer/geqo_random.h2
-rw-r--r--src/include/optimizer/geqo_recombination.h2
-rw-r--r--src/include/optimizer/geqo_selection.h2
-rw-r--r--src/include/optimizer/joininfo.h2
-rw-r--r--src/include/optimizer/orclauses.h2
-rw-r--r--src/include/optimizer/pathnode.h48
-rw-r--r--src/include/optimizer/paths.h15
-rw-r--r--src/include/optimizer/placeholder.h2
-rw-r--r--src/include/optimizer/plancat.h2
-rw-r--r--src/include/optimizer/planmain.h10
-rw-r--r--src/include/optimizer/planner.h4
-rw-r--r--src/include/optimizer/predtest.h2
-rw-r--r--src/include/optimizer/prep.h7
-rw-r--r--src/include/optimizer/restrictinfo.h10
-rw-r--r--src/include/optimizer/subselect.h2
-rw-r--r--src/include/optimizer/tlist.h9
-rw-r--r--src/include/optimizer/var.h2
-rw-r--r--src/include/parser/analyze.h15
-rw-r--r--src/include/parser/gramparse.h2
-rw-r--r--src/include/parser/kwlist.h15
-rw-r--r--src/include/parser/parse_agg.h2
-rw-r--r--src/include/parser/parse_clause.h8
-rw-r--r--src/include/parser/parse_coerce.h6
-rw-r--r--src/include/parser/parse_collate.h2
-rw-r--r--src/include/parser/parse_cte.h2
-rw-r--r--src/include/parser/parse_enr.h22
-rw-r--r--src/include/parser/parse_expr.h2
-rw-r--r--src/include/parser/parse_func.h12
-rw-r--r--src/include/parser/parse_node.h58
-rw-r--r--src/include/parser/parse_oper.h7
-rw-r--r--src/include/parser/parse_param.h2
-rw-r--r--src/include/parser/parse_relation.h15
-rw-r--r--src/include/parser/parse_target.h5
-rw-r--r--src/include/parser/parse_type.h2
-rw-r--r--src/include/parser/parse_utilcmd.h4
-rw-r--r--src/include/parser/parser.h2
-rw-r--r--src/include/parser/parsetree.h2
-rw-r--r--src/include/parser/scanner.h4
-rw-r--r--src/include/parser/scansup.h2
-rw-r--r--src/include/pg_config.h.in68
-rw-r--r--src/include/pg_config.h.win3249
-rw-r--r--src/include/pg_config_manual.h25
-rw-r--r--src/include/pg_getopt.h2
-rw-r--r--src/include/pg_trace.h2
-rw-r--r--src/include/pgstat.h223
-rw-r--r--src/include/pgtar.h3
-rw-r--r--src/include/pgtime.h4
-rw-r--r--src/include/port.h22
-rw-r--r--src/include/port/atomics.h71
-rw-r--r--src/include/port/atomics/arch-arm.h9
-rw-r--r--src/include/port/atomics/arch-hppa.h2
-rw-r--r--src/include/port/atomics/arch-ia64.h5
-rw-r--r--src/include/port/atomics/arch-ppc.h5
-rw-r--r--src/include/port/atomics/arch-x86.h16
-rw-r--r--src/include/port/atomics/fallback.h38
-rw-r--r--src/include/port/atomics/generic-acc.h2
-rw-r--r--src/include/port/atomics/generic-gcc.h15
-rw-r--r--src/include/port/atomics/generic-msvc.h4
-rw-r--r--src/include/port/atomics/generic-sunpro.h2
-rw-r--r--src/include/port/atomics/generic-xlc.h2
-rw-r--r--src/include/port/atomics/generic.h58
-rw-r--r--src/include/port/darwin.h2
-rw-r--r--src/include/port/pg_bswap.h27
-rw-r--r--src/include/port/pg_crc32c.h2
-rw-r--r--src/include/port/sco.h7
-rw-r--r--src/include/port/unixware.h11
-rw-r--r--src/include/port/win32.h43
-rw-r--r--src/include/portability/instr_time.h104
-rw-r--r--src/include/portability/mem.h2
-rw-r--r--src/include/postgres.h89
-rw-r--r--src/include/postgres_ext.h5
-rw-r--r--src/include/postgres_fe.h2
-rw-r--r--src/include/postmaster/autovacuum.h16
-rw-r--r--src/include/postmaster/bgworker.h16
-rw-r--r--src/include/postmaster/bgworker_internals.h10
-rw-r--r--src/include/postmaster/bgwriter.h2
-rw-r--r--src/include/postmaster/fork_process.h2
-rw-r--r--src/include/postmaster/pgarch.h4
-rw-r--r--src/include/postmaster/postmaster.h2
-rw-r--r--src/include/postmaster/startup.h2
-rw-r--r--src/include/postmaster/syslogger.h9
-rw-r--r--src/include/postmaster/walwriter.h2
-rw-r--r--src/include/regex/regcustom.h23
-rw-r--r--src/include/regex/regex.h1
-rw-r--r--src/include/regex/regexport.h2
-rw-r--r--src/include/regex/regguts.h142
-rw-r--r--src/include/replication/basebackup.h2
-rw-r--r--src/include/replication/decode.h2
-rw-r--r--src/include/replication/logical.h23
-rw-r--r--src/include/replication/logicalfuncs.h9
-rw-r--r--src/include/replication/logicallauncher.h27
-rw-r--r--src/include/replication/logicalproto.h106
-rw-r--r--src/include/replication/logicalrelation.h42
-rw-r--r--src/include/replication/logicalworker.h17
-rw-r--r--src/include/replication/message.h2
-rw-r--r--src/include/replication/origin.h16
-rw-r--r--src/include/replication/output_plugin.h36
-rw-r--r--src/include/replication/pgoutput.h30
-rw-r--r--src/include/replication/reorderbuffer.h16
-rw-r--r--src/include/replication/slot.h13
-rw-r--r--src/include/replication/snapbuild.h31
-rw-r--r--src/include/replication/syncrep.h9
-rw-r--r--src/include/replication/walreceiver.h164
-rw-r--r--src/include/replication/walsender.h17
-rw-r--r--src/include/replication/walsender_private.h10
-rw-r--r--src/include/replication/worker_internal.h97
-rw-r--r--src/include/rewrite/prs2lock.h2
-rw-r--r--src/include/rewrite/rewriteDefine.h2
-rw-r--r--src/include/rewrite/rewriteHandler.h2
-rw-r--r--src/include/rewrite/rewriteManip.h2
-rw-r--r--src/include/rewrite/rewriteRemove.h2
-rw-r--r--src/include/rewrite/rewriteSupport.h4
-rw-r--r--src/include/rewrite/rowsecurity.h3
-rw-r--r--src/include/rusagestub.h2
-rw-r--r--src/include/snowball/header.h7
-rw-r--r--src/include/statistics/extended_stats_internal.h69
-rw-r--r--src/include/statistics/statistics.h98
-rw-r--r--src/include/storage/backendid.h2
-rw-r--r--src/include/storage/barrier.h23
-rw-r--r--src/include/storage/block.h2
-rw-r--r--src/include/storage/buf.h2
-rw-r--r--src/include/storage/buf_internals.h9
-rw-r--r--src/include/storage/buffile.h2
-rw-r--r--src/include/storage/bufmgr.h17
-rw-r--r--src/include/storage/bufpage.h16
-rw-r--r--src/include/storage/checksum.h2
-rw-r--r--src/include/storage/checksum_impl.h2
-rw-r--r--src/include/storage/condition_variable.h59
-rw-r--r--src/include/storage/copydir.h2
-rw-r--r--src/include/storage/dsm.h6
-rw-r--r--src/include/storage/dsm_impl.h6
-rw-r--r--src/include/storage/fd.h15
-rw-r--r--src/include/storage/freespace.h2
-rw-r--r--src/include/storage/fsm_internals.h2
-rw-r--r--src/include/storage/indexfsm.h2
-rw-r--r--src/include/storage/ipc.h2
-rw-r--r--src/include/storage/item.h2
-rw-r--r--src/include/storage/itemid.h2
-rw-r--r--src/include/storage/itemptr.h36
-rw-r--r--src/include/storage/large_object.h2
-rw-r--r--src/include/storage/latch.h14
-rw-r--r--src/include/storage/lmgr.h2
-rw-r--r--src/include/storage/lock.h2
-rw-r--r--src/include/storage/lockdefs.h2
-rw-r--r--src/include/storage/lwlock.h73
-rw-r--r--src/include/storage/off.h2
-rw-r--r--src/include/storage/pg_sema.h54
-rw-r--r--src/include/storage/pg_shmem.h2
-rw-r--r--src/include/storage/pmsignal.h2
-rw-r--r--src/include/storage/pos.h64
-rw-r--r--src/include/storage/predicate.h4
-rw-r--r--src/include/storage/predicate_internals.h4
-rw-r--r--src/include/storage/proc.h32
-rw-r--r--src/include/storage/procarray.h45
-rw-r--r--src/include/storage/proclist.h208
-rw-r--r--src/include/storage/proclist_types.h45
-rw-r--r--src/include/storage/procsignal.h2
-rw-r--r--src/include/storage/reinit.h2
-rw-r--r--src/include/storage/relfilenode.h2
-rw-r--r--src/include/storage/s_lock.h29
-rw-r--r--src/include/storage/shm_mq.h2
-rw-r--r--src/include/storage/shm_toc.h2
-rw-r--r--src/include/storage/shmem.h4
-rw-r--r--src/include/storage/sinval.h5
-rw-r--r--src/include/storage/sinvaladt.h2
-rw-r--r--src/include/storage/smgr.h16
-rw-r--r--src/include/storage/spin.h6
-rw-r--r--src/include/storage/standby.h2
-rw-r--r--src/include/storage/standbydefs.h2
-rw-r--r--src/include/tcop/deparse_utility.h2
-rw-r--r--src/include/tcop/dest.h3
-rw-r--r--src/include/tcop/fastpath.h4
-rw-r--r--src/include/tcop/pquery.h4
-rw-r--r--src/include/tcop/tcopprot.h14
-rw-r--r--src/include/tcop/utility.h19
-rw-r--r--src/include/tsearch/dicts/regis.h2
-rw-r--r--src/include/tsearch/dicts/spell.h4
-rw-r--r--src/include/tsearch/ts_cache.h2
-rw-r--r--src/include/tsearch/ts_locale.h2
-rw-r--r--src/include/tsearch/ts_public.h2
-rw-r--r--src/include/tsearch/ts_type.h100
-rw-r--r--src/include/tsearch/ts_utils.h197
-rw-r--r--src/include/utils/.gitignore1
-rw-r--r--src/include/utils/acl.h37
-rw-r--r--src/include/utils/aclchk_internal.h2
-rw-r--r--src/include/utils/array.h63
-rw-r--r--src/include/utils/arrayaccess.h2
-rw-r--r--src/include/utils/ascii.h8
-rw-r--r--src/include/utils/attoptcache.h2
-rw-r--r--src/include/utils/backend_random.h19
-rw-r--r--src/include/utils/builtins.h1218
-rw-r--r--src/include/utils/bytea.h27
-rw-r--r--src/include/utils/cash.h48
-rw-r--r--src/include/utils/catcache.h11
-rw-r--r--src/include/utils/combocid.h2
-rw-r--r--src/include/utils/date.h145
-rw-r--r--src/include/utils/datetime.h15
-rw-r--r--src/include/utils/datum.h2
-rw-r--r--src/include/utils/dsa.h125
-rw-r--r--src/include/utils/dynahash.h2
-rw-r--r--src/include/utils/dynamic_loader.h2
-rw-r--r--src/include/utils/elog.h13
-rw-r--r--src/include/utils/evtcache.h2
-rw-r--r--src/include/utils/expandeddatum.h2
-rw-r--r--src/include/utils/fmgrtab.h2
-rw-r--r--src/include/utils/formatting.h14
-rw-r--r--src/include/utils/freepage.h99
-rw-r--r--src/include/utils/geo_decls.h264
-rw-r--r--src/include/utils/guc.h9
-rw-r--r--src/include/utils/guc_tables.h3
-rw-r--r--src/include/utils/help_config.h2
-rw-r--r--src/include/utils/hsearch.h2
-rw-r--r--src/include/utils/index_selfuncs.h20
-rw-r--r--src/include/utils/inet.h52
-rw-r--r--src/include/utils/int8.h106
-rw-r--r--src/include/utils/inval.h4
-rw-r--r--src/include/utils/json.h66
-rw-r--r--src/include/utils/jsonapi.h20
-rw-r--r--src/include/utils/jsonb.h111
-rw-r--r--src/include/utils/logtape.h10
-rw-r--r--src/include/utils/lsyscache.h38
-rw-r--r--src/include/utils/memdebug.h50
-rw-r--r--src/include/utils/memutils.h83
-rw-r--r--src/include/utils/nabstime.h65
-rw-r--r--src/include/utils/numeric.h2
-rw-r--r--src/include/utils/palloc.h4
-rw-r--r--src/include/utils/pg_crc.h2
-rw-r--r--src/include/utils/pg_locale.h37
-rw-r--r--src/include/utils/pg_lsn.h18
-rw-r--r--src/include/utils/pg_rusage.h2
-rw-r--r--src/include/utils/plancache.h21
-rw-r--r--src/include/utils/portal.h9
-rw-r--r--src/include/utils/queryenvironment.h74
-rw-r--r--src/include/utils/rangetypes.h82
-rw-r--r--src/include/utils/regproc.h28
-rw-r--r--src/include/utils/rel.h105
-rw-r--r--src/include/utils/relcache.h9
-rw-r--r--src/include/utils/relfilenodemap.h2
-rw-r--r--src/include/utils/relmapper.h2
-rw-r--r--src/include/utils/relptr.h77
-rw-r--r--src/include/utils/reltrigger.h9
-rw-r--r--src/include/utils/resowner.h2
-rw-r--r--src/include/utils/resowner_private.h2
-rw-r--r--src/include/utils/rls.h2
-rw-r--r--src/include/utils/ruleutils.h4
-rw-r--r--src/include/utils/sampling.h2
-rw-r--r--src/include/utils/selfuncs.h36
-rw-r--r--src/include/utils/snapmgr.h15
-rw-r--r--src/include/utils/snapshot.h5
-rw-r--r--src/include/utils/sortsupport.h2
-rw-r--r--src/include/utils/spccache.h2
-rw-r--r--src/include/utils/syscache.h17
-rw-r--r--src/include/utils/timeout.h2
-rw-r--r--src/include/utils/timestamp.h175
-rw-r--r--src/include/utils/tqual.h2
-rw-r--r--src/include/utils/tuplesort.h14
-rw-r--r--src/include/utils/tuplestore.h4
-rw-r--r--src/include/utils/typcache.h7
-rw-r--r--src/include/utils/tzparser.h2
-rw-r--r--src/include/utils/uuid.h10
-rw-r--r--src/include/utils/varbit.h48
-rw-r--r--src/include/utils/varlena.h37
-rw-r--r--src/include/utils/xml.h42
-rw-r--r--src/include/windowapi.h2
594 files changed, 20110 insertions, 6578 deletions
diff --git a/src/include/Makefile b/src/include/Makefile
index e4f1fc38bf..6afa3cfe25 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -45,6 +45,7 @@ install: all installdirs
$(INSTALL_DATA) pg_config_os.h '$(DESTDIR)$(includedir_server)'
$(INSTALL_DATA) utils/errcodes.h '$(DESTDIR)$(includedir_server)/utils'
$(INSTALL_DATA) utils/fmgroids.h '$(DESTDIR)$(includedir_server)/utils'
+ $(INSTALL_DATA) utils/fmgrprotos.h '$(DESTDIR)$(includedir_server)/utils'
# We don't use INSTALL_DATA for performance reasons --- there are a lot of files
cp $(srcdir)/*.h '$(DESTDIR)$(includedir_server)'/ || exit; \
chmod $(INSTALL_DATA_MODE) '$(DESTDIR)$(includedir_server)'/*.h || exit; \
@@ -72,7 +73,7 @@ uninstall:
clean:
- rm -f utils/fmgroids.h utils/errcodes.h parser/gram.h utils/probes.h catalog/schemapg.h
+ rm -f utils/fmgroids.h utils/fmgrprotos.h utils/errcodes.h parser/gram.h utils/probes.h catalog/schemapg.h
distclean maintainer-clean: clean
rm -f pg_config.h pg_config_ext.h pg_config_os.h dynloader.h stamp-h stamp-ext-h
diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h
index 1036cca99c..f919cf8b87 100644
--- a/src/include/access/amapi.h
+++ b/src/include/access/amapi.h
@@ -3,7 +3,7 @@
* amapi.h
* API for Postgres index access methods.
*
- * Copyright (c) 2015-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2015-2017, PostgreSQL Global Development Group
*
* src/include/access/amapi.h
*
@@ -72,7 +72,8 @@ typedef bool (*aminsert_function) (Relation indexRelation,
bool *isnull,
ItemPointer heap_tid,
Relation heapRelation,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
/* bulk delete */
typedef IndexBulkDeleteResult *(*ambulkdelete_function) (IndexVacuumInfo *info,
@@ -94,7 +95,8 @@ typedef void (*amcostestimate_function) (struct PlannerInfo *root,
Cost *indexStartupCost,
Cost *indexTotalCost,
Selectivity *indexSelectivity,
- double *indexCorrelation);
+ double *indexCorrelation,
+ double *indexPages);
/* parse index reloptions */
typedef bytea *(*amoptions_function) (Datum reloptions,
@@ -137,6 +139,18 @@ typedef void (*ammarkpos_function) (IndexScanDesc scan);
/* restore marked scan position */
typedef void (*amrestrpos_function) (IndexScanDesc scan);
+/*
+ * Callback function signatures - for parallel index scans.
+ */
+
+/* estimate size of parallel scan descriptor */
+typedef Size (*amestimateparallelscan_function) (void);
+
+/* prepare for parallel index scan */
+typedef void (*aminitparallelscan_function) (void *target);
+
+/* (re)start parallel index scan */
+typedef void (*amparallelrescan_function) (IndexScanDesc scan);
/*
* API struct for an index AM. Note this must be stored in a single palloc'd
@@ -175,6 +189,8 @@ typedef struct IndexAmRoutine
bool amclusterable;
/* does AM handle predicate locks? */
bool ampredlocks;
+ /* does AM support parallel scan? */
+ bool amcanparallel;
/* type of data stored in index, or InvalidOid if variable */
Oid amkeytype;
@@ -196,6 +212,11 @@ typedef struct IndexAmRoutine
amendscan_function amendscan;
ammarkpos_function ammarkpos; /* can be NULL */
amrestrpos_function amrestrpos; /* can be NULL */
+
+ /* interface functions to support parallel index scans */
+ amestimateparallelscan_function amestimateparallelscan; /* can be NULL */
+ aminitparallelscan_function aminitparallelscan; /* can be NULL */
+ amparallelrescan_function amparallelrescan; /* can be NULL */
} IndexAmRoutine;
@@ -203,6 +224,4 @@ typedef struct IndexAmRoutine
extern IndexAmRoutine *GetIndexAmRoutine(Oid amhandler);
extern IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid, bool noerror);
-extern Datum amvalidate(PG_FUNCTION_ARGS);
-
#endif /* AMAPI_H */
diff --git a/src/include/access/amvalidate.h b/src/include/access/amvalidate.h
index 7f4289a996..742c25a78d 100644
--- a/src/include/access/amvalidate.h
+++ b/src/include/access/amvalidate.h
@@ -3,7 +3,7 @@
* amvalidate.h
* Support routines for index access methods' amvalidate functions.
*
- * Copyright (c) 2016, PostgreSQL Global Development Group
+ * Copyright (c) 2016-2017, PostgreSQL Global Development Group
*
* src/include/access/amvalidate.h
*
diff --git a/src/include/access/attnum.h b/src/include/access/attnum.h
index 849634c145..7fa459fc8c 100644
--- a/src/include/access/attnum.h
+++ b/src/include/access/attnum.h
@@ -4,7 +4,7 @@
* POSTGRES attribute number definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/attnum.h
diff --git a/src/include/access/brin.h b/src/include/access/brin.h
index 99bf5330bb..45d55a9733 100644
--- a/src/include/access/brin.h
+++ b/src/include/access/brin.h
@@ -1,7 +1,7 @@
/*
* AM-callable functions for BRIN indexes
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
@@ -16,24 +16,37 @@
/*
- * prototypes for functions in brin.c (external entry points for BRIN)
- */
-extern Datum brinhandler(PG_FUNCTION_ARGS);
-extern Datum brin_summarize_new_values(PG_FUNCTION_ARGS);
-
-/*
* Storage type for BRIN's reloptions
*/
typedef struct BrinOptions
{
int32 vl_len_; /* varlena header (do not touch directly!) */
BlockNumber pagesPerRange;
+ bool autosummarize;
} BrinOptions;
+
+/*
+ * BrinStatsData represents stats data for planner use
+ */
+typedef struct BrinStatsData
+{
+ BlockNumber pagesPerRange;
+ BlockNumber revmapNumPages;
+} BrinStatsData;
+
+
#define BRIN_DEFAULT_PAGES_PER_RANGE 128
#define BrinGetPagesPerRange(relation) \
((relation)->rd_options ? \
((BrinOptions *) (relation)->rd_options)->pagesPerRange : \
BRIN_DEFAULT_PAGES_PER_RANGE)
+#define BrinGetAutoSummarize(relation) \
+ ((relation)->rd_options ? \
+ ((BrinOptions *) (relation)->rd_options)->autosummarize : \
+ false)
+
+
+extern void brinGetStats(Relation index, BrinStatsData *stats);
#endif /* BRIN_H */
diff --git a/src/include/access/brin_internal.h b/src/include/access/brin_internal.h
index 47317af43c..abe887788b 100644
--- a/src/include/access/brin_internal.h
+++ b/src/include/access/brin_internal.h
@@ -2,7 +2,7 @@
* brin_internal.h
* internal declarations for BRIN indexes
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
@@ -89,7 +89,8 @@ extern IndexBuildResult *brinbuild(Relation heap, Relation index,
extern void brinbuildempty(Relation index);
extern bool brininsert(Relation idxRel, Datum *values, bool *nulls,
ItemPointer heaptid, Relation heapRel,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
extern IndexScanDesc brinbeginscan(Relation r, int nkeys, int norderbys);
extern int64 bringetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
extern void brinrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
diff --git a/src/include/access/brin_page.h b/src/include/access/brin_page.h
index b48f8f5597..e2b3b92fac 100644
--- a/src/include/access/brin_page.h
+++ b/src/include/access/brin_page.h
@@ -2,7 +2,7 @@
* brin_page.h
* Prototypes and definitions for BRIN page layouts
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
diff --git a/src/include/access/brin_pageops.h b/src/include/access/brin_pageops.h
index af86cc86e7..ab38093a23 100644
--- a/src/include/access/brin_pageops.h
+++ b/src/include/access/brin_pageops.h
@@ -2,7 +2,7 @@
* brin_pageops.h
* Prototypes for operating on BRIN pages.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
diff --git a/src/include/access/brin_revmap.h b/src/include/access/brin_revmap.h
index 89054e0128..7fdcf877f4 100644
--- a/src/include/access/brin_revmap.h
+++ b/src/include/access/brin_revmap.h
@@ -2,7 +2,7 @@
* brin_revmap.h
* Prototypes for BRIN reverse range maps
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
@@ -36,5 +36,6 @@ extern void brinSetHeapBlockItemptr(Buffer rmbuf, BlockNumber pagesPerRange,
extern BrinTuple *brinGetTupleForHeapBlock(BrinRevmap *revmap,
BlockNumber heapBlk, Buffer *buf, OffsetNumber *off,
Size *size, int mode, Snapshot snapshot);
+extern bool brinRevmapDesummarizeRange(Relation idxrel, BlockNumber heapBlk);
#endif /* BRIN_REVMAP_H */
diff --git a/src/include/access/brin_tuple.h b/src/include/access/brin_tuple.h
index 2af05123aa..3f4a7b6d3c 100644
--- a/src/include/access/brin_tuple.h
+++ b/src/include/access/brin_tuple.h
@@ -2,7 +2,7 @@
* brin_tuple.h
* Declarations for dealing with BRIN-specific tuples.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
@@ -38,6 +38,11 @@ typedef struct BrinMemTuple
bool bt_placeholder; /* this is a placeholder tuple */
BlockNumber bt_blkno; /* heap blkno that the tuple is for */
MemoryContext bt_context; /* memcxt holding the bt_columns values */
+ /* output arrays for brin_deform_tuple: */
+ Datum *bt_values; /* values array */
+ bool *bt_allnulls; /* allnulls array */
+ bool *bt_hasnulls; /* hasnulls array */
+ /* not an output array, but must be last */
BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER];
} BrinMemTuple;
@@ -83,14 +88,15 @@ extern BrinTuple *brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno,
extern BrinTuple *brin_form_placeholder_tuple(BrinDesc *brdesc,
BlockNumber blkno, Size *size);
extern void brin_free_tuple(BrinTuple *tuple);
-extern BrinTuple *brin_copy_tuple(BrinTuple *tuple, Size len);
+extern BrinTuple *brin_copy_tuple(BrinTuple *tuple, Size len,
+ BrinTuple *dest, Size *destsz);
extern bool brin_tuples_equal(const BrinTuple *a, Size alen,
const BrinTuple *b, Size blen);
extern BrinMemTuple *brin_new_memtuple(BrinDesc *brdesc);
-extern void brin_memtuple_initialize(BrinMemTuple *dtuple,
+extern BrinMemTuple *brin_memtuple_initialize(BrinMemTuple *dtuple,
BrinDesc *brdesc);
extern BrinMemTuple *brin_deform_tuple(BrinDesc *brdesc,
- BrinTuple *tuple);
+ BrinTuple *tuple, BrinMemTuple *dMemtuple);
#endif /* BRIN_TUPLE_H */
diff --git a/src/include/access/brin_xlog.h b/src/include/access/brin_xlog.h
index f6148053b4..38e6dcccf2 100644
--- a/src/include/access/brin_xlog.h
+++ b/src/include/access/brin_xlog.h
@@ -4,7 +4,7 @@
* POSTGRES BRIN access XLOG definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/brin_xlog.h
@@ -33,7 +33,7 @@
#define XLOG_BRIN_UPDATE 0x20
#define XLOG_BRIN_SAMEPAGE_UPDATE 0x30
#define XLOG_BRIN_REVMAP_EXTEND 0x40
-#define XLOG_BRIN_REVMAP_VACUUM 0x50
+#define XLOG_BRIN_DESUMMARIZE 0x50
#define XLOG_BRIN_OPMASK 0x70
/*
@@ -124,9 +124,28 @@ typedef struct xl_brin_revmap_extend
#define SizeOfBrinRevmapExtend (offsetof(xl_brin_revmap_extend, targetBlk) + \
sizeof(BlockNumber))
+/*
+ * This is what we need to know about a range de-summarization
+ *
+ * Backup block 0: revmap page
+ * Backup block 1: regular page
+ */
+typedef struct xl_brin_desummarize
+{
+ BlockNumber pagesPerRange;
+ /* page number location to set to invalid */
+ BlockNumber heapBlk;
+ /* offset of item to delete in regular index page */
+ OffsetNumber regOffset;
+} xl_brin_desummarize;
+
+#define SizeOfBrinDesummarize (offsetof(xl_brin_desummarize, regOffset) + \
+ sizeof(OffsetNumber))
+
extern void brin_redo(XLogReaderState *record);
extern void brin_desc(StringInfo buf, XLogReaderState *record);
extern const char *brin_identify(uint8 info);
+extern void brin_mask(char *pagedata, BlockNumber blkno);
#endif /* BRIN_XLOG_H */
diff --git a/src/include/access/bufmask.h b/src/include/access/bufmask.h
new file mode 100644
index 0000000000..95c6c3ae02
--- /dev/null
+++ b/src/include/access/bufmask.h
@@ -0,0 +1,32 @@
+/*-------------------------------------------------------------------------
+ *
+ * bufmask.h
+ * Definitions for buffer masking routines, used to mask certain bits
+ * in a page which can be different when the WAL is generated
+ * and when the WAL is applied. This is really the job of each
+ * individual rmgr, but we make things easier by providing some
+ * common routines to handle cases which occur in multiple rmgrs.
+ *
+ * Portions Copyright (c) 2016-2017, PostgreSQL Global Development Group
+ *
+ * src/include/access/bufmask.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef BUFMASK_H
+#define BUFMASK_H
+
+#include "storage/block.h"
+#include "storage/bufmgr.h"
+
+/* Marker used to mask pages consistently */
+#define MASK_MARKER 0
+
+extern void mask_page_lsn(Page page);
+extern void mask_page_hint_bits(Page page);
+extern void mask_unused_space(Page page);
+extern void mask_lp_flags(Page page);
+extern void mask_page_content(Page page);
+
+#endif
diff --git a/src/include/access/clog.h b/src/include/access/clog.h
index 06c069ae3a..5ac7cdd618 100644
--- a/src/include/access/clog.h
+++ b/src/include/access/clog.h
@@ -3,7 +3,7 @@
*
* PostgreSQL transaction-commit-log manager
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/clog.h
@@ -28,6 +28,12 @@ typedef int XidStatus;
#define TRANSACTION_STATUS_ABORTED 0x02
#define TRANSACTION_STATUS_SUB_COMMITTED 0x03
+typedef struct xl_clog_truncate
+{
+ int pageno;
+ TransactionId oldestXact;
+ Oid oldestXactDb;
+} xl_clog_truncate;
extern void TransactionIdSetTreeStatus(TransactionId xid, int nsubxids,
TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
@@ -42,7 +48,7 @@ extern void TrimCLOG(void);
extern void ShutdownCLOG(void);
extern void CheckPointCLOG(void);
extern void ExtendCLOG(TransactionId newestXact);
-extern void TruncateCLOG(TransactionId oldestXact);
+extern void TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid);
/* XLOG stuff */
#define CLOG_ZEROPAGE 0x00
diff --git a/src/include/access/commit_ts.h b/src/include/access/commit_ts.h
index cf343ca8ea..f172c91d8f 100644
--- a/src/include/access/commit_ts.h
+++ b/src/include/access/commit_ts.h
@@ -3,7 +3,7 @@
*
* PostgreSQL commit timestamp manager
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/commit_ts.h
@@ -61,6 +61,14 @@ typedef struct xl_commit_ts_set
#define SizeOfCommitTsSet (offsetof(xl_commit_ts_set, mainxid) + \
sizeof(TransactionId))
+typedef struct xl_commit_ts_truncate
+{
+ int pageno;
+ TransactionId oldestXid;
+} xl_commit_ts_truncate;
+
+#define SizeOfCommitTsTruncate (offsetof(xl_commit_ts_truncate, oldestXid) + \
+ sizeof(TransactionId))
extern void commit_ts_redo(XLogReaderState *record);
extern void commit_ts_desc(StringInfo buf, XLogReaderState *record);
diff --git a/src/include/access/genam.h b/src/include/access/genam.h
index 81907d5566..f467b18a9c 100644
--- a/src/include/access/genam.h
+++ b/src/include/access/genam.h
@@ -4,7 +4,7 @@
* POSTGRES generalized index access method definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/genam.h
@@ -21,6 +21,9 @@
#include "utils/relcache.h"
#include "utils/snapshot.h"
+/* We don't want this file to depend on execnodes.h. */
+struct IndexInfo;
+
/*
* Struct for statistics returned by ambuild
*/
@@ -83,6 +86,8 @@ typedef bool (*IndexBulkDeleteCallback) (ItemPointer itemptr, void *state);
typedef struct IndexScanDescData *IndexScanDesc;
typedef struct SysScanDescData *SysScanDesc;
+typedef struct ParallelIndexScanDescData *ParallelIndexScanDesc;
+
/*
* Enumeration specifying the type of uniqueness check to perform in
* index_insert().
@@ -129,7 +134,8 @@ extern bool index_insert(Relation indexRelation,
Datum *values, bool *isnull,
ItemPointer heap_t_ctid,
Relation heapRelation,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
extern IndexScanDesc index_beginscan(Relation heapRelation,
Relation indexRelation,
@@ -144,6 +150,13 @@ extern void index_rescan(IndexScanDesc scan,
extern void index_endscan(IndexScanDesc scan);
extern void index_markpos(IndexScanDesc scan);
extern void index_restrpos(IndexScanDesc scan);
+extern Size index_parallelscan_estimate(Relation indexrel, Snapshot snapshot);
+extern void index_parallelscan_initialize(Relation heaprel, Relation indexrel,
+ Snapshot snapshot, ParallelIndexScanDesc target);
+extern void index_parallelrescan(IndexScanDesc scan);
+extern IndexScanDesc index_beginscan_parallel(Relation heaprel,
+ Relation indexrel, int nkeys, int norderbys,
+ ParallelIndexScanDesc pscan);
extern ItemPointer index_getnext_tid(IndexScanDesc scan,
ScanDirection direction);
extern HeapTuple index_fetch_heap(IndexScanDesc scan);
diff --git a/src/include/access/generic_xlog.h b/src/include/access/generic_xlog.h
index 63f2120633..0dc17f55f2 100644
--- a/src/include/access/generic_xlog.h
+++ b/src/include/access/generic_xlog.h
@@ -4,7 +4,7 @@
* Generic xlog API definition.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/generic_xlog.h
@@ -40,5 +40,6 @@ extern void GenericXLogAbort(GenericXLogState *state);
extern void generic_redo(XLogReaderState *record);
extern const char *generic_identify(uint8 info);
extern void generic_desc(StringInfo buf, XLogReaderState *record);
+extern void generic_mask(char *pagedata, BlockNumber blkno);
#endif /* GENERIC_XLOG_H */
diff --git a/src/include/access/gin.h b/src/include/access/gin.h
index e5b2e10a27..bd9e8833de 100644
--- a/src/include/access/gin.h
+++ b/src/include/access/gin.h
@@ -2,7 +2,7 @@
* gin.h
* Public header file for Generalized Inverted Index access method.
*
- * Copyright (c) 2006-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2006-2017, PostgreSQL Global Development Group
*
* src/include/access/gin.h
*--------------------------------------------------------------------------
@@ -73,11 +73,4 @@ extern int gin_pending_list_limit;
extern void ginGetStats(Relation index, GinStatsData *stats);
extern void ginUpdateStats(Relation index, const GinStatsData *stats);
-/* ginxlog.c */
-extern void gin_redo(XLogReaderState *record);
-extern void gin_desc(StringInfo buf, XLogReaderState *record);
-extern const char *gin_identify(uint8 info);
-extern void gin_xlog_startup(void);
-extern void gin_xlog_cleanup(void);
-
#endif /* GIN_H */
diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h
index 68cfe0c1ac..986fe6e041 100644
--- a/src/include/access/gin_private.h
+++ b/src/include/access/gin_private.h
@@ -2,7 +2,7 @@
* gin_private.h
* header file for postgres inverted index access method implementation.
*
- * Copyright (c) 2006-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2006-2017, PostgreSQL Global Development Group
*
* src/include/access/gin_private.h
*--------------------------------------------------------------------------
@@ -12,309 +12,12 @@
#include "access/amapi.h"
#include "access/gin.h"
+#include "access/ginblock.h"
#include "access/itup.h"
#include "fmgr.h"
#include "storage/bufmgr.h"
#include "lib/rbtree.h"
-
-/*
- * Page opaque data in an inverted index page.
- *
- * Note: GIN does not include a page ID word as do the other index types.
- * This is OK because the opaque data is only 8 bytes and so can be reliably
- * distinguished by size. Revisit this if the size ever increases.
- * Further note: as of 9.2, SP-GiST also uses 8-byte special space, as does
- * BRIN as of 9.5. This is still OK, as long as GIN isn't using all of the
- * high-order bits in its flags word, because that way the flags word cannot
- * match the page IDs used by SP-GiST and BRIN.
- */
-typedef struct GinPageOpaqueData
-{
- BlockNumber rightlink; /* next page if any */
- OffsetNumber maxoff; /* number of PostingItems on GIN_DATA &
- * ~GIN_LEAF page. On GIN_LIST page, number of
- * heap tuples. */
- uint16 flags; /* see bit definitions below */
-} GinPageOpaqueData;
-
-typedef GinPageOpaqueData *GinPageOpaque;
-
-#define GIN_DATA (1 << 0)
-#define GIN_LEAF (1 << 1)
-#define GIN_DELETED (1 << 2)
-#define GIN_META (1 << 3)
-#define GIN_LIST (1 << 4)
-#define GIN_LIST_FULLROW (1 << 5) /* makes sense only on GIN_LIST page */
-#define GIN_INCOMPLETE_SPLIT (1 << 6) /* page was split, but parent not
- * updated */
-#define GIN_COMPRESSED (1 << 7)
-
-/* Page numbers of fixed-location pages */
-#define GIN_METAPAGE_BLKNO (0)
-#define GIN_ROOT_BLKNO (1)
-
-typedef struct GinMetaPageData
-{
- /*
- * Pointers to head and tail of pending list, which consists of GIN_LIST
- * pages. These store fast-inserted entries that haven't yet been moved
- * into the regular GIN structure.
- */
- BlockNumber head;
- BlockNumber tail;
-
- /*
- * Free space in bytes in the pending list's tail page.
- */
- uint32 tailFreeSize;
-
- /*
- * We store both number of pages and number of heap tuples that are in the
- * pending list.
- */
- BlockNumber nPendingPages;
- int64 nPendingHeapTuples;
-
- /*
- * Statistics for planner use (accurate as of last VACUUM)
- */
- BlockNumber nTotalPages;
- BlockNumber nEntryPages;
- BlockNumber nDataPages;
- int64 nEntries;
-
- /*
- * GIN version number (ideally this should have been at the front, but too
- * late now. Don't move it!)
- *
- * Currently 2 (for indexes initialized in 9.4 or later)
- *
- * Version 1 (indexes initialized in version 9.1, 9.2 or 9.3), is
- * compatible, but may contain uncompressed posting tree (leaf) pages and
- * posting lists. They will be converted to compressed format when
- * modified.
- *
- * Version 0 (indexes initialized in 9.0 or before) is compatible but may
- * be missing null entries, including both null keys and placeholders.
- * Reject full-index-scan attempts on such indexes.
- */
- int32 ginVersion;
-} GinMetaPageData;
-
-#define GIN_CURRENT_VERSION 2
-
-#define GinPageGetMeta(p) \
- ((GinMetaPageData *) PageGetContents(p))
-
-/*
- * Macros for accessing a GIN index page's opaque data
- */
-#define GinPageGetOpaque(page) ( (GinPageOpaque) PageGetSpecialPointer(page) )
-
-#define GinPageIsLeaf(page) ( (GinPageGetOpaque(page)->flags & GIN_LEAF) != 0 )
-#define GinPageSetLeaf(page) ( GinPageGetOpaque(page)->flags |= GIN_LEAF )
-#define GinPageSetNonLeaf(page) ( GinPageGetOpaque(page)->flags &= ~GIN_LEAF )
-#define GinPageIsData(page) ( (GinPageGetOpaque(page)->flags & GIN_DATA) != 0 )
-#define GinPageSetData(page) ( GinPageGetOpaque(page)->flags |= GIN_DATA )
-#define GinPageIsList(page) ( (GinPageGetOpaque(page)->flags & GIN_LIST) != 0 )
-#define GinPageSetList(page) ( GinPageGetOpaque(page)->flags |= GIN_LIST )
-#define GinPageHasFullRow(page) ( (GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW) != 0 )
-#define GinPageSetFullRow(page) ( GinPageGetOpaque(page)->flags |= GIN_LIST_FULLROW )
-#define GinPageIsCompressed(page) ( (GinPageGetOpaque(page)->flags & GIN_COMPRESSED) != 0 )
-#define GinPageSetCompressed(page) ( GinPageGetOpaque(page)->flags |= GIN_COMPRESSED )
-
-#define GinPageIsDeleted(page) ( (GinPageGetOpaque(page)->flags & GIN_DELETED) != 0 )
-#define GinPageSetDeleted(page) ( GinPageGetOpaque(page)->flags |= GIN_DELETED)
-#define GinPageSetNonDeleted(page) ( GinPageGetOpaque(page)->flags &= ~GIN_DELETED)
-#define GinPageIsIncompleteSplit(page) ( (GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT) != 0 )
-
-#define GinPageRightMost(page) ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber)
-
-/*
- * We use our own ItemPointerGet(BlockNumber|OffsetNumber)
- * to avoid Asserts, since sometimes the ip_posid isn't "valid"
- */
-#define GinItemPointerGetBlockNumber(pointer) \
- BlockIdGetBlockNumber(&(pointer)->ip_blkid)
-
-#define GinItemPointerGetOffsetNumber(pointer) \
- ((pointer)->ip_posid)
-
-/*
- * Special-case item pointer values needed by the GIN search logic.
- * MIN: sorts less than any valid item pointer
- * MAX: sorts greater than any valid item pointer
- * LOSSY PAGE: indicates a whole heap page, sorts after normal item
- * pointers for that page
- * Note that these are all distinguishable from an "invalid" item pointer
- * (which is InvalidBlockNumber/0) as well as from all normal item
- * pointers (which have item numbers in the range 1..MaxHeapTuplesPerPage).
- */
-#define ItemPointerSetMin(p) \
- ItemPointerSet((p), (BlockNumber)0, (OffsetNumber)0)
-#define ItemPointerIsMin(p) \
- (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0 && \
- GinItemPointerGetBlockNumber(p) == (BlockNumber)0)
-#define ItemPointerSetMax(p) \
- ItemPointerSet((p), InvalidBlockNumber, (OffsetNumber)0xffff)
-#define ItemPointerIsMax(p) \
- (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
- GinItemPointerGetBlockNumber(p) == InvalidBlockNumber)
-#define ItemPointerSetLossyPage(p, b) \
- ItemPointerSet((p), (b), (OffsetNumber)0xffff)
-#define ItemPointerIsLossyPage(p) \
- (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
- GinItemPointerGetBlockNumber(p) != InvalidBlockNumber)
-
-/*
- * Posting item in a non-leaf posting-tree page
- */
-typedef struct
-{
- /* We use BlockIdData not BlockNumber to avoid padding space wastage */
- BlockIdData child_blkno;
- ItemPointerData key;
-} PostingItem;
-
-#define PostingItemGetBlockNumber(pointer) \
- BlockIdGetBlockNumber(&(pointer)->child_blkno)
-
-#define PostingItemSetBlockNumber(pointer, blockNumber) \
- BlockIdSet(&((pointer)->child_blkno), (blockNumber))
-
-/*
- * Category codes to distinguish placeholder nulls from ordinary NULL keys.
- * Note that the datatype size and the first two code values are chosen to be
- * compatible with the usual usage of bool isNull flags.
- *
- * GIN_CAT_EMPTY_QUERY is never stored in the index; and notice that it is
- * chosen to sort before not after regular key values.
- */
-typedef signed char GinNullCategory;
-
-#define GIN_CAT_NORM_KEY 0 /* normal, non-null key value */
-#define GIN_CAT_NULL_KEY 1 /* null key value */
-#define GIN_CAT_EMPTY_ITEM 2 /* placeholder for zero-key item */
-#define GIN_CAT_NULL_ITEM 3 /* placeholder for null item */
-#define GIN_CAT_EMPTY_QUERY (-1) /* placeholder for full-scan query */
-
-/*
- * Access macros for null category byte in entry tuples
- */
-#define GinCategoryOffset(itup,ginstate) \
- (IndexInfoFindDataOffset((itup)->t_info) + \
- ((ginstate)->oneCol ? 0 : sizeof(int16)))
-#define GinGetNullCategory(itup,ginstate) \
- (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))))
-#define GinSetNullCategory(itup,ginstate,c) \
- (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))) = (c))
-
-/*
- * Access macros for leaf-page entry tuples (see discussion in README)
- */
-#define GinGetNPosting(itup) GinItemPointerGetOffsetNumber(&(itup)->t_tid)
-#define GinSetNPosting(itup,n) ItemPointerSetOffsetNumber(&(itup)->t_tid,n)
-#define GIN_TREE_POSTING ((OffsetNumber)0xffff)
-#define GinIsPostingTree(itup) (GinGetNPosting(itup) == GIN_TREE_POSTING)
-#define GinSetPostingTree(itup, blkno) ( GinSetNPosting((itup),GIN_TREE_POSTING), ItemPointerSetBlockNumber(&(itup)->t_tid, blkno) )
-#define GinGetPostingTree(itup) GinItemPointerGetBlockNumber(&(itup)->t_tid)
-
-#define GIN_ITUP_COMPRESSED (1U << 31)
-#define GinGetPostingOffset(itup) (GinItemPointerGetBlockNumber(&(itup)->t_tid) & (~GIN_ITUP_COMPRESSED))
-#define GinSetPostingOffset(itup,n) ItemPointerSetBlockNumber(&(itup)->t_tid,(n)|GIN_ITUP_COMPRESSED)
-#define GinGetPosting(itup) ((Pointer) ((char*)(itup) + GinGetPostingOffset(itup)))
-#define GinItupIsCompressed(itup) ((GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED) != 0)
-
-/*
- * Maximum size of an item on entry tree page. Make sure that we fit at least
- * three items on each page. (On regular B-tree indexes, we must fit at least
- * three items: two data items and the "high key". In GIN entry tree, we don't
- * currently store the high key explicitly, we just use the rightmost item on
- * the page, so it would actually be enough to fit two items.)
- */
-#define GinMaxItemSize \
- Min(INDEX_SIZE_MASK, \
- MAXALIGN_DOWN(((BLCKSZ - \
- MAXALIGN(SizeOfPageHeaderData + 3 * sizeof(ItemIdData)) - \
- MAXALIGN(sizeof(GinPageOpaqueData))) / 3)))
-
-/*
- * Access macros for non-leaf entry tuples
- */
-#define GinGetDownlink(itup) GinItemPointerGetBlockNumber(&(itup)->t_tid)
-#define GinSetDownlink(itup,blkno) ItemPointerSet(&(itup)->t_tid, blkno, InvalidOffsetNumber)
-
-
-/*
- * Data (posting tree) pages
- *
- * Posting tree pages don't store regular tuples. Non-leaf pages contain
- * PostingItems, which are pairs of ItemPointers and child block numbers.
- * Leaf pages contain GinPostingLists and an uncompressed array of item
- * pointers.
- *
- * In a leaf page, the compressed posting lists are stored after the regular
- * page header, one after each other. Although we don't store regular tuples,
- * pd_lower is used to indicate the end of the posting lists. After that, free
- * space follows. This layout is compatible with the "standard" heap and
- * index page layout described in bufpage.h, so that we can e.g set buffer_std
- * when writing WAL records.
- *
- * In the special space is the GinPageOpaque struct.
- */
-#define GinDataLeafPageGetPostingList(page) \
- (GinPostingList *) ((PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData))))
-#define GinDataLeafPageGetPostingListSize(page) \
- (((PageHeader) page)->pd_lower - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(ItemPointerData)))
-
-#define GinDataLeafPageIsEmpty(page) \
- (GinPageIsCompressed(page) ? (GinDataLeafPageGetPostingListSize(page) == 0) : (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber))
-
-#define GinDataLeafPageGetFreeSpace(page) PageGetExactFreeSpace(page)
-
-#define GinDataPageGetRightBound(page) ((ItemPointer) PageGetContents(page))
-/*
- * Pointer to the data portion of a posting tree page. For internal pages,
- * that's the beginning of the array of PostingItems. For compressed leaf
- * pages, the first compressed posting list. For uncompressed (pre-9.4) leaf
- * pages, it's the beginning of the ItemPointer array.
- */
-#define GinDataPageGetData(page) \
- (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))
-/* non-leaf pages contain PostingItems */
-#define GinDataPageGetPostingItem(page, i) \
- ((PostingItem *) (GinDataPageGetData(page) + ((i)-1) * sizeof(PostingItem)))
-
-/*
- * Note: there is no GinDataPageGetDataSize macro, because before version
- * 9.4, we didn't set pd_lower on data pages. There can be pages in the index
- * that were binary-upgraded from earlier versions and still have an invalid
- * pd_lower, so we cannot trust it in general. Compressed posting tree leaf
- * pages are new in 9.4, however, so we can trust them; see
- * GinDataLeafPageGetPostingListSize.
- */
-#define GinDataPageSetDataSize(page, size) \
- { \
- Assert(size <= GinDataPageMaxDataSize); \
- ((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \
- }
-
-#define GinNonLeafDataPageGetFreeSpace(page) \
- (GinDataPageMaxDataSize - \
- GinPageGetOpaque(page)->maxoff * sizeof(PostingItem))
-
-#define GinDataPageMaxDataSize \
- (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
- - MAXALIGN(sizeof(ItemPointerData)) \
- - MAXALIGN(sizeof(GinPageOpaqueData)))
-
-/*
- * List pages
- */
-#define GinListPageSize \
- ( BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(GinPageOpaqueData)) )
-
/*
* Storage type for GIN's reloptions
*/
@@ -380,218 +83,7 @@ typedef struct GinState
} GinState;
-/*
- * A compressed posting list.
- *
- * Note: This requires 2-byte alignment.
- */
-typedef struct
-{
- ItemPointerData first; /* first item in this posting list (unpacked) */
- uint16 nbytes; /* number of bytes that follow */
- unsigned char bytes[FLEXIBLE_ARRAY_MEMBER]; /* varbyte encoded items */
-} GinPostingList;
-
-#define SizeOfGinPostingList(plist) (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )
-#define GinNextPostingListSegment(cur) ((GinPostingList *) (((char *) (cur)) + SizeOfGinPostingList((cur))))
-
-
-/* XLog stuff */
-
-#define XLOG_GIN_CREATE_INDEX 0x00
-
-#define XLOG_GIN_CREATE_PTREE 0x10
-
-typedef struct ginxlogCreatePostingTree
-{
- uint32 size;
- /* A compressed posting list follows */
-} ginxlogCreatePostingTree;
-
-/*
- * The format of the insertion record varies depending on the page type.
- * ginxlogInsert is the common part between all variants.
- *
- * Backup Blk 0: target page
- * Backup Blk 1: left child, if this insertion finishes an incomplete split
- */
-
-#define XLOG_GIN_INSERT 0x20
-
-typedef struct
-{
- uint16 flags; /* GIN_INSERT_ISLEAF and/or GIN_INSERT_ISDATA */
-
- /*
- * FOLLOWS:
- *
- * 1. if not leaf page, block numbers of the left and right child pages
- * whose split this insertion finishes, as BlockIdData[2] (beware of
- * adding fields in this struct that would make them not 16-bit aligned)
- *
- * 2. a ginxlogInsertEntry or ginxlogRecompressDataLeaf struct, depending
- * on tree type.
- *
- * NB: the below structs are only 16-bit aligned when appended to a
- * ginxlogInsert struct! Beware of adding fields to them that require
- * stricter alignment.
- */
-} ginxlogInsert;
-
-typedef struct
-{
- OffsetNumber offset;
- bool isDelete;
- IndexTupleData tuple; /* variable length */
-} ginxlogInsertEntry;
-
-
-typedef struct
-{
- uint16 nactions;
-
- /* Variable number of 'actions' follow */
-} ginxlogRecompressDataLeaf;
-
-/*
- * Note: this struct is currently not used in code, and only acts as
- * documentation. The WAL record format is as specified here, but the code
- * uses straight access through a Pointer and memcpy to read/write these.
- */
-typedef struct
-{
- uint8 segno; /* segment this action applies to */
- char type; /* action type (see below) */
-
- /*
- * Action-specific data follows. For INSERT and REPLACE actions that is a
- * GinPostingList struct. For ADDITEMS, a uint16 for the number of items
- * added, followed by the items themselves as ItemPointers. DELETE actions
- * have no further data.
- */
-} ginxlogSegmentAction;
-
-/* Action types */
-#define GIN_SEGMENT_UNMODIFIED 0 /* no action (not used in WAL records) */
-#define GIN_SEGMENT_DELETE 1 /* a whole segment is removed */
-#define GIN_SEGMENT_INSERT 2 /* a whole segment is added */
-#define GIN_SEGMENT_REPLACE 3 /* a segment is replaced */
-#define GIN_SEGMENT_ADDITEMS 4 /* items are added to existing segment */
-
-typedef struct
-{
- OffsetNumber offset;
- PostingItem newitem;
-} ginxlogInsertDataInternal;
-
-/*
- * Backup Blk 0: new left page (= original page, if not root split)
- * Backup Blk 1: new right page
- * Backup Blk 2: original page / new root page, if root split
- * Backup Blk 3: left child, if this insertion completes an earlier split
- */
-#define XLOG_GIN_SPLIT 0x30
-
-typedef struct ginxlogSplit
-{
- RelFileNode node;
- BlockNumber rrlink; /* right link, or root's blocknumber if root
- * split */
- BlockNumber leftChildBlkno; /* valid on a non-leaf split */
- BlockNumber rightChildBlkno;
- uint16 flags; /* see below */
-} ginxlogSplit;
-
-/*
- * Flags used in ginxlogInsert and ginxlogSplit records
- */
-#define GIN_INSERT_ISDATA 0x01 /* for both insert and split records */
-#define GIN_INSERT_ISLEAF 0x02 /* ditto */
-#define GIN_SPLIT_ROOT 0x04 /* only for split records */
-
-/*
- * Vacuum simply WAL-logs the whole page, when anything is modified. This
- * is functionally identical to heap_newpage records, but is kept separate for
- * debugging purposes. (When inspecting the WAL stream, it's easier to see
- * what's going on when GIN vacuum records are marked as such, not as heap
- * records.) This is currently only used for entry tree leaf pages.
- */
-#define XLOG_GIN_VACUUM_PAGE 0x40
-
-/*
- * Vacuuming posting tree leaf page is WAL-logged like recompression caused
- * by insertion.
- */
-#define XLOG_GIN_VACUUM_DATA_LEAF_PAGE 0x90
-
-typedef struct ginxlogVacuumDataLeafPage
-{
- ginxlogRecompressDataLeaf data;
-} ginxlogVacuumDataLeafPage;
-
-/*
- * Backup Blk 0: deleted page
- * Backup Blk 1: parent
- * Backup Blk 2: left sibling
- */
-#define XLOG_GIN_DELETE_PAGE 0x50
-
-typedef struct ginxlogDeletePage
-{
- OffsetNumber parentOffset;
- BlockNumber rightLink;
-} ginxlogDeletePage;
-
-#define XLOG_GIN_UPDATE_META_PAGE 0x60
-
-/*
- * Backup Blk 0: metapage
- * Backup Blk 1: tail page
- */
-typedef struct ginxlogUpdateMeta
-{
- RelFileNode node;
- GinMetaPageData metadata;
- BlockNumber prevTail;
- BlockNumber newRightlink;
- int32 ntuples; /* if ntuples > 0 then metadata.tail was
- * updated with that many tuples; else new sub
- * list was inserted */
- /* array of inserted tuples follows */
-} ginxlogUpdateMeta;
-
-#define XLOG_GIN_INSERT_LISTPAGE 0x70
-
-typedef struct ginxlogInsertListPage
-{
- BlockNumber rightlink;
- int32 ntuples;
- /* array of inserted tuples follows */
-} ginxlogInsertListPage;
-
-/*
- * Backup Blk 0: metapage
- * Backup Blk 1 to (ndeleted + 1): deleted pages
- */
-
-#define XLOG_GIN_DELETE_LISTPAGE 0x80
-
-/*
- * The WAL record for deleting list pages must contain a block reference to
- * all the deleted pages, so the number of pages that can be deleted in one
- * record is limited by XLR_MAX_BLOCK_ID. (block_id 0 is used for the
- * metapage.)
- */
-#define GIN_NDELETE_AT_ONCE Min(16, XLR_MAX_BLOCK_ID - 1)
-typedef struct ginxlogDeleteListPages
-{
- GinMetaPageData metadata;
- int32 ndeleted;
-} ginxlogDeleteListPages;
-
-
/* ginutil.c */
-extern Datum ginhandler(PG_FUNCTION_ARGS);
extern bytea *ginoptions(Datum reloptions, bool validate);
extern void initGinState(GinState *state, Relation index);
extern Buffer GinNewBuffer(Relation index);
@@ -618,7 +110,8 @@ extern IndexBuildResult *ginbuild(Relation heap, Relation index,
extern void ginbuildempty(Relation index);
extern bool gininsert(Relation index, Datum *values, bool *isnull,
ItemPointer ht_ctid, Relation heapRel,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
extern void ginEntryInsert(GinState *ginstate,
OffsetNumber attnum, Datum key, GinNullCategory category,
ItemPointerData *items, uint32 nitem,
@@ -788,7 +281,7 @@ typedef struct GinScanKeyData
int nadditional;
/* array of check flags, reported to consistentFn */
- bool *entryRes;
+ GinTernaryValue *entryRes;
bool (*boolConsistentFn) (GinScanKey key);
GinTernaryValue (*triConsistentFn) (GinScanKey key);
FmgrInfo *consistentFmgrInfo;
@@ -880,9 +373,6 @@ extern void ginFreeScanKeys(GinScanOpaque so);
/* ginget.c */
extern int64 gingetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
-/* ginfast.c */
-extern Datum gin_clean_pending_list(PG_FUNCTION_ARGS);
-
/* ginlogic.c */
extern void ginInitConsistentFunction(GinState *ginstate, GinScanKey key);
@@ -919,6 +409,7 @@ typedef struct
GinEntryAccumulator *entryallocator;
uint32 eas_used;
RBTree *tree;
+ RBTreeIterator tree_walk;
} BuildAccumulator;
extern void ginInitBA(BuildAccumulator *accum);
@@ -969,8 +460,8 @@ extern ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na,
static inline int
ginCompareItemPointers(ItemPointer a, ItemPointer b)
{
- uint64 ia = (uint64) a->ip_blkid.bi_hi << 32 | (uint64) a->ip_blkid.bi_lo << 16 | a->ip_posid;
- uint64 ib = (uint64) b->ip_blkid.bi_hi << 32 | (uint64) b->ip_blkid.bi_lo << 16 | b->ip_posid;
+ uint64 ia = (uint64) GinItemPointerGetBlockNumber(a) << 32 | GinItemPointerGetOffsetNumber(a);
+ uint64 ib = (uint64) GinItemPointerGetBlockNumber(b) << 32 | GinItemPointerGetOffsetNumber(b);
if (ia == ib)
return 0;
@@ -980,4 +471,6 @@ ginCompareItemPointers(ItemPointer a, ItemPointer b)
return -1;
}
+extern int ginTraverseLock(Buffer buffer, bool searchMode);
+
#endif /* GIN_PRIVATE_H */
diff --git a/src/include/access/ginblock.h b/src/include/access/ginblock.h
new file mode 100644
index 0000000000..438912c6a0
--- /dev/null
+++ b/src/include/access/ginblock.h
@@ -0,0 +1,336 @@
+/*--------------------------------------------------------------------------
+ * ginblock.h
+ * details of structures stored in GIN index blocks
+ *
+ * Copyright (c) 2006-2017, PostgreSQL Global Development Group
+ *
+ * src/include/access/ginblock.h
+ *--------------------------------------------------------------------------
+ */
+#ifndef GINBLOCK_H
+#define GINBLOCK_H
+
+#include "storage/block.h"
+#include "storage/itemptr.h"
+#include "storage/off.h"
+
+/*
+ * Page opaque data in an inverted index page.
+ *
+ * Note: GIN does not include a page ID word as do the other index types.
+ * This is OK because the opaque data is only 8 bytes and so can be reliably
+ * distinguished by size. Revisit this if the size ever increases.
+ * Further note: as of 9.2, SP-GiST also uses 8-byte special space, as does
+ * BRIN as of 9.5. This is still OK, as long as GIN isn't using all of the
+ * high-order bits in its flags word, because that way the flags word cannot
+ * match the page IDs used by SP-GiST and BRIN.
+ */
+typedef struct GinPageOpaqueData
+{
+ BlockNumber rightlink; /* next page if any */
+ OffsetNumber maxoff; /* number of PostingItems on GIN_DATA &
+ * ~GIN_LEAF page. On GIN_LIST page, number of
+ * heap tuples. */
+ uint16 flags; /* see bit definitions below */
+} GinPageOpaqueData;
+
+typedef GinPageOpaqueData *GinPageOpaque;
+
+#define GIN_DATA (1 << 0)
+#define GIN_LEAF (1 << 1)
+#define GIN_DELETED (1 << 2)
+#define GIN_META (1 << 3)
+#define GIN_LIST (1 << 4)
+#define GIN_LIST_FULLROW (1 << 5) /* makes sense only on GIN_LIST page */
+#define GIN_INCOMPLETE_SPLIT (1 << 6) /* page was split, but parent not
+ * updated */
+#define GIN_COMPRESSED (1 << 7)
+
+/* Page numbers of fixed-location pages */
+#define GIN_METAPAGE_BLKNO (0)
+#define GIN_ROOT_BLKNO (1)
+
+typedef struct GinMetaPageData
+{
+ /*
+ * Pointers to head and tail of pending list, which consists of GIN_LIST
+ * pages. These store fast-inserted entries that haven't yet been moved
+ * into the regular GIN structure.
+ */
+ BlockNumber head;
+ BlockNumber tail;
+
+ /*
+ * Free space in bytes in the pending list's tail page.
+ */
+ uint32 tailFreeSize;
+
+ /*
+ * We store both number of pages and number of heap tuples that are in the
+ * pending list.
+ */
+ BlockNumber nPendingPages;
+ int64 nPendingHeapTuples;
+
+ /*
+ * Statistics for planner use (accurate as of last VACUUM)
+ */
+ BlockNumber nTotalPages;
+ BlockNumber nEntryPages;
+ BlockNumber nDataPages;
+ int64 nEntries;
+
+ /*
+ * GIN version number (ideally this should have been at the front, but too
+ * late now. Don't move it!)
+ *
+ * Currently 2 (for indexes initialized in 9.4 or later)
+ *
+ * Version 1 (indexes initialized in version 9.1, 9.2 or 9.3), is
+ * compatible, but may contain uncompressed posting tree (leaf) pages and
+ * posting lists. They will be converted to compressed format when
+ * modified.
+ *
+ * Version 0 (indexes initialized in 9.0 or before) is compatible but may
+ * be missing null entries, including both null keys and placeholders.
+ * Reject full-index-scan attempts on such indexes.
+ */
+ int32 ginVersion;
+} GinMetaPageData;
+
+#define GIN_CURRENT_VERSION 2
+
+#define GinPageGetMeta(p) \
+ ((GinMetaPageData *) PageGetContents(p))
+
+/*
+ * Macros for accessing a GIN index page's opaque data
+ */
+#define GinPageGetOpaque(page) ( (GinPageOpaque) PageGetSpecialPointer(page) )
+
+#define GinPageIsLeaf(page) ( (GinPageGetOpaque(page)->flags & GIN_LEAF) != 0 )
+#define GinPageSetLeaf(page) ( GinPageGetOpaque(page)->flags |= GIN_LEAF )
+#define GinPageSetNonLeaf(page) ( GinPageGetOpaque(page)->flags &= ~GIN_LEAF )
+#define GinPageIsData(page) ( (GinPageGetOpaque(page)->flags & GIN_DATA) != 0 )
+#define GinPageSetData(page) ( GinPageGetOpaque(page)->flags |= GIN_DATA )
+#define GinPageIsList(page) ( (GinPageGetOpaque(page)->flags & GIN_LIST) != 0 )
+#define GinPageSetList(page) ( GinPageGetOpaque(page)->flags |= GIN_LIST )
+#define GinPageHasFullRow(page) ( (GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW) != 0 )
+#define GinPageSetFullRow(page) ( GinPageGetOpaque(page)->flags |= GIN_LIST_FULLROW )
+#define GinPageIsCompressed(page) ( (GinPageGetOpaque(page)->flags & GIN_COMPRESSED) != 0 )
+#define GinPageSetCompressed(page) ( GinPageGetOpaque(page)->flags |= GIN_COMPRESSED )
+
+#define GinPageIsDeleted(page) ( (GinPageGetOpaque(page)->flags & GIN_DELETED) != 0 )
+#define GinPageSetDeleted(page) ( GinPageGetOpaque(page)->flags |= GIN_DELETED)
+#define GinPageSetNonDeleted(page) ( GinPageGetOpaque(page)->flags &= ~GIN_DELETED)
+#define GinPageIsIncompleteSplit(page) ( (GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT) != 0 )
+
+#define GinPageRightMost(page) ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber)
+
+/*
+ * We use our own ItemPointerGet(BlockNumber|OffsetNumber)
+ * to avoid Asserts, since sometimes the ip_posid isn't "valid"
+ */
+#define GinItemPointerGetBlockNumber(pointer) \
+ (ItemPointerGetBlockNumberNoCheck(pointer))
+
+#define GinItemPointerGetOffsetNumber(pointer) \
+ (ItemPointerGetOffsetNumberNoCheck(pointer))
+
+#define GinItemPointerSetBlockNumber(pointer, blkno) \
+ (ItemPointerSetBlockNumber((pointer), (blkno)))
+
+#define GinItemPointerSetOffsetNumber(pointer, offnum) \
+ (ItemPointerSetOffsetNumber((pointer), (offnum)))
+
+
+/*
+ * Special-case item pointer values needed by the GIN search logic.
+ * MIN: sorts less than any valid item pointer
+ * MAX: sorts greater than any valid item pointer
+ * LOSSY PAGE: indicates a whole heap page, sorts after normal item
+ * pointers for that page
+ * Note that these are all distinguishable from an "invalid" item pointer
+ * (which is InvalidBlockNumber/0) as well as from all normal item
+ * pointers (which have item numbers in the range 1..MaxHeapTuplesPerPage).
+ */
+#define ItemPointerSetMin(p) \
+ ItemPointerSet((p), (BlockNumber)0, (OffsetNumber)0)
+#define ItemPointerIsMin(p) \
+ (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0 && \
+ GinItemPointerGetBlockNumber(p) == (BlockNumber)0)
+#define ItemPointerSetMax(p) \
+ ItemPointerSet((p), InvalidBlockNumber, (OffsetNumber)0xffff)
+#define ItemPointerIsMax(p) \
+ (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
+ GinItemPointerGetBlockNumber(p) == InvalidBlockNumber)
+#define ItemPointerSetLossyPage(p, b) \
+ ItemPointerSet((p), (b), (OffsetNumber)0xffff)
+#define ItemPointerIsLossyPage(p) \
+ (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
+ GinItemPointerGetBlockNumber(p) != InvalidBlockNumber)
+
+/*
+ * Posting item in a non-leaf posting-tree page
+ */
+typedef struct
+{
+ /* We use BlockIdData not BlockNumber to avoid padding space wastage */
+ BlockIdData child_blkno;
+ ItemPointerData key;
+} PostingItem;
+
+#define PostingItemGetBlockNumber(pointer) \
+ BlockIdGetBlockNumber(&(pointer)->child_blkno)
+
+#define PostingItemSetBlockNumber(pointer, blockNumber) \
+ BlockIdSet(&((pointer)->child_blkno), (blockNumber))
+
+/*
+ * Category codes to distinguish placeholder nulls from ordinary NULL keys.
+ * Note that the datatype size and the first two code values are chosen to be
+ * compatible with the usual usage of bool isNull flags.
+ *
+ * GIN_CAT_EMPTY_QUERY is never stored in the index; and notice that it is
+ * chosen to sort before not after regular key values.
+ */
+typedef signed char GinNullCategory;
+
+#define GIN_CAT_NORM_KEY 0 /* normal, non-null key value */
+#define GIN_CAT_NULL_KEY 1 /* null key value */
+#define GIN_CAT_EMPTY_ITEM 2 /* placeholder for zero-key item */
+#define GIN_CAT_NULL_ITEM 3 /* placeholder for null item */
+#define GIN_CAT_EMPTY_QUERY (-1) /* placeholder for full-scan query */
+
+/*
+ * Access macros for null category byte in entry tuples
+ */
+#define GinCategoryOffset(itup,ginstate) \
+ (IndexInfoFindDataOffset((itup)->t_info) + \
+ ((ginstate)->oneCol ? 0 : sizeof(int16)))
+#define GinGetNullCategory(itup,ginstate) \
+ (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))))
+#define GinSetNullCategory(itup,ginstate,c) \
+ (*((GinNullCategory *) ((char*)(itup) + GinCategoryOffset(itup,ginstate))) = (c))
+
+/*
+ * Access macros for leaf-page entry tuples (see discussion in README)
+ */
+#define GinGetNPosting(itup) GinItemPointerGetOffsetNumber(&(itup)->t_tid)
+#define GinSetNPosting(itup,n) ItemPointerSetOffsetNumber(&(itup)->t_tid,n)
+#define GIN_TREE_POSTING ((OffsetNumber)0xffff)
+#define GinIsPostingTree(itup) (GinGetNPosting(itup) == GIN_TREE_POSTING)
+#define GinSetPostingTree(itup, blkno) ( GinSetNPosting((itup),GIN_TREE_POSTING), ItemPointerSetBlockNumber(&(itup)->t_tid, blkno) )
+#define GinGetPostingTree(itup) GinItemPointerGetBlockNumber(&(itup)->t_tid)
+
+#define GIN_ITUP_COMPRESSED (1U << 31)
+#define GinGetPostingOffset(itup) (GinItemPointerGetBlockNumber(&(itup)->t_tid) & (~GIN_ITUP_COMPRESSED))
+#define GinSetPostingOffset(itup,n) ItemPointerSetBlockNumber(&(itup)->t_tid,(n)|GIN_ITUP_COMPRESSED)
+#define GinGetPosting(itup) ((Pointer) ((char*)(itup) + GinGetPostingOffset(itup)))
+#define GinItupIsCompressed(itup) ((GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED) != 0)
+
+/*
+ * Maximum size of an item on entry tree page. Make sure that we fit at least
+ * three items on each page. (On regular B-tree indexes, we must fit at least
+ * three items: two data items and the "high key". In GIN entry tree, we don't
+ * currently store the high key explicitly, we just use the rightmost item on
+ * the page, so it would actually be enough to fit two items.)
+ */
+#define GinMaxItemSize \
+ Min(INDEX_SIZE_MASK, \
+ MAXALIGN_DOWN(((BLCKSZ - \
+ MAXALIGN(SizeOfPageHeaderData + 3 * sizeof(ItemIdData)) - \
+ MAXALIGN(sizeof(GinPageOpaqueData))) / 3)))
+
+/*
+ * Access macros for non-leaf entry tuples
+ */
+#define GinGetDownlink(itup) GinItemPointerGetBlockNumber(&(itup)->t_tid)
+#define GinSetDownlink(itup,blkno) ItemPointerSet(&(itup)->t_tid, blkno, InvalidOffsetNumber)
+
+
+/*
+ * Data (posting tree) pages
+ *
+ * Posting tree pages don't store regular tuples. Non-leaf pages contain
+ * PostingItems, which are pairs of ItemPointers and child block numbers.
+ * Leaf pages contain GinPostingLists and an uncompressed array of item
+ * pointers.
+ *
+ * In a leaf page, the compressed posting lists are stored after the regular
+ * page header, one after each other. Although we don't store regular tuples,
+ * pd_lower is used to indicate the end of the posting lists. After that, free
+ * space follows. This layout is compatible with the "standard" heap and
+ * index page layout described in bufpage.h, so that we can e.g set buffer_std
+ * when writing WAL records.
+ *
+ * In the special space is the GinPageOpaque struct.
+ */
+#define GinDataLeafPageGetPostingList(page) \
+ (GinPostingList *) ((PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData))))
+#define GinDataLeafPageGetPostingListSize(page) \
+ (((PageHeader) page)->pd_lower - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(ItemPointerData)))
+
+#define GinDataLeafPageIsEmpty(page) \
+ (GinPageIsCompressed(page) ? (GinDataLeafPageGetPostingListSize(page) == 0) : (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber))
+
+#define GinDataLeafPageGetFreeSpace(page) PageGetExactFreeSpace(page)
+
+#define GinDataPageGetRightBound(page) ((ItemPointer) PageGetContents(page))
+/*
+ * Pointer to the data portion of a posting tree page. For internal pages,
+ * that's the beginning of the array of PostingItems. For compressed leaf
+ * pages, the first compressed posting list. For uncompressed (pre-9.4) leaf
+ * pages, it's the beginning of the ItemPointer array.
+ */
+#define GinDataPageGetData(page) \
+ (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))
+/* non-leaf pages contain PostingItems */
+#define GinDataPageGetPostingItem(page, i) \
+ ((PostingItem *) (GinDataPageGetData(page) + ((i)-1) * sizeof(PostingItem)))
+
+/*
+ * Note: there is no GinDataPageGetDataSize macro, because before version
+ * 9.4, we didn't set pd_lower on data pages. There can be pages in the index
+ * that were binary-upgraded from earlier versions and still have an invalid
+ * pd_lower, so we cannot trust it in general. Compressed posting tree leaf
+ * pages are new in 9.4, however, so we can trust them; see
+ * GinDataLeafPageGetPostingListSize.
+ */
+#define GinDataPageSetDataSize(page, size) \
+ { \
+ Assert(size <= GinDataPageMaxDataSize); \
+ ((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \
+ }
+
+#define GinNonLeafDataPageGetFreeSpace(page) \
+ (GinDataPageMaxDataSize - \
+ GinPageGetOpaque(page)->maxoff * sizeof(PostingItem))
+
+#define GinDataPageMaxDataSize \
+ (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
+ - MAXALIGN(sizeof(ItemPointerData)) \
+ - MAXALIGN(sizeof(GinPageOpaqueData)))
+
+/*
+ * List pages
+ */
+#define GinListPageSize \
+ ( BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(GinPageOpaqueData)) )
+
+/*
+ * A compressed posting list.
+ *
+ * Note: This requires 2-byte alignment.
+ */
+typedef struct
+{
+ ItemPointerData first; /* first item in this posting list (unpacked) */
+ uint16 nbytes; /* number of bytes that follow */
+ unsigned char bytes[FLEXIBLE_ARRAY_MEMBER]; /* varbyte encoded items */
+} GinPostingList;
+
+#define SizeOfGinPostingList(plist) (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )
+#define GinNextPostingListSegment(cur) ((GinPostingList *) (((char *) (cur)) + SizeOfGinPostingList((cur))))
+
+#endif /* GINBLOCK_H */
diff --git a/src/include/access/ginxlog.h b/src/include/access/ginxlog.h
new file mode 100644
index 0000000000..8decc42cdb
--- /dev/null
+++ b/src/include/access/ginxlog.h
@@ -0,0 +1,217 @@
+/*--------------------------------------------------------------------------
+ * ginxlog.h
+ * header file for postgres inverted index xlog implementation.
+ *
+ * Copyright (c) 2006-2017, PostgreSQL Global Development Group
+ *
+ * src/include/access/ginxlog.h
+ *--------------------------------------------------------------------------
+ */
+#ifndef GINXLOG_H
+#define GINXLOG_H
+
+#include "access/ginblock.h"
+#include "access/itup.h"
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+#include "storage/off.h"
+
+#define XLOG_GIN_CREATE_INDEX 0x00
+
+#define XLOG_GIN_CREATE_PTREE 0x10
+
+typedef struct ginxlogCreatePostingTree
+{
+ uint32 size;
+ /* A compressed posting list follows */
+} ginxlogCreatePostingTree;
+
+/*
+ * The format of the insertion record varies depending on the page type.
+ * ginxlogInsert is the common part between all variants.
+ *
+ * Backup Blk 0: target page
+ * Backup Blk 1: left child, if this insertion finishes an incomplete split
+ */
+
+#define XLOG_GIN_INSERT 0x20
+
+typedef struct
+{
+ uint16 flags; /* GIN_INSERT_ISLEAF and/or GIN_INSERT_ISDATA */
+
+ /*
+ * FOLLOWS:
+ *
+ * 1. if not leaf page, block numbers of the left and right child pages
+ * whose split this insertion finishes, as BlockIdData[2] (beware of
+ * adding fields in this struct that would make them not 16-bit aligned)
+ *
+ * 2. a ginxlogInsertEntry or ginxlogRecompressDataLeaf struct, depending
+ * on tree type.
+ *
+ * NB: the below structs are only 16-bit aligned when appended to a
+ * ginxlogInsert struct! Beware of adding fields to them that require
+ * stricter alignment.
+ */
+} ginxlogInsert;
+
+typedef struct
+{
+ OffsetNumber offset;
+ bool isDelete;
+ IndexTupleData tuple; /* variable length */
+} ginxlogInsertEntry;
+
+
+typedef struct
+{
+ uint16 nactions;
+
+ /* Variable number of 'actions' follow */
+} ginxlogRecompressDataLeaf;
+
+/*
+ * Note: this struct is currently not used in code, and only acts as
+ * documentation. The WAL record format is as specified here, but the code
+ * uses straight access through a Pointer and memcpy to read/write these.
+ */
+typedef struct
+{
+ uint8 segno; /* segment this action applies to */
+ char type; /* action type (see below) */
+
+ /*
+ * Action-specific data follows. For INSERT and REPLACE actions that is a
+ * GinPostingList struct. For ADDITEMS, a uint16 for the number of items
+ * added, followed by the items themselves as ItemPointers. DELETE actions
+ * have no further data.
+ */
+} ginxlogSegmentAction;
+
+/* Action types */
+#define GIN_SEGMENT_UNMODIFIED 0 /* no action (not used in WAL records) */
+#define GIN_SEGMENT_DELETE 1 /* a whole segment is removed */
+#define GIN_SEGMENT_INSERT 2 /* a whole segment is added */
+#define GIN_SEGMENT_REPLACE 3 /* a segment is replaced */
+#define GIN_SEGMENT_ADDITEMS 4 /* items are added to existing segment */
+
+typedef struct
+{
+ OffsetNumber offset;
+ PostingItem newitem;
+} ginxlogInsertDataInternal;
+
+/*
+ * Backup Blk 0: new left page (= original page, if not root split)
+ * Backup Blk 1: new right page
+ * Backup Blk 2: original page / new root page, if root split
+ * Backup Blk 3: left child, if this insertion completes an earlier split
+ */
+#define XLOG_GIN_SPLIT 0x30
+
+typedef struct ginxlogSplit
+{
+ RelFileNode node;
+ BlockNumber rrlink; /* right link, or root's blocknumber if root
+ * split */
+ BlockNumber leftChildBlkno; /* valid on a non-leaf split */
+ BlockNumber rightChildBlkno;
+ uint16 flags; /* see below */
+} ginxlogSplit;
+
+/*
+ * Flags used in ginxlogInsert and ginxlogSplit records
+ */
+#define GIN_INSERT_ISDATA 0x01 /* for both insert and split records */
+#define GIN_INSERT_ISLEAF 0x02 /* ditto */
+#define GIN_SPLIT_ROOT 0x04 /* only for split records */
+
+/*
+ * Vacuum simply WAL-logs the whole page, when anything is modified. This
+ * is functionally identical to heap_newpage records, but is kept separate for
+ * debugging purposes. (When inspecting the WAL stream, it's easier to see
+ * what's going on when GIN vacuum records are marked as such, not as heap
+ * records.) This is currently only used for entry tree leaf pages.
+ */
+#define XLOG_GIN_VACUUM_PAGE 0x40
+
+/*
+ * Vacuuming posting tree leaf page is WAL-logged like recompression caused
+ * by insertion.
+ */
+#define XLOG_GIN_VACUUM_DATA_LEAF_PAGE 0x90
+
+typedef struct ginxlogVacuumDataLeafPage
+{
+ ginxlogRecompressDataLeaf data;
+} ginxlogVacuumDataLeafPage;
+
+/*
+ * Backup Blk 0: deleted page
+ * Backup Blk 1: parent
+ * Backup Blk 2: left sibling
+ */
+#define XLOG_GIN_DELETE_PAGE 0x50
+
+typedef struct ginxlogDeletePage
+{
+ OffsetNumber parentOffset;
+ BlockNumber rightLink;
+} ginxlogDeletePage;
+
+#define XLOG_GIN_UPDATE_META_PAGE 0x60
+
+/*
+ * Backup Blk 0: metapage
+ * Backup Blk 1: tail page
+ */
+typedef struct ginxlogUpdateMeta
+{
+ RelFileNode node;
+ GinMetaPageData metadata;
+ BlockNumber prevTail;
+ BlockNumber newRightlink;
+ int32 ntuples; /* if ntuples > 0 then metadata.tail was
+ * updated with that many tuples; else new sub
+ * list was inserted */
+ /* array of inserted tuples follows */
+} ginxlogUpdateMeta;
+
+#define XLOG_GIN_INSERT_LISTPAGE 0x70
+
+typedef struct ginxlogInsertListPage
+{
+ BlockNumber rightlink;
+ int32 ntuples;
+ /* array of inserted tuples follows */
+} ginxlogInsertListPage;
+
+/*
+ * Backup Blk 0: metapage
+ * Backup Blk 1 to (ndeleted + 1): deleted pages
+ */
+
+#define XLOG_GIN_DELETE_LISTPAGE 0x80
+
+/*
+ * The WAL record for deleting list pages must contain a block reference to
+ * all the deleted pages, so the number of pages that can be deleted in one
+ * record is limited by XLR_MAX_BLOCK_ID. (block_id 0 is used for the
+ * metapage.)
+ */
+#define GIN_NDELETE_AT_ONCE Min(16, XLR_MAX_BLOCK_ID - 1)
+typedef struct ginxlogDeleteListPages
+{
+ GinMetaPageData metadata;
+ int32 ndeleted;
+} ginxlogDeleteListPages;
+
+extern void gin_redo(XLogReaderState *record);
+extern void gin_desc(StringInfo buf, XLogReaderState *record);
+extern const char *gin_identify(uint8 info);
+extern void gin_xlog_startup(void);
+extern void gin_xlog_cleanup(void);
+extern void gin_mask(char *pagedata, BlockNumber blkno);
+
+#endif /* GINXLOG_H */
diff --git a/src/include/access/gist.h b/src/include/access/gist.h
index 4343d6f74f..5824e90bda 100644
--- a/src/include/access/gist.h
+++ b/src/include/access/gist.h
@@ -6,7 +6,7 @@
* changes should be made with care.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/gist.h
diff --git a/src/include/access/gist_private.h b/src/include/access/gist_private.h
index 1231585017..1ad4ed6da7 100644
--- a/src/include/access/gist_private.h
+++ b/src/include/access/gist_private.h
@@ -4,7 +4,7 @@
* private declarations for GiST -- declarations related to the
* internal implementation of GiST, not the public API
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/gist_private.h
@@ -17,7 +17,6 @@
#include "access/amapi.h"
#include "access/gist.h"
#include "access/itup.h"
-#include "access/xlogreader.h"
#include "fmgr.h"
#include "lib/pairingheap.h"
#include "storage/bufmgr.h"
@@ -107,15 +106,11 @@ typedef struct GISTSTATE
* upper index pages; this rule avoids doing extra work during a search that
* ends early due to LIMIT.
*
- * To perform an ordered search, we use an RBTree to manage the distance-order
- * queue. Each GISTSearchTreeItem stores all unvisited items of the same
- * distance; they are GISTSearchItems chained together via their next fields.
- *
- * In a non-ordered search (no order-by operators), the RBTree degenerates
- * to a single item, which we use as a queue of unvisited index pages only.
- * In this case matched heap items from the current index leaf page are
- * remembered in GISTScanOpaqueData.pageData[] and returned directly from
- * there, instead of building a separate GISTSearchItem for each one.
+ * To perform an ordered search, we use a pairing heap to manage the
+ * distance-order queue. In a non-ordered search (no order-by operators),
+ * we use it to return heap tuples before unvisited index pages, to
+ * ensure depth-first order, but all entries are otherwise considered
+ * equal.
*/
/* Individual heap tuple to be visited */
@@ -124,7 +119,7 @@ typedef struct GISTSearchHeapItem
ItemPointerData heapPtr;
bool recheck; /* T if quals must be rechecked */
bool recheckDistances; /* T if distances must be rechecked */
- IndexTuple ftup; /* data fetched back from the index, used in
+ HeapTuple recontup; /* data reconstructed from the index, used in
* index-only scans */
OffsetNumber offnum; /* track offset in page to mark tuple as
* LP_DEAD */
@@ -181,51 +176,7 @@ typedef struct GISTScanOpaqueData
typedef GISTScanOpaqueData *GISTScanOpaque;
-
-/* XLog stuff */
-
-#define XLOG_GIST_PAGE_UPDATE 0x00
- /* #define XLOG_GIST_NEW_ROOT 0x20 */ /* not used anymore */
-#define XLOG_GIST_PAGE_SPLIT 0x30
- /* #define XLOG_GIST_INSERT_COMPLETE 0x40 */ /* not used anymore */
-#define XLOG_GIST_CREATE_INDEX 0x50
- /* #define XLOG_GIST_PAGE_DELETE 0x60 */ /* not used anymore */
-
-/*
- * Backup Blk 0: updated page.
- * Backup Blk 1: If this operation completes a page split, by inserting a
- * downlink for the split page, the left half of the split
- */
-typedef struct gistxlogPageUpdate
-{
- /* number of deleted offsets */
- uint16 ntodelete;
- uint16 ntoinsert;
-
- /*
- * In payload of blk 0 : 1. todelete OffsetNumbers 2. tuples to insert
- */
-} gistxlogPageUpdate;
-
-/*
- * Backup Blk 0: If this operation completes a page split, by inserting a
- * downlink for the split page, the left half of the split
- * Backup Blk 1 - npage: split pages (1 is the original page)
- */
-typedef struct gistxlogPageSplit
-{
- BlockNumber origrlink; /* rightlink of the page before split */
- GistNSN orignsn; /* NSN of the page before split */
- bool origleaf; /* was splitted page a leaf page? */
-
- uint16 npage; /* # of pages in the split */
- bool markfollowright; /* set F_FOLLOW_RIGHT flags */
-
- /*
- * follow: 1. gistxlogPage and array of IndexTupleData per page
- */
-} gistxlogPageSplit;
-
+/* despite the name, gistxlogPage is not part of any xlog record */
typedef struct gistxlogPage
{
BlockNumber blkno;
@@ -298,8 +249,8 @@ typedef struct
#define GIST_ROOT_BLKNO 0
/*
- * Before PostgreSQL 9.1, we used rely on so-called "invalid tuples" on inner
- * pages to finish crash recovery of incomplete page splits. If a crash
+ * Before PostgreSQL 9.1, we used to rely on so-called "invalid tuples" on
+ * inner pages to finish crash recovery of incomplete page splits. If a crash
* happened in the middle of a page split, so that the downlink pointers were
* not yet inserted, crash recovery inserted a special downlink pointer. The
* semantics of an invalid tuple was that it if you encounter one in a scan,
@@ -427,11 +378,11 @@ typedef struct GiSTOptions
} GiSTOptions;
/* gist.c */
-extern Datum gisthandler(PG_FUNCTION_ARGS);
extern void gistbuildempty(Relation index);
extern bool gistinsert(Relation r, Datum *values, bool *isnull,
ItemPointer ht_ctid, Relation heapRel,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
extern MemoryContext createTempGistContext(void);
extern GISTSTATE *initGISTstate(Relation index);
extern void freeGISTstate(GISTSTATE *giststate);
@@ -458,13 +409,6 @@ extern bool gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
extern SplitedPageLayout *gistSplit(Relation r, Page page, IndexTuple *itup,
int len, GISTSTATE *giststate);
-/* gistxlog.c */
-extern void gist_redo(XLogReaderState *record);
-extern void gist_desc(StringInfo buf, XLogReaderState *record);
-extern const char *gist_identify(uint8 info);
-extern void gist_xlog_startup(void);
-extern void gist_xlog_cleanup(void);
-
extern XLogRecPtr gistXLogUpdate(Buffer buffer,
OffsetNumber *todelete, int ntodelete,
IndexTuple *itup, int ntup,
@@ -533,7 +477,7 @@ extern void gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len,
extern bool gistKeyIsEQ(GISTSTATE *giststate, int attno, Datum a, Datum b);
extern void gistDeCompressAtt(GISTSTATE *giststate, Relation r, IndexTuple tuple, Page p,
OffsetNumber o, GISTENTRY *attdata, bool *isnull);
-extern IndexTuple gistFetchTuple(GISTSTATE *giststate, Relation r,
+extern HeapTuple gistFetchTuple(GISTSTATE *giststate, Relation r,
IndexTuple tuple);
extern void gistMakeUnionKey(GISTSTATE *giststate, int attno,
GISTENTRY *entry1, bool isnull1,
diff --git a/src/include/access/gistscan.h b/src/include/access/gistscan.h
index 4acaebdc9e..017740d14a 100644
--- a/src/include/access/gistscan.h
+++ b/src/include/access/gistscan.h
@@ -4,7 +4,7 @@
* routines defined in access/gist/gistscan.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/gistscan.h
diff --git a/src/include/access/gistxlog.h b/src/include/access/gistxlog.h
new file mode 100644
index 0000000000..3b126eca2a
--- /dev/null
+++ b/src/include/access/gistxlog.h
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+ *
+ * gistxlog.h
+ * gist xlog routines
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/access/gistxlog.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef GIST_XLOG_H
+#define GIST_XLOG_H
+
+#include "access/gist.h"
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+
+#define XLOG_GIST_PAGE_UPDATE 0x00
+ /* #define XLOG_GIST_NEW_ROOT 0x20 */ /* not used anymore */
+#define XLOG_GIST_PAGE_SPLIT 0x30
+ /* #define XLOG_GIST_INSERT_COMPLETE 0x40 */ /* not used anymore */
+#define XLOG_GIST_CREATE_INDEX 0x50
+ /* #define XLOG_GIST_PAGE_DELETE 0x60 */ /* not used anymore */
+
+/*
+ * Backup Blk 0: updated page.
+ * Backup Blk 1: If this operation completes a page split, by inserting a
+ * downlink for the split page, the left half of the split
+ */
+typedef struct gistxlogPageUpdate
+{
+ /* number of deleted offsets */
+ uint16 ntodelete;
+ uint16 ntoinsert;
+
+ /*
+ * In payload of blk 0 : 1. todelete OffsetNumbers 2. tuples to insert
+ */
+} gistxlogPageUpdate;
+
+/*
+ * Backup Blk 0: If this operation completes a page split, by inserting a
+ * downlink for the split page, the left half of the split
+ * Backup Blk 1 - npage: split pages (1 is the original page)
+ */
+typedef struct gistxlogPageSplit
+{
+ BlockNumber origrlink; /* rightlink of the page before split */
+ GistNSN orignsn; /* NSN of the page before split */
+ bool origleaf; /* was splitted page a leaf page? */
+
+ uint16 npage; /* # of pages in the split */
+ bool markfollowright; /* set F_FOLLOW_RIGHT flags */
+
+ /*
+ * follow: 1. gistxlogPage and array of IndexTupleData per page
+ */
+} gistxlogPageSplit;
+
+extern void gist_redo(XLogReaderState *record);
+extern void gist_desc(StringInfo buf, XLogReaderState *record);
+extern const char *gist_identify(uint8 info);
+extern void gist_xlog_startup(void);
+extern void gist_xlog_cleanup(void);
+extern void gist_mask(char *pagedata, BlockNumber blkno);
+
+#endif
diff --git a/src/include/access/hash.h b/src/include/access/hash.h
index ce6a70687e..c608b03bb0 100644
--- a/src/include/access/hash.h
+++ b/src/include/access/hash.h
@@ -4,7 +4,7 @@
* header file for postgres hash access method implementation
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/hash.h
@@ -20,11 +20,11 @@
#include "access/amapi.h"
#include "access/itup.h"
#include "access/sdir.h"
-#include "access/xlogreader.h"
#include "fmgr.h"
#include "lib/stringinfo.h"
#include "storage/bufmgr.h"
#include "storage/lockdefs.h"
+#include "utils/hsearch.h"
#include "utils/relcache.h"
/*
@@ -33,37 +33,62 @@
*/
typedef uint32 Bucket;
+#define InvalidBucket ((Bucket) 0xFFFFFFFF)
+
#define BUCKET_TO_BLKNO(metap,B) \
- ((BlockNumber) ((B) + ((B) ? (metap)->hashm_spares[_hash_log2((B)+1)-1] : 0)) + 1)
+ ((BlockNumber) ((B) + ((B) ? (metap)->hashm_spares[_hash_spareindex((B)+1)-1] : 0)) + 1)
/*
* Special space for hash index pages.
*
- * hasho_flag tells us which type of page we're looking at. For
- * example, knowing overflow pages from bucket pages is necessary
- * information when you're deleting tuples from a page. If all the
- * tuples are deleted from an overflow page, the overflow is made
- * available to other buckets by calling _hash_freeovflpage(). If all
- * the tuples are deleted from a bucket page, no additional action is
- * necessary.
+ * hasho_flag's LH_PAGE_TYPE bits tell us which type of page we're looking at.
+ * Additional bits in the flag word are used for more transient purposes.
+ *
+ * To test a page's type, do (hasho_flag & LH_PAGE_TYPE) == LH_xxx_PAGE.
+ * However, we ensure that each used page type has a distinct bit so that
+ * we can OR together page types for uses such as the allowable-page-types
+ * argument of _hash_checkpage().
*/
#define LH_UNUSED_PAGE (0)
#define LH_OVERFLOW_PAGE (1 << 0)
#define LH_BUCKET_PAGE (1 << 1)
#define LH_BITMAP_PAGE (1 << 2)
#define LH_META_PAGE (1 << 3)
+#define LH_BUCKET_BEING_POPULATED (1 << 4)
+#define LH_BUCKET_BEING_SPLIT (1 << 5)
+#define LH_BUCKET_NEEDS_SPLIT_CLEANUP (1 << 6)
+#define LH_PAGE_HAS_DEAD_TUPLES (1 << 7)
+
+#define LH_PAGE_TYPE \
+ (LH_OVERFLOW_PAGE | LH_BUCKET_PAGE | LH_BITMAP_PAGE | LH_META_PAGE)
+/*
+ * In an overflow page, hasho_prevblkno stores the block number of the previous
+ * page in the bucket chain; in a bucket page, hasho_prevblkno stores the
+ * hashm_maxbucket value as of the last time the bucket was last split, or
+ * else as of the time the bucket was created. The latter convention is used
+ * to determine whether a cached copy of the metapage is too stale to be used
+ * without needing to lock or pin the metapage.
+ *
+ * hasho_nextblkno is always the block number of the next page in the
+ * bucket chain, or InvalidBlockNumber if there are no more such pages.
+ */
typedef struct HashPageOpaqueData
{
- BlockNumber hasho_prevblkno; /* previous ovfl (or bucket) blkno */
- BlockNumber hasho_nextblkno; /* next ovfl blkno */
+ BlockNumber hasho_prevblkno; /* see above */
+ BlockNumber hasho_nextblkno; /* see above */
Bucket hasho_bucket; /* bucket number this pg belongs to */
- uint16 hasho_flag; /* page type code, see above */
+ uint16 hasho_flag; /* page type code + flag bits, see above */
uint16 hasho_page_id; /* for identification of hash indexes */
} HashPageOpaqueData;
typedef HashPageOpaqueData *HashPageOpaque;
+#define H_NEEDS_SPLIT_CLEANUP(opaque) (((opaque)->hasho_flag & LH_BUCKET_NEEDS_SPLIT_CLEANUP) != 0)
+#define H_BUCKET_BEING_SPLIT(opaque) (((opaque)->hasho_flag & LH_BUCKET_BEING_SPLIT) != 0)
+#define H_BUCKET_BEING_POPULATED(opaque) (((opaque)->hasho_flag & LH_BUCKET_BEING_POPULATED) != 0)
+#define H_HAS_DEAD_TUPLES(opaque) (((opaque)->hasho_flag & LH_PAGE_HAS_DEAD_TUPLES) != 0)
+
/*
* The page ID is for the convenience of pg_filedump and similar utilities,
* which otherwise would have a hard time telling pages of different index
@@ -72,6 +97,13 @@ typedef HashPageOpaqueData *HashPageOpaque;
*/
#define HASHO_PAGE_ID 0xFF80
+typedef struct HashScanPosItem /* what we remember about each match */
+{
+ ItemPointerData heapTid; /* TID of referenced heap item */
+ OffsetNumber indexOffset; /* index item's location within page */
+} HashScanPosItem;
+
+
/*
* HashScanOpaqueData is private state for a hash index scan.
*/
@@ -81,19 +113,6 @@ typedef struct HashScanOpaqueData
uint32 hashso_sk_hash;
/*
- * By definition, a hash scan should be examining only one bucket. We
- * record the bucket number here as soon as it is known.
- */
- Bucket hashso_bucket;
- bool hashso_bucket_valid;
-
- /*
- * If we have a share lock on the bucket, we record it here. When
- * hashso_bucket_blkno is zero, we have no such lock.
- */
- BlockNumber hashso_bucket_blkno;
-
- /*
* We also want to remember which buffer we're currently examining in the
* scan. We keep the buffer pinned (but not locked) across hashgettuple
* calls, in order to avoid doing a ReadBuffer() for every tuple in the
@@ -101,11 +120,34 @@ typedef struct HashScanOpaqueData
*/
Buffer hashso_curbuf;
+ /* remember the buffer associated with primary bucket */
+ Buffer hashso_bucket_buf;
+
+ /*
+ * remember the buffer associated with primary bucket page of bucket being
+ * split. it is required during the scan of the bucket which is being
+ * populated during split operation.
+ */
+ Buffer hashso_split_bucket_buf;
+
/* Current position of the scan, as an index TID */
ItemPointerData hashso_curpos;
/* Current position of the scan, as a heap TID */
ItemPointerData hashso_heappos;
+
+ /* Whether scan starts on bucket being populated due to split */
+ bool hashso_buc_populated;
+
+ /*
+ * Whether scanning bucket being split? The value of this parameter is
+ * referred only when hashso_buc_populated is true.
+ */
+ bool hashso_buc_split;
+ /* info about killed items if any (killedItems is NULL if never used) */
+ HashScanPosItem *killedItems; /* tids and offset numbers of killed
+ * items */
+ int numKilled; /* number of currently stored items */
} HashScanOpaqueData;
typedef HashScanOpaqueData *HashScanOpaque;
@@ -117,10 +159,11 @@ typedef HashScanOpaqueData *HashScanOpaque;
#define HASH_METAPAGE 0 /* metapage is always block 0 */
#define HASH_MAGIC 0x6440640
-#define HASH_VERSION 2 /* 2 signifies only hash key value is stored */
+#define HASH_VERSION 3 /* 3 signifies multi-phased bucket allocation
+ * to reduce doubling */
/*
- * Spares[] holds the number of overflow pages currently allocated at or
+ * spares[] holds the number of overflow pages currently allocated at or
* before a certain splitpoint. For example, if spares[3] = 7 then there are
* 7 ovflpages before splitpoint 3 (compare BUCKET_TO_BLKNO macro). The
* value in spares[ovflpoint] increases as overflow pages are added at the
@@ -130,18 +173,33 @@ typedef HashScanOpaqueData *HashScanOpaque;
*
* ovflpages that have been recycled for reuse can be found by looking at
* bitmaps that are stored within ovflpages dedicated for the purpose.
- * The blknos of these bitmap pages are kept in bitmaps[]; nmaps is the
+ * The blknos of these bitmap pages are kept in mapp[]; nmaps is the
* number of currently existing bitmaps.
*
* The limitation on the size of spares[] comes from the fact that there's
* no point in having more than 2^32 buckets with only uint32 hashcodes.
+ * (Note: The value of HASH_MAX_SPLITPOINTS which is the size of spares[] is
+ * adjusted in such a way to accommodate multi phased allocation of buckets
+ * after HASH_SPLITPOINT_GROUPS_WITH_ONE_PHASE).
+ *
* There is no particular upper limit on the size of mapp[], other than
* needing to fit into the metapage. (With 8K block size, 128 bitmaps
- * limit us to 64 Gb of overflow space...)
+ * limit us to 64 GB of overflow space...)
*/
-#define HASH_MAX_SPLITPOINTS 32
#define HASH_MAX_BITMAPS 128
+#define HASH_SPLITPOINT_PHASE_BITS 2
+#define HASH_SPLITPOINT_PHASES_PER_GRP (1 << HASH_SPLITPOINT_PHASE_BITS)
+#define HASH_SPLITPOINT_PHASE_MASK (HASH_SPLITPOINT_PHASES_PER_GRP - 1)
+#define HASH_SPLITPOINT_GROUPS_WITH_ONE_PHASE 10
+
+/* defines max number of splitpoit phases a hash index can have */
+#define HASH_MAX_SPLITPOINT_GROUP 32
+#define HASH_MAX_SPLITPOINTS \
+ (((HASH_MAX_SPLITPOINT_GROUP - HASH_SPLITPOINT_GROUPS_WITH_ONE_PHASE) * \
+ HASH_SPLITPOINT_PHASES_PER_GRP) + \
+ HASH_SPLITPOINT_GROUPS_WITH_ONE_PHASE)
+
typedef struct HashMetaPageData
{
uint32 hashm_magic; /* magic no. for hash tables */
@@ -176,6 +234,8 @@ typedef HashMetaPageData *HashMetaPage;
sizeof(ItemIdData) - \
MAXALIGN(sizeof(HashPageOpaqueData)))
+#define INDEX_MOVED_BY_SPLIT_MASK 0x2000
+
#define HASH_MIN_FILLFACTOR 10
#define HASH_DEFAULT_FILLFACTOR 75
@@ -224,9 +284,6 @@ typedef HashMetaPageData *HashMetaPage;
#define HASH_WRITE BUFFER_LOCK_EXCLUSIVE
#define HASH_NOLOCK (-1)
-#define HASH_SHARE ShareLock
-#define HASH_EXCLUSIVE ExclusiveLock
-
/*
* Strategy number. There's only one valid strategy for hashing: equality.
*/
@@ -244,13 +301,13 @@ typedef HashMetaPageData *HashMetaPage;
/* public routines */
-extern Datum hashhandler(PG_FUNCTION_ARGS);
extern IndexBuildResult *hashbuild(Relation heap, Relation index,
struct IndexInfo *indexInfo);
extern void hashbuildempty(Relation index);
extern bool hashinsert(Relation rel, Datum *values, bool *isnull,
ItemPointer ht_ctid, Relation heapRel,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
extern bool hashgettuple(IndexScanDesc scan, ScanDirection dir);
extern int64 hashgetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
extern IndexScanDesc hashbeginscan(Relation rel, int nkeys, int norderbys);
@@ -266,55 +323,43 @@ extern IndexBulkDeleteResult *hashvacuumcleanup(IndexVacuumInfo *info,
extern bytea *hashoptions(Datum reloptions, bool validate);
extern bool hashvalidate(Oid opclassoid);
-/*
- * Datatype-specific hash functions in hashfunc.c.
- *
- * These support both hash indexes and hash joins.
- *
- * NOTE: some of these are also used by catcache operations, without
- * any direct connection to hash indexes. Also, the common hash_any
- * routine is also used by dynahash tables.
- */
-extern Datum hashchar(PG_FUNCTION_ARGS);
-extern Datum hashint2(PG_FUNCTION_ARGS);
-extern Datum hashint4(PG_FUNCTION_ARGS);
-extern Datum hashint8(PG_FUNCTION_ARGS);
-extern Datum hashoid(PG_FUNCTION_ARGS);
-extern Datum hashenum(PG_FUNCTION_ARGS);
-extern Datum hashfloat4(PG_FUNCTION_ARGS);
-extern Datum hashfloat8(PG_FUNCTION_ARGS);
-extern Datum hashoidvector(PG_FUNCTION_ARGS);
-extern Datum hashint2vector(PG_FUNCTION_ARGS);
-extern Datum hashname(PG_FUNCTION_ARGS);
-extern Datum hashtext(PG_FUNCTION_ARGS);
-extern Datum hashvarlena(PG_FUNCTION_ARGS);
extern Datum hash_any(register const unsigned char *k, register int keylen);
extern Datum hash_uint32(uint32 k);
/* private routines */
/* hashinsert.c */
-extern void _hash_doinsert(Relation rel, IndexTuple itup);
+extern void _hash_doinsert(Relation rel, IndexTuple itup, Relation heapRel);
extern OffsetNumber _hash_pgaddtup(Relation rel, Buffer buf,
Size itemsize, IndexTuple itup);
+extern void _hash_pgaddmultitup(Relation rel, Buffer buf, IndexTuple *itups,
+ OffsetNumber *itup_offsets, uint16 nitups);
/* hashovfl.c */
-extern Buffer _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf);
-extern BlockNumber _hash_freeovflpage(Relation rel, Buffer ovflbuf,
- BufferAccessStrategy bstrategy);
-extern void _hash_initbitmap(Relation rel, HashMetaPage metap,
- BlockNumber blkno, ForkNumber forkNum);
+extern Buffer _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin);
+extern BlockNumber _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf,
+ Buffer wbuf, IndexTuple *itups, OffsetNumber *itup_offsets,
+ Size *tups_size, uint16 nitups, BufferAccessStrategy bstrategy);
+extern void _hash_initbitmapbuffer(Buffer buf, uint16 bmsize, bool initpage);
extern void _hash_squeezebucket(Relation rel,
Bucket bucket, BlockNumber bucket_blkno,
+ Buffer bucket_buf,
BufferAccessStrategy bstrategy);
+extern uint32 _hash_ovflblkno_to_bitno(HashMetaPage metap, BlockNumber ovflblkno);
/* hashpage.c */
-extern void _hash_getlock(Relation rel, BlockNumber whichlock, int access);
-extern bool _hash_try_getlock(Relation rel, BlockNumber whichlock, int access);
-extern void _hash_droplock(Relation rel, BlockNumber whichlock, int access);
extern Buffer _hash_getbuf(Relation rel, BlockNumber blkno,
int access, int flags);
+extern Buffer _hash_getbuf_with_condlock_cleanup(Relation rel,
+ BlockNumber blkno, int flags);
+extern HashMetaPage _hash_getcachedmetap(Relation rel, Buffer *metabuf,
+ bool force_refresh);
+extern Buffer _hash_getbucketbuf_from_hashkey(Relation rel, uint32 hashkey,
+ int access,
+ HashMetaPage *cachedmetap);
extern Buffer _hash_getinitbuf(Relation rel, BlockNumber blkno);
+extern void _hash_initbuf(Buffer buf, uint32 max_bucket, uint32 num_bucket,
+ uint32 flag, bool initpage);
extern Buffer _hash_getnewbuf(Relation rel, BlockNumber blkno,
ForkNumber forkNum);
extern Buffer _hash_getbuf_with_strategy(Relation rel, BlockNumber blkno,
@@ -322,19 +367,16 @@ extern Buffer _hash_getbuf_with_strategy(Relation rel, BlockNumber blkno,
BufferAccessStrategy bstrategy);
extern void _hash_relbuf(Relation rel, Buffer buf);
extern void _hash_dropbuf(Relation rel, Buffer buf);
-extern void _hash_wrtbuf(Relation rel, Buffer buf);
-extern void _hash_chgbufaccess(Relation rel, Buffer buf, int from_access,
- int to_access);
-extern uint32 _hash_metapinit(Relation rel, double num_tuples,
- ForkNumber forkNum);
+extern void _hash_dropscanbuf(Relation rel, HashScanOpaque so);
+extern uint32 _hash_init(Relation rel, double num_tuples,
+ ForkNumber forkNum);
+extern void _hash_init_metabuffer(Buffer buf, double num_tuples,
+ RegProcedure procid, uint16 ffactor, bool initpage);
extern void _hash_pageinit(Page page, Size size);
extern void _hash_expandtable(Relation rel, Buffer metabuf);
-
-/* hashscan.c */
-extern void _hash_regscan(IndexScanDesc scan);
-extern void _hash_dropscan(IndexScanDesc scan);
-extern bool _hash_has_active_scan(Relation rel, Bucket bucket);
-extern void ReleaseResources_hash(void);
+extern void _hash_finish_split(Relation rel, Buffer metabuf, Buffer obuf,
+ Bucket obucket, uint32 maxbucket, uint32 highmask,
+ uint32 lowmask);
/* hashsearch.c */
extern bool _hash_next(IndexScanDesc scan, ScanDirection dir);
@@ -348,7 +390,7 @@ extern HSpool *_h_spoolinit(Relation heap, Relation index, uint32 num_buckets);
extern void _h_spooldestroy(HSpool *hspool);
extern void _h_spool(HSpool *hspool, ItemPointer self,
Datum *values, bool *isnull);
-extern void _h_indexbuild(HSpool *hspool);
+extern void _h_indexbuild(HSpool *hspool, Relation heapRel);
/* hashutil.c */
extern bool _hash_checkqual(IndexScanDesc scan, IndexTuple itup);
@@ -357,6 +399,8 @@ extern uint32 _hash_datum2hashkey_type(Relation rel, Datum key, Oid keytype);
extern Bucket _hash_hashkey2bucket(uint32 hashkey, uint32 maxbucket,
uint32 highmask, uint32 lowmask);
extern uint32 _hash_log2(uint32 num);
+extern uint32 _hash_spareindex(uint32 num_bucket);
+extern uint32 _hash_get_totalbuckets(uint32 splitpoint_phase);
extern void _hash_checkpage(Relation rel, Buffer buf, int flags);
extern uint32 _hash_get_indextuple_hashkey(IndexTuple itup);
extern bool _hash_convert_tuple(Relation index,
@@ -364,11 +408,20 @@ extern bool _hash_convert_tuple(Relation index,
Datum *index_values, bool *index_isnull);
extern OffsetNumber _hash_binsearch(Page page, uint32 hash_value);
extern OffsetNumber _hash_binsearch_last(Page page, uint32 hash_value);
+extern BlockNumber _hash_get_oldblock_from_newbucket(Relation rel, Bucket new_bucket);
+extern BlockNumber _hash_get_newblock_from_oldbucket(Relation rel, Bucket old_bucket);
+extern Bucket _hash_get_newbucket_from_oldbucket(Relation rel, Bucket old_bucket,
+ uint32 lowmask, uint32 maxbucket);
+extern void _hash_kill_items(IndexScanDesc scan);
/* hash.c */
-extern void hash_redo(XLogReaderState *record);
-extern void hash_desc(StringInfo buf, XLogReaderState *record);
-extern const char *hash_identify(uint8 info);
+extern void hashbucketcleanup(Relation rel, Bucket cur_bucket,
+ Buffer bucket_buf, BlockNumber bucket_blkno,
+ BufferAccessStrategy bstrategy,
+ uint32 maxbucket, uint32 highmask, uint32 lowmask,
+ double *tuples_removed, double *num_index_tuples,
+ bool bucket_has_garbage,
+ IndexBulkDeleteCallback callback, void *callback_state);
#ifdef PGXC
extern Datum compute_hash(Oid type, Datum value, char locator);
diff --git a/src/include/access/hash_xlog.h b/src/include/access/hash_xlog.h
new file mode 100644
index 0000000000..d4a6a71ca7
--- /dev/null
+++ b/src/include/access/hash_xlog.h
@@ -0,0 +1,282 @@
+/*-------------------------------------------------------------------------
+ *
+ * hash_xlog.h
+ * header file for Postgres hash AM implementation
+ *
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/access/hash_xlog.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef HASH_XLOG_H
+#define HASH_XLOG_H
+
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+#include "storage/off.h"
+
+/* Number of buffers required for XLOG_HASH_SQUEEZE_PAGE operation */
+#define HASH_XLOG_FREE_OVFL_BUFS 6
+
+/*
+ * XLOG records for hash operations
+ */
+#define XLOG_HASH_INIT_META_PAGE 0x00 /* initialize the meta page */
+#define XLOG_HASH_INIT_BITMAP_PAGE 0x10 /* initialize the bitmap page */
+#define XLOG_HASH_INSERT 0x20 /* add index tuple without split */
+#define XLOG_HASH_ADD_OVFL_PAGE 0x30 /* add overflow page */
+#define XLOG_HASH_SPLIT_ALLOCATE_PAGE 0x40 /* allocate new page for split */
+#define XLOG_HASH_SPLIT_PAGE 0x50 /* split page */
+#define XLOG_HASH_SPLIT_COMPLETE 0x60 /* completion of split
+ * operation */
+#define XLOG_HASH_MOVE_PAGE_CONTENTS 0x70 /* remove tuples from one page
+ * and add to another page */
+#define XLOG_HASH_SQUEEZE_PAGE 0x80 /* add tuples to one of the previous
+ * pages in chain and free the ovfl
+ * page */
+#define XLOG_HASH_DELETE 0x90 /* delete index tuples from a page */
+#define XLOG_HASH_SPLIT_CLEANUP 0xA0 /* clear split-cleanup flag in primary
+ * bucket page after deleting tuples
+ * that are moved due to split */
+#define XLOG_HASH_UPDATE_META_PAGE 0xB0 /* update meta page after
+ * vacuum */
+
+#define XLOG_HASH_VACUUM_ONE_PAGE 0xC0 /* remove dead tuples from
+ * index page */
+
+/*
+ * xl_hash_split_allocate_page flag values, 8 bits are available.
+ */
+#define XLH_SPLIT_META_UPDATE_MASKS (1<<0)
+#define XLH_SPLIT_META_UPDATE_SPLITPOINT (1<<1)
+
+/*
+ * This is what we need to know about a HASH index create.
+ *
+ * Backup block 0: metapage
+ */
+typedef struct xl_hash_createidx
+{
+ double num_tuples;
+ RegProcedure procid;
+ uint16 ffactor;
+} xl_hash_createidx;
+#define SizeOfHashCreateIdx (offsetof(xl_hash_createidx, ffactor) + sizeof(uint16))
+
+/*
+ * This is what we need to know about simple (without split) insert.
+ *
+ * This data record is used for XLOG_HASH_INSERT
+ *
+ * Backup Blk 0: original page (data contains the inserted tuple)
+ * Backup Blk 1: metapage (HashMetaPageData)
+ */
+typedef struct xl_hash_insert
+{
+ OffsetNumber offnum;
+} xl_hash_insert;
+
+#define SizeOfHashInsert (offsetof(xl_hash_insert, offnum) + sizeof(OffsetNumber))
+
+/*
+ * This is what we need to know about addition of overflow page.
+ *
+ * This data record is used for XLOG_HASH_ADD_OVFL_PAGE
+ *
+ * Backup Blk 0: newly allocated overflow page
+ * Backup Blk 1: page before new overflow page in the bucket chain
+ * Backup Blk 2: bitmap page
+ * Backup Blk 3: new bitmap page
+ * Backup Blk 4: metapage
+ */
+typedef struct xl_hash_add_ovfl_page
+{
+ uint16 bmsize;
+ bool bmpage_found;
+} xl_hash_add_ovfl_page;
+
+#define SizeOfHashAddOvflPage \
+ (offsetof(xl_hash_add_ovfl_page, bmpage_found) + sizeof(bool))
+
+/*
+ * This is what we need to know about allocating a page for split.
+ *
+ * This data record is used for XLOG_HASH_SPLIT_ALLOCATE_PAGE
+ *
+ * Backup Blk 0: page for old bucket
+ * Backup Blk 1: page for new bucket
+ * Backup Blk 2: metapage
+ */
+typedef struct xl_hash_split_allocate_page
+{
+ uint32 new_bucket;
+ uint16 old_bucket_flag;
+ uint16 new_bucket_flag;
+ uint8 flags;
+} xl_hash_split_allocate_page;
+
+#define SizeOfHashSplitAllocPage \
+ (offsetof(xl_hash_split_allocate_page, flags) + sizeof(uint8))
+
+/*
+ * This is what we need to know about completing the split operation.
+ *
+ * This data record is used for XLOG_HASH_SPLIT_COMPLETE
+ *
+ * Backup Blk 0: page for old bucket
+ * Backup Blk 1: page for new bucket
+ */
+typedef struct xl_hash_split_complete
+{
+ uint16 old_bucket_flag;
+ uint16 new_bucket_flag;
+} xl_hash_split_complete;
+
+#define SizeOfHashSplitComplete \
+ (offsetof(xl_hash_split_complete, new_bucket_flag) + sizeof(uint16))
+
+/*
+ * This is what we need to know about move page contents required during
+ * squeeze operation.
+ *
+ * This data record is used for XLOG_HASH_MOVE_PAGE_CONTENTS
+ *
+ * Backup Blk 0: bucket page
+ * Backup Blk 1: page containing moved tuples
+ * Backup Blk 2: page from which tuples will be removed
+ */
+typedef struct xl_hash_move_page_contents
+{
+ uint16 ntups;
+ bool is_prim_bucket_same_wrt; /* TRUE if the page to which
+ * tuples are moved is same as
+ * primary bucket page */
+} xl_hash_move_page_contents;
+
+#define SizeOfHashMovePageContents \
+ (offsetof(xl_hash_move_page_contents, is_prim_bucket_same_wrt) + sizeof(bool))
+
+/*
+ * This is what we need to know about the squeeze page operation.
+ *
+ * This data record is used for XLOG_HASH_SQUEEZE_PAGE
+ *
+ * Backup Blk 0: page containing tuples moved from freed overflow page
+ * Backup Blk 1: freed overflow page
+ * Backup Blk 2: page previous to the freed overflow page
+ * Backup Blk 3: page next to the freed overflow page
+ * Backup Blk 4: bitmap page containing info of freed overflow page
+ * Backup Blk 5: meta page
+ */
+typedef struct xl_hash_squeeze_page
+{
+ BlockNumber prevblkno;
+ BlockNumber nextblkno;
+ uint16 ntups;
+ bool is_prim_bucket_same_wrt; /* TRUE if the page to which
+ * tuples are moved is same as
+ * primary bucket page */
+ bool is_prev_bucket_same_wrt; /* TRUE if the page to which
+ * tuples are moved is the
+ * page previous to the freed
+ * overflow page */
+} xl_hash_squeeze_page;
+
+#define SizeOfHashSqueezePage \
+ (offsetof(xl_hash_squeeze_page, is_prev_bucket_same_wrt) + sizeof(bool))
+
+/*
+ * This is what we need to know about the deletion of index tuples from a page.
+ *
+ * This data record is used for XLOG_HASH_DELETE
+ *
+ * Backup Blk 0: primary bucket page
+ * Backup Blk 1: page from which tuples are deleted
+ */
+typedef struct xl_hash_delete
+{
+ bool clear_dead_marking; /* TRUE if this operation clears
+ * LH_PAGE_HAS_DEAD_TUPLES flag */
+ bool is_primary_bucket_page; /* TRUE if the operation is for
+ * primary bucket page */
+} xl_hash_delete;
+
+#define SizeOfHashDelete (offsetof(xl_hash_delete, is_primary_bucket_page) + sizeof(bool))
+
+/*
+ * This is what we need for metapage update operation.
+ *
+ * This data record is used for XLOG_HASH_UPDATE_META_PAGE
+ *
+ * Backup Blk 0: meta page
+ */
+typedef struct xl_hash_update_meta_page
+{
+ double ntuples;
+} xl_hash_update_meta_page;
+
+#define SizeOfHashUpdateMetaPage \
+ (offsetof(xl_hash_update_meta_page, ntuples) + sizeof(double))
+
+/*
+ * This is what we need to initialize metapage.
+ *
+ * This data record is used for XLOG_HASH_INIT_META_PAGE
+ *
+ * Backup Blk 0: meta page
+ */
+typedef struct xl_hash_init_meta_page
+{
+ double num_tuples;
+ RegProcedure procid;
+ uint16 ffactor;
+} xl_hash_init_meta_page;
+
+#define SizeOfHashInitMetaPage \
+ (offsetof(xl_hash_init_meta_page, ffactor) + sizeof(uint16))
+
+/*
+ * This is what we need to initialize bitmap page.
+ *
+ * This data record is used for XLOG_HASH_INIT_BITMAP_PAGE
+ *
+ * Backup Blk 0: bitmap page
+ * Backup Blk 1: meta page
+ */
+typedef struct xl_hash_init_bitmap_page
+{
+ uint16 bmsize;
+} xl_hash_init_bitmap_page;
+
+#define SizeOfHashInitBitmapPage \
+ (offsetof(xl_hash_init_bitmap_page, bmsize) + sizeof(uint16))
+
+/*
+ * This is what we need for index tuple deletion and to
+ * update the meta page.
+ *
+ * This data record is used for XLOG_HASH_VACUUM_ONE_PAGE
+ *
+ * Backup Blk 0: bucket page
+ * Backup Blk 1: meta page
+ */
+typedef struct xl_hash_vacuum_one_page
+{
+ RelFileNode hnode;
+ int ntuples;
+
+ /* TARGET OFFSET NUMBERS FOLLOW AT THE END */
+} xl_hash_vacuum_one_page;
+
+#define SizeOfHashVacuumOnePage \
+ (offsetof(xl_hash_vacuum_one_page, ntuples) + sizeof(int))
+
+extern void hash_redo(XLogReaderState *record);
+extern void hash_desc(StringInfo buf, XLogReaderState *record);
+extern const char *hash_identify(uint8 info);
+extern void hash_mask(char *pagedata, BlockNumber blkno);
+
+#endif /* HASH_XLOG_H */
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index b3a595c67e..7e85510d2f 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -4,7 +4,7 @@
* POSTGRES heap access method definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/heapam.h
@@ -19,7 +19,7 @@
#include "nodes/lockoptions.h"
#include "nodes/primnodes.h"
#include "storage/bufpage.h"
-#include "storage/lock.h"
+#include "storage/lockdefs.h"
#include "utils/relcache.h"
#include "utils/snapshot.h"
@@ -147,6 +147,7 @@ extern void setLastTid(const ItemPointer tid);
extern BulkInsertState GetBulkInsertState(void);
extern void FreeBulkInsertState(BulkInsertState);
+extern void ReleaseBulkInsertStatePin(BulkInsertState bistate);
extern Oid heap_insert(Relation relation, HeapTuple tup, CommandId cid,
int options, BulkInsertState bistate);
@@ -178,6 +179,7 @@ extern void simple_heap_update(Relation relation, ItemPointer otid,
HeapTuple tup);
extern void heap_sync(Relation relation);
+extern void heap_update_snapshot(HeapScanDesc scan, Snapshot snapshot);
/* in heap/pruneheap.c */
extern void heap_page_prune_opt(Relation relation, Buffer buffer);
diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h
index 06a82426bb..b285f172aa 100644
--- a/src/include/access/heapam_xlog.h
+++ b/src/include/access/heapam_xlog.h
@@ -4,7 +4,7 @@
* POSTGRES heap access XLOG definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/heapam_xlog.h
@@ -373,6 +373,7 @@ extern void HeapTupleHeaderAdvanceLatestRemovedXid(HeapTupleHeader tuple,
extern void heap_redo(XLogReaderState *record);
extern void heap_desc(StringInfo buf, XLogReaderState *record);
extern const char *heap_identify(uint8 info);
+extern void heap_mask(char *pagedata, BlockNumber blkno);
extern void heap2_redo(XLogReaderState *record);
extern void heap2_desc(StringInfo buf, XLogReaderState *record);
extern const char *heap2_identify(uint8 info);
diff --git a/src/include/access/hio.h b/src/include/access/hio.h
index a174b34c96..2824f23218 100644
--- a/src/include/access/hio.h
+++ b/src/include/access/hio.h
@@ -4,7 +4,7 @@
* POSTGRES heap access method input/output definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/hio.h
diff --git a/src/include/access/htup.h b/src/include/access/htup.h
index 01d5a6f926..1d31b5f1c2 100644
--- a/src/include/access/htup.h
+++ b/src/include/access/htup.h
@@ -5,7 +5,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/htup.h
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index d7e5fad11e..e365f4f2b4 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -4,7 +4,7 @@
* POSTGRES heap tuple header definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/htup_details.h
@@ -165,7 +165,7 @@ struct HeapTupleHeaderData
/* MORE DATA FOLLOWS AT END OF STRUCT */
};
-/* typedef appears in tupbasics.h */
+/* typedef appears in htup.h */
#define SizeofHeapTupleHeader offsetof(HeapTupleHeaderData, t_bits)
@@ -237,8 +237,8 @@ struct HeapTupleHeaderData
*/
#define HEAP_LOCKED_UPGRADED(infomask) \
( \
- ((infomask) & HEAP_XMAX_IS_MULTI) && \
- ((infomask) & HEAP_XMAX_LOCK_ONLY) && \
+ ((infomask) & HEAP_XMAX_IS_MULTI) != 0 && \
+ ((infomask) & HEAP_XMAX_LOCK_ONLY) != 0 && \
(((infomask) & (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)) == 0) \
)
@@ -317,7 +317,7 @@ struct HeapTupleHeaderData
#define HeapTupleHeaderXminCommitted(tup) \
( \
- (tup)->t_infomask & HEAP_XMIN_COMMITTED \
+ ((tup)->t_infomask & HEAP_XMIN_COMMITTED) != 0 \
)
#define HeapTupleHeaderXminInvalid(tup) \
@@ -422,7 +422,7 @@ do { \
#define HeapTupleHeaderIsSpeculative(tup) \
( \
- (tup)->t_ctid.ip_posid == SpecTokenOffsetNumber \
+ (ItemPointerGetOffsetNumberNoCheck(&(tup)->t_ctid) == SpecTokenOffsetNumber) \
)
#define HeapTupleHeaderGetSpeculativeToken(tup) \
@@ -501,7 +501,7 @@ do { \
#define HeapTupleHeaderIsHeapOnly(tup) \
( \
- (tup)->t_infomask2 & HEAP_ONLY_TUPLE \
+ ((tup)->t_infomask2 & HEAP_ONLY_TUPLE) != 0 \
)
#define HeapTupleHeaderSetHeapOnly(tup) \
@@ -516,7 +516,7 @@ do { \
#define HeapTupleHeaderHasMatch(tup) \
( \
- (tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH \
+ ((tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH) != 0 \
)
#define HeapTupleHeaderSetMatch(tup) \
@@ -805,6 +805,12 @@ extern HeapTuple heap_modify_tuple(HeapTuple tuple,
Datum *replValues,
bool *replIsnull,
bool *doReplace);
+extern HeapTuple heap_modify_tuple_by_cols(HeapTuple tuple,
+ TupleDesc tupleDesc,
+ int nCols,
+ int *replCols,
+ Datum *replValues,
+ bool *replIsnull);
extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
Datum *values, bool *isnull);
extern void heap_freetuple(HeapTuple htup);
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 8350fa0084..e9ec8e27e2 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -4,7 +4,7 @@
* POSTGRES index tuple definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/itup.h
@@ -63,7 +63,7 @@ typedef IndexAttributeBitMapData *IndexAttributeBitMap;
* t_info manipulation macros
*/
#define INDEX_SIZE_MASK 0x1FFF
-/* bit 0x2000 is not used at present */
+/* bit 0x2000 is reserved for index-AM specific usage */
#define INDEX_VAR_MASK 0x4000
#define INDEX_NULL_MASK 0x8000
diff --git a/src/include/access/multixact.h b/src/include/access/multixact.h
index ab5de627d2..85997a41fa 100644
--- a/src/include/access/multixact.h
+++ b/src/include/access/multixact.h
@@ -3,7 +3,7 @@
*
* PostgreSQL multi-transaction-log manager
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/multixact.h
@@ -127,7 +127,8 @@ extern void StartupMultiXact(void);
extern void TrimMultiXact(void);
extern void ShutdownMultiXact(void);
extern void SetMultiXactIdLimit(MultiXactId oldest_datminmxid,
- Oid oldest_datoid);
+ Oid oldest_datoid,
+ bool is_startup);
extern void MultiXactGetCheckptMulti(bool is_shutdown,
MultiXactId *nextMulti,
MultiXactOffset *nextMultiOffset,
diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h
index c580f51f7f..15771ce9e0 100644
--- a/src/include/access/nbtree.h
+++ b/src/include/access/nbtree.h
@@ -4,7 +4,7 @@
* header file for postgres btree access method implementation.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/nbtree.h
@@ -151,9 +151,8 @@ typedef struct BTMetaPageData
* within a level). - vadim 04/09/97
*/
#define BTTidSame(i1, i2) \
- ( (i1).ip_blkid.bi_hi == (i2).ip_blkid.bi_hi && \
- (i1).ip_blkid.bi_lo == (i2).ip_blkid.bi_lo && \
- (i1).ip_posid == (i2).ip_posid )
+ ((ItemPointerGetBlockNumber(&(i1)) == ItemPointerGetBlockNumber(&(i2))) && \
+ (ItemPointerGetOffsetNumber(&(i1)) == ItemPointerGetOffsetNumber(&(i2))))
#define BTEntrySame(i1, i2) \
BTTidSame((i1)->t_tid, (i2)->t_tid)
@@ -177,6 +176,7 @@ typedef struct BTMetaPageData
#define P_ISLEAF(opaque) ((opaque)->btpo_flags & BTP_LEAF)
#define P_ISROOT(opaque) ((opaque)->btpo_flags & BTP_ROOT)
#define P_ISDELETED(opaque) ((opaque)->btpo_flags & BTP_DELETED)
+#define P_ISMETA(opaque) ((opaque)->btpo_flags & BTP_META)
#define P_ISHALFDEAD(opaque) ((opaque)->btpo_flags & BTP_HALF_DEAD)
#define P_IGNORE(opaque) ((opaque)->btpo_flags & (BTP_DELETED|BTP_HALF_DEAD))
#define P_HAS_GARBAGE(opaque) ((opaque)->btpo_flags & BTP_HAS_GARBAGE)
@@ -204,232 +204,6 @@ typedef struct BTMetaPageData
#define P_FIRSTKEY ((OffsetNumber) 2)
#define P_FIRSTDATAKEY(opaque) (P_RIGHTMOST(opaque) ? P_HIKEY : P_FIRSTKEY)
-/*
- * XLOG records for btree operations
- *
- * XLOG allows to store some information in high 4 bits of log
- * record xl_info field
- */
-#define XLOG_BTREE_INSERT_LEAF 0x00 /* add index tuple without split */
-#define XLOG_BTREE_INSERT_UPPER 0x10 /* same, on a non-leaf page */
-#define XLOG_BTREE_INSERT_META 0x20 /* same, plus update metapage */
-#define XLOG_BTREE_SPLIT_L 0x30 /* add index tuple with split */
-#define XLOG_BTREE_SPLIT_R 0x40 /* as above, new item on right */
-#define XLOG_BTREE_SPLIT_L_ROOT 0x50 /* add tuple with split of root */
-#define XLOG_BTREE_SPLIT_R_ROOT 0x60 /* as above, new item on right */
-#define XLOG_BTREE_DELETE 0x70 /* delete leaf index tuples for a page */
-#define XLOG_BTREE_UNLINK_PAGE 0x80 /* delete a half-dead page */
-#define XLOG_BTREE_UNLINK_PAGE_META 0x90 /* same, and update metapage */
-#define XLOG_BTREE_NEWROOT 0xA0 /* new root page */
-#define XLOG_BTREE_MARK_PAGE_HALFDEAD 0xB0 /* mark a leaf as half-dead */
-#define XLOG_BTREE_VACUUM 0xC0 /* delete entries on a page during
- * vacuum */
-#define XLOG_BTREE_REUSE_PAGE 0xD0 /* old page is about to be reused from
- * FSM */
-
-/*
- * All that we need to regenerate the meta-data page
- */
-typedef struct xl_btree_metadata
-{
- BlockNumber root;
- uint32 level;
- BlockNumber fastroot;
- uint32 fastlevel;
-} xl_btree_metadata;
-
-/*
- * This is what we need to know about simple (without split) insert.
- *
- * This data record is used for INSERT_LEAF, INSERT_UPPER, INSERT_META.
- * Note that INSERT_META implies it's not a leaf page.
- *
- * Backup Blk 0: original page (data contains the inserted tuple)
- * Backup Blk 1: child's left sibling, if INSERT_UPPER or INSERT_META
- * Backup Blk 2: xl_btree_metadata, if INSERT_META
- */
-typedef struct xl_btree_insert
-{
- OffsetNumber offnum;
-} xl_btree_insert;
-
-#define SizeOfBtreeInsert (offsetof(xl_btree_insert, offnum) + sizeof(OffsetNumber))
-
-/*
- * On insert with split, we save all the items going into the right sibling
- * so that we can restore it completely from the log record. This way takes
- * less xlog space than the normal approach, because if we did it standardly,
- * XLogInsert would almost always think the right page is new and store its
- * whole page image. The left page, however, is handled in the normal
- * incremental-update fashion.
- *
- * Note: the four XLOG_BTREE_SPLIT xl_info codes all use this data record.
- * The _L and _R variants indicate whether the inserted tuple went into the
- * left or right split page (and thus, whether newitemoff and the new item
- * are stored or not). The _ROOT variants indicate that we are splitting
- * the root page, and thus that a newroot record rather than an insert or
- * split record should follow. Note that a split record never carries a
- * metapage update --- we'll do that in the parent-level update.
- *
- * Backup Blk 0: original page / new left page
- *
- * The left page's data portion contains the new item, if it's the _L variant.
- * (In the _R variants, the new item is one of the right page's tuples.)
- * If level > 0, an IndexTuple representing the HIKEY of the left page
- * follows. We don't need this on leaf pages, because it's the same as the
- * leftmost key in the new right page.
- *
- * Backup Blk 1: new right page
- *
- * The right page's data portion contains the right page's tuples in the
- * form used by _bt_restore_page.
- *
- * Backup Blk 2: next block (orig page's rightlink), if any
- * Backup Blk 3: child's left sibling, if non-leaf split
- */
-typedef struct xl_btree_split
-{
- uint32 level; /* tree level of page being split */
- OffsetNumber firstright; /* first item moved to right page */
- OffsetNumber newitemoff; /* new item's offset (if placed on left page) */
-} xl_btree_split;
-
-#define SizeOfBtreeSplit (offsetof(xl_btree_split, newitemoff) + sizeof(OffsetNumber))
-
-/*
- * This is what we need to know about delete of individual leaf index tuples.
- * The WAL record can represent deletion of any number of index tuples on a
- * single index page when *not* executed by VACUUM.
- *
- * Backup Blk 0: index page
- */
-typedef struct xl_btree_delete
-{
- RelFileNode hnode; /* RelFileNode of the heap the index currently
- * points at */
- int nitems;
-
- /* TARGET OFFSET NUMBERS FOLLOW AT THE END */
-} xl_btree_delete;
-
-#define SizeOfBtreeDelete (offsetof(xl_btree_delete, nitems) + sizeof(int))
-
-/*
- * This is what we need to know about page reuse within btree.
- */
-typedef struct xl_btree_reuse_page
-{
- RelFileNode node;
- BlockNumber block;
- TransactionId latestRemovedXid;
-} xl_btree_reuse_page;
-
-#define SizeOfBtreeReusePage (sizeof(xl_btree_reuse_page))
-
-/*
- * This is what we need to know about vacuum of individual leaf index tuples.
- * The WAL record can represent deletion of any number of index tuples on a
- * single index page when executed by VACUUM.
- *
- * For MVCC scans, lastBlockVacuumed will be set to InvalidBlockNumber.
- * For a non-MVCC index scans there is an additional correctness requirement
- * for applying these changes during recovery, which is that we must do one
- * of these two things for every block in the index:
- * * lock the block for cleanup and apply any required changes
- * * EnsureBlockUnpinned()
- * The purpose of this is to ensure that no index scans started before we
- * finish scanning the index are still running by the time we begin to remove
- * heap tuples.
- *
- * Any changes to any one block are registered on just one WAL record. All
- * blocks that we need to run EnsureBlockUnpinned() are listed as a block range
- * starting from the last block vacuumed through until this one. Individual
- * block numbers aren't given.
- *
- * Note that the *last* WAL record in any vacuum of an index is allowed to
- * have a zero length array of offsets. Earlier records must have at least one.
- */
-typedef struct xl_btree_vacuum
-{
- BlockNumber lastBlockVacuumed;
-
- /* TARGET OFFSET NUMBERS FOLLOW */
-} xl_btree_vacuum;
-
-#define SizeOfBtreeVacuum (offsetof(xl_btree_vacuum, lastBlockVacuumed) + sizeof(BlockNumber))
-
-/*
- * This is what we need to know about marking an empty branch for deletion.
- * The target identifies the tuple removed from the parent page (note that we
- * remove this tuple's downlink and the *following* tuple's key). Note that
- * the leaf page is empty, so we don't need to store its content --- it is
- * just reinitialized during recovery using the rest of the fields.
- *
- * Backup Blk 0: leaf block
- * Backup Blk 1: top parent
- */
-typedef struct xl_btree_mark_page_halfdead
-{
- OffsetNumber poffset; /* deleted tuple id in parent page */
-
- /* information needed to recreate the leaf page: */
- BlockNumber leafblk; /* leaf block ultimately being deleted */
- BlockNumber leftblk; /* leaf block's left sibling, if any */
- BlockNumber rightblk; /* leaf block's right sibling */
- BlockNumber topparent; /* topmost internal page in the branch */
-} xl_btree_mark_page_halfdead;
-
-#define SizeOfBtreeMarkPageHalfDead (offsetof(xl_btree_mark_page_halfdead, topparent) + sizeof(BlockNumber))
-
-/*
- * This is what we need to know about deletion of a btree page. Note we do
- * not store any content for the deleted page --- it is just rewritten as empty
- * during recovery, apart from resetting the btpo.xact.
- *
- * Backup Blk 0: target block being deleted
- * Backup Blk 1: target block's left sibling, if any
- * Backup Blk 2: target block's right sibling
- * Backup Blk 3: leaf block (if different from target)
- * Backup Blk 4: metapage (if rightsib becomes new fast root)
- */
-typedef struct xl_btree_unlink_page
-{
- BlockNumber leftsib; /* target block's left sibling, if any */
- BlockNumber rightsib; /* target block's right sibling */
-
- /*
- * Information needed to recreate the leaf page, when target is an
- * internal page.
- */
- BlockNumber leafleftsib;
- BlockNumber leafrightsib;
- BlockNumber topparent; /* next child down in the branch */
-
- TransactionId btpo_xact; /* value of btpo.xact for use in recovery */
- /* xl_btree_metadata FOLLOWS IF XLOG_BTREE_UNLINK_PAGE_META */
-} xl_btree_unlink_page;
-
-#define SizeOfBtreeUnlinkPage (offsetof(xl_btree_unlink_page, btpo_xact) + sizeof(TransactionId))
-
-/*
- * New root log record. There are zero tuples if this is to establish an
- * empty root, or two if it is the result of splitting an old root.
- *
- * Note that although this implies rewriting the metadata page, we don't need
- * an xl_btree_metadata record --- the rootblk and level are sufficient.
- *
- * Backup Blk 0: new root page (2 tuples as payload, if splitting old root)
- * Backup Blk 1: left child (if splitting an old root)
- * Backup Blk 2: metapage
- */
-typedef struct xl_btree_newroot
-{
- BlockNumber rootblk; /* location of new root (redundant with blk 0) */
- uint32 level; /* its tree level */
-} xl_btree_newroot;
-
-#define SizeOfBtreeNewroot (offsetof(xl_btree_newroot, level) + sizeof(uint32))
-
/*
* Operator strategy numbers for B-tree have been moved to access/stratnum.h,
@@ -609,6 +383,8 @@ typedef struct BTScanOpaqueData
ScanKey arrayKeyData; /* modified copy of scan->keyData */
int numArrayKeys; /* number of equality-type array keys (-1 if
* there are any unsatisfiable array keys) */
+ int arrayKeyCount; /* count indicating number of array scan keys
+ * processed */
BTArrayKeyInfo *arrayKeys; /* info about each equality-type array key */
MemoryContext arrayContext; /* scan-lifespan context for array data */
@@ -652,20 +428,23 @@ typedef BTScanOpaqueData *BTScanOpaque;
#define SK_BT_NULLS_FIRST (INDOPTION_NULLS_FIRST << SK_BT_INDOPTION_SHIFT)
/*
- * prototypes for functions in nbtree.c (external entry points for btree)
+ * external entry points for btree, in nbtree.c
*/
-extern Datum bthandler(PG_FUNCTION_ARGS);
extern IndexBuildResult *btbuild(Relation heap, Relation index,
struct IndexInfo *indexInfo);
extern void btbuildempty(Relation index);
extern bool btinsert(Relation rel, Datum *values, bool *isnull,
ItemPointer ht_ctid, Relation heapRel,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
extern IndexScanDesc btbeginscan(Relation rel, int nkeys, int norderbys);
+extern Size btestimateparallelscan(void);
+extern void btinitparallelscan(void *target);
extern bool btgettuple(IndexScanDesc scan, ScanDirection dir);
extern int64 btgetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
extern void btrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
ScanKey orderbys, int norderbys);
+extern void btparallelrescan(IndexScanDesc scan);
extern void btendscan(IndexScanDesc scan);
extern void btmarkpos(IndexScanDesc scan);
extern void btrestrpos(IndexScanDesc scan);
@@ -678,6 +457,14 @@ extern IndexBulkDeleteResult *btvacuumcleanup(IndexVacuumInfo *info,
extern bool btcanreturn(Relation index, int attno);
/*
+ * prototypes for internal functions in nbtree.c
+ */
+extern bool _bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno);
+extern void _bt_parallel_release(IndexScanDesc scan, BlockNumber scan_page);
+extern void _bt_parallel_done(IndexScanDesc scan);
+extern void _bt_parallel_advance_array_keys(IndexScanDesc scan);
+
+/*
* prototypes for functions in nbtinsert.c
*/
extern bool _bt_doinsert(Relation rel, IndexTuple itup,
@@ -769,11 +556,4 @@ extern void _bt_spool(BTSpool *btspool, ItemPointer self,
Datum *values, bool *isnull);
extern void _bt_leafbuild(BTSpool *btspool, BTSpool *spool2);
-/*
- * prototypes for functions in nbtxlog.c
- */
-extern void btree_redo(XLogReaderState *record);
-extern void btree_desc(StringInfo buf, XLogReaderState *record);
-extern const char *btree_identify(uint8 info);
-
#endif /* NBTREE_H */
diff --git a/src/include/access/nbtxlog.h b/src/include/access/nbtxlog.h
new file mode 100644
index 0000000000..d6a3085923
--- /dev/null
+++ b/src/include/access/nbtxlog.h
@@ -0,0 +1,255 @@
+/*-------------------------------------------------------------------------
+ *
+ * nbtxlog.h
+ * header file for postgres btree xlog routines
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/access/nbtxlog.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NBTXLOG_H
+#define NBTXLOG_H
+
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+#include "storage/off.h"
+
+/*
+ * XLOG records for btree operations
+ *
+ * XLOG allows to store some information in high 4 bits of log
+ * record xl_info field
+ */
+#define XLOG_BTREE_INSERT_LEAF 0x00 /* add index tuple without split */
+#define XLOG_BTREE_INSERT_UPPER 0x10 /* same, on a non-leaf page */
+#define XLOG_BTREE_INSERT_META 0x20 /* same, plus update metapage */
+#define XLOG_BTREE_SPLIT_L 0x30 /* add index tuple with split */
+#define XLOG_BTREE_SPLIT_R 0x40 /* as above, new item on right */
+#define XLOG_BTREE_SPLIT_L_ROOT 0x50 /* add tuple with split of root */
+#define XLOG_BTREE_SPLIT_R_ROOT 0x60 /* as above, new item on right */
+#define XLOG_BTREE_DELETE 0x70 /* delete leaf index tuples for a page */
+#define XLOG_BTREE_UNLINK_PAGE 0x80 /* delete a half-dead page */
+#define XLOG_BTREE_UNLINK_PAGE_META 0x90 /* same, and update metapage */
+#define XLOG_BTREE_NEWROOT 0xA0 /* new root page */
+#define XLOG_BTREE_MARK_PAGE_HALFDEAD 0xB0 /* mark a leaf as half-dead */
+#define XLOG_BTREE_VACUUM 0xC0 /* delete entries on a page during
+ * vacuum */
+#define XLOG_BTREE_REUSE_PAGE 0xD0 /* old page is about to be reused from
+ * FSM */
+
+/*
+ * All that we need to regenerate the meta-data page
+ */
+typedef struct xl_btree_metadata
+{
+ BlockNumber root;
+ uint32 level;
+ BlockNumber fastroot;
+ uint32 fastlevel;
+} xl_btree_metadata;
+
+/*
+ * This is what we need to know about simple (without split) insert.
+ *
+ * This data record is used for INSERT_LEAF, INSERT_UPPER, INSERT_META.
+ * Note that INSERT_META implies it's not a leaf page.
+ *
+ * Backup Blk 0: original page (data contains the inserted tuple)
+ * Backup Blk 1: child's left sibling, if INSERT_UPPER or INSERT_META
+ * Backup Blk 2: xl_btree_metadata, if INSERT_META
+ */
+typedef struct xl_btree_insert
+{
+ OffsetNumber offnum;
+} xl_btree_insert;
+
+#define SizeOfBtreeInsert (offsetof(xl_btree_insert, offnum) + sizeof(OffsetNumber))
+
+/*
+ * On insert with split, we save all the items going into the right sibling
+ * so that we can restore it completely from the log record. This way takes
+ * less xlog space than the normal approach, because if we did it standardly,
+ * XLogInsert would almost always think the right page is new and store its
+ * whole page image. The left page, however, is handled in the normal
+ * incremental-update fashion.
+ *
+ * Note: the four XLOG_BTREE_SPLIT xl_info codes all use this data record.
+ * The _L and _R variants indicate whether the inserted tuple went into the
+ * left or right split page (and thus, whether newitemoff and the new item
+ * are stored or not). The _ROOT variants indicate that we are splitting
+ * the root page, and thus that a newroot record rather than an insert or
+ * split record should follow. Note that a split record never carries a
+ * metapage update --- we'll do that in the parent-level update.
+ *
+ * Backup Blk 0: original page / new left page
+ *
+ * The left page's data portion contains the new item, if it's the _L variant.
+ * (In the _R variants, the new item is one of the right page's tuples.)
+ * If level > 0, an IndexTuple representing the HIKEY of the left page
+ * follows. We don't need this on leaf pages, because it's the same as the
+ * leftmost key in the new right page.
+ *
+ * Backup Blk 1: new right page
+ *
+ * The right page's data portion contains the right page's tuples in the
+ * form used by _bt_restore_page.
+ *
+ * Backup Blk 2: next block (orig page's rightlink), if any
+ * Backup Blk 3: child's left sibling, if non-leaf split
+ */
+typedef struct xl_btree_split
+{
+ uint32 level; /* tree level of page being split */
+ OffsetNumber firstright; /* first item moved to right page */
+ OffsetNumber newitemoff; /* new item's offset (if placed on left page) */
+} xl_btree_split;
+
+#define SizeOfBtreeSplit (offsetof(xl_btree_split, newitemoff) + sizeof(OffsetNumber))
+
+/*
+ * This is what we need to know about delete of individual leaf index tuples.
+ * The WAL record can represent deletion of any number of index tuples on a
+ * single index page when *not* executed by VACUUM.
+ *
+ * Backup Blk 0: index page
+ */
+typedef struct xl_btree_delete
+{
+ RelFileNode hnode; /* RelFileNode of the heap the index currently
+ * points at */
+ int nitems;
+
+ /* TARGET OFFSET NUMBERS FOLLOW AT THE END */
+} xl_btree_delete;
+
+#define SizeOfBtreeDelete (offsetof(xl_btree_delete, nitems) + sizeof(int))
+
+/*
+ * This is what we need to know about page reuse within btree.
+ */
+typedef struct xl_btree_reuse_page
+{
+ RelFileNode node;
+ BlockNumber block;
+ TransactionId latestRemovedXid;
+} xl_btree_reuse_page;
+
+#define SizeOfBtreeReusePage (sizeof(xl_btree_reuse_page))
+
+/*
+ * This is what we need to know about vacuum of individual leaf index tuples.
+ * The WAL record can represent deletion of any number of index tuples on a
+ * single index page when executed by VACUUM.
+ *
+ * For MVCC scans, lastBlockVacuumed will be set to InvalidBlockNumber.
+ * For a non-MVCC index scans there is an additional correctness requirement
+ * for applying these changes during recovery, which is that we must do one
+ * of these two things for every block in the index:
+ * * lock the block for cleanup and apply any required changes
+ * * EnsureBlockUnpinned()
+ * The purpose of this is to ensure that no index scans started before we
+ * finish scanning the index are still running by the time we begin to remove
+ * heap tuples.
+ *
+ * Any changes to any one block are registered on just one WAL record. All
+ * blocks that we need to run EnsureBlockUnpinned() are listed as a block range
+ * starting from the last block vacuumed through until this one. Individual
+ * block numbers aren't given.
+ *
+ * Note that the *last* WAL record in any vacuum of an index is allowed to
+ * have a zero length array of offsets. Earlier records must have at least one.
+ */
+typedef struct xl_btree_vacuum
+{
+ BlockNumber lastBlockVacuumed;
+
+ /* TARGET OFFSET NUMBERS FOLLOW */
+} xl_btree_vacuum;
+
+#define SizeOfBtreeVacuum (offsetof(xl_btree_vacuum, lastBlockVacuumed) + sizeof(BlockNumber))
+
+/*
+ * This is what we need to know about marking an empty branch for deletion.
+ * The target identifies the tuple removed from the parent page (note that we
+ * remove this tuple's downlink and the *following* tuple's key). Note that
+ * the leaf page is empty, so we don't need to store its content --- it is
+ * just reinitialized during recovery using the rest of the fields.
+ *
+ * Backup Blk 0: leaf block
+ * Backup Blk 1: top parent
+ */
+typedef struct xl_btree_mark_page_halfdead
+{
+ OffsetNumber poffset; /* deleted tuple id in parent page */
+
+ /* information needed to recreate the leaf page: */
+ BlockNumber leafblk; /* leaf block ultimately being deleted */
+ BlockNumber leftblk; /* leaf block's left sibling, if any */
+ BlockNumber rightblk; /* leaf block's right sibling */
+ BlockNumber topparent; /* topmost internal page in the branch */
+} xl_btree_mark_page_halfdead;
+
+#define SizeOfBtreeMarkPageHalfDead (offsetof(xl_btree_mark_page_halfdead, topparent) + sizeof(BlockNumber))
+
+/*
+ * This is what we need to know about deletion of a btree page. Note we do
+ * not store any content for the deleted page --- it is just rewritten as empty
+ * during recovery, apart from resetting the btpo.xact.
+ *
+ * Backup Blk 0: target block being deleted
+ * Backup Blk 1: target block's left sibling, if any
+ * Backup Blk 2: target block's right sibling
+ * Backup Blk 3: leaf block (if different from target)
+ * Backup Blk 4: metapage (if rightsib becomes new fast root)
+ */
+typedef struct xl_btree_unlink_page
+{
+ BlockNumber leftsib; /* target block's left sibling, if any */
+ BlockNumber rightsib; /* target block's right sibling */
+
+ /*
+ * Information needed to recreate the leaf page, when target is an
+ * internal page.
+ */
+ BlockNumber leafleftsib;
+ BlockNumber leafrightsib;
+ BlockNumber topparent; /* next child down in the branch */
+
+ TransactionId btpo_xact; /* value of btpo.xact for use in recovery */
+ /* xl_btree_metadata FOLLOWS IF XLOG_BTREE_UNLINK_PAGE_META */
+} xl_btree_unlink_page;
+
+#define SizeOfBtreeUnlinkPage (offsetof(xl_btree_unlink_page, btpo_xact) + sizeof(TransactionId))
+
+/*
+ * New root log record. There are zero tuples if this is to establish an
+ * empty root, or two if it is the result of splitting an old root.
+ *
+ * Note that although this implies rewriting the metadata page, we don't need
+ * an xl_btree_metadata record --- the rootblk and level are sufficient.
+ *
+ * Backup Blk 0: new root page (2 tuples as payload, if splitting old root)
+ * Backup Blk 1: left child (if splitting an old root)
+ * Backup Blk 2: metapage
+ */
+typedef struct xl_btree_newroot
+{
+ BlockNumber rootblk; /* location of new root (redundant with blk 0) */
+ uint32 level; /* its tree level */
+} xl_btree_newroot;
+
+#define SizeOfBtreeNewroot (offsetof(xl_btree_newroot, level) + sizeof(uint32))
+
+
+/*
+ * prototypes for functions in nbtxlog.c
+ */
+extern void btree_redo(XLogReaderState *record);
+extern void btree_desc(StringInfo buf, XLogReaderState *record);
+extern const char *btree_identify(uint8 info);
+extern void btree_mask(char *pagedata, BlockNumber blkno);
+
+#endif /* NBXLOG_H */
diff --git a/src/include/access/parallel.h b/src/include/access/parallel.h
index 2f8f36fea4..590e27a484 100644
--- a/src/include/access/parallel.h
+++ b/src/include/access/parallel.h
@@ -3,7 +3,7 @@
* parallel.h
* Infrastructure for launching parallel workers
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/parallel.h
@@ -35,7 +35,6 @@ typedef struct ParallelContext
SubTransactionId subid;
int nworkers;
int nworkers_launched;
- parallel_worker_main_type entrypoint;
char *library_name;
char *function_name;
ErrorContextCallback *error_context_stack;
@@ -52,8 +51,7 @@ extern bool InitializingParallelWorker;
#define IsParallelWorker() (ParallelWorkerNumber >= 0)
-extern ParallelContext *CreateParallelContext(parallel_worker_main_type entrypoint, int nworkers);
-extern ParallelContext *CreateParallelContextForExternalFunction(char *library_name, char *function_name, int nworkers);
+extern ParallelContext *CreateParallelContext(const char *library_name, const char *function_name, int nworkers);
extern void InitializeParallelDSM(ParallelContext *pcxt);
extern void ReinitializeParallelDSM(ParallelContext *pcxt);
extern void LaunchParallelWorkers(ParallelContext *pcxt);
@@ -67,4 +65,6 @@ extern void AtEOXact_Parallel(bool isCommit);
extern void AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId);
extern void ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end);
+extern void ParallelWorkerMain(Datum main_arg);
+
#endif /* PARALLEL_H */
diff --git a/src/include/access/printsimple.h b/src/include/access/printsimple.h
new file mode 100644
index 0000000000..3f3e7a3840
--- /dev/null
+++ b/src/include/access/printsimple.h
@@ -0,0 +1,23 @@
+/*-------------------------------------------------------------------------
+ *
+ * printsimple.h
+ * print simple tuples without catalog access
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/access/printsimple.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PRINTSIMPLE_H
+#define PRINTSIMPLE_H
+
+#include "tcop/dest.h"
+
+extern bool printsimple(TupleTableSlot *slot, DestReceiver *self);
+extern void printsimple_startup(DestReceiver *self, int operation,
+ TupleDesc tupdesc);
+
+#endif /* PRINTSIMPLE_H */
diff --git a/src/include/access/printtup.h b/src/include/access/printtup.h
index 608c564287..a828889c4f 100644
--- a/src/include/access/printtup.h
+++ b/src/include/access/printtup.h
@@ -4,7 +4,7 @@
*
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/printtup.h
diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h
index 469ac677e3..91b2cd7bb2 100644
--- a/src/include/access/reloptions.h
+++ b/src/include/access/reloptions.h
@@ -9,7 +9,7 @@
* into a lot of low-level code.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/reloptions.h
@@ -48,8 +48,9 @@ typedef enum relopt_kind
RELOPT_KIND_SPGIST = (1 << 8),
RELOPT_KIND_VIEW = (1 << 9),
RELOPT_KIND_BRIN = (1 << 10),
+ RELOPT_KIND_PARTITIONED = (1 << 11),
/* if you add a new kind, make sure you update "last_default" too */
- RELOPT_KIND_LAST_DEFAULT = RELOPT_KIND_BRIN,
+ RELOPT_KIND_LAST_DEFAULT = RELOPT_KIND_PARTITIONED,
/* some compilers treat enums as signed ints, so we can't use 1 << 31 */
RELOPT_KIND_MAX = (1 << 30)
} relopt_kind;
diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h
index 49c2a6f2ce..f4d4f1ee71 100644
--- a/src/include/access/relscan.h
+++ b/src/include/access/relscan.h
@@ -4,7 +4,7 @@
* POSTGRES relation scan descriptor definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/relscan.h
@@ -19,6 +19,7 @@
#include "access/htup_details.h"
#include "access/itup.h"
#include "access/tupdesc.h"
+#include "storage/spin.h"
/*
* Shared state for parallel heap scan.
@@ -92,6 +93,7 @@ typedef struct IndexScanDescData
ScanKey keyData; /* array of index qualifier descriptors */
ScanKey orderByData; /* array of ordering op descriptors */
bool xs_want_itup; /* caller requests index tuples */
+ bool xs_temp_snap; /* unregister snapshot at scan end? */
/* signaling to index AM about killing index tuples */
bool kill_prior_tuple; /* last-returned tuple is dead */
@@ -102,9 +104,16 @@ typedef struct IndexScanDescData
/* index access method's private state */
void *opaque; /* access-method-specific info */
- /* in an index-only scan, this is valid after a successful amgettuple */
+ /*
+ * In an index-only scan, a successful amgettuple call must fill either
+ * xs_itup (and xs_itupdesc) or xs_hitup (and xs_hitupdesc) to provide the
+ * data returned by the scan. It can fill both, in which case the heap
+ * format will be used.
+ */
IndexTuple xs_itup; /* index tuple returned by AM */
TupleDesc xs_itupdesc; /* rowtype descriptor of xs_itup */
+ HeapTuple xs_hitup; /* index data returned by AM, as HeapTuple */
+ TupleDesc xs_hitupdesc; /* rowtype descriptor of xs_hitup */
/* xs_ctup/xs_cbuf/xs_recheck are valid after a successful index_getnext */
HeapTupleData xs_ctup; /* current heap tuple, if any */
@@ -125,8 +134,20 @@ typedef struct IndexScanDescData
/* state data for traversing HOT chains in index_getnext */
bool xs_continue_hot; /* T if must keep walking HOT chain */
+
+ /* parallel index scan information, in shared memory */
+ ParallelIndexScanDesc parallel_scan;
} IndexScanDescData;
+/* Generic structure for parallel scans */
+typedef struct ParallelIndexScanDescData
+{
+ Oid ps_relid;
+ Oid ps_indexid;
+ Size ps_offset; /* Offset in bytes of am specific structure */
+ char ps_snapshot_data[FLEXIBLE_ARRAY_MEMBER];
+} ParallelIndexScanDescData;
+
/* Struct for heap-or-index scans of system tables */
typedef struct SysScanDescData
{
diff --git a/src/include/access/rewriteheap.h b/src/include/access/rewriteheap.h
index 4b87f25f4b..564c2ad0f5 100644
--- a/src/include/access/rewriteheap.h
+++ b/src/include/access/rewriteheap.h
@@ -3,7 +3,7 @@
* rewriteheap.h
* Declarations for heap rewrite support functions
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California
*
* src/include/access/rewriteheap.h
diff --git a/src/include/access/rmgr.h b/src/include/access/rmgr.h
index ff7fe62c05..64b92ff33a 100644
--- a/src/include/access/rmgr.h
+++ b/src/include/access/rmgr.h
@@ -19,7 +19,7 @@ typedef uint8 RmgrId;
* Note: RM_MAX_ID must fit in RmgrId; widening that type will affect the XLOG
* file format.
*/
-#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup) \
+#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask) \
symname,
typedef enum RmgrIds
diff --git a/src/include/access/rmgrlist.h b/src/include/access/rmgrlist.h
index 77920395c1..0988cb4103 100644
--- a/src/include/access/rmgrlist.h
+++ b/src/include/access/rmgrlist.h
@@ -6,7 +6,7 @@
* by the PG_RMGR macro, which is not defined in this file; it can be
* defined by the caller for special purposes.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/rmgrlist.h
@@ -25,28 +25,28 @@
*/
/* symbol name, textual name, redo, desc, identify, startup, cleanup */
-PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, xlog_identify, NULL, NULL)
-PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, xact_identify, NULL, NULL)
-PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, smgr_identify, NULL, NULL)
-PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, clog_identify, NULL, NULL)
-PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, dbase_identify, NULL, NULL)
-PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, tblspc_identify, NULL, NULL)
-PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, multixact_identify, NULL, NULL)
-PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, relmap_identify, NULL, NULL)
-PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, standby_identify, NULL, NULL)
-PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, heap2_identify, NULL, NULL)
-PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, heap_identify, NULL, NULL)
-PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, btree_identify, NULL, NULL)
-PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, hash_identify, NULL, NULL)
-PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_identify, gin_xlog_startup, gin_xlog_cleanup)
-PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_identify, gist_xlog_startup, gist_xlog_cleanup)
-PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, seq_identify, NULL, NULL)
-PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_identify, spg_xlog_startup, spg_xlog_cleanup)
-PG_RMGR(RM_BRIN_ID, "BRIN", brin_redo, brin_desc, brin_identify, NULL, NULL)
-PG_RMGR(RM_COMMIT_TS_ID, "CommitTs", commit_ts_redo, commit_ts_desc, commit_ts_identify, NULL, NULL)
-PG_RMGR(RM_REPLORIGIN_ID, "ReplicationOrigin", replorigin_redo, replorigin_desc, replorigin_identify, NULL, NULL)
+PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, xlog_identify, NULL, NULL, NULL)
+PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, xact_identify, NULL, NULL, NULL)
+PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, smgr_identify, NULL, NULL, NULL)
+PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, clog_identify, NULL, NULL, NULL)
+PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, dbase_identify, NULL, NULL, NULL)
+PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, tblspc_identify, NULL, NULL, NULL)
+PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, multixact_identify, NULL, NULL, NULL)
+PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, relmap_identify, NULL, NULL, NULL)
+PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, standby_identify, NULL, NULL, NULL)
+PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, heap2_identify, NULL, NULL, heap_mask)
+PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, heap_identify, NULL, NULL, heap_mask)
+PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, btree_identify, NULL, NULL, btree_mask)
+PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, hash_identify, NULL, NULL, hash_mask)
+PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_identify, gin_xlog_startup, gin_xlog_cleanup, gin_mask)
+PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_identify, gist_xlog_startup, gist_xlog_cleanup, gist_mask)
+PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, seq_identify, NULL, NULL, seq_mask)
+PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_identify, spg_xlog_startup, spg_xlog_cleanup, spg_mask)
+PG_RMGR(RM_BRIN_ID, "BRIN", brin_redo, brin_desc, brin_identify, NULL, NULL, brin_mask)
+PG_RMGR(RM_COMMIT_TS_ID, "CommitTs", commit_ts_redo, commit_ts_desc, commit_ts_identify, NULL, NULL, NULL)
+PG_RMGR(RM_REPLORIGIN_ID, "ReplicationOrigin", replorigin_redo, replorigin_desc, replorigin_identify, NULL, NULL, NULL)
#ifdef PGXC
-PG_RMGR(RM_BARRIER_ID, "Barrier", barrier_redo, barrier_desc, NULL, NULL, NULL)
+PG_RMGR(RM_BARRIER_ID, "Barrier", barrier_redo, barrier_desc, barrier_identify, NULL, NULL, NULL)
#endif
-PG_RMGR(RM_GENERIC_ID, "Generic", generic_redo, generic_desc, generic_identify, NULL, NULL)
-PG_RMGR(RM_LOGICALMSG_ID, "LogicalMessage", logicalmsg_redo, logicalmsg_desc, logicalmsg_identify, NULL, NULL)
+PG_RMGR(RM_GENERIC_ID, "Generic", generic_redo, generic_desc, generic_identify, NULL, NULL, generic_mask)
+PG_RMGR(RM_LOGICALMSG_ID, "LogicalMessage", logicalmsg_redo, logicalmsg_desc, logicalmsg_identify, NULL, NULL, NULL)
diff --git a/src/include/access/sdir.h b/src/include/access/sdir.h
index fc9d939209..347e910a41 100644
--- a/src/include/access/sdir.h
+++ b/src/include/access/sdir.h
@@ -4,7 +4,7 @@
* POSTGRES scan direction definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/sdir.h
diff --git a/src/include/access/skey.h b/src/include/access/skey.h
index c8ac001974..01cc940363 100644
--- a/src/include/access/skey.h
+++ b/src/include/access/skey.h
@@ -4,7 +4,7 @@
* POSTGRES scan key definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/skey.h
diff --git a/src/include/access/slru.h b/src/include/access/slru.h
index 5fcebc52fb..722867d5d2 100644
--- a/src/include/access/slru.h
+++ b/src/include/access/slru.h
@@ -3,7 +3,7 @@
* slru.h
* Simple LRU buffering for transaction status logfiles
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/slru.h
@@ -76,7 +76,7 @@ typedef struct SlruSharedData
/*
* Optional array of WAL flush LSNs associated with entries in the SLRU
* pages. If not zero/NULL, we must flush WAL before writing pages (true
- * for pg_clog, false for multixact, pg_subtrans, pg_notify). group_lsn[]
+ * for pg_xact, false for multixact, pg_subtrans, pg_notify). group_lsn[]
* has lsn_groups_per_page entries per buffer slot, each containing the
* highest LSN known for a contiguous group of SLRU entries on that slot's
* page.
@@ -104,7 +104,6 @@ typedef struct SlruSharedData
/* LWLocks */
int lwlock_tranche_id;
- LWLockTranche lwlock_tranche;
char lwlock_tranche_name[SLRU_MAX_NAME_LENGTH];
LWLockPadded *buffer_locks;
} SlruSharedData;
@@ -120,7 +119,7 @@ typedef struct SlruCtlData
SlruShared shared;
/*
- * This flag tells whether to fsync writes (true for pg_clog and multixact
+ * This flag tells whether to fsync writes (true for pg_xact and multixact
* stuff, false for pg_subtrans and pg_notify).
*/
bool do_fsync;
diff --git a/src/include/access/spgist.h b/src/include/access/spgist.h
index f39a2d6938..9dca8fde7d 100644
--- a/src/include/access/spgist.h
+++ b/src/include/access/spgist.h
@@ -4,7 +4,7 @@
* Public header file for SP-GiST access method.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/spgist.h
@@ -90,10 +90,13 @@ typedef struct spgChooseOut
} addNode;
struct /* results for spgSplitTuple */
{
- /* Info to form new inner tuple with one node */
+ /* Info to form new upper-level inner tuple with one child tuple */
bool prefixHasPrefix; /* tuple should have a prefix? */
Datum prefixPrefixDatum; /* if so, its value */
- Datum nodeLabel; /* node's label */
+ int prefixNNodes; /* number of nodes */
+ Datum *prefixNodeLabels; /* their labels (or NULL for
+ * no labels) */
+ int childNodeN; /* which node gets child tuple */
/* Info to form new lower-level inner tuple with all old nodes */
bool postfixHasPrefix; /* tuple should have a prefix? */
@@ -134,7 +137,8 @@ typedef struct spgInnerConsistentIn
Datum reconstructedValue; /* value reconstructed at parent */
void *traversalValue; /* opclass-specific traverse value */
- MemoryContext traversalMemoryContext;
+ MemoryContext traversalMemoryContext; /* put new traverse values
+ * here */
int level; /* current level (counting from zero) */
bool returnData; /* original data must be returned? */
@@ -163,8 +167,8 @@ typedef struct spgLeafConsistentIn
ScanKey scankeys; /* array of operators and comparison values */
int nkeys; /* length of array */
- void *traversalValue; /* opclass-specific traverse value */
Datum reconstructedValue; /* value reconstructed at parent */
+ void *traversalValue; /* opclass-specific traverse value */
int level; /* current level (counting from zero) */
bool returnData; /* original data must be returned? */
@@ -179,7 +183,6 @@ typedef struct spgLeafConsistentOut
/* spgutils.c */
-extern Datum spghandler(PG_FUNCTION_ARGS);
extern bytea *spgoptions(Datum reloptions, bool validate);
/* spginsert.c */
@@ -188,7 +191,8 @@ extern IndexBuildResult *spgbuild(Relation heap, Relation index,
extern void spgbuildempty(Relation index);
extern bool spginsert(Relation index, Datum *values, bool *isnull,
ItemPointer ht_ctid, Relation heapRel,
- IndexUniqueCheck checkUnique);
+ IndexUniqueCheck checkUnique,
+ struct IndexInfo *indexInfo);
/* spgscan.c */
extern IndexScanDesc spgbeginscan(Relation rel, int keysz, int orderbysz);
@@ -210,11 +214,4 @@ extern IndexBulkDeleteResult *spgvacuumcleanup(IndexVacuumInfo *info,
/* spgvalidate.c */
extern bool spgvalidate(Oid opclassoid);
-/* spgxlog.c */
-extern void spg_redo(XLogReaderState *record);
-extern void spg_desc(StringInfo buf, XLogReaderState *record);
-extern const char *spg_identify(uint8 info);
-extern void spg_xlog_startup(void);
-extern void spg_xlog_cleanup(void);
-
#endif /* SPGIST_H */
diff --git a/src/include/access/spgist_private.h b/src/include/access/spgist_private.h
index cb8fa9c0b5..4072c050de 100644
--- a/src/include/access/spgist_private.h
+++ b/src/include/access/spgist_private.h
@@ -4,7 +4,7 @@
* Private declarations for SP-GiST access method.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/spgist_private.h
@@ -159,7 +159,7 @@ typedef struct SpGistScanOpaqueData
int iPtr; /* index for scanning through same */
ItemPointerData heapPtrs[MaxIndexTuplesPerPage]; /* TIDs from cur page */
bool recheck[MaxIndexTuplesPerPage]; /* their recheck flags */
- IndexTuple indexTups[MaxIndexTuplesPerPage]; /* reconstructed tuples */
+ HeapTuple reconTups[MaxIndexTuplesPerPage]; /* reconstructed tuples */
/*
* Note: using MaxIndexTuplesPerPage above is a bit hokey since
@@ -354,28 +354,6 @@ typedef SpGistDeadTupleData *SpGistDeadTuple;
* XLOG stuff
*/
-/* XLOG record types for SPGiST */
-#define XLOG_SPGIST_CREATE_INDEX 0x00
-#define XLOG_SPGIST_ADD_LEAF 0x10
-#define XLOG_SPGIST_MOVE_LEAFS 0x20
-#define XLOG_SPGIST_ADD_NODE 0x30
-#define XLOG_SPGIST_SPLIT_TUPLE 0x40
-#define XLOG_SPGIST_PICKSPLIT 0x50
-#define XLOG_SPGIST_VACUUM_LEAF 0x60
-#define XLOG_SPGIST_VACUUM_ROOT 0x70
-#define XLOG_SPGIST_VACUUM_REDIRECT 0x80
-
-/*
- * Some redo functions need an SpGistState, although only a few of its fields
- * need to be valid. spgxlogState carries the required info in xlog records.
- * (See fillFakeState in spgxlog.c for more comments.)
- */
-typedef struct spgxlogState
-{
- TransactionId myXid;
- bool isBuild;
-} spgxlogState;
-
#define STORE_STATE(s, d) \
do { \
(d).myXid = (s)->myXid; \
@@ -383,214 +361,6 @@ typedef struct spgxlogState
} while(0)
/*
- * Backup Blk 0: destination page for leaf tuple
- * Backup Blk 1: parent page (if any)
- */
-typedef struct spgxlogAddLeaf
-{
- bool newPage; /* init dest page? */
- bool storesNulls; /* page is in the nulls tree? */
- OffsetNumber offnumLeaf; /* offset where leaf tuple gets placed */
- OffsetNumber offnumHeadLeaf; /* offset of head tuple in chain, if any */
-
- OffsetNumber offnumParent; /* where the parent downlink is, if any */
- uint16 nodeI;
-
- /* new leaf tuple follows (unaligned!) */
-} spgxlogAddLeaf;
-
-/*
- * Backup Blk 0: source leaf page
- * Backup Blk 1: destination leaf page
- * Backup Blk 2: parent page
- */
-typedef struct spgxlogMoveLeafs
-{
- uint16 nMoves; /* number of tuples moved from source page */
- bool newPage; /* init dest page? */
- bool replaceDead; /* are we replacing a DEAD source tuple? */
- bool storesNulls; /* pages are in the nulls tree? */
-
- /* where the parent downlink is */
- OffsetNumber offnumParent;
- uint16 nodeI;
-
- spgxlogState stateSrc;
-
- /*----------
- * data follows:
- * array of deleted tuple numbers, length nMoves
- * array of inserted tuple numbers, length nMoves + 1 or 1
- * list of leaf tuples, length nMoves + 1 or 1 (unaligned!)
- *
- * Note: if replaceDead is true then there is only one inserted tuple
- * number and only one leaf tuple in the data, because we are not copying
- * the dead tuple from the source
- *----------
- */
- OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
-} spgxlogMoveLeafs;
-
-#define SizeOfSpgxlogMoveLeafs offsetof(spgxlogMoveLeafs, offsets)
-
-/*
- * Backup Blk 0: original page
- * Backup Blk 1: where new tuple goes, if not same place
- * Backup Blk 2: where parent downlink is, if updated and different from
- * the old and new
- */
-typedef struct spgxlogAddNode
-{
- /*
- * Offset of the original inner tuple, in the original page (on backup
- * block 0).
- */
- OffsetNumber offnum;
-
- /*
- * Offset of the new tuple, on the new page (on backup block 1). Invalid,
- * if we overwrote the old tuple in the original page).
- */
- OffsetNumber offnumNew;
- bool newPage; /* init new page? */
-
- /*----
- * Where is the parent downlink? parentBlk indicates which page it's on,
- * and offnumParent is the offset within the page. The possible values for
- * parentBlk are:
- *
- * 0: parent == original page
- * 1: parent == new page
- * 2: parent == different page (blk ref 2)
- * -1: parent not updated
- *----
- */
- int8 parentBlk;
- OffsetNumber offnumParent; /* offset within the parent page */
-
- uint16 nodeI;
-
- spgxlogState stateSrc;
-
- /*
- * updated inner tuple follows (unaligned!)
- */
-} spgxlogAddNode;
-
-/*
- * Backup Blk 0: where the prefix tuple goes
- * Backup Blk 1: where the postfix tuple goes (if different page)
- */
-typedef struct spgxlogSplitTuple
-{
- /* where the prefix tuple goes */
- OffsetNumber offnumPrefix;
-
- /* where the postfix tuple goes */
- OffsetNumber offnumPostfix;
- bool newPage; /* need to init that page? */
- bool postfixBlkSame; /* was postfix tuple put on same page as
- * prefix? */
-
- /*
- * new prefix inner tuple follows, then new postfix inner tuple (both are
- * unaligned!)
- */
-} spgxlogSplitTuple;
-
-/*
- * Buffer references in the rdata array are:
- * Backup Blk 0: Src page (only if not root)
- * Backup Blk 1: Dest page (if used)
- * Backup Blk 2: Inner page
- * Backup Blk 3: Parent page (if any, and different from Inner)
- */
-typedef struct spgxlogPickSplit
-{
- bool isRootSplit;
-
- uint16 nDelete; /* n to delete from Src */
- uint16 nInsert; /* n to insert on Src and/or Dest */
- bool initSrc; /* re-init the Src page? */
- bool initDest; /* re-init the Dest page? */
-
- /* where to put new inner tuple */
- OffsetNumber offnumInner;
- bool initInner; /* re-init the Inner page? */
-
- bool storesNulls; /* pages are in the nulls tree? */
-
- /* where the parent downlink is, if any */
- bool innerIsParent; /* is parent the same as inner page? */
- OffsetNumber offnumParent;
- uint16 nodeI;
-
- spgxlogState stateSrc;
-
- /*----------
- * data follows:
- * array of deleted tuple numbers, length nDelete
- * array of inserted tuple numbers, length nInsert
- * array of page selector bytes for inserted tuples, length nInsert
- * new inner tuple (unaligned!)
- * list of leaf tuples, length nInsert (unaligned!)
- *----------
- */
- OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
-} spgxlogPickSplit;
-
-#define SizeOfSpgxlogPickSplit offsetof(spgxlogPickSplit, offsets)
-
-typedef struct spgxlogVacuumLeaf
-{
- uint16 nDead; /* number of tuples to become DEAD */
- uint16 nPlaceholder; /* number of tuples to become PLACEHOLDER */
- uint16 nMove; /* number of tuples to move */
- uint16 nChain; /* number of tuples to re-chain */
-
- spgxlogState stateSrc;
-
- /*----------
- * data follows:
- * tuple numbers to become DEAD
- * tuple numbers to become PLACEHOLDER
- * tuple numbers to move from (and replace with PLACEHOLDER)
- * tuple numbers to move to (replacing what is there)
- * tuple numbers to update nextOffset links of
- * tuple numbers to insert in nextOffset links
- *----------
- */
- OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
-} spgxlogVacuumLeaf;
-
-#define SizeOfSpgxlogVacuumLeaf offsetof(spgxlogVacuumLeaf, offsets)
-
-typedef struct spgxlogVacuumRoot
-{
- /* vacuum a root page when it is also a leaf */
- uint16 nDelete; /* number of tuples to delete */
-
- spgxlogState stateSrc;
-
- /* offsets of tuples to delete follow */
- OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
-} spgxlogVacuumRoot;
-
-#define SizeOfSpgxlogVacuumRoot offsetof(spgxlogVacuumRoot, offsets)
-
-typedef struct spgxlogVacuumRedirect
-{
- uint16 nToPlaceholder; /* number of redirects to make placeholders */
- OffsetNumber firstPlaceholder; /* first placeholder tuple to remove */
- TransactionId newestRedirectXid; /* newest XID of removed redirects */
-
- /* offsets of redirect tuples to make placeholders follow */
- OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
-} spgxlogVacuumRedirect;
-
-#define SizeOfSpgxlogVacuumRedirect offsetof(spgxlogVacuumRedirect, offsets)
-
-/*
* The "flags" argument for SpGistGetBuffer should be either GBUF_LEAF to
* get a leaf page, or GBUF_INNER_PARITY(blockNumber) to get an inner
* page in the same triple-parity group as the specified block number.
diff --git a/src/include/access/spgxlog.h b/src/include/access/spgxlog.h
new file mode 100644
index 0000000000..ff597f75db
--- /dev/null
+++ b/src/include/access/spgxlog.h
@@ -0,0 +1,257 @@
+/*-------------------------------------------------------------------------
+ *
+ * spgxlog.h
+ * xlog declarations for SP-GiST access method.
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/access/spgxlog.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef SPGXLOG_H
+#define SPGXLOG_H
+
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+#include "storage/off.h"
+
+/* XLOG record types for SPGiST */
+#define XLOG_SPGIST_CREATE_INDEX 0x00
+#define XLOG_SPGIST_ADD_LEAF 0x10
+#define XLOG_SPGIST_MOVE_LEAFS 0x20
+#define XLOG_SPGIST_ADD_NODE 0x30
+#define XLOG_SPGIST_SPLIT_TUPLE 0x40
+#define XLOG_SPGIST_PICKSPLIT 0x50
+#define XLOG_SPGIST_VACUUM_LEAF 0x60
+#define XLOG_SPGIST_VACUUM_ROOT 0x70
+#define XLOG_SPGIST_VACUUM_REDIRECT 0x80
+
+/*
+ * Some redo functions need an SpGistState, although only a few of its fields
+ * need to be valid. spgxlogState carries the required info in xlog records.
+ * (See fillFakeState in spgxlog.c for more comments.)
+ */
+typedef struct spgxlogState
+{
+ TransactionId myXid;
+ bool isBuild;
+} spgxlogState;
+
+/*
+ * Backup Blk 0: destination page for leaf tuple
+ * Backup Blk 1: parent page (if any)
+ */
+typedef struct spgxlogAddLeaf
+{
+ bool newPage; /* init dest page? */
+ bool storesNulls; /* page is in the nulls tree? */
+ OffsetNumber offnumLeaf; /* offset where leaf tuple gets placed */
+ OffsetNumber offnumHeadLeaf; /* offset of head tuple in chain, if any */
+
+ OffsetNumber offnumParent; /* where the parent downlink is, if any */
+ uint16 nodeI;
+
+ /* new leaf tuple follows (unaligned!) */
+} spgxlogAddLeaf;
+
+/*
+ * Backup Blk 0: source leaf page
+ * Backup Blk 1: destination leaf page
+ * Backup Blk 2: parent page
+ */
+typedef struct spgxlogMoveLeafs
+{
+ uint16 nMoves; /* number of tuples moved from source page */
+ bool newPage; /* init dest page? */
+ bool replaceDead; /* are we replacing a DEAD source tuple? */
+ bool storesNulls; /* pages are in the nulls tree? */
+
+ /* where the parent downlink is */
+ OffsetNumber offnumParent;
+ uint16 nodeI;
+
+ spgxlogState stateSrc;
+
+ /*----------
+ * data follows:
+ * array of deleted tuple numbers, length nMoves
+ * array of inserted tuple numbers, length nMoves + 1 or 1
+ * list of leaf tuples, length nMoves + 1 or 1 (unaligned!)
+ *
+ * Note: if replaceDead is true then there is only one inserted tuple
+ * number and only one leaf tuple in the data, because we are not copying
+ * the dead tuple from the source
+ *----------
+ */
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} spgxlogMoveLeafs;
+
+#define SizeOfSpgxlogMoveLeafs offsetof(spgxlogMoveLeafs, offsets)
+
+/*
+ * Backup Blk 0: original page
+ * Backup Blk 1: where new tuple goes, if not same place
+ * Backup Blk 2: where parent downlink is, if updated and different from
+ * the old and new
+ */
+typedef struct spgxlogAddNode
+{
+ /*
+ * Offset of the original inner tuple, in the original page (on backup
+ * block 0).
+ */
+ OffsetNumber offnum;
+
+ /*
+ * Offset of the new tuple, on the new page (on backup block 1). Invalid,
+ * if we overwrote the old tuple in the original page).
+ */
+ OffsetNumber offnumNew;
+ bool newPage; /* init new page? */
+
+ /*----
+ * Where is the parent downlink? parentBlk indicates which page it's on,
+ * and offnumParent is the offset within the page. The possible values for
+ * parentBlk are:
+ *
+ * 0: parent == original page
+ * 1: parent == new page
+ * 2: parent == different page (blk ref 2)
+ * -1: parent not updated
+ *----
+ */
+ int8 parentBlk;
+ OffsetNumber offnumParent; /* offset within the parent page */
+
+ uint16 nodeI;
+
+ spgxlogState stateSrc;
+
+ /*
+ * updated inner tuple follows (unaligned!)
+ */
+} spgxlogAddNode;
+
+/*
+ * Backup Blk 0: where the prefix tuple goes
+ * Backup Blk 1: where the postfix tuple goes (if different page)
+ */
+typedef struct spgxlogSplitTuple
+{
+ /* where the prefix tuple goes */
+ OffsetNumber offnumPrefix;
+
+ /* where the postfix tuple goes */
+ OffsetNumber offnumPostfix;
+ bool newPage; /* need to init that page? */
+ bool postfixBlkSame; /* was postfix tuple put on same page as
+ * prefix? */
+
+ /*
+ * new prefix inner tuple follows, then new postfix inner tuple (both are
+ * unaligned!)
+ */
+} spgxlogSplitTuple;
+
+/*
+ * Buffer references in the rdata array are:
+ * Backup Blk 0: Src page (only if not root)
+ * Backup Blk 1: Dest page (if used)
+ * Backup Blk 2: Inner page
+ * Backup Blk 3: Parent page (if any, and different from Inner)
+ */
+typedef struct spgxlogPickSplit
+{
+ bool isRootSplit;
+
+ uint16 nDelete; /* n to delete from Src */
+ uint16 nInsert; /* n to insert on Src and/or Dest */
+ bool initSrc; /* re-init the Src page? */
+ bool initDest; /* re-init the Dest page? */
+
+ /* where to put new inner tuple */
+ OffsetNumber offnumInner;
+ bool initInner; /* re-init the Inner page? */
+
+ bool storesNulls; /* pages are in the nulls tree? */
+
+ /* where the parent downlink is, if any */
+ bool innerIsParent; /* is parent the same as inner page? */
+ OffsetNumber offnumParent;
+ uint16 nodeI;
+
+ spgxlogState stateSrc;
+
+ /*----------
+ * data follows:
+ * array of deleted tuple numbers, length nDelete
+ * array of inserted tuple numbers, length nInsert
+ * array of page selector bytes for inserted tuples, length nInsert
+ * new inner tuple (unaligned!)
+ * list of leaf tuples, length nInsert (unaligned!)
+ *----------
+ */
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} spgxlogPickSplit;
+
+#define SizeOfSpgxlogPickSplit offsetof(spgxlogPickSplit, offsets)
+
+typedef struct spgxlogVacuumLeaf
+{
+ uint16 nDead; /* number of tuples to become DEAD */
+ uint16 nPlaceholder; /* number of tuples to become PLACEHOLDER */
+ uint16 nMove; /* number of tuples to move */
+ uint16 nChain; /* number of tuples to re-chain */
+
+ spgxlogState stateSrc;
+
+ /*----------
+ * data follows:
+ * tuple numbers to become DEAD
+ * tuple numbers to become PLACEHOLDER
+ * tuple numbers to move from (and replace with PLACEHOLDER)
+ * tuple numbers to move to (replacing what is there)
+ * tuple numbers to update nextOffset links of
+ * tuple numbers to insert in nextOffset links
+ *----------
+ */
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} spgxlogVacuumLeaf;
+
+#define SizeOfSpgxlogVacuumLeaf offsetof(spgxlogVacuumLeaf, offsets)
+
+typedef struct spgxlogVacuumRoot
+{
+ /* vacuum a root page when it is also a leaf */
+ uint16 nDelete; /* number of tuples to delete */
+
+ spgxlogState stateSrc;
+
+ /* offsets of tuples to delete follow */
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} spgxlogVacuumRoot;
+
+#define SizeOfSpgxlogVacuumRoot offsetof(spgxlogVacuumRoot, offsets)
+
+typedef struct spgxlogVacuumRedirect
+{
+ uint16 nToPlaceholder; /* number of redirects to make placeholders */
+ OffsetNumber firstPlaceholder; /* first placeholder tuple to remove */
+ TransactionId newestRedirectXid; /* newest XID of removed redirects */
+
+ /* offsets of redirect tuples to make placeholders follow */
+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} spgxlogVacuumRedirect;
+
+#define SizeOfSpgxlogVacuumRedirect offsetof(spgxlogVacuumRedirect, offsets)
+
+extern void spg_redo(XLogReaderState *record);
+extern void spg_desc(StringInfo buf, XLogReaderState *record);
+extern const char *spg_identify(uint8 info);
+extern void spg_xlog_startup(void);
+extern void spg_xlog_cleanup(void);
+extern void spg_mask(char *pagedata, BlockNumber blkno);
+
+#endif /* SPGXLOG_H */
diff --git a/src/include/access/stratnum.h b/src/include/access/stratnum.h
index eabced569c..489e5c595e 100644
--- a/src/include/access/stratnum.h
+++ b/src/include/access/stratnum.h
@@ -4,7 +4,7 @@
* POSTGRES strategy number definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/stratnum.h
diff --git a/src/include/access/subtrans.h b/src/include/access/subtrans.h
index f39c6d388f..847359873a 100644
--- a/src/include/access/subtrans.h
+++ b/src/include/access/subtrans.h
@@ -3,7 +3,7 @@
*
* PostgreSQL subtransaction-log manager
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/subtrans.h
@@ -14,7 +14,7 @@
/* Number of SLRU buffers to use for subtrans */
#define NUM_SUBTRANS_BUFFERS 32
-extern void SubTransSetParent(TransactionId xid, TransactionId parent, bool overwriteOK);
+extern void SubTransSetParent(TransactionId xid, TransactionId parent);
extern TransactionId SubTransGetParent(TransactionId xid);
extern TransactionId SubTransGetTopmostTransaction(TransactionId xid);
diff --git a/src/include/access/sysattr.h b/src/include/access/sysattr.h
index 1d74d51ab7..348c67ed86 100644
--- a/src/include/access/sysattr.h
+++ b/src/include/access/sysattr.h
@@ -4,7 +4,7 @@
* POSTGRES system attribute definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/sysattr.h
diff --git a/src/include/access/timeline.h b/src/include/access/timeline.h
index 2b333bc10e..c1911feb16 100644
--- a/src/include/access/timeline.h
+++ b/src/include/access/timeline.h
@@ -3,7 +3,7 @@
*
* Functions for reading and writing timeline history files.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/timeline.h
@@ -17,7 +17,7 @@
/*
* A list of these structs describes the timeline history of the server. Each
* TimeLineHistoryEntry represents a piece of WAL belonging to the history,
- * from newest to oldest. All WAL positions between 'begin' and 'end' belong to
+ * from newest to oldest. All WAL locations between 'begin' and 'end' belong to
* the timeline represented by the entry. Together the 'begin' and 'end'
* pointers of all the entries form a contiguous line from beginning of time
* to infinity.
diff --git a/src/include/access/transam.h b/src/include/access/transam.h
index 395953a6f1..e357d5dea8 100644
--- a/src/include/access/transam.h
+++ b/src/include/access/transam.h
@@ -5,7 +5,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
@@ -138,6 +138,12 @@ typedef struct VariableCacheData
*/
TransactionId latestCompletedXid; /* newest XID that has committed or
* aborted */
+
+ /*
+ * These fields are protected by CLogTruncationLock
+ */
+ TransactionId oldestClogXid; /* oldest it's safe to look up in clog */
+
} VariableCacheData;
typedef VariableCacheData *VariableCache;
@@ -189,6 +195,7 @@ extern void ExtendLogs(TransactionId xid);
extern TransactionId ReadNewTransactionId(void);
extern void SetTransactionIdLimit(TransactionId oldest_datfrozenxid,
Oid oldest_datoid);
+extern void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid);
extern bool ForceTransactionIdLimitUpdate(void);
extern Oid GetNewObjectId(void);
diff --git a/src/include/access/tsmapi.h b/src/include/access/tsmapi.h
index 2e605c3406..d07b3f25a9 100644
--- a/src/include/access/tsmapi.h
+++ b/src/include/access/tsmapi.h
@@ -3,7 +3,7 @@
* tsmapi.h
* API for tablesample methods
*
- * Copyright (c) 2015-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2015-2017, PostgreSQL Global Development Group
*
* src/include/access/tsmapi.h
*
diff --git a/src/include/access/tupconvert.h b/src/include/access/tupconvert.h
index 10556eec7e..e86cfd56c8 100644
--- a/src/include/access/tupconvert.h
+++ b/src/include/access/tupconvert.h
@@ -4,7 +4,7 @@
* Tuple conversion support.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/tupconvert.h
@@ -38,6 +38,10 @@ extern TupleConversionMap *convert_tuples_by_name(TupleDesc indesc,
TupleDesc outdesc,
const char *msg);
+extern AttrNumber *convert_tuples_by_name_map(TupleDesc indesc,
+ TupleDesc outdesc,
+ const char *msg);
+
extern HeapTuple do_convert_tuple(HeapTuple tuple, TupleConversionMap *map);
extern void free_conversion_map(TupleConversionMap *map);
diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h
index de18f7488c..b48f839028 100644
--- a/src/include/access/tupdesc.h
+++ b/src/include/access/tupdesc.h
@@ -4,7 +4,7 @@
* POSTGRES tuple descriptor definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/tupdesc.h
@@ -119,6 +119,13 @@ extern void TupleDescInitEntry(TupleDesc desc,
int32 typmod,
int attdim);
+extern void TupleDescInitBuiltinEntry(TupleDesc desc,
+ AttrNumber attributeNumber,
+ const char *attributeName,
+ Oid oidtypeid,
+ int32 typmod,
+ int attdim);
+
extern void TupleDescInitEntryCollation(TupleDesc desc,
AttrNumber attributeNumber,
Oid collationid);
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index a24f1dda30..b5369108cc 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -4,7 +4,7 @@
* Tuple macros used by both index tuples and heap tuples.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/tupmacs.h
diff --git a/src/include/access/tuptoaster.h b/src/include/access/tuptoaster.h
index 7b5ae6245e..c7abeed812 100644
--- a/src/include/access/tuptoaster.h
+++ b/src/include/access/tuptoaster.h
@@ -4,7 +4,7 @@
* POSTGRES definitions for external and compressed storage
* of variable size attributes.
*
- * Copyright (c) 2000-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2000-2017, PostgreSQL Global Development Group
*
* src/include/access/tuptoaster.h
*
@@ -142,7 +142,7 @@ extern HeapTuple toast_insert_or_update(Relation rel,
* Called by heap_delete().
* ----------
*/
-extern void toast_delete(Relation rel, HeapTuple oldtup);
+extern void toast_delete(Relation rel, HeapTuple oldtup, bool is_speculative);
/* ----------
* heap_tuple_fetch_attr() -
@@ -194,6 +194,17 @@ extern Datum toast_flatten_tuple_to_datum(HeapTupleHeader tup,
TupleDesc tupleDesc);
/* ----------
+ * toast_build_flattened_tuple -
+ *
+ * Build a tuple containing no out-of-line toasted fields.
+ * (This does not eliminate compressed or short-header datums.)
+ * ----------
+ */
+extern HeapTuple toast_build_flattened_tuple(TupleDesc tupleDesc,
+ Datum *values,
+ bool *isnull);
+
+/* ----------
* toast_compress_datum -
*
* Create a compressed version of a varlena datum, if possible
diff --git a/src/include/access/twophase.h b/src/include/access/twophase.h
index 4d63bbd5dc..d03af5f2c2 100644
--- a/src/include/access/twophase.h
+++ b/src/include/access/twophase.h
@@ -4,7 +4,7 @@
* Two-phase-commit related declarations.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/twophase.h
@@ -46,14 +46,15 @@ extern bool StandbyTransactionIdIsPrepared(TransactionId xid);
extern TransactionId PrescanPreparedTransactions(TransactionId **xids_p,
int *nxids_p);
-extern void StandbyRecoverPreparedTransactions(bool overwriteOK);
+extern void StandbyRecoverPreparedTransactions(void);
extern void RecoverPreparedTransactions(void);
-extern void RecreateTwoPhaseFile(TransactionId xid, void *content, int len);
-extern void RemoveTwoPhaseFile(TransactionId xid, bool giveWarning);
-
extern void CheckPointTwoPhase(XLogRecPtr redo_horizon);
extern void FinishPreparedTransaction(const char *gid, bool isCommit);
+extern void PrepareRedoAdd(char *buf, XLogRecPtr start_lsn,
+ XLogRecPtr end_lsn);
+extern void PrepareRedoRemove(TransactionId xid, bool giveWarning);
+extern void restoreTwoPhaseData(void);
#endif /* TWOPHASE_H */
diff --git a/src/include/access/twophase_rmgr.h b/src/include/access/twophase_rmgr.h
index 55627bfcc4..32b6475dd9 100644
--- a/src/include/access/twophase_rmgr.h
+++ b/src/include/access/twophase_rmgr.h
@@ -4,7 +4,7 @@
* Two-phase-commit resource managers definition
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/twophase_rmgr.h
diff --git a/src/include/access/valid.h b/src/include/access/valid.h
index 30af9df429..72f2bb6ac2 100644
--- a/src/include/access/valid.h
+++ b/src/include/access/valid.h
@@ -4,7 +4,7 @@
* POSTGRES tuple qualification validity definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/valid.h
diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h
index 00bbd4c2d9..a3796f2902 100644
--- a/src/include/access/visibilitymap.h
+++ b/src/include/access/visibilitymap.h
@@ -4,7 +4,7 @@
* visibility map interface
*
*
- * Portions Copyright (c) 2007-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 2007-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/visibilitymap.h
@@ -26,7 +26,7 @@
#define VISIBILITYMAP_ALL_VISIBLE 0x01
#define VISIBILITYMAP_ALL_FROZEN 0x02
#define VISIBILITYMAP_VALID_BITS 0x03 /* OR of all valid
- * visiblitymap flags bits */
+ * visibilitymap flags bits */
/* Macros for visibilitymap test */
#define VM_ALL_VISIBLE(r, b, v) \
diff --git a/src/include/access/xact.h b/src/include/access/xact.h
index 063c8c2af3..2186e706a6 100644
--- a/src/include/access/xact.h
+++ b/src/include/access/xact.h
@@ -5,7 +5,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
@@ -70,14 +70,33 @@ typedef enum
* apply */
} SyncCommitLevel;
-/* Define the default setting for synchonous_commit */
+/* Define the default setting for synchronous_commit */
#define SYNCHRONOUS_COMMIT_ON SYNCHRONOUS_COMMIT_REMOTE_FLUSH
/* Synchronous commit level */
extern int synchronous_commit;
-/* Kluge for 2PC support */
-extern bool MyXactAccessedTempRel;
+/*
+ * Miscellaneous flag bits to record events which occur on the top level
+ * transaction. These flags are only persisted in MyXactFlags and are intended
+ * so we remember to do certain things later in the transaction. This is
+ * globally accessible, so can be set from anywhere in the code which requires
+ * recording flags.
+ */
+extern int MyXactFlags;
+
+/*
+ * XACT_FLAGS_ACCESSEDTEMPREL - set when a temporary relation is accessed. We
+ * don't allow PREPARE TRANSACTION in that case.
+ */
+#define XACT_FLAGS_ACCESSEDTEMPREL (1U << 0)
+
+/*
+ * XACT_FLAGS_ACQUIREDACCESSEXCLUSIVELOCK - records whether the top level xact
+ * logged any Access Exclusive Locks.
+ */
+#define XACT_FLAGS_ACQUIREDACCESSEXCLUSIVELOCK (1U << 1)
+
/*
* start- and end-of-transaction callbacks for dynamically loaded modules
@@ -155,6 +174,7 @@ typedef void (*GTMCallback) (GTMEvent event, void *arg);
#define XACT_XINFO_HAS_INVALS (1U << 3)
#define XACT_XINFO_HAS_TWOPHASE (1U << 4)
#define XACT_XINFO_HAS_ORIGIN (1U << 5)
+#define XACT_XINFO_HAS_AE_LOCKS (1U << 6)
/*
* Also stored in xinfo, these indicating a variety of additional actions that
@@ -243,7 +263,6 @@ typedef struct xl_xact_twophase
{
TransactionId xid;
} xl_xact_twophase;
-#define MinSizeOfXactInvals offsetof(xl_xact_invals, msgs)
typedef struct xl_xact_origin
{
@@ -420,12 +439,13 @@ extern XLogRecPtr XactLogCommitRecord(TimestampTz commit_time,
int nrels, RelFileNode *rels,
int nmsgs, SharedInvalidationMessage *msgs,
bool relcacheInval, bool forceSync,
+ int xactflags,
TransactionId twophase_xid);
extern XLogRecPtr XactLogAbortRecord(TimestampTz abort_time,
int nsubxacts, TransactionId *subxacts,
int nrels, RelFileNode *rels,
- TransactionId twophase_xid);
+ int xactflags, TransactionId twophase_xid);
extern void xact_redo(XLogReaderState *record);
/* xactdesc.c */
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 0f5a0a3720..4a633a7fad 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -1,9 +1,9 @@
/*
* xlog.h
*
- * PostgreSQL transaction log manager
+ * PostgreSQL write-ahead log manager
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xlog.h
@@ -86,6 +86,7 @@ typedef enum
#ifdef PGXC
RECOVERY_TARGET_BARRIER,
#endif
+ RECOVERY_TARGET_LSN,
RECOVERY_TARGET_IMMEDIATE
} RecoveryTargetType;
@@ -96,8 +97,8 @@ extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd;
extern bool reachedConsistency;
/* these variables are GUC parameters related to XLOG */
-extern int min_wal_size;
-extern int max_wal_size;
+extern int min_wal_size_mb;
+extern int max_wal_size_mb;
extern int wal_keep_segments;
extern int XLOGbuffers;
extern int XLogArchiveTimeout;
@@ -107,6 +108,8 @@ extern bool EnableHotStandby;
extern bool fullPageWrites;
extern bool wal_log_hints;
extern bool wal_compression;
+extern bool *wal_consistency_checking;
+extern char *wal_consistency_checking_string;
extern bool log_checkpoints;
extern int CheckPointSegments;
@@ -186,6 +189,13 @@ extern bool XLOG_DEBUG;
#define CHECKPOINT_CAUSE_XLOG 0x0040 /* XLOG consumption */
#define CHECKPOINT_CAUSE_TIME 0x0080 /* Elapsed time */
+/*
+ * Flag bits for the record being inserted, set using XLogSetRecordFlags().
+ */
+#define XLOG_INCLUDE_ORIGIN 0x01 /* include the replication origin */
+#define XLOG_MARK_UNIMPORTANT 0x02 /* record not important for durability */
+
+
/* Checkpoint statistics */
typedef struct CheckpointStatsData
{
@@ -213,7 +223,9 @@ extern CheckpointStatsData CheckpointStats;
struct XLogRecData;
-extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata, XLogRecPtr fpw_lsn);
+extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata,
+ XLogRecPtr fpw_lsn,
+ uint8 flags);
extern void XLogFlush(XLogRecPtr RecPtr);
extern bool XLogBackgroundFlush(void);
extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
@@ -247,6 +259,7 @@ extern char *XLogFileNameP(TimeLineID tli, XLogSegNo segno);
extern void UpdateControlFile(void);
extern uint64 GetSystemIdentifier(void);
+extern char *GetMockAuthenticationNonce(void);
extern bool DataChecksumsEnabled(void);
extern XLogRecPtr GetFakeLSNForUnloggedRel(void);
extern Size XLOGShmemSize(void);
@@ -264,6 +277,7 @@ extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p)
extern XLogRecPtr GetRedoRecPtr(void);
extern XLogRecPtr GetInsertRecPtr(void);
extern XLogRecPtr GetFlushRecPtr(void);
+extern XLogRecPtr GetLastImportantRecPtr(void);
extern void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch);
extern void RemovePromoteSignalFiles(void);
@@ -277,8 +291,26 @@ extern void assign_max_wal_size(int newval, void *extra);
extern void assign_checkpoint_completion_target(double newval, void *extra);
/*
- * Starting/stopping a base backup
+ * Routines to start, stop, and get status of a base backup.
+ */
+
+/*
+ * Session-level status of base backups
+ *
+ * This is used in parallel with the shared memory status to control parallel
+ * execution of base backup functions for a given session, be it a backend
+ * dedicated to replication or a normal backend connected to a database. The
+ * update of the session-level status happens at the same time as the shared
+ * memory counters to keep a consistent global and local state of the backups
+ * running.
*/
+typedef enum SessionBackupState
+{
+ SESSION_BACKUP_NONE,
+ SESSION_BACKUP_EXCLUSIVE,
+ SESSION_BACKUP_NON_EXCLUSIVE
+} SessionBackupState;
+
extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast,
TimeLineID *starttli_p, StringInfo labelfile, DIR *tblspcdir,
List **tablespaces, StringInfo tblspcmapfile, bool infotbssize,
@@ -286,6 +318,7 @@ extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast,
extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive,
TimeLineID *stoptli_p);
extern void do_pg_abort_backup(void);
+extern SessionBackupState get_backup_status(void);
/* File path names (all relative to $PGDATA) */
#define BACKUP_LABEL_FILE "backup_label"
diff --git a/src/include/access/xlog_fn.h b/src/include/access/xlog_fn.h
deleted file mode 100644
index 576a4dc741..0000000000
--- a/src/include/access/xlog_fn.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * xlog_fn.h
- *
- * PostgreSQL transaction log SQL-callable function declarations
- *
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * src/include/access/xlog_fn.h
- */
-#ifndef XLOG_FN_H
-#define XLOG_FN_H
-
-#include "fmgr.h"
-
-extern Datum pg_start_backup(PG_FUNCTION_ARGS);
-extern Datum pg_stop_backup(PG_FUNCTION_ARGS);
-extern Datum pg_stop_backup_v2(PG_FUNCTION_ARGS);
-extern Datum pg_switch_xlog(PG_FUNCTION_ARGS);
-extern Datum pg_create_restore_point(PG_FUNCTION_ARGS);
-extern Datum pg_current_xlog_location(PG_FUNCTION_ARGS);
-extern Datum pg_current_xlog_insert_location(PG_FUNCTION_ARGS);
-extern Datum pg_current_xlog_flush_location(PG_FUNCTION_ARGS);
-extern Datum pg_last_xlog_receive_location(PG_FUNCTION_ARGS);
-extern Datum pg_last_xlog_replay_location(PG_FUNCTION_ARGS);
-extern Datum pg_last_xact_replay_timestamp(PG_FUNCTION_ARGS);
-extern Datum pg_xlogfile_name_offset(PG_FUNCTION_ARGS);
-extern Datum pg_xlogfile_name(PG_FUNCTION_ARGS);
-extern Datum pg_is_in_recovery(PG_FUNCTION_ARGS);
-extern Datum pg_xlog_replay_pause(PG_FUNCTION_ARGS);
-extern Datum pg_xlog_replay_resume(PG_FUNCTION_ARGS);
-extern Datum pg_is_xlog_replay_paused(PG_FUNCTION_ARGS);
-extern Datum pg_xlog_location_diff(PG_FUNCTION_ARGS);
-extern Datum pg_is_in_backup(PG_FUNCTION_ARGS);
-extern Datum pg_backup_start_time(PG_FUNCTION_ARGS);
-
-#endif /* XLOG_FN_H */
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index 0a595ccc48..6e2bfd0ad0 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -1,7 +1,7 @@
/*
* xlog_internal.h
*
- * PostgreSQL transaction log internal declarations
+ * PostgreSQL write-ahead log internal declarations
*
* NOTE: this file is intended to contain declarations useful for
* manipulating the XLOG files directly, but it is not supposed to be
@@ -9,9 +9,9 @@
* So the XLogRecord typedef and associated stuff appear in xlogrecord.h.
*
* Note: This file must be includable in both frontend and backend contexts,
- * to allow stand-alone tools like pg_receivexlog to deal with WAL files.
+ * to allow stand-alone tools like pg_receivewal to deal with WAL files.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xlog_internal.h
@@ -31,7 +31,7 @@
/*
* Each page of XLOG file has a header like this:
*/
-#define XLOG_PAGE_MAGIC 0xD093 /* can be used as WAL version indicator */
+#define XLOG_PAGE_MAGIC 0xD097 /* can be used as WAL version indicator */
typedef struct XLogPageHeaderData
{
@@ -128,7 +128,7 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
/*
* The XLog directory and control file (relative to $PGDATA)
*/
-#define XLOGDIR "pg_xlog"
+#define XLOGDIR "pg_wal"
#define XLOG_CONTROL_FILE "global/pg_control"
/*
@@ -153,7 +153,7 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN)
/*
- * XLOG segment with .partial suffix. Used by pg_receivexlog and at end of
+ * XLOG segment with .partial suffix. Used by pg_receivewal and at end of
* archive recovery, when we want to archive a WAL segment but it might not
* be complete yet.
*/
@@ -266,6 +266,9 @@ typedef enum
* "VACUUM". rm_desc can then be called to obtain additional detail for the
* record, if available (e.g. the last block).
*
+ * rm_mask takes as input a page modified by the resource manager and masks
+ * out bits that shouldn't be flagged by wal_consistency_checking.
+ *
* RmgrTable[] is indexed by RmgrId values (see rmgrlist.h).
*/
typedef struct RmgrData
@@ -276,6 +279,7 @@ typedef struct RmgrData
const char *(*rm_identify) (uint8 info);
void (*rm_startup) (void);
void (*rm_cleanup) (void);
+ void (*rm_mask) (char *pagedata, BlockNumber blkno);
} RmgrData;
extern const RmgrData RmgrTable[];
@@ -283,8 +287,8 @@ extern const RmgrData RmgrTable[];
/*
* Exported to support xlog switching from checkpointer
*/
-extern pg_time_t GetLastSegSwitchTime(void);
-extern XLogRecPtr RequestXLogSwitch(void);
+extern pg_time_t GetLastSegSwitchData(XLogRecPtr *lastSwitchLSN);
+extern XLogRecPtr RequestXLogSwitch(bool mark_unimportant);
extern void GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli);
diff --git a/src/include/access/xlogdefs.h b/src/include/access/xlogdefs.h
index c2c6632e63..0f07bb2674 100644
--- a/src/include/access/xlogdefs.h
+++ b/src/include/access/xlogdefs.h
@@ -1,10 +1,10 @@
/*
* xlogdefs.h
*
- * Postgres transaction log manager record pointer and
+ * Postgres write-ahead log manager record pointer and
* timeline number definitions
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xlogdefs.h
diff --git a/src/include/access/xloginsert.h b/src/include/access/xloginsert.h
index cc0177ef4e..d30786fa0d 100644
--- a/src/include/access/xloginsert.h
+++ b/src/include/access/xloginsert.h
@@ -3,7 +3,7 @@
*
* Functions for generating WAL records
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xloginsert.h
@@ -40,7 +40,7 @@
/* prototypes for public functions in xloginsert.c: */
extern void XLogBeginInsert(void);
-extern void XLogIncludeOrigin(void);
+extern void XLogSetRecordFlags(uint8 flags);
extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info);
extern void XLogEnsureRecordSpace(int nbuffers, int ndatas);
extern void XLogRegisterData(char *data, int len);
diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h
index deaa7f5128..956c9bd3a8 100644
--- a/src/include/access/xlogreader.h
+++ b/src/include/access/xlogreader.h
@@ -3,7 +3,7 @@
* xlogreader.h
* Definitions for the generic XLog reading facility
*
- * Portions Copyright (c) 2013-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 2013-2017, PostgreSQL Global Development Group
*
* IDENTIFICATION
* src/include/access/xlogreader.h
@@ -51,7 +51,8 @@ typedef struct
uint8 flags;
/* Information on full-page image, if any */
- bool has_image;
+ bool has_image; /* has image, even for consistency checking */
+ bool apply_image; /* has image that should be restored */
char *bkp_image;
uint16 hole_offset;
uint16 hole_length;
@@ -160,6 +161,24 @@ struct XLogReaderState
/* beginning of the WAL record being read. */
XLogRecPtr currRecPtr;
+ /* timeline to read it from, 0 if a lookup is required */
+ TimeLineID currTLI;
+
+ /*
+ * Safe point to read to in currTLI if current TLI is historical
+ * (tliSwitchPoint) or InvalidXLogRecPtr if on current timeline.
+ *
+ * Actually set to the start of the segment containing the timeline switch
+ * that ends currTLI's validity, not the LSN of the switch its self, since
+ * we can't assume the old segment will be present.
+ */
+ XLogRecPtr currTLIValidUntil;
+
+ /*
+ * If currTLI is not the most recent known timeline, the next timeline to
+ * read from when currTLIValidUntil is reached.
+ */
+ TimeLineID nextTLI;
/* Buffer for current ReadRecord result (expandable) */
char *readRecordBuf;
@@ -205,6 +224,8 @@ extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record,
((decoder)->blocks[block_id].in_use)
#define XLogRecHasBlockImage(decoder, block_id) \
((decoder)->blocks[block_id].has_image)
+#define XLogRecBlockImageApply(decoder, block_id) \
+ ((decoder)->blocks[block_id].apply_image)
extern bool RestoreBlockImage(XLogReaderState *recoder, uint8 block_id, char *dst);
extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len);
diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h
index 3dfcb494f7..eeb6a30c1c 100644
--- a/src/include/access/xlogrecord.h
+++ b/src/include/access/xlogrecord.h
@@ -3,7 +3,7 @@
*
* Definitions for the WAL record format.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xlogrecord.h
@@ -56,8 +56,8 @@ typedef struct XLogRecord
/*
* The high 4 bits in xl_info may be used freely by rmgr. The
- * XLR_SPECIAL_REL_UPDATE bit can be passed by XLogInsert caller. The rest
- * are set internally by XLogInsert.
+ * XLR_SPECIAL_REL_UPDATE and XLR_CHECK_CONSISTENCY bits can be passed by
+ * XLogInsert caller. The rest are set internally by XLogInsert.
*/
#define XLR_INFO_MASK 0x0F
#define XLR_RMGR_INFO_MASK 0xF0
@@ -71,6 +71,15 @@ typedef struct XLogRecord
#define XLR_SPECIAL_REL_UPDATE 0x01
/*
+ * Enforces consistency checks of replayed WAL at recovery. If enabled,
+ * each record will log a full-page write for each block modified by the
+ * record and will reuse it afterwards for consistency checks. The caller
+ * of XLogInsert can use this value if necessary, but if
+ * wal_consistency_checking is enabled for a rmgr this is set unconditionally.
+ */
+#define XLR_CHECK_CONSISTENCY 0x02
+
+/*
* Header info for block data appended to an XLOG record.
*
* 'data_length' is the length of the rmgr-specific payload data associated
@@ -137,6 +146,7 @@ typedef struct XLogRecordBlockImageHeader
/* Information stored in bimg_info */
#define BKPIMAGE_HAS_HOLE 0x01 /* page image has "hole" */
#define BKPIMAGE_IS_COMPRESSED 0x02 /* page image is compressed */
+#define BKPIMAGE_APPLY 0x04 /* page image should be restored during replay */
/*
* Extra header information used when page image has "hole" and
diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h
index d027ea173b..114ffbcc53 100644
--- a/src/include/access/xlogutils.h
+++ b/src/include/access/xlogutils.h
@@ -3,7 +3,7 @@
*
* Utilities for replaying WAL records.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xlogutils.h
@@ -52,4 +52,7 @@ extern int read_local_xlog_page(XLogReaderState *state,
XLogRecPtr targetRecPtr, char *cur_page,
TimeLineID *pageTLI);
+extern void XLogReadDetermineTimeline(XLogReaderState *state,
+ XLogRecPtr wantPage, uint32 wantLength);
+
#endif
diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h
index 0daf681a22..51a0ba925f 100644
--- a/src/include/bootstrap/bootstrap.h
+++ b/src/include/bootstrap/bootstrap.h
@@ -4,7 +4,7 @@
* include file for the bootstrapping code
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
diff --git a/src/include/c.h b/src/include/c.h
index ca12c048a0..5e91b64305 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -9,7 +9,7 @@
* polluting the namespace with lots of stuff...
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/c.h
@@ -149,6 +149,8 @@
/*
* CppAsString
* Convert the argument to a string, using the C preprocessor.
+ * CppAsString2
+ * Convert the argument to a string, after one round of macro expansion.
* CppConcat
* Concatenate two arguments together, using the C preprocessor.
*
@@ -157,6 +159,7 @@
* backward compatibility with existing PostgreSQL code.
*/
#define CppAsString(identifier) #identifier
+#define CppAsString2(x) CppAsString(x)
#define CppConcat(x, y) x##y
/*
@@ -340,10 +343,11 @@ typedef unsigned PG_INT128_TYPE uint128;
#define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
#define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)
-/* Select timestamp representation (float8 or int64) */
-#ifdef USE_INTEGER_DATETIMES
+/*
+ * We now always use int64 timestamps, but keep this symbol defined for the
+ * benefit of external code that might test it.
+ */
#define HAVE_INT64_TIMESTAMP
-#endif
/*
* Size
@@ -416,7 +420,7 @@ typedef uint32 CommandId;
typedef struct
{
int indx[MAXDIM];
-} IntArray;
+} IntArray;
/* ----------------
* Variable-length datatypes all share the 'struct varlena' header.
@@ -425,10 +429,11 @@ typedef struct
* may be compressed or moved out-of-line. However datatype-specific routines
* are mostly content to deal with de-TOASTed values only, and of course
* client-side routines should never see a TOASTed value. But even in a
- * de-TOASTed value, beware of touching vl_len_ directly, as its representation
- * is no longer convenient. It's recommended that code always use the VARDATA,
- * VARSIZE, and SET_VARSIZE macros instead of relying on direct mentions of
- * the struct fields. See postgres.h for details of the TOASTed form.
+ * de-TOASTed value, beware of touching vl_len_ directly, as its
+ * representation is no longer convenient. It's recommended that code always
+ * use macros VARDATA_ANY, VARSIZE_ANY, VARSIZE_ANY_EXHDR, VARDATA, VARSIZE,
+ * and SET_VARSIZE instead of relying on direct mentions of the struct fields.
+ * See postgres.h for details of the TOASTed form.
* ----------------
*/
struct varlena
@@ -442,7 +447,7 @@ struct varlena
/*
* These widely-used datatypes are just a varlena header and the data bytes.
* There is no terminating null or anything like that --- the data length is
- * always VARSIZE(ptr) - VARHDRSZ.
+ * always VARSIZE_ANY_EXHDR(ptr).
*/
typedef struct varlena bytea;
typedef struct varlena text;
@@ -527,6 +532,9 @@ typedef NameData *Name;
#define PointerIsAligned(pointer, type) \
(((uintptr_t)(pointer) % (sizeof (type))) == 0)
+#define OffsetToPointer(base, offset) \
+ ((void *)((char *) base + offset))
+
#define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid))
#define RegProcedureIsValid(p) OidIsValid(p)
@@ -939,6 +947,22 @@ typedef NameData *Name;
#endif
+/*
+ * Hints to the compiler about the likelihood of a branch. Both likely() and
+ * unlikely() return the boolean value of the contained expression.
+ *
+ * These should only be used sparingly, in very hot code paths. It's very easy
+ * to mis-estimate likelihoods.
+ */
+#if __GNUC__ >= 3
+#define likely(x) __builtin_expect((x) != 0, 1)
+#define unlikely(x) __builtin_expect((x) != 0, 0)
+#else
+#define likely(x) ((x) != 0)
+#define unlikely(x) ((x) != 0)
+#endif
+
+
/* ----------------------------------------------------------------
* Section 8: random stuff
* ----------------------------------------------------------------
@@ -972,7 +996,7 @@ typedef NameData *Name;
/* gettext domain name mangling */
/*
- * To better support parallel installations of major PostgeSQL
+ * To better support parallel installations of major PostgreSQL
* versions as well as parallel installations of major library soname
* versions, we mangle the gettext domain name by appending those
* version numbers. The coding rule ought to be that wherever the
@@ -984,10 +1008,6 @@ typedef NameData *Name;
*
* Make sure this matches the installation rules in nls-global.mk.
*/
-
-/* need a second indirection because we want to stringize the macro value, not the name */
-#define CppAsString2(x) CppAsString(x)
-
#ifdef SO_MAJOR_VERSION
#define PG_TEXTDOMAIN(domain) (domain CppAsString2(SO_MAJOR_VERSION) "-" PG_MAJORVERSION)
#else
diff --git a/src/include/catalog/binary_upgrade.h b/src/include/catalog/binary_upgrade.h
index 373498441f..98089e3c1a 100644
--- a/src/include/catalog/binary_upgrade.h
+++ b/src/include/catalog/binary_upgrade.h
@@ -4,7 +4,7 @@
* variables used for binary upgrades
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/binary_upgrade.h
diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h
index b90ffa1c83..7062d7ed2f 100644
--- a/src/include/catalog/catalog.h
+++ b/src/include/catalog/catalog.h
@@ -5,7 +5,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/catalog.h
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 2ca3cd911a..06fff799af 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -34,7 +34,7 @@
* database contents or layout, such as altering tuple headers.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 201608131
+#define CATALOG_VERSION_NO 201705141
#endif
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 2aff496881..c4d0c694f4 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -4,7 +4,7 @@
* Routines to support inter-object dependencies.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
@@ -148,6 +148,7 @@ typedef enum ObjectClass
OCLASS_REWRITE, /* pg_rewrite */
OCLASS_TRIGGER, /* pg_trigger */
OCLASS_SCHEMA, /* pg_namespace */
+ OCLASS_STATISTIC_EXT, /* pg_statistic_ext */
OCLASS_TSPARSER, /* pg_ts_parser */
OCLASS_TSDICT, /* pg_ts_dict */
OCLASS_TSTEMPLATE, /* pg_ts_template */
@@ -167,16 +168,23 @@ typedef enum ObjectClass
OCLASS_EXTENSION, /* pg_extension */
OCLASS_EVENT_TRIGGER, /* pg_event_trigger */
OCLASS_POLICY, /* pg_policy */
+ OCLASS_PUBLICATION, /* pg_publication */
+ OCLASS_PUBLICATION_REL, /* pg_publication_rel */
+ OCLASS_SUBSCRIPTION, /* pg_subscription */
OCLASS_TRANSFORM /* pg_transform */
} ObjectClass;
#define LAST_OCLASS OCLASS_TRANSFORM
+/* flag bits for performDeletion/performMultipleDeletions: */
+#define PERFORM_DELETION_INTERNAL 0x0001 /* internal action */
+#define PERFORM_DELETION_CONCURRENTLY 0x0002 /* concurrent drop */
+#define PERFORM_DELETION_QUIETLY 0x0004 /* suppress notices */
+#define PERFORM_DELETION_SKIP_ORIGINAL 0x0008 /* keep original obj */
+#define PERFORM_DELETION_SKIP_EXTENSIONS 0x0010 /* keep extensions */
-/* in dependency.c */
-#define PERFORM_DELETION_INTERNAL 0x0001
-#define PERFORM_DELETION_CONCURRENTLY 0x0002
+/* in dependency.c */
extern void performDeletion(const ObjectAddress *object,
DropBehavior behavior, int flags);
@@ -189,10 +197,6 @@ extern void performRename(const ObjectAddress *object,
const char *oldname,
const char *newname);
#endif
-
-extern void deleteWhatDependsOn(const ObjectAddress *object,
- bool showNotices);
-
extern void recordDependencyOnExpr(const ObjectAddress *depender,
Node *expr, List *rtable,
DependencyType behavior);
@@ -200,7 +204,8 @@ extern void recordDependencyOnExpr(const ObjectAddress *depender,
extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
Node *expr, Oid relId,
DependencyType behavior,
- DependencyType self_behavior);
+ DependencyType self_behavior,
+ bool ignore_self);
extern ObjectClass getObjectClass(const ObjectAddress *object);
@@ -244,11 +249,9 @@ extern long changeDependencyFor(Oid classId, Oid objectId,
extern Oid getExtensionOfObject(Oid classId, Oid objectId);
-extern bool sequenceIsOwned(Oid seqId, Oid *tableId, int32 *colId);
-
-extern void markSequenceUnowned(Oid seqId);
-
-extern List *getOwnedSequences(Oid relid);
+extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId);
+extern List *getOwnedSequences(Oid relid, AttrNumber attnum);
+extern Oid getOwnedSequence(Oid relid, AttrNumber attnum);
extern Oid get_constraint_index(Oid constraintId);
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index 8e81de5f6d..a522b4cd82 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -9,7 +9,7 @@
* bootstrap file from these header files.)
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/genbki.h
diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h
index a5f053fc52..12ad62532b 100644
--- a/src/include/catalog/heap.h
+++ b/src/include/catalog/heap.h
@@ -4,7 +4,7 @@
* prototypes for functions in backend/catalog/heap.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
@@ -154,5 +154,16 @@ extern Oid *GetRelationDistributionNodes(PGXCSubCluster *subcluster,
extern Oid *BuildRelationDistributionNodes(List *nodes, int *numnodes);
extern Oid *SortRelationDistributionNodes(Oid *nodeoids, int numnodes);
#endif
+/* pg_partitioned_table catalog manipulation functions */
+extern void StorePartitionKey(Relation rel,
+ char strategy,
+ int16 partnatts,
+ AttrNumber *partattrs,
+ List *partexprs,
+ Oid *partopclass,
+ Oid *partcollation);
+extern void RemovePartitionKeyByRelId(Oid relid);
+extern void StorePartitionBound(Relation rel, Relation parent,
+ PartitionBoundSpec *bound);
#endif /* HEAP_H */
diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h
index 37e6ef3fa9..20bec90b9d 100644
--- a/src/include/catalog/index.h
+++ b/src/include/catalog/index.h
@@ -4,7 +4,7 @@
* prototypes for catalog/index.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/index.h
diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h
index f2d8be7856..35f50b69a5 100644
--- a/src/include/catalog/indexing.h
+++ b/src/include/catalog/indexing.h
@@ -5,7 +5,7 @@
* on system catalogs
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
@@ -31,9 +31,15 @@ typedef struct ResultRelInfo *CatalogIndexState;
*/
extern CatalogIndexState CatalogOpenIndexes(Relation heapRel);
extern void CatalogCloseIndexes(CatalogIndexState indstate);
-extern void CatalogIndexInsert(CatalogIndexState indstate,
- HeapTuple heapTuple);
-extern void CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple);
+extern Oid CatalogTupleInsert(Relation heapRel, HeapTuple tup);
+extern Oid CatalogTupleInsertWithInfo(Relation heapRel, HeapTuple tup,
+ CatalogIndexState indstate);
+extern void CatalogTupleUpdate(Relation heapRel, ItemPointer otid,
+ HeapTuple tup);
+extern void CatalogTupleUpdateWithInfo(Relation heapRel,
+ ItemPointer otid, HeapTuple tup,
+ CatalogIndexState indstate);
+extern void CatalogTupleDelete(Relation heapRel, ItemPointer tid);
/*
@@ -177,6 +183,13 @@ DECLARE_UNIQUE_INDEX(pg_largeobject_loid_pn_index, 2683, on pg_largeobject using
DECLARE_UNIQUE_INDEX(pg_largeobject_metadata_oid_index, 2996, on pg_largeobject_metadata using btree(oid oid_ops));
#define LargeObjectMetadataOidIndexId 2996
+DECLARE_UNIQUE_INDEX(pg_statistic_ext_oid_index, 3380, on pg_statistic_ext using btree(oid oid_ops));
+#define StatisticExtOidIndexId 3380
+DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops));
+#define StatisticExtNameIndexId 3997
+DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, on pg_statistic_ext using btree(stxrelid oid_ops));
+#define StatisticExtRelidIndexId 3379
+
DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, on pg_namespace using btree(nspname name_ops));
#define NamespaceNameIndexId 2684
DECLARE_UNIQUE_INDEX(pg_namespace_oid_index, 2685, on pg_namespace using btree(oid oid_ops));
@@ -210,6 +223,9 @@ DECLARE_UNIQUE_INDEX(pg_rewrite_oid_index, 2692, on pg_rewrite using btree(oid o
DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops));
#define RewriteRelRulenameIndexId 2693
+DECLARE_UNIQUE_INDEX(pg_sequence_seqrelid_index, 5002, on pg_sequence using btree(seqrelid oid_ops));
+#define SequenceRelidIndexId 5002
+
DECLARE_INDEX(pg_shdepend_depender_index, 1232, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));
#define SharedDependDependerIndexId 1232
DECLARE_INDEX(pg_shdepend_reference_index, 1233, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops));
@@ -341,6 +357,30 @@ DECLARE_UNIQUE_INDEX(pg_replication_origin_roiident_index, 6001, on pg_replicati
DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, on pg_replication_origin using btree(roname text_pattern_ops));
#define ReplicationOriginNameIndex 6002
+DECLARE_UNIQUE_INDEX(pg_partitioned_table_partrelid_index, 3351, on pg_partitioned_table using btree(partrelid oid_ops));
+#define PartitionedRelidIndexId 3351
+
+DECLARE_UNIQUE_INDEX(pg_publication_oid_index, 6110, on pg_publication using btree(oid oid_ops));
+#define PublicationObjectIndexId 6110
+
+DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, on pg_publication using btree(pubname name_ops));
+#define PublicationNameIndexId 6111
+
+DECLARE_UNIQUE_INDEX(pg_publication_rel_oid_index, 6112, on pg_publication_rel using btree(oid oid_ops));
+#define PublicationRelObjectIndexId 6112
+
+DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, on pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops));
+#define PublicationRelPrrelidPrpubidIndexId 6113
+
+DECLARE_UNIQUE_INDEX(pg_subscription_oid_index, 6114, on pg_subscription using btree(oid oid_ops));
+#define SubscriptionObjectIndexId 6114
+
+DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, on pg_subscription using btree(subdbid oid_ops, subname name_ops));
+#define SubscriptionNameIndexId 6115
+
+DECLARE_UNIQUE_INDEX(pg_subscription_rel_srrelid_srsubid_index, 6117, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));
+#define SubscriptionRelSrrelidSrsubidIndexId 6117
+
/* last step of initialization script: build the indexes declared above */
BUILD_INDICES
diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h
index 3c31dafa9d..14df88290a 100644
--- a/src/include/catalog/namespace.h
+++ b/src/include/catalog/namespace.h
@@ -5,7 +5,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/namespace.h
@@ -93,6 +93,9 @@ extern bool CollationIsVisible(Oid collid);
extern Oid ConversionGetConid(const char *conname);
extern bool ConversionIsVisible(Oid conid);
+extern Oid get_statistics_object_oid(List *names, bool missing_ok);
+extern bool StatisticsObjIsVisible(Oid stxid);
+
extern Oid get_ts_parser_oid(List *names, bool missing_ok);
extern bool TSParserIsVisible(Oid prsId);
@@ -145,6 +148,7 @@ extern Oid get_collation_oid(List *collname, bool missing_ok);
extern Oid get_conversion_oid(List *conname, bool missing_ok);
extern Oid FindDefaultConversionProc(int32 for_encoding, int32 to_encoding);
+
/* initialization & transaction cleanup code */
extern void InitializeSearchPath(void);
extern void AtEOXact_Namespace(bool isCommit, bool parallel);
diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h
index 1ef7f1f16c..3a6dd596ce 100644
--- a/src/include/catalog/objectaccess.h
+++ b/src/include/catalog/objectaccess.h
@@ -3,7 +3,7 @@
*
* Object access hooks.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*/
diff --git a/src/include/catalog/objectaddress.h b/src/include/catalog/objectaddress.h
index 583a1206f3..406c38bc73 100644
--- a/src/include/catalog/objectaddress.h
+++ b/src/include/catalog/objectaddress.h
@@ -3,7 +3,7 @@
* objectaddress.h
* functions for working with object addresses
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/objectaddress.h
@@ -40,17 +40,17 @@ extern const ObjectAddress InvalidObjectAddress;
#define ObjectAddressSet(addr, class_id, object_id) \
ObjectAddressSubSet(addr, class_id, object_id, 0)
-extern ObjectAddress get_object_address(ObjectType objtype, List *objname,
- List *objargs, Relation *relp,
+extern ObjectAddress get_object_address(ObjectType objtype, Node *object,
+ Relation *relp,
LOCKMODE lockmode, bool missing_ok);
extern ObjectAddress get_object_address_rv(ObjectType objtype, RangeVar *rel,
- List *objname, List *objargs, Relation *relp,
+ List *object, Relation *relp,
LOCKMODE lockmode, bool missing_ok);
extern void check_object_ownership(Oid roleid,
ObjectType objtype, ObjectAddress address,
- List *objname, List *objargs, Relation relation);
+ Node *object, Relation relation);
extern Oid get_object_namespace(const ObjectAddress *address);
diff --git a/src/include/catalog/opfam_internal.h b/src/include/catalog/opfam_internal.h
index 7eb882fd12..448ad9708b 100644
--- a/src/include/catalog/opfam_internal.h
+++ b/src/include/catalog/opfam_internal.h
@@ -2,7 +2,7 @@
*
* opfam_internal.h
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/opfam_internal.h
diff --git a/src/include/catalog/partition.h b/src/include/catalog/partition.h
new file mode 100644
index 0000000000..0a1e468898
--- /dev/null
+++ b/src/include/catalog/partition.h
@@ -0,0 +1,101 @@
+/*-------------------------------------------------------------------------
+ *
+ * partition.h
+ * Header file for structures and utility functions related to
+ * partitioning
+ *
+ * Copyright (c) 2007-2017, PostgreSQL Global Development Group
+ *
+ * src/include/catalog/partition.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PARTITION_H
+#define PARTITION_H
+
+#include "fmgr.h"
+#include "executor/tuptable.h"
+#include "nodes/execnodes.h"
+#include "parser/parse_node.h"
+#include "utils/rel.h"
+
+/*
+ * PartitionBoundInfo encapsulates a set of partition bounds. It is usually
+ * associated with partitioned tables as part of its partition descriptor.
+ *
+ * The internal structure is opaque outside partition.c.
+ */
+typedef struct PartitionBoundInfoData *PartitionBoundInfo;
+
+/*
+ * Information about partitions of a partitioned table.
+ */
+typedef struct PartitionDescData
+{
+ int nparts; /* Number of partitions */
+ Oid *oids; /* OIDs of partitions */
+ PartitionBoundInfo boundinfo; /* collection of partition bounds */
+} PartitionDescData;
+
+typedef struct PartitionDescData *PartitionDesc;
+
+/*-----------------------
+ * PartitionDispatch - information about one partitioned table in a partition
+ * hierarchy required to route a tuple to one of its partitions
+ *
+ * reldesc Relation descriptor of the table
+ * key Partition key information of the table
+ * keystate Execution state required for expressions in the partition key
+ * partdesc Partition descriptor of the table
+ * tupslot A standalone TupleTableSlot initialized with this table's tuple
+ * descriptor
+ * tupmap TupleConversionMap to convert from the parent's rowtype to
+ * this table's rowtype (when extracting the partition key of a
+ * tuple just before routing it through this table)
+ * indexes Array with partdesc->nparts members (for details on what
+ * individual members represent, see how they are set in
+ * RelationGetPartitionDispatchInfo())
+ *-----------------------
+ */
+typedef struct PartitionDispatchData
+{
+ Relation reldesc;
+ PartitionKey key;
+ List *keystate; /* list of ExprState */
+ PartitionDesc partdesc;
+ TupleTableSlot *tupslot;
+ TupleConversionMap *tupmap;
+ int *indexes;
+} PartitionDispatchData;
+
+typedef struct PartitionDispatchData *PartitionDispatch;
+
+extern void RelationBuildPartitionDesc(Relation relation);
+extern bool partition_bounds_equal(PartitionKey key,
+ PartitionBoundInfo p1, PartitionBoundInfo p2);
+
+extern void check_new_partition_bound(char *relname, Relation parent,
+ PartitionBoundSpec *spec);
+extern Oid get_partition_parent(Oid relid);
+extern List *get_qual_from_partbound(Relation rel, Relation parent,
+ PartitionBoundSpec *spec);
+extern List *map_partition_varattnos(List *expr, int target_varno,
+ Relation partrel, Relation parent);
+extern List *RelationGetPartitionQual(Relation rel);
+extern Expr *get_partition_qual_relid(Oid relid);
+
+/* For tuple routing */
+extern PartitionDispatch *RelationGetPartitionDispatchInfo(Relation rel,
+ int lockmode, int *num_parted,
+ List **leaf_part_oids);
+extern void FormPartitionKeyDatum(PartitionDispatch pd,
+ TupleTableSlot *slot,
+ EState *estate,
+ Datum *values,
+ bool *isnull);
+extern int get_partition_for_tuple(PartitionDispatch *pd,
+ TupleTableSlot *slot,
+ EState *estate,
+ PartitionDispatchData **failed_at,
+ TupleTableSlot **failed_slot);
+#endif /* PARTITION_H */
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 8865bba010..1ffde6cdc5 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_aggregate.h
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index 1116923799..9b6dc38f64 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_am.h
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index a15b0ec309..da0228de6b 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -30,7 +30,7 @@
* intentional denormalization of the catalogs to buy lookup speed.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_amop.h
@@ -373,6 +373,16 @@ DATA(insert ( 1984 829 829 4 s 1225 403 0 ));
DATA(insert ( 1984 829 829 5 s 1224 403 0 ));
/*
+ * btree macaddr8
+ */
+
+DATA(insert ( 3371 774 774 1 s 3364 403 0 ));
+DATA(insert ( 3371 774 774 2 s 3365 403 0 ));
+DATA(insert ( 3371 774 774 3 s 3362 403 0 ));
+DATA(insert ( 3371 774 774 4 s 3367 403 0 ));
+DATA(insert ( 3371 774 774 5 s 3366 403 0 ));
+
+/*
* btree network
*/
@@ -553,6 +563,8 @@ DATA(insert ( 1977 20 23 1 s 416 405 0 ));
DATA(insert ( 1983 1186 1186 1 s 1330 405 0 ));
/* macaddr_ops */
DATA(insert ( 1985 829 829 1 s 1220 405 0 ));
+/* macaddr8_ops */
+DATA(insert ( 3372 774 774 1 s 3362 405 0 ));
/* name_ops */
DATA(insert ( 1987 19 19 1 s 93 405 0 ));
/* oid_ops */
@@ -573,8 +585,6 @@ DATA(insert ( 2040 1114 1114 1 s 2060 405 0 ));
DATA(insert ( 2222 16 16 1 s 91 405 0 ));
/* bytea_ops */
DATA(insert ( 2223 17 17 1 s 1955 405 0 ));
-/* int2vector_ops */
-DATA(insert ( 2224 22 22 1 s 386 405 0 ));
/* xid_ops */
DATA(insert ( 2225 28 28 1 s 352 405 0 ));
/* cid_ops */
@@ -673,8 +683,7 @@ DATA(insert ( 2595 718 718 14 s 2864 783 0 ));
DATA(insert ( 2595 718 600 15 o 3291 783 1970 ));
/*
- * gin array_ops (these anyarray operators are used with all the opclasses
- * of the family)
+ * gin array_ops
*/
DATA(insert ( 2745 2277 2277 1 s 2750 2742 0 ));
DATA(insert ( 2745 2277 2277 2 s 2751 2742 0 ));
@@ -863,6 +872,21 @@ DATA(insert ( 3550 869 869 25 s 932 783 0 ));
DATA(insert ( 3550 869 869 26 s 933 783 0 ));
DATA(insert ( 3550 869 869 27 s 934 783 0 ));
+/*
+ * SP-GiST inet_ops
+ */
+DATA(insert ( 3794 869 869 3 s 3552 4000 0 ));
+DATA(insert ( 3794 869 869 18 s 1201 4000 0 ));
+DATA(insert ( 3794 869 869 19 s 1202 4000 0 ));
+DATA(insert ( 3794 869 869 20 s 1203 4000 0 ));
+DATA(insert ( 3794 869 869 21 s 1204 4000 0 ));
+DATA(insert ( 3794 869 869 22 s 1205 4000 0 ));
+DATA(insert ( 3794 869 869 23 s 1206 4000 0 ));
+DATA(insert ( 3794 869 869 24 s 931 4000 0 ));
+DATA(insert ( 3794 869 869 25 s 932 4000 0 ));
+DATA(insert ( 3794 869 869 26 s 933 4000 0 ));
+DATA(insert ( 3794 869 869 27 s 934 4000 0 ));
+
/* BRIN opclasses */
/* minmax bytea */
DATA(insert ( 4064 17 17 1 s 1957 3580 0 ));
@@ -987,6 +1011,12 @@ DATA(insert ( 4074 829 829 2 s 1223 3580 0 ));
DATA(insert ( 4074 829 829 3 s 1220 3580 0 ));
DATA(insert ( 4074 829 829 4 s 1225 3580 0 ));
DATA(insert ( 4074 829 829 5 s 1224 3580 0 ));
+/* minmax macaddr8 */
+DATA(insert ( 4109 774 774 1 s 3364 3580 0 ));
+DATA(insert ( 4109 774 774 2 s 3365 3580 0 ));
+DATA(insert ( 4109 774 774 3 s 3362 3580 0 ));
+DATA(insert ( 4109 774 774 4 s 3367 3580 0 ));
+DATA(insert ( 4109 774 774 5 s 3366 3580 0 ));
/* minmax inet */
DATA(insert ( 4075 869 869 1 s 1203 3580 0 ));
DATA(insert ( 4075 869 869 2 s 1204 3580 0 ));
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 00320b4c33..bcbb7a1617 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -19,7 +19,7 @@
* some don't pay attention to non-default functions at all.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_amproc.h
@@ -117,6 +117,7 @@ DATA(insert ( 1976 20 23 1 2189 ));
DATA(insert ( 1976 20 21 1 2193 ));
DATA(insert ( 1982 1186 1186 1 1315 ));
DATA(insert ( 1984 829 829 1 836 ));
+DATA(insert ( 1984 829 829 2 3359 ));
DATA(insert ( 1986 19 19 1 359 ));
DATA(insert ( 1986 19 19 2 3135 ));
DATA(insert ( 1988 1700 1700 1 1769 ));
@@ -142,6 +143,7 @@ DATA(insert ( 2968 2950 2950 2 3300 ));
DATA(insert ( 2994 2249 2249 1 2987 ));
DATA(insert ( 3194 2249 2249 1 3187 ));
DATA(insert ( 3253 3220 3220 1 3251 ));
+DATA(insert ( 3371 774 774 1 4119 ));
DATA(insert ( 3522 3500 3500 1 3514 ));
DATA(insert ( 3626 3614 3614 1 3622 ));
DATA(insert ( 3683 3615 3615 1 3668 ));
@@ -173,7 +175,6 @@ DATA(insert ( 2001 1266 1266 1 1696 ));
DATA(insert ( 2040 1114 1114 1 2039 ));
DATA(insert ( 2222 16 16 1 454 ));
DATA(insert ( 2223 17 17 1 456 ));
-DATA(insert ( 2224 22 22 1 398 ));
DATA(insert ( 2225 28 28 1 450 ));
DATA(insert ( 2226 29 29 1 450 ));
DATA(insert ( 2227 702 702 1 450 ));
@@ -183,6 +184,7 @@ DATA(insert ( 2231 1042 1042 1 1080 ));
DATA(insert ( 2235 1033 1033 1 329 ));
DATA(insert ( 2969 2950 2950 1 2963 ));
DATA(insert ( 3254 3220 3220 1 3252 ));
+DATA(insert ( 3372 774 774 1 328 ));
DATA(insert ( 3523 3500 3500 1 3515 ));
DATA(insert ( 3903 3831 3831 1 3902 ));
DATA(insert ( 4034 3802 3802 1 4045 ));
@@ -255,156 +257,10 @@ DATA(insert ( 3550 869 869 9 3573 ));
/* gin */
-DATA(insert ( 2745 1007 1007 1 351 ));
-DATA(insert ( 2745 1007 1007 2 2743 ));
-DATA(insert ( 2745 1007 1007 3 2774 ));
-DATA(insert ( 2745 1007 1007 4 2744 ));
-DATA(insert ( 2745 1007 1007 6 3920 ));
-DATA(insert ( 2745 1009 1009 1 360 ));
-DATA(insert ( 2745 1009 1009 2 2743 ));
-DATA(insert ( 2745 1009 1009 3 2774 ));
-DATA(insert ( 2745 1009 1009 4 2744 ));
-DATA(insert ( 2745 1009 1009 6 3920 ));
-DATA(insert ( 2745 1015 1015 1 360 ));
-DATA(insert ( 2745 1015 1015 2 2743 ));
-DATA(insert ( 2745 1015 1015 3 2774 ));
-DATA(insert ( 2745 1015 1015 4 2744 ));
-DATA(insert ( 2745 1015 1015 6 3920 ));
-DATA(insert ( 2745 1023 1023 1 357 ));
-DATA(insert ( 2745 1023 1023 2 2743 ));
-DATA(insert ( 2745 1023 1023 3 2774 ));
-DATA(insert ( 2745 1023 1023 4 2744 ));
-DATA(insert ( 2745 1023 1023 6 3920 ));
-DATA(insert ( 2745 1561 1561 1 1596 ));
-DATA(insert ( 2745 1561 1561 2 2743 ));
-DATA(insert ( 2745 1561 1561 3 2774 ));
-DATA(insert ( 2745 1561 1561 4 2744 ));
-DATA(insert ( 2745 1561 1561 6 3920 ));
-DATA(insert ( 2745 1000 1000 1 1693 ));
-DATA(insert ( 2745 1000 1000 2 2743 ));
-DATA(insert ( 2745 1000 1000 3 2774 ));
-DATA(insert ( 2745 1000 1000 4 2744 ));
-DATA(insert ( 2745 1000 1000 6 3920 ));
-DATA(insert ( 2745 1014 1014 1 1078 ));
-DATA(insert ( 2745 1014 1014 2 2743 ));
-DATA(insert ( 2745 1014 1014 3 2774 ));
-DATA(insert ( 2745 1014 1014 4 2744 ));
-DATA(insert ( 2745 1014 1014 6 3920 ));
-DATA(insert ( 2745 1001 1001 1 1954 ));
-DATA(insert ( 2745 1001 1001 2 2743 ));
-DATA(insert ( 2745 1001 1001 3 2774 ));
-DATA(insert ( 2745 1001 1001 4 2744 ));
-DATA(insert ( 2745 1001 1001 6 3920 ));
-DATA(insert ( 2745 1002 1002 1 358 ));
-DATA(insert ( 2745 1002 1002 2 2743 ));
-DATA(insert ( 2745 1002 1002 3 2774 ));
-DATA(insert ( 2745 1002 1002 4 2744 ));
-DATA(insert ( 2745 1002 1002 6 3920 ));
-DATA(insert ( 2745 1182 1182 1 1092 ));
-DATA(insert ( 2745 1182 1182 2 2743 ));
-DATA(insert ( 2745 1182 1182 3 2774 ));
-DATA(insert ( 2745 1182 1182 4 2744 ));
-DATA(insert ( 2745 1182 1182 6 3920 ));
-DATA(insert ( 2745 1021 1021 1 354 ));
-DATA(insert ( 2745 1021 1021 2 2743 ));
-DATA(insert ( 2745 1021 1021 3 2774 ));
-DATA(insert ( 2745 1021 1021 4 2744 ));
-DATA(insert ( 2745 1021 1021 6 3920 ));
-DATA(insert ( 2745 1022 1022 1 355 ));
-DATA(insert ( 2745 1022 1022 2 2743 ));
-DATA(insert ( 2745 1022 1022 3 2774 ));
-DATA(insert ( 2745 1022 1022 4 2744 ));
-DATA(insert ( 2745 1022 1022 6 3920 ));
-DATA(insert ( 2745 1041 1041 1 926 ));
-DATA(insert ( 2745 1041 1041 2 2743 ));
-DATA(insert ( 2745 1041 1041 3 2774 ));
-DATA(insert ( 2745 1041 1041 4 2744 ));
-DATA(insert ( 2745 1041 1041 6 3920 ));
-DATA(insert ( 2745 651 651 1 926 ));
-DATA(insert ( 2745 651 651 2 2743 ));
-DATA(insert ( 2745 651 651 3 2774 ));
-DATA(insert ( 2745 651 651 4 2744 ));
-DATA(insert ( 2745 651 651 6 3920 ));
-DATA(insert ( 2745 1005 1005 1 350 ));
-DATA(insert ( 2745 1005 1005 2 2743 ));
-DATA(insert ( 2745 1005 1005 3 2774 ));
-DATA(insert ( 2745 1005 1005 4 2744 ));
-DATA(insert ( 2745 1005 1005 6 3920 ));
-DATA(insert ( 2745 1016 1016 1 842 ));
-DATA(insert ( 2745 1016 1016 2 2743 ));
-DATA(insert ( 2745 1016 1016 3 2774 ));
-DATA(insert ( 2745 1016 1016 4 2744 ));
-DATA(insert ( 2745 1016 1016 6 3920 ));
-DATA(insert ( 2745 1187 1187 1 1315 ));
-DATA(insert ( 2745 1187 1187 2 2743 ));
-DATA(insert ( 2745 1187 1187 3 2774 ));
-DATA(insert ( 2745 1187 1187 4 2744 ));
-DATA(insert ( 2745 1187 1187 6 3920 ));
-DATA(insert ( 2745 1040 1040 1 836 ));
-DATA(insert ( 2745 1040 1040 2 2743 ));
-DATA(insert ( 2745 1040 1040 3 2774 ));
-DATA(insert ( 2745 1040 1040 4 2744 ));
-DATA(insert ( 2745 1040 1040 6 3920 ));
-DATA(insert ( 2745 1003 1003 1 359 ));
-DATA(insert ( 2745 1003 1003 2 2743 ));
-DATA(insert ( 2745 1003 1003 3 2774 ));
-DATA(insert ( 2745 1003 1003 4 2744 ));
-DATA(insert ( 2745 1003 1003 6 3920 ));
-DATA(insert ( 2745 1231 1231 1 1769 ));
-DATA(insert ( 2745 1231 1231 2 2743 ));
-DATA(insert ( 2745 1231 1231 3 2774 ));
-DATA(insert ( 2745 1231 1231 4 2744 ));
-DATA(insert ( 2745 1231 1231 6 3920 ));
-DATA(insert ( 2745 1028 1028 1 356 ));
-DATA(insert ( 2745 1028 1028 2 2743 ));
-DATA(insert ( 2745 1028 1028 3 2774 ));
-DATA(insert ( 2745 1028 1028 4 2744 ));
-DATA(insert ( 2745 1028 1028 6 3920 ));
-DATA(insert ( 2745 1013 1013 1 404 ));
-DATA(insert ( 2745 1013 1013 2 2743 ));
-DATA(insert ( 2745 1013 1013 3 2774 ));
-DATA(insert ( 2745 1013 1013 4 2744 ));
-DATA(insert ( 2745 1013 1013 6 3920 ));
-DATA(insert ( 2745 1183 1183 1 1107 ));
-DATA(insert ( 2745 1183 1183 2 2743 ));
-DATA(insert ( 2745 1183 1183 3 2774 ));
-DATA(insert ( 2745 1183 1183 4 2744 ));
-DATA(insert ( 2745 1183 1183 6 3920 ));
-DATA(insert ( 2745 1185 1185 1 1314 ));
-DATA(insert ( 2745 1185 1185 2 2743 ));
-DATA(insert ( 2745 1185 1185 3 2774 ));
-DATA(insert ( 2745 1185 1185 4 2744 ));
-DATA(insert ( 2745 1185 1185 6 3920 ));
-DATA(insert ( 2745 1270 1270 1 1358 ));
-DATA(insert ( 2745 1270 1270 2 2743 ));
-DATA(insert ( 2745 1270 1270 3 2774 ));
-DATA(insert ( 2745 1270 1270 4 2744 ));
-DATA(insert ( 2745 1270 1270 6 3920 ));
-DATA(insert ( 2745 1563 1563 1 1672 ));
-DATA(insert ( 2745 1563 1563 2 2743 ));
-DATA(insert ( 2745 1563 1563 3 2774 ));
-DATA(insert ( 2745 1563 1563 4 2744 ));
-DATA(insert ( 2745 1563 1563 6 3920 ));
-DATA(insert ( 2745 1115 1115 1 2045 ));
-DATA(insert ( 2745 1115 1115 2 2743 ));
-DATA(insert ( 2745 1115 1115 3 2774 ));
-DATA(insert ( 2745 1115 1115 4 2744 ));
-DATA(insert ( 2745 1115 1115 6 3920 ));
-DATA(insert ( 2745 791 791 1 377 ));
-DATA(insert ( 2745 791 791 2 2743 ));
-DATA(insert ( 2745 791 791 3 2774 ));
-DATA(insert ( 2745 791 791 4 2744 ));
-DATA(insert ( 2745 791 791 6 3920 ));
-DATA(insert ( 2745 1024 1024 1 380 ));
-DATA(insert ( 2745 1024 1024 2 2743 ));
-DATA(insert ( 2745 1024 1024 3 2774 ));
-DATA(insert ( 2745 1024 1024 4 2744 ));
-DATA(insert ( 2745 1024 1024 6 3920 ));
-DATA(insert ( 2745 1025 1025 1 381 ));
-DATA(insert ( 2745 1025 1025 2 2743 ));
-DATA(insert ( 2745 1025 1025 3 2774 ));
-DATA(insert ( 2745 1025 1025 4 2744 ));
-DATA(insert ( 2745 1025 1025 6 3920 ));
+DATA(insert ( 2745 2277 2277 2 2743 ));
+DATA(insert ( 2745 2277 2277 3 2774 ));
+DATA(insert ( 2745 2277 2277 4 2744 ));
+DATA(insert ( 2745 2277 2277 6 3920 ));
DATA(insert ( 3659 3614 3614 1 3724 ));
DATA(insert ( 3659 3614 3614 2 3656 ));
DATA(insert ( 3659 3614 3614 3 3657 ));
@@ -428,6 +284,11 @@ DATA(insert ( 3474 3831 3831 2 3470 ));
DATA(insert ( 3474 3831 3831 3 3471 ));
DATA(insert ( 3474 3831 3831 4 3472 ));
DATA(insert ( 3474 3831 3831 5 3473 ));
+DATA(insert ( 3794 869 869 1 3795 ));
+DATA(insert ( 3794 869 869 2 3796 ));
+DATA(insert ( 3794 869 869 3 3797 ));
+DATA(insert ( 3794 869 869 4 3798 ));
+DATA(insert ( 3794 869 869 5 3799 ));
DATA(insert ( 4015 600 600 1 4018 ));
DATA(insert ( 4015 600 600 2 4019 ));
DATA(insert ( 4015 600 600 3 4020 ));
@@ -556,6 +417,11 @@ DATA(insert ( 4074 829 829 1 3383 ));
DATA(insert ( 4074 829 829 2 3384 ));
DATA(insert ( 4074 829 829 3 3385 ));
DATA(insert ( 4074 829 829 4 3386 ));
+/* minmax macaddr8 */
+DATA(insert ( 4109 774 774 1 3383 ));
+DATA(insert ( 4109 774 774 2 3384 ));
+DATA(insert ( 4109 774 774 3 3385 ));
+DATA(insert ( 4109 774 774 4 3386 ));
/* minmax inet */
DATA(insert ( 4075 869 869 1 3383 ));
DATA(insert ( 4075 869 869 2 3384 ));
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 59be88f7af..ff1842f53c 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_attrdef.h
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 39d8eedb4e..753d45f2d1 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_attribute.h
@@ -133,6 +133,9 @@ CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BK
/* Has DEFAULT value or not */
bool atthasdef;
+ /* One of the ATTRIBUTE_IDENTITY_* constants below, or '\0' */
+ char attidentity;
+
/* Is dropped (ie, logically invisible) or not */
bool attisdropped;
@@ -188,7 +191,7 @@ typedef FormData_pg_attribute *Form_pg_attribute;
* ----------------
*/
-#define Natts_pg_attribute 21
+#define Natts_pg_attribute 22
#define Anum_pg_attribute_attrelid 1
#define Anum_pg_attribute_attname 2
#define Anum_pg_attribute_atttypid 3
@@ -203,13 +206,14 @@ typedef FormData_pg_attribute *Form_pg_attribute;
#define Anum_pg_attribute_attalign 12
#define Anum_pg_attribute_attnotnull 13
#define Anum_pg_attribute_atthasdef 14
-#define Anum_pg_attribute_attisdropped 15
-#define Anum_pg_attribute_attislocal 16
-#define Anum_pg_attribute_attinhcount 17
-#define Anum_pg_attribute_attcollation 18
-#define Anum_pg_attribute_attacl 19
-#define Anum_pg_attribute_attoptions 20
-#define Anum_pg_attribute_attfdwoptions 21
+#define Anum_pg_attribute_attidentity 15
+#define Anum_pg_attribute_attisdropped 16
+#define Anum_pg_attribute_attislocal 17
+#define Anum_pg_attribute_attinhcount 18
+#define Anum_pg_attribute_attcollation 19
+#define Anum_pg_attribute_attacl 20
+#define Anum_pg_attribute_attoptions 21
+#define Anum_pg_attribute_attfdwoptions 22
/* ----------------
@@ -220,4 +224,8 @@ typedef FormData_pg_attribute *Form_pg_attribute;
* ----------------
*/
+
+#define ATTRIBUTE_IDENTITY_ALWAYS 'a'
+#define ATTRIBUTE_IDENTITY_BY_DEFAULT 'd'
+
#endif /* PG_ATTRIBUTE_H */
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index 7257541e5b..e34a4e80a4 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -5,7 +5,7 @@
* (pg_auth_members) along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_auth_members.h
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index 533081def6..39fea9f41a 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -7,7 +7,7 @@
* pg_shadow and pg_group are now publicly accessible views on pg_authid.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_authid.h
@@ -94,15 +94,21 @@ typedef FormData_pg_authid *Form_pg_authid;
* The uppercase quantities will be replaced at initdb time with
* user choices.
*
- * If adding new default roles or changing the OIDs below, be sure to add or
- * update the #defines which follow as appropriate.
+ * The C code typically refers to these roles using the #define symbols,
+ * so be sure to keep those in sync with the DATA lines.
* ----------------
*/
DATA(insert OID = 10 ( "POSTGRES" t t t t t t t -1 _null_ _null_));
-DATA(insert OID = 4200 ( "pg_signal_backend" f t f f f f f -1 _null_ _null_));
-
#define BOOTSTRAP_SUPERUSERID 10
-
+DATA(insert OID = 3373 ( "pg_monitor" f t f f f f f -1 _null_ _null_));
+#define DEFAULT_ROLE_MONITOR 3373
+DATA(insert OID = 3374 ( "pg_read_all_settings" f t f f f f f -1 _null_ _null_));
+#define DEFAULT_ROLE_READ_ALL_SETTINGS 3374
+DATA(insert OID = 3375 ( "pg_read_all_stats" f t f f f f f -1 _null_ _null_));
+#define DEFAULT_ROLE_READ_ALL_STATS 3375
+DATA(insert OID = 3377 ( "pg_stat_scan_tables" f t f f f f f -1 _null_ _null_));
+#define DEFAULT_ROLE_STAT_SCAN_TABLES 3377
+DATA(insert OID = 4200 ( "pg_signal_backend" f t f f f f f -1 _null_ _null_));
#define DEFAULT_ROLE_SIGNAL_BACKENDID 4200
#endif /* PG_AUTHID_H */
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index ee568d836a..ccc6fb35a8 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -8,7 +8,7 @@
* but also length coercion functions.
*
*
- * Copyright (c) 2002-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2002-2017, PostgreSQL Global Development Group
*
* src/include/catalog/pg_cast.h
*
@@ -59,7 +59,7 @@ typedef enum CoercionCodes
/*
* The allowable values for pg_cast.castmethod are specified by this enum.
- * Since castcontext is stored as a "char", we use ASCII codes for human
+ * Since castmethod is stored as a "char", we use ASCII codes for human
* convenience in reading the table.
*/
typedef enum CoercionMethod
@@ -254,6 +254,14 @@ DATA(insert ( 23 18 78 e f ));
/* pg_node_tree can be coerced to, but not from, text */
DATA(insert ( 194 25 0 i b ));
+/* pg_ndistinct can be coerced to, but not from, bytea and text */
+DATA(insert ( 3361 17 0 i b ));
+DATA(insert ( 3361 25 0 i i ));
+
+/* pg_dependencies can be coerced to, but not from, bytea and text */
+DATA(insert ( 3402 17 0 i b ));
+DATA(insert ( 3402 25 0 i i ));
+
/*
* Datetime category
*/
@@ -304,6 +312,12 @@ DATA(insert ( 718 603 1480 e f ));
DATA(insert ( 718 604 1544 e f ));
/*
+ * MAC address category
+ */
+DATA(insert ( 829 774 4123 i f ));
+DATA(insert ( 774 829 4124 i f ));
+
+/*
* INET category
*/
DATA(insert ( 650 869 0 i b ));
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 7b3b058d89..3657201317 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_class.h
@@ -70,6 +70,7 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
* not */
bool relispopulated; /* matview currently holds query results */
char relreplident; /* see REPLICA_IDENTITY_xxx constants */
+ bool relispartition; /* is relation a partition? */
TransactionId relfrozenxid; /* all Xids < this are frozen in this rel */
TransactionId relminmxid; /* all multixacts in this rel are >= this.
* this is really a MultiXactId */
@@ -78,6 +79,7 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
/* NOTE: These fields are not present in a relcache entry's rd_rel field. */
aclitem relacl[1]; /* access permissions */
text reloptions[1]; /* access-method-specific options */
+ pg_node_tree relpartbound; /* partition bound node tree */
#endif
} FormData_pg_class;
@@ -97,7 +99,7 @@ typedef FormData_pg_class *Form_pg_class;
* ----------------
*/
-#define Natts_pg_class 31
+#define Natts_pg_class 33
#define Anum_pg_class_relname 1
#define Anum_pg_class_relnamespace 2
#define Anum_pg_class_reltype 3
@@ -125,10 +127,12 @@ typedef FormData_pg_class *Form_pg_class;
#define Anum_pg_class_relforcerowsecurity 25
#define Anum_pg_class_relispopulated 26
#define Anum_pg_class_relreplident 27
-#define Anum_pg_class_relfrozenxid 28
-#define Anum_pg_class_relminmxid 29
-#define Anum_pg_class_relacl 30
-#define Anum_pg_class_reloptions 31
+#define Anum_pg_class_relispartition 28
+#define Anum_pg_class_relfrozenxid 29
+#define Anum_pg_class_relminmxid 30
+#define Anum_pg_class_relacl 31
+#define Anum_pg_class_reloptions 32
+#define Anum_pg_class_relpartbound 33
/* ----------------
* initial contents of pg_class
@@ -143,13 +147,13 @@ typedef FormData_pg_class *Form_pg_class;
* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId;
* similarly, "1" in relminmxid stands for FirstMultiXactId
*/
-DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 30 0 t f f f f f f t n 3 1 _null_ _null_ ));
+DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 30 0 t f f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR("");
-DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 21 0 f f f f f f f t n 3 1 _null_ _null_ ));
+DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 22 0 f f f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR("");
-DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 29 0 t f f f f f f t n 3 1 _null_ _null_ ));
+DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 29 0 t f f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR("");
-DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 31 0 t f f f f f f t n 3 1 _null_ _null_ ));
+DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 33 0 t f f f f f f t n f 3 1 _null_ _null_ _null_));
DESCR("");
@@ -158,9 +162,10 @@ DESCR("");
#define RELKIND_SEQUENCE 'S' /* sequence object */
#define RELKIND_TOASTVALUE 't' /* for out-of-line values */
#define RELKIND_VIEW 'v' /* view */
+#define RELKIND_MATVIEW 'm' /* materialized view */
#define RELKIND_COMPOSITE_TYPE 'c' /* composite type */
#define RELKIND_FOREIGN_TABLE 'f' /* foreign table */
-#define RELKIND_MATVIEW 'm' /* materialized view */
+#define RELKIND_PARTITIONED_TABLE 'p' /* partitioned table */
#define RELPERSISTENCE_PERMANENT 'p' /* regular table */
#define RELPERSISTENCE_UNLOGGED 'u' /* unlogged permanent table */
@@ -177,9 +182,10 @@ DESCR("");
/* all columns are logged as replica identity */
#define REPLICA_IDENTITY_FULL 'f'
/*
- * an explicitly chosen candidate key's columns are used as identity;
- * will still be set if the index has been dropped, in that case it
- * has the same meaning as 'd'
+ * an explicitly chosen candidate key's columns are used as replica identity.
+ * Note this will still be set if the index has been dropped; in that case it
+ * has the same meaning as 'd'.
*/
#define REPLICA_IDENTITY_INDEX 'i'
+
#endif /* PG_CLASS_H */
diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h
index 636771202e..1e44ce0949 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
@@ -34,9 +34,14 @@ CATALOG(pg_collation,3456)
NameData collname; /* collation name */
Oid collnamespace; /* OID of namespace containing collation */
Oid collowner; /* owner of collation */
+ char collprovider; /* see constants below */
int32 collencoding; /* encoding for this collation; -1 = "all" */
NameData collcollate; /* LC_COLLATE setting */
NameData collctype; /* LC_CTYPE setting */
+#ifdef CATALOG_VARLEN /* variable-length fields start here */
+ text collversion; /* provider-dependent version of collation
+ * data */
+#endif
} FormData_pg_collation;
/* ----------------
@@ -50,27 +55,34 @@ typedef FormData_pg_collation *Form_pg_collation;
* compiler constants for pg_collation
* ----------------
*/
-#define Natts_pg_collation 6
+#define Natts_pg_collation 8
#define Anum_pg_collation_collname 1
#define Anum_pg_collation_collnamespace 2
#define Anum_pg_collation_collowner 3
-#define Anum_pg_collation_collencoding 4
-#define Anum_pg_collation_collcollate 5
-#define Anum_pg_collation_collctype 6
+#define Anum_pg_collation_collprovider 4
+#define Anum_pg_collation_collencoding 5
+#define Anum_pg_collation_collcollate 6
+#define Anum_pg_collation_collctype 7
+#define Anum_pg_collation_collversion 8
/* ----------------
* initial contents of pg_collation
* ----------------
*/
-DATA(insert OID = 100 ( default PGNSP PGUID -1 "" "" ));
+DATA(insert OID = 100 ( default PGNSP PGUID d -1 "" "" 0 ));
DESCR("database's default collation");
#define DEFAULT_COLLATION_OID 100
-DATA(insert OID = 950 ( C PGNSP PGUID -1 "C" "C" ));
+DATA(insert OID = 950 ( C PGNSP PGUID c -1 "C" "C" 0 ));
DESCR("standard C collation");
#define C_COLLATION_OID 950
-DATA(insert OID = 951 ( POSIX PGNSP PGUID -1 "POSIX" "POSIX" ));
+DATA(insert OID = 951 ( POSIX PGNSP PGUID c -1 "POSIX" "POSIX" 0 ));
DESCR("standard POSIX collation");
#define POSIX_COLLATION_OID 951
+
+#define COLLPROVIDER_DEFAULT 'd'
+#define COLLPROVIDER_ICU 'i'
+#define COLLPROVIDER_LIBC 'c'
+
#endif /* PG_COLLATION_H */
diff --git a/src/include/catalog/pg_collation_fn.h b/src/include/catalog/pg_collation_fn.h
index 574b288acc..dfebdbaa0b 100644
--- a/src/include/catalog/pg_collation_fn.h
+++ b/src/include/catalog/pg_collation_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_collation.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_collation_fn.h
@@ -16,8 +16,11 @@
extern Oid CollationCreate(const char *collname, Oid collnamespace,
Oid collowner,
+ char collprovider,
int32 collencoding,
- const char *collcollate, const char *collctype);
+ const char *collcollate, const char *collctype,
+ const char *collversion,
+ bool if_not_exists);
extern void RemoveCollationById(Oid collationOid);
#endif /* PG_COLLATION_FN_H */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 666b2304bf..e959583364 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_constraint.h
diff --git a/src/include/catalog/pg_constraint_fn.h b/src/include/catalog/pg_constraint_fn.h
index 1f11174210..d2acb3a053 100644
--- a/src/include/catalog/pg_constraint_fn.h
+++ b/src/include/catalog/pg_constraint_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_constraint.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_constraint_fn.h
diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h
index 0bc41abee5..3a25cc84b2 100644
--- a/src/include/catalog/pg_control.h
+++ b/src/include/catalog/pg_control.h
@@ -5,7 +5,7 @@
* However, we define it here so that the format is documented.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_control.h
@@ -20,8 +20,10 @@
#include "port/pg_crc32c.h"
+#define MOCK_AUTH_NONCE_LEN 32
+
/* Version identifier for this pg_control format */
-#define PG_CONTROL_VERSION 960
+#define PG_CONTROL_VERSION 1002
/*
* Body of CheckPoint XLOG records. This is declared here because we keep
@@ -215,9 +217,6 @@ typedef struct ControlFileData
uint32 toast_max_chunk_size; /* chunk size in TOAST tables */
uint32 loblksize; /* chunk size in pg_largeobject */
- /* flag indicating internal format of timestamp, interval, time */
- bool enableIntTimes; /* int64 storage enabled? */
-
/* flags indicating pass-by-value status of various types */
bool float4ByVal; /* float4 pass-by-value? */
bool float8ByVal; /* float8, int8, etc pass-by-value? */
@@ -225,6 +224,13 @@ typedef struct ControlFileData
/* Are data pages protected by checksums? Zero if no checksum version */
uint32 data_checksum_version;
+ /*
+ * Random nonce, used in authentication requests that need to proceed
+ * based on values that are cluster-unique, like a SASL exchange that
+ * failed at an early stage.
+ */
+ char mock_authentication_nonce[MOCK_AUTH_NONCE_LEN];
+
/* CRC of all above ... MUST BE LAST! */
pg_crc32c crc;
} ControlFileData;
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index 1cfe57ce19..88174a620a 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_conversion.h
diff --git a/src/include/catalog/pg_conversion_fn.h b/src/include/catalog/pg_conversion_fn.h
index 9fcdde6d5b..a2c1345f01 100644
--- a/src/include/catalog/pg_conversion_fn.h
+++ b/src/include/catalog/pg_conversion_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_conversion.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_conversion_fn.h
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index 6ae1b40559..55a1f6edab 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_database.h
diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h
index a1f0150d39..311258fd7b 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -4,7 +4,7 @@
* definition of configuration settings
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_db_role_setting.h
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index 06aaaba0da..78bbeb64fe 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -4,7 +4,7 @@
* definition of default ACLs for new objects.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_default_acl.h
@@ -70,5 +70,6 @@ typedef FormData_pg_default_acl *Form_pg_default_acl;
#define DEFACLOBJ_SEQUENCE 'S' /* sequence */
#define DEFACLOBJ_FUNCTION 'f' /* function */
#define DEFACLOBJ_TYPE 'T' /* type */
+#define DEFACLOBJ_NAMESPACE 'n' /* namespace */
#endif /* PG_DEFAULT_ACL_H */
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index 3796206fa8..6c480dd7dc 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_depend.h
diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h
index c960d0e198..2f51ac33f3 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -19,7 +19,7 @@
* for example).
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_description.h
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index dd32443b91..faee5e6c3c 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Copyright (c) 2006-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2006-2017, PostgreSQL Global Development Group
*
* src/include/catalog/pg_enum.h
*
@@ -67,5 +67,7 @@ extern void EnumValuesDelete(Oid enumTypeOid);
extern void AddEnumLabel(Oid enumTypeOid, const char *newVal,
const char *neighbor, bool newValIsAfter,
bool skipIfExists);
+extern void RenameEnumLabel(Oid enumTypeOid,
+ const char *oldVal, const char *newVal);
#endif /* PG_ENUM_H */
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index 8884ef4a3e..b41cc12602 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_event_trigger.h
diff --git a/src/include/catalog/pg_extension.h b/src/include/catalog/pg_extension.h
index e823f7b79a..41b087d8b9 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_extension.h
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 1e9b4775ce..47df6799c9 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_foreign_data_wrapper.h
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 06b4f6afe8..629bfc389d 100644
--- a/src/include/catalog/pg_foreign_server.h
+++ b/src/include/catalog/pg_foreign_server.h
@@ -3,7 +3,7 @@
* pg_foreign_server.h
* definition of the system "foreign server" relation (pg_foreign_server)
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_foreign_server.h
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index e7b925b7c9..b62d5e948b 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -3,13 +3,13 @@
* pg_foreign_table.h
* definition of the system "foreign table" relation (pg_foreign_table)
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_foreign_table.h
*
* NOTES
- * the genbki.sh script reads this file and generates .bki
+ * the genbki.pl script reads this file and generates .bki
* information from the DATA() statements.
*
*-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index ee97c5dec8..7ca0fae707 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_index.h
diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h
index a117f7816a..434fa7c864 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_inherits.h
diff --git a/src/include/catalog/pg_inherits_fn.h b/src/include/catalog/pg_inherits_fn.h
index a717108481..e33b39e71e 100644
--- a/src/include/catalog/pg_inherits_fn.h
+++ b/src/include/catalog/pg_inherits_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_inherits.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_inherits_fn.h
diff --git a/src/include/catalog/pg_init_privs.h b/src/include/catalog/pg_init_privs.h
index e13edd3ff5..0d241b8a40 100644
--- a/src/include/catalog/pg_init_privs.h
+++ b/src/include/catalog/pg_init_privs.h
@@ -15,7 +15,7 @@
* for a table itself, so that it is distinct from any column privilege.
* Currently, objsubid is unused and zero for all other kinds of objects.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_init_privs.h
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index 5203dfd721..46e4099485 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_language.h
diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h
index 8dae408eae..93c8c6af6e 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_largeobject.h
diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h
index b8e47f60f6..16cb602a6c 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_largeobject_metadata.h
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 308af49812..010190e35c 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -6,7 +6,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_namespace.h
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index 6c82d94600..5819d5309f 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -25,7 +25,7 @@
* AMs support this.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_opclass.h
@@ -113,6 +113,7 @@ DATA(insert ( 405 float8_ops PGNSP PGUID 1971 701 t 0 ));
DATA(insert ( 403 inet_ops PGNSP PGUID 1974 869 t 0 ));
DATA(insert ( 405 inet_ops PGNSP PGUID 1975 869 t 0 ));
DATA(insert ( 783 inet_ops PGNSP PGUID 3550 869 f 0 ));
+DATA(insert ( 4000 inet_ops PGNSP PGUID 3794 869 t 0 ));
DATA(insert OID = 1979 ( 403 int2_ops PGNSP PGUID 1976 21 t 0 ));
#define INT2_BTREE_OPS_OID 1979
DATA(insert ( 405 int2_ops PGNSP PGUID 1977 21 t 0 ));
@@ -126,6 +127,8 @@ DATA(insert ( 403 interval_ops PGNSP PGUID 1982 1186 t 0 ));
DATA(insert ( 405 interval_ops PGNSP PGUID 1983 1186 t 0 ));
DATA(insert ( 403 macaddr_ops PGNSP PGUID 1984 829 t 0 ));
DATA(insert ( 405 macaddr_ops PGNSP PGUID 1985 829 t 0 ));
+DATA(insert ( 403 macaddr8_ops PGNSP PGUID 3371 774 t 0 ));
+DATA(insert ( 405 macaddr8_ops PGNSP PGUID 3372 774 t 0 ));
/*
* Here's an ugly little hack to save space in the system catalog indexes.
* btree doesn't ordinarily allow a storage type different from input type;
@@ -167,7 +170,6 @@ DATA(insert ( 403 bpchar_pattern_ops PGNSP PGUID 2097 1042 f 0 ));
DATA(insert ( 403 money_ops PGNSP PGUID 2099 790 t 0 ));
DATA(insert ( 405 bool_ops PGNSP PGUID 2222 16 t 0 ));
DATA(insert ( 405 bytea_ops PGNSP PGUID 2223 17 t 0 ));
-DATA(insert ( 405 int2vector_ops PGNSP PGUID 2224 22 t 0 ));
DATA(insert ( 403 tid_ops PGNSP PGUID 2789 27 t 0 ));
DATA(insert ( 405 xid_ops PGNSP PGUID 2225 28 t 0 ));
DATA(insert ( 405 cid_ops PGNSP PGUID 2226 29 t 0 ));
@@ -183,36 +185,7 @@ DATA(insert ( 783 box_ops PGNSP PGUID 2593 603 t 0 ));
DATA(insert ( 783 point_ops PGNSP PGUID 1029 600 t 603 ));
DATA(insert ( 783 poly_ops PGNSP PGUID 2594 604 t 603 ));
DATA(insert ( 783 circle_ops PGNSP PGUID 2595 718 t 603 ));
-DATA(insert ( 2742 _int4_ops PGNSP PGUID 2745 1007 t 23 ));
-DATA(insert ( 2742 _text_ops PGNSP PGUID 2745 1009 t 25 ));
-DATA(insert ( 2742 _abstime_ops PGNSP PGUID 2745 1023 t 702 ));
-DATA(insert ( 2742 _bit_ops PGNSP PGUID 2745 1561 t 1560 ));
-DATA(insert ( 2742 _bool_ops PGNSP PGUID 2745 1000 t 16 ));
-DATA(insert ( 2742 _bpchar_ops PGNSP PGUID 2745 1014 t 1042 ));
-DATA(insert ( 2742 _bytea_ops PGNSP PGUID 2745 1001 t 17 ));
-DATA(insert ( 2742 _char_ops PGNSP PGUID 2745 1002 t 18 ));
-DATA(insert ( 2742 _cidr_ops PGNSP PGUID 2745 651 t 650 ));
-DATA(insert ( 2742 _date_ops PGNSP PGUID 2745 1182 t 1082 ));
-DATA(insert ( 2742 _float4_ops PGNSP PGUID 2745 1021 t 700 ));
-DATA(insert ( 2742 _float8_ops PGNSP PGUID 2745 1022 t 701 ));
-DATA(insert ( 2742 _inet_ops PGNSP PGUID 2745 1041 t 869 ));
-DATA(insert ( 2742 _int2_ops PGNSP PGUID 2745 1005 t 21 ));
-DATA(insert ( 2742 _int8_ops PGNSP PGUID 2745 1016 t 20 ));
-DATA(insert ( 2742 _interval_ops PGNSP PGUID 2745 1187 t 1186 ));
-DATA(insert ( 2742 _macaddr_ops PGNSP PGUID 2745 1040 t 829 ));
-DATA(insert ( 2742 _name_ops PGNSP PGUID 2745 1003 t 19 ));
-DATA(insert ( 2742 _numeric_ops PGNSP PGUID 2745 1231 t 1700 ));
-DATA(insert ( 2742 _oid_ops PGNSP PGUID 2745 1028 t 26 ));
-DATA(insert ( 2742 _oidvector_ops PGNSP PGUID 2745 1013 t 30 ));
-DATA(insert ( 2742 _time_ops PGNSP PGUID 2745 1183 t 1083 ));
-DATA(insert ( 2742 _timestamptz_ops PGNSP PGUID 2745 1185 t 1184 ));
-DATA(insert ( 2742 _timetz_ops PGNSP PGUID 2745 1270 t 1266 ));
-DATA(insert ( 2742 _varbit_ops PGNSP PGUID 2745 1563 t 1562 ));
-DATA(insert ( 2742 _varchar_ops PGNSP PGUID 2745 1015 t 1043 ));
-DATA(insert ( 2742 _timestamp_ops PGNSP PGUID 2745 1115 t 1114 ));
-DATA(insert ( 2742 _money_ops PGNSP PGUID 2745 791 t 790 ));
-DATA(insert ( 2742 _reltime_ops PGNSP PGUID 2745 1024 t 703 ));
-DATA(insert ( 2742 _tinterval_ops PGNSP PGUID 2745 1025 t 704 ));
+DATA(insert ( 2742 array_ops PGNSP PGUID 2745 2277 t 2283 ));
DATA(insert ( 403 uuid_ops PGNSP PGUID 2968 2950 t 0 ));
DATA(insert ( 405 uuid_ops PGNSP PGUID 2969 2950 t 0 ));
DATA(insert ( 403 pg_lsn_ops PGNSP PGUID 3253 3220 t 0 ));
@@ -253,6 +226,7 @@ DATA(insert ( 3580 float8_minmax_ops PGNSP PGUID 4070 701 t 701 ));
DATA(insert ( 3580 abstime_minmax_ops PGNSP PGUID 4072 702 t 702 ));
DATA(insert ( 3580 reltime_minmax_ops PGNSP PGUID 4073 703 t 703 ));
DATA(insert ( 3580 macaddr_minmax_ops PGNSP PGUID 4074 829 t 829 ));
+DATA(insert ( 3580 macaddr8_minmax_ops PGNSP PGUID 4109 774 t 774 ));
DATA(insert ( 3580 inet_minmax_ops PGNSP PGUID 4075 869 f 869 ));
DATA(insert ( 3580 inet_inclusion_ops PGNSP PGUID 4102 869 t 869 ));
DATA(insert ( 3580 bpchar_minmax_ops PGNSP PGUID 4076 1042 t 1042 ));
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index b8f06b3500..ccbb17efec 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_operator.h
@@ -156,8 +156,6 @@ DATA(insert OID = 389 ( "!!" PGNSP PGUID l f f 0 20 1700 0 0 numeric_fac
DESCR("deprecated, use ! instead");
DATA(insert OID = 385 ( "=" PGNSP PGUID b f t 29 29 16 385 0 cideq eqsel eqjoinsel ));
DESCR("equal");
-DATA(insert OID = 386 ( "=" PGNSP PGUID b f t 22 22 16 386 0 int2vectoreq eqsel eqjoinsel ));
-DESCR("equal");
DATA(insert OID = 387 ( "=" PGNSP PGUID b t f 27 27 16 387 402 tideq eqsel eqjoinsel ));
DESCR("equal");
@@ -711,6 +709,10 @@ DATA(insert OID = 908 ( "*" PGNSP PGUID b f f 790 701 790 916 0 cash_mul_
DESCR("multiply");
DATA(insert OID = 909 ( "/" PGNSP PGUID b f f 790 701 790 0 0 cash_div_flt8 - - ));
DESCR("divide");
+DATA(insert OID = 3346 ( "*" PGNSP PGUID b f f 790 20 790 3349 0 cash_mul_int8 - - ));
+DESCR("multiply");
+DATA(insert OID = 3347 ( "/" PGNSP PGUID b f f 790 20 790 0 0 cash_div_int8 - - ));
+DESCR("divide");
DATA(insert OID = 912 ( "*" PGNSP PGUID b f f 790 23 790 917 0 cash_mul_int4 - - ));
DESCR("multiply");
DATA(insert OID = 913 ( "/" PGNSP PGUID b f f 790 23 790 0 0 cash_div_int4 - - ));
@@ -721,6 +723,8 @@ DATA(insert OID = 915 ( "/" PGNSP PGUID b f f 790 21 790 0 0 cash_div_
DESCR("divide");
DATA(insert OID = 916 ( "*" PGNSP PGUID b f f 701 790 790 908 0 flt8_mul_cash - - ));
DESCR("multiply");
+DATA(insert OID = 3349 ( "*" PGNSP PGUID b f f 20 790 790 3346 0 int8_mul_cash - - ));
+DESCR("multiply");
DATA(insert OID = 917 ( "*" PGNSP PGUID b f f 23 790 790 912 0 int4_mul_cash - - ));
DESCR("multiply");
DATA(insert OID = 918 ( "*" PGNSP PGUID b f f 21 790 790 914 0 int2_mul_cash - - ));
@@ -1115,7 +1119,7 @@ DESCR("equal");
DATA(insert OID = 1617 ( "#" PGNSP PGUID b f f 628 628 600 1617 0 line_interpt - - ));
DESCR("intersection point");
-/* MAC type */
+/* MACADDR type */
DATA(insert OID = 1220 ( "=" PGNSP PGUID b t t 829 829 16 1220 1221 macaddr_eq eqsel eqjoinsel ));
DESCR("equal");
DATA(insert OID = 1221 ( "<>" PGNSP PGUID b f f 829 829 16 1221 1220 macaddr_ne neqsel neqjoinsel ));
@@ -1136,6 +1140,27 @@ DESCR("bitwise and");
DATA(insert OID = 3149 ( "|" PGNSP PGUID b f f 829 829 829 0 0 macaddr_or - - ));
DESCR("bitwise or");
+/* MACADDR8 type */
+DATA(insert OID = 3362 ( "=" PGNSP PGUID b t t 774 774 16 3362 3363 macaddr8_eq eqsel eqjoinsel ));
+DESCR("equal");
+DATA(insert OID = 3363 ( "<>" PGNSP PGUID b f f 774 774 16 3363 3362 macaddr8_ne neqsel neqjoinsel ));
+DESCR("not equal");
+DATA(insert OID = 3364 ( "<" PGNSP PGUID b f f 774 774 16 3366 3367 macaddr8_lt scalarltsel scalarltjoinsel ));
+DESCR("less than");
+DATA(insert OID = 3365 ( "<=" PGNSP PGUID b f f 774 774 16 3367 3366 macaddr8_le scalarltsel scalarltjoinsel ));
+DESCR("less than or equal");
+DATA(insert OID = 3366 ( ">" PGNSP PGUID b f f 774 774 16 3364 3365 macaddr8_gt scalargtsel scalargtjoinsel ));
+DESCR("greater than");
+DATA(insert OID = 3367 ( ">=" PGNSP PGUID b f f 774 774 16 3365 3364 macaddr8_ge scalargtsel scalargtjoinsel ));
+DESCR("greater than or equal");
+
+DATA(insert OID = 3368 ( "~" PGNSP PGUID l f f 0 774 774 0 0 macaddr8_not - - ));
+DESCR("bitwise not");
+DATA(insert OID = 3369 ( "&" PGNSP PGUID b f f 774 774 774 0 0 macaddr8_and - - ));
+DESCR("bitwise and");
+DATA(insert OID = 3370 ( "|" PGNSP PGUID b f f 774 774 774 0 0 macaddr8_or - - ));
+DESCR("bitwise or");
+
/* INET type (these also support CIDR via implicit cast) */
DATA(insert OID = 1201 ( "=" PGNSP PGUID b t t 869 869 16 1201 1202 network_eq eqsel eqjoinsel ));
DESCR("equal");
@@ -1822,6 +1847,8 @@ DATA(insert OID = 3284 ( "||" PGNSP PGUID b f f 3802 3802 3802 0 0 jsonb_con
DESCR("concatenate");
DATA(insert OID = 3285 ( "-" PGNSP PGUID b f f 3802 25 3802 0 0 3302 - - ));
DESCR("delete object field");
+DATA(insert OID = 3398 ( "-" PGNSP PGUID b f f 3802 1009 3802 0 0 3343 - -));
+DESCR("delete object fields");
DATA(insert OID = 3286 ( "-" PGNSP PGUID b f f 3802 23 3802 0 0 3303 - - ));
DESCR("delete array element");
DATA(insert OID = 3287 ( "#-" PGNSP PGUID b f f 3802 1009 3802 0 0 jsonb_delete_path - - ));
diff --git a/src/include/catalog/pg_operator_fn.h b/src/include/catalog/pg_operator_fn.h
index 58814e2111..d8ea390fdf 100644
--- a/src/include/catalog/pg_operator_fn.h
+++ b/src/include/catalog/pg_operator_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_operator.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_operator_fn.h
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 1499a502f3..546527aa8e 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_opfamily.h
@@ -79,6 +79,7 @@ DATA(insert OID = 1974 ( 403 network_ops PGNSP PGUID ));
#define NETWORK_BTREE_FAM_OID 1974
DATA(insert OID = 1975 ( 405 network_ops PGNSP PGUID ));
DATA(insert OID = 3550 ( 783 network_ops PGNSP PGUID ));
+DATA(insert OID = 3794 ( 4000 network_ops PGNSP PGUID ));
DATA(insert OID = 1976 ( 403 integer_ops PGNSP PGUID ));
#define INTEGER_BTREE_FAM_OID 1976
DATA(insert OID = 1977 ( 405 integer_ops PGNSP PGUID ));
@@ -86,6 +87,8 @@ DATA(insert OID = 1982 ( 403 interval_ops PGNSP PGUID ));
DATA(insert OID = 1983 ( 405 interval_ops PGNSP PGUID ));
DATA(insert OID = 1984 ( 403 macaddr_ops PGNSP PGUID ));
DATA(insert OID = 1985 ( 405 macaddr_ops PGNSP PGUID ));
+DATA(insert OID = 3371 ( 403 macaddr8_ops PGNSP PGUID ));
+DATA(insert OID = 3372 ( 405 macaddr8_ops PGNSP PGUID ));
DATA(insert OID = 1986 ( 403 name_ops PGNSP PGUID ));
#define NAME_BTREE_FAM_OID 1986
DATA(insert OID = 1987 ( 405 name_ops PGNSP PGUID ));
@@ -116,7 +119,6 @@ DATA(insert OID = 2099 ( 403 money_ops PGNSP PGUID ));
DATA(insert OID = 2222 ( 405 bool_ops PGNSP PGUID ));
#define BOOL_HASH_FAM_OID 2222
DATA(insert OID = 2223 ( 405 bytea_ops PGNSP PGUID ));
-DATA(insert OID = 2224 ( 405 int2vector_ops PGNSP PGUID ));
DATA(insert OID = 2789 ( 403 tid_ops PGNSP PGUID ));
DATA(insert OID = 2225 ( 405 xid_ops PGNSP PGUID ));
DATA(insert OID = 2226 ( 405 cid_ops PGNSP PGUID ));
@@ -171,6 +173,7 @@ DATA(insert OID = 4070 ( 3580 float_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4072 ( 3580 abstime_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4073 ( 3580 reltime_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4074 ( 3580 macaddr_minmax_ops PGNSP PGUID ));
+DATA(insert OID = 4109 ( 3580 macaddr8_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4075 ( 3580 network_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4102 ( 3580 network_inclusion_ops PGNSP PGUID ));
DATA(insert OID = 4076 ( 3580 bpchar_minmax_ops PGNSP PGUID ));
diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h
new file mode 100644
index 0000000000..bdff36a04b
--- /dev/null
+++ b/src/include/catalog/pg_partitioned_table.h
@@ -0,0 +1,74 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_partitioned_table.h
+ * definition of the system "partitioned table" relation
+ * along with the relation's initial contents.
+ *
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ *
+ * src/include/catalog/pg_partitioned_table.h
+ *
+ * NOTES
+ * the genbki.sh script reads this file and generates .bki
+ * information from the DATA() statements.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_PARTITIONED_TABLE_H
+#define PG_PARTITIONED_TABLE_H
+
+#include "catalog/genbki.h"
+
+/* ----------------
+ * pg_partitioned_table definition. cpp turns this into
+ * typedef struct FormData_pg_partitioned_table
+ * ----------------
+ */
+#define PartitionedRelationId 3350
+
+CATALOG(pg_partitioned_table,3350) BKI_WITHOUT_OIDS
+{
+ Oid partrelid; /* partitioned table oid */
+ char partstrat; /* partitioning strategy */
+ int16 partnatts; /* number of partition key columns */
+
+ /*
+ * variable-length fields start here, but we allow direct access to
+ * partattrs via the C struct. That's because the first variable-length
+ * field of a heap tuple can be reliably accessed using its C struct
+ * offset, as previous fields are all non-nullable fixed-length fields.
+ */
+ int2vector partattrs; /* each member of the array is the attribute
+ * number of a partition key column, or 0 if
+ * the column is actually an expression */
+
+#ifdef CATALOG_VARLEN
+ oidvector partclass; /* operator class to compare keys */
+ oidvector partcollation; /* user-specified collation for keys */
+ pg_node_tree partexprs; /* list of expressions in the partition key;
+ * one item for each zero entry in partattrs[] */
+#endif
+} FormData_pg_partitioned_table;
+
+/* ----------------
+ * Form_pg_partitioned_table corresponds to a pointer to a tuple with
+ * the format of pg_partitioned_table relation.
+ * ----------------
+ */
+typedef FormData_pg_partitioned_table *Form_pg_partitioned_table;
+
+/* ----------------
+ * compiler constants for pg_partitioned_table
+ * ----------------
+ */
+#define Natts_pg_partitioned_table 7
+#define Anum_pg_partitioned_table_partrelid 1
+#define Anum_pg_partitioned_table_partstrat 2
+#define Anum_pg_partitioned_table_partnatts 3
+#define Anum_pg_partitioned_table_partattrs 4
+#define Anum_pg_partitioned_table_partclass 5
+#define Anum_pg_partitioned_table_partcollation 6
+#define Anum_pg_partitioned_table_partexprs 7
+
+#endif /* PG_PARTITIONED_TABLE_H */
diff --git a/src/include/catalog/pg_pltemplate.h b/src/include/catalog/pg_pltemplate.h
index 3c7388de55..6d770fbb3c 100644
--- a/src/include/catalog/pg_pltemplate.h
+++ b/src/include/catalog/pg_pltemplate.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_pltemplate.h
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index d73e9c2c1a..331584f5e0 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -2,7 +2,7 @@
* pg_policy.h
* definition of the system "policy" relation (pg_policy)
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*/
@@ -23,6 +23,7 @@ CATALOG(pg_policy,3256)
NameData polname; /* Policy name. */
Oid polrelid; /* Oid of the relation with policy. */
char polcmd; /* One of ACL_*_CHR, or '*' for all */
+ bool polpermissive; /* restrictive or permissive policy */
#ifdef CATALOG_VARLEN
Oid polroles[1]; /* Roles associated with policy, not-NULL */
@@ -42,12 +43,13 @@ typedef FormData_pg_policy *Form_pg_policy;
* compiler constants for pg_policy
* ----------------
*/
-#define Natts_pg_policy 6
-#define Anum_pg_policy_polname 1
-#define Anum_pg_policy_polrelid 2
-#define Anum_pg_policy_polcmd 3
-#define Anum_pg_policy_polroles 4
-#define Anum_pg_policy_polqual 5
-#define Anum_pg_policy_polwithcheck 6
+#define Natts_pg_policy 7
+#define Anum_pg_policy_polname 1
+#define Anum_pg_policy_polrelid 2
+#define Anum_pg_policy_polcmd 3
+#define Anum_pg_policy_polpermissive 4
+#define Anum_pg_policy_polroles 5
+#define Anum_pg_policy_polqual 6
+#define Anum_pg_policy_polwithcheck 7
#endif /* PG_POLICY_H */
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 7fccccf2a4..e06ed6cc77 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_proc.h
@@ -541,7 +541,6 @@ DATA(insert OID = 313 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23
DESCR("convert int2 to int4");
DATA(insert OID = 314 ( int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 21 "23" _null_ _null_ _null_ _null_ _null_ i4toi2 _null_ _null_ _null_ ));
DESCR("convert int4 to int2");
-DATA(insert OID = 315 ( int2vectoreq PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "22 22" _null_ _null_ _null_ _null_ _null_ int2vectoreq _null_ _null_ _null_ ));
DATA(insert OID = 316 ( float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 701 "23" _null_ _null_ _null_ _null_ _null_ i4tod _null_ _null_ _null_ ));
DESCR("convert int4 to float8");
DATA(insert OID = 317 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "701" _null_ _null_ _null_ _null_ _null_ dtoi4 _null_ _null_ _null_ ));
@@ -566,6 +565,10 @@ DATA(insert OID = 335 ( brinhandler PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0
DESCR("brin index access method handler");
DATA(insert OID = 3952 ( brin_summarize_new_values PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 23 "2205" _null_ _null_ _null_ _null_ _null_ brin_summarize_new_values _null_ _null_ _null_ ));
DESCR("brin: standalone scan new table pages");
+DATA(insert OID = 3999 ( brin_summarize_range PGNSP PGUID 12 1 0 0 0 f f f f t f v s 2 0 23 "2205 20" _null_ _null_ _null_ _null_ _null_ brin_summarize_range _null_ _null_ _null_ ));
+DESCR("brin: standalone scan new table pages");
+DATA(insert OID = 4014 ( brin_desummarize_range PGNSP PGUID 12 1 0 0 0 f f f f t f v s 2 0 2278 "2205 20" _null_ _null_ _null_ _null_ _null_ brin_desummarize_range _null_ _null_ _null_ ));
+DESCR("brin: desummarize page range");
DATA(insert OID = 338 ( amvalidate PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ amvalidate _null_ _null_ _null_ ));
DESCR("validate an operator class");
@@ -688,14 +691,14 @@ DATA(insert OID = 457 ( hashoidvector PGNSP PGUID 12 1 0 0 0 f f f f t f i s
DESCR("hash");
DATA(insert OID = 329 ( hash_aclitem PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "1033" _null_ _null_ _null_ _null_ _null_ hash_aclitem _null_ _null_ _null_ ));
DESCR("hash");
-DATA(insert OID = 398 ( hashint2vector PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "22" _null_ _null_ _null_ _null_ _null_ hashint2vector _null_ _null_ _null_ ));
-DESCR("hash");
DATA(insert OID = 399 ( hashmacaddr PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "829" _null_ _null_ _null_ _null_ _null_ hashmacaddr _null_ _null_ _null_ ));
DESCR("hash");
DATA(insert OID = 422 ( hashinet PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "869" _null_ _null_ _null_ _null_ _null_ hashinet _null_ _null_ _null_ ));
DESCR("hash");
DATA(insert OID = 432 ( hash_numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "1700" _null_ _null_ _null_ _null_ _null_ hash_numeric _null_ _null_ _null_ ));
DESCR("hash");
+DATA(insert OID = 328 ( hashmacaddr8 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "774" _null_ _null_ _null_ _null_ _null_ hashmacaddr8 _null_ _null_ _null_ ));
+DESCR("hash");
DATA(insert OID = 438 ( num_nulls PGNSP PGUID 12 1 0 2276 0 f f f f f f i s 1 0 23 "2276" "{2276}" "{v}" _null_ _null_ _null_ pg_num_nulls _null_ _null_ _null_ ));
DESCR("count the number of NULL arguments");
@@ -907,11 +910,11 @@ DESCR("storage manager");
DATA(insert OID = 763 ( smgrne PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "210 210" _null_ _null_ _null_ _null_ _null_ smgrne _null_ _null_ _null_ ));
DESCR("storage manager");
-DATA(insert OID = 764 ( lo_import PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 26 "25" _null_ _null_ _null_ _null_ _null_ lo_import _null_ _null_ _null_ ));
+DATA(insert OID = 764 ( lo_import PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 26 "25" _null_ _null_ _null_ _null_ _null_ be_lo_import _null_ _null_ _null_ ));
DESCR("large object import");
-DATA(insert OID = 767 ( lo_import PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 26 "25 26" _null_ _null_ _null_ _null_ _null_ lo_import_with_oid _null_ _null_ _null_ ));
+DATA(insert OID = 767 ( lo_import PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 26 "25 26" _null_ _null_ _null_ _null_ _null_ be_lo_import_with_oid _null_ _null_ _null_ ));
DESCR("large object import");
-DATA(insert OID = 765 ( lo_export PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "26 25" _null_ _null_ _null_ _null_ _null_ lo_export _null_ _null_ _null_ ));
+DATA(insert OID = 765 ( lo_export PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "26 25" _null_ _null_ _null_ _null_ _null_ be_lo_export _null_ _null_ _null_ ));
DESCR("large object export");
DATA(insert OID = 766 ( int4inc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4inc _null_ _null_ _null_ ));
@@ -961,8 +964,11 @@ DESCR("name of the current database");
DATA(insert OID = 817 ( current_query PGNSP PGUID 12 1 0 0 0 f f f f f f v r 0 0 25 "" _null_ _null_ _null_ _null_ _null_ current_query _null_ _null_ _null_ ));
DESCR("get the currently executing query");
+DATA(insert OID = 3399 ( int8_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "20 790" _null_ _null_ _null_ _null_ _null_ int8_mul_cash _null_ _null_ _null_ ));
DATA(insert OID = 862 ( int4_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "23 790" _null_ _null_ _null_ _null_ _null_ int4_mul_cash _null_ _null_ _null_ ));
DATA(insert OID = 863 ( int2_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "21 790" _null_ _null_ _null_ _null_ _null_ int2_mul_cash _null_ _null_ _null_ ));
+DATA(insert OID = 3344 ( cash_mul_int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "790 20" _null_ _null_ _null_ _null_ _null_ cash_mul_int8 _null_ _null_ _null_ ));
+DATA(insert OID = 3345 ( cash_div_int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "790 20" _null_ _null_ _null_ _null_ _null_ cash_div_int8 _null_ _null_ _null_ ));
DATA(insert OID = 864 ( cash_mul_int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "790 23" _null_ _null_ _null_ _null_ _null_ cash_mul_int4 _null_ _null_ _null_ ));
DATA(insert OID = 865 ( cash_div_int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "790 23" _null_ _null_ _null_ _null_ _null_ cash_div_int4 _null_ _null_ _null_ ));
DATA(insert OID = 866 ( cash_mul_int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 790 "790 21" _null_ _null_ _null_ _null_ _null_ cash_mul_int2 _null_ _null_ _null_ ));
@@ -1015,38 +1021,38 @@ DESCR("convert text to char");
DATA(insert OID = 946 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 25 "18" _null_ _null_ _null_ _null_ _null_ char_text _null_ _null_ _null_ ));
DESCR("convert char to text");
-DATA(insert OID = 952 ( lo_open PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "26 23" _null_ _null_ _null_ _null_ _null_ lo_open _null_ _null_ _null_ ));
+DATA(insert OID = 952 ( lo_open PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "26 23" _null_ _null_ _null_ _null_ _null_ be_lo_open _null_ _null_ _null_ ));
DESCR("large object open");
-DATA(insert OID = 953 ( lo_close PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ lo_close _null_ _null_ _null_ ));
+DATA(insert OID = 953 ( lo_close PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ be_lo_close _null_ _null_ _null_ ));
DESCR("large object close");
-DATA(insert OID = 954 ( loread PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 17 "23 23" _null_ _null_ _null_ _null_ _null_ loread _null_ _null_ _null_ ));
+DATA(insert OID = 954 ( loread PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 17 "23 23" _null_ _null_ _null_ _null_ _null_ be_loread _null_ _null_ _null_ ));
DESCR("large object read");
-DATA(insert OID = 955 ( lowrite PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "23 17" _null_ _null_ _null_ _null_ _null_ lowrite _null_ _null_ _null_ ));
+DATA(insert OID = 955 ( lowrite PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "23 17" _null_ _null_ _null_ _null_ _null_ be_lowrite _null_ _null_ _null_ ));
DESCR("large object write");
-DATA(insert OID = 956 ( lo_lseek PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 23 "23 23 23" _null_ _null_ _null_ _null_ _null_ lo_lseek _null_ _null_ _null_ ));
+DATA(insert OID = 956 ( lo_lseek PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 23 "23 23 23" _null_ _null_ _null_ _null_ _null_ be_lo_lseek _null_ _null_ _null_ ));
DESCR("large object seek");
-DATA(insert OID = 3170 ( lo_lseek64 PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 20 "23 20 23" _null_ _null_ _null_ _null_ _null_ lo_lseek64 _null_ _null_ _null_ ));
+DATA(insert OID = 3170 ( lo_lseek64 PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 20 "23 20 23" _null_ _null_ _null_ _null_ _null_ be_lo_lseek64 _null_ _null_ _null_ ));
DESCR("large object seek (64 bit)");
-DATA(insert OID = 957 ( lo_creat PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 26 "23" _null_ _null_ _null_ _null_ _null_ lo_creat _null_ _null_ _null_ ));
+DATA(insert OID = 957 ( lo_creat PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 26 "23" _null_ _null_ _null_ _null_ _null_ be_lo_creat _null_ _null_ _null_ ));
DESCR("large object create");
-DATA(insert OID = 715 ( lo_create PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 26 "26" _null_ _null_ _null_ _null_ _null_ lo_create _null_ _null_ _null_ ));
+DATA(insert OID = 715 ( lo_create PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 26 "26" _null_ _null_ _null_ _null_ _null_ be_lo_create _null_ _null_ _null_ ));
DESCR("large object create");
-DATA(insert OID = 958 ( lo_tell PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ lo_tell _null_ _null_ _null_ ));
+DATA(insert OID = 958 ( lo_tell PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ be_lo_tell _null_ _null_ _null_ ));
DESCR("large object position");
-DATA(insert OID = 3171 ( lo_tell64 PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 20 "23" _null_ _null_ _null_ _null_ _null_ lo_tell64 _null_ _null_ _null_ ));
+DATA(insert OID = 3171 ( lo_tell64 PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 20 "23" _null_ _null_ _null_ _null_ _null_ be_lo_tell64 _null_ _null_ _null_ ));
DESCR("large object position (64 bit)");
-DATA(insert OID = 1004 ( lo_truncate PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ lo_truncate _null_ _null_ _null_ ));
+DATA(insert OID = 1004 ( lo_truncate PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ be_lo_truncate _null_ _null_ _null_ ));
DESCR("truncate large object");
-DATA(insert OID = 3172 ( lo_truncate64 PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "23 20" _null_ _null_ _null_ _null_ _null_ lo_truncate64 _null_ _null_ _null_ ));
+DATA(insert OID = 3172 ( lo_truncate64 PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 23 "23 20" _null_ _null_ _null_ _null_ _null_ be_lo_truncate64 _null_ _null_ _null_ ));
DESCR("truncate large object (64 bit)");
-DATA(insert OID = 3457 ( lo_from_bytea PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 26 "26 17" _null_ _null_ _null_ _null_ _null_ lo_from_bytea _null_ _null_ _null_ ));
+DATA(insert OID = 3457 ( lo_from_bytea PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 26 "26 17" _null_ _null_ _null_ _null_ _null_ be_lo_from_bytea _null_ _null_ _null_ ));
DESCR("create new large object with given content");
-DATA(insert OID = 3458 ( lo_get PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 17 "26" _null_ _null_ _null_ _null_ _null_ lo_get _null_ _null_ _null_ ));
+DATA(insert OID = 3458 ( lo_get PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 17 "26" _null_ _null_ _null_ _null_ _null_ be_lo_get _null_ _null_ _null_ ));
DESCR("read entire large object");
-DATA(insert OID = 3459 ( lo_get PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 17 "26 20 23" _null_ _null_ _null_ _null_ _null_ lo_get_fragment _null_ _null_ _null_ ));
+DATA(insert OID = 3459 ( lo_get PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 17 "26 20 23" _null_ _null_ _null_ _null_ _null_ be_lo_get_fragment _null_ _null_ _null_ ));
DESCR("read large object from offset for length");
-DATA(insert OID = 3460 ( lo_put PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 2278 "26 20 17" _null_ _null_ _null_ _null_ _null_ lo_put _null_ _null_ _null_ ));
+DATA(insert OID = 3460 ( lo_put PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 2278 "26 20 17" _null_ _null_ _null_ _null_ _null_ be_lo_put _null_ _null_ _null_ ));
DESCR("write data at offset");
DATA(insert OID = 959 ( on_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "600 628" _null_ _null_ _null_ _null_ _null_ on_pl _null_ _null_ _null_ ));
@@ -1055,7 +1061,7 @@ DATA(insert OID = 961 ( close_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0
DATA(insert OID = 962 ( close_sl PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 600 "601 628" _null_ _null_ _null_ _null_ _null_ close_sl _null_ _null_ _null_ ));
DATA(insert OID = 963 ( close_lb PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 600 "628 603" _null_ _null_ _null_ _null_ _null_ close_lb _null_ _null_ _null_ ));
-DATA(insert OID = 964 ( lo_unlink PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 23 "26" _null_ _null_ _null_ _null_ _null_ lo_unlink _null_ _null_ _null_ ));
+DATA(insert OID = 964 ( lo_unlink PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 23 "26" _null_ _null_ _null_ _null_ _null_ be_lo_unlink _null_ _null_ _null_ ));
DESCR("large object unlink (delete)");
DATA(insert OID = 973 ( path_inter PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_inter _null_ _null_ _null_ ));
@@ -1767,8 +1773,10 @@ DATA(insert OID = 1576 ( setval PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 20
DESCR("set sequence value");
DATA(insert OID = 1765 ( setval PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 20 "2205 20 16" _null_ _null_ _null_ _null_ _null_ setval3_oid _null_ _null_ _null_ ));
DESCR("set sequence value and is_called status");
-DATA(insert OID = 3078 ( pg_sequence_parameters PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 2249 "26" "{26,20,20,20,20,16}" "{i,o,o,o,o,o}" "{sequence_oid,start_value,minimum_value,maximum_value,increment,cycle_option}" _null_ _null_ pg_sequence_parameters _null_ _null_ _null_));
+DATA(insert OID = 3078 ( pg_sequence_parameters PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 2249 "26" "{26,20,20,20,20,16,20,26}" "{i,o,o,o,o,o,o,o}" "{sequence_oid,start_value,minimum_value,maximum_value,increment,cycle_option,cache_size,data_type}" _null_ _null_ pg_sequence_parameters _null_ _null_ _null_));
DESCR("sequence parameters, for use by information schema");
+DATA(insert OID = 4032 ( pg_sequence_last_value PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ pg_sequence_last_value _null_ _null_ _null_ ));
+DESCR("sequence last value");
DATA(insert OID = 1579 ( varbit_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 1562 "2275 26 23" _null_ _null_ _null_ _null_ _null_ varbit_in _null_ _null_ _null_ ));
DESCR("I/O");
@@ -1913,10 +1921,14 @@ DATA(insert OID = 2284 ( regexp_replace PGNSP PGUID 12 1 0 0 0 f f f f t f i
DESCR("replace text using regexp");
DATA(insert OID = 2285 ( regexp_replace PGNSP PGUID 12 1 0 0 0 f f f f t f i s 4 0 25 "25 25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace _null_ _null_ _null_ ));
DESCR("replace text using regexp");
+DATA(insert OID = 3396 ( regexp_match PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_match_no_flags _null_ _null_ _null_ ));
+DESCR("find first match for regexp");
+DATA(insert OID = 3397 ( regexp_match PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_match _null_ _null_ _null_ ));
+DESCR("find first match for regexp");
DATA(insert OID = 2763 ( regexp_matches PGNSP PGUID 12 1 1 0 0 f f f f t t i s 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches_no_flags _null_ _null_ _null_ ));
-DESCR("find all match groups for regexp");
+DESCR("find match(es) for regexp");
DATA(insert OID = 2764 ( regexp_matches PGNSP PGUID 12 1 10 0 0 f f f f t t i s 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches _null_ _null_ _null_ ));
-DESCR("find all match groups for regexp");
+DESCR("find match(es) for regexp");
DATA(insert OID = 2088 ( split_part PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 25 "25 25 23" _null_ _null_ _null_ _null_ _null_ split_text _null_ _null_ _null_ ));
DESCR("split string by field_sep and return field_num");
DATA(insert OID = 2765 ( regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 f f f f t t i s 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table_no_flags _null_ _null_ _null_ ));
@@ -1977,6 +1989,12 @@ DATA(insert OID = 1642 ( pg_get_userbyid PGNSP PGUID 12 1 0 0 0 f f f f t f
DESCR("role name by OID (with fallback)");
DATA(insert OID = 1643 ( pg_get_indexdef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_indexdef _null_ _null_ _null_ ));
DESCR("index description");
+DATA(insert OID = 3415 ( pg_get_statisticsobjdef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_statisticsobjdef _null_ _null_ _null_ ));
+DESCR("extended statistics object description");
+DATA(insert OID = 3352 ( pg_get_partkeydef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_partkeydef _null_ _null_ _null_ ));
+DESCR("partition key description");
+DATA(insert OID = 3408 ( pg_get_partition_constraintdef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_partition_constraintdef _null_ _null_ _null_ ));
+DESCR("partition constraint description");
DATA(insert OID = 1662 ( pg_get_triggerdef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_triggerdef _null_ _null_ _null_ ));
DESCR("trigger description");
DATA(insert OID = 1387 ( pg_get_constraintdef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_constraintdef _null_ _null_ _null_ ));
@@ -2012,6 +2030,9 @@ DESCR("is a relation insertable/updatable/deletable");
DATA(insert OID = 3843 ( pg_column_is_updatable PGNSP PGUID 12 10 0 0 0 f f f f t f s s 3 0 16 "2205 21 16" _null_ _null_ _null_ _null_ _null_ pg_column_is_updatable _null_ _null_ _null_ ));
DESCR("is a column updatable");
+DATA(insert OID = 6120 ( pg_get_replica_identity_index PGNSP PGUID 12 10 0 0 0 f f f f t f s s 1 0 2205 "2205" _null_ _null_ _null_ _null_ _null_ pg_get_replica_identity_index _null_ _null_ _null_ ));
+DESCR("oid of replica identity index if any");
+
/* Deferrable unique constraint trigger */
DATA(insert OID = 1250 ( unique_key_recheck PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ unique_key_recheck _null_ _null_ _null_ ));
DESCR("deferred UNIQUE constraint check");
@@ -2051,6 +2072,7 @@ DATA(insert OID = 1671 ( varbitlt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0
DATA(insert OID = 1672 ( varbitcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 23 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitcmp _null_ _null_ _null_ ));
DESCR("less-equal-greater");
+/* avoid the C names bitand and bitor, since they are C++ keywords */
DATA(insert OID = 1673 ( bitand PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1560 "1560 1560" _null_ _null_ _null_ _null_ _null_ bit_and _null_ _null_ _null_ ));
DATA(insert OID = 1674 ( bitor PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1560 "1560 1560" _null_ _null_ _null_ _null_ _null_ bit_or _null_ _null_ _null_ ));
DATA(insert OID = 1675 ( bitxor PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1560 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitxor _null_ _null_ _null_ ));
@@ -2090,14 +2112,14 @@ DESCR("get bit");
DATA(insert OID = 3033 ( set_bit PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 1560 "1560 23 23" _null_ _null_ _null_ _null_ _null_ bitsetbit _null_ _null_ _null_ ));
DESCR("set bit");
-/* for mac type support */
+/* for macaddr type support */
DATA(insert OID = 436 ( macaddr_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "2275" _null_ _null_ _null_ _null_ _null_ macaddr_in _null_ _null_ _null_ ));
DESCR("I/O");
DATA(insert OID = 437 ( macaddr_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "829" _null_ _null_ _null_ _null_ _null_ macaddr_out _null_ _null_ _null_ ));
DESCR("I/O");
DATA(insert OID = 753 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr_trunc _null_ _null_ _null_ ));
-DESCR("MAC manufacturer fields");
+DESCR("MACADDR manufacturer fields");
DATA(insert OID = 830 ( macaddr_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_eq _null_ _null_ _null_ ));
DATA(insert OID = 831 ( macaddr_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_lt _null_ _null_ _null_ ));
@@ -2110,6 +2132,35 @@ DESCR("less-equal-greater");
DATA(insert OID = 3144 ( macaddr_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr_not _null_ _null_ _null_ ));
DATA(insert OID = 3145 ( macaddr_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_and _null_ _null_ _null_ ));
DATA(insert OID = 3146 ( macaddr_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_or _null_ _null_ _null_ ));
+DATA(insert OID = 3359 ( macaddr_sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ macaddr_sortsupport _null_ _null_ _null_ ));
+DESCR("sort support");
+
+/* for macaddr8 type support */
+DATA(insert OID = 4110 ( macaddr8_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "2275" _null_ _null_ _null_ _null_ _null_ macaddr8_in _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 4111 ( macaddr8_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "774" _null_ _null_ _null_ _null_ _null_ macaddr8_out _null_ _null_ _null_ ));
+DESCR("I/O");
+
+DATA(insert OID = 4112 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr8_trunc _null_ _null_ _null_ ));
+DESCR("MACADDR8 manufacturer fields");
+
+DATA(insert OID = 4113 ( macaddr8_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_eq _null_ _null_ _null_ ));
+DATA(insert OID = 4114 ( macaddr8_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_lt _null_ _null_ _null_ ));
+DATA(insert OID = 4115 ( macaddr8_le PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_le _null_ _null_ _null_ ));
+DATA(insert OID = 4116 ( macaddr8_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_gt _null_ _null_ _null_ ));
+DATA(insert OID = 4117 ( macaddr8_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_ge _null_ _null_ _null_ ));
+DATA(insert OID = 4118 ( macaddr8_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_ne _null_ _null_ _null_ ));
+DATA(insert OID = 4119 ( macaddr8_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 23 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_cmp _null_ _null_ _null_ ));
+DESCR("less-equal-greater");
+DATA(insert OID = 4120 ( macaddr8_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr8_not _null_ _null_ _null_ ));
+DATA(insert OID = 4121 ( macaddr8_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 774 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_and _null_ _null_ _null_ ));
+DATA(insert OID = 4122 ( macaddr8_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 774 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr8_or _null_ _null_ _null_ ));
+DATA(insert OID = 4123 ( macaddr8 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "829" _null_ _null_ _null_ _null_ _null_ macaddrtomacaddr8 _null_ _null_ _null_ ));
+DESCR("convert macaddr to macaddr8");
+DATA(insert OID = 4124 ( macaddr PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "774" _null_ _null_ _null_ _null_ _null_ macaddr8tomacaddr _null_ _null_ _null_ ));
+DESCR("convert macaddr8 to macaddr");
+DATA(insert OID = 4125 ( macaddr8_set7bit PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr8_set7bit _null_ _null_ _null_ ));
+DESCR("set 7th bit in macaddr8");
/* for inet type support */
DATA(insert OID = 910 ( inet_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 869 "2275" _null_ _null_ _null_ _null_ _null_ inet_in _null_ _null_ _null_ ));
@@ -2209,6 +2260,18 @@ DESCR("GiST support");
DATA(insert OID = 3559 ( inet_gist_same PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 2281 "869 869 2281" _null_ _null_ _null_ _null_ _null_ inet_gist_same _null_ _null_ _null_ ));
DESCR("GiST support");
+/* SP-GiST support for inet and cidr */
+DATA(insert OID = 3795 ( inet_spg_config PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_spg_config _null_ _null_ _null_ ));
+DESCR("SP-GiST support");
+DATA(insert OID = 3796 ( inet_spg_choose PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_spg_choose _null_ _null_ _null_ ));
+DESCR("SP-GiST support");
+DATA(insert OID = 3797 ( inet_spg_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_spg_picksplit _null_ _null_ _null_ ));
+DESCR("SP-GiST support");
+DATA(insert OID = 3798 ( inet_spg_inner_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_spg_inner_consistent _null_ _null_ _null_ ));
+DESCR("SP-GiST support");
+DATA(insert OID = 3799 ( inet_spg_leaf_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_spg_leaf_consistent _null_ _null_ _null_ ));
+DESCR("SP-GiST support");
+
/* Selectivity estimation for inet and cidr */
DATA(insert OID = 3560 ( networksel PGNSP PGUID 12 1 0 0 0 f f f f t f s s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ networksel _null_ _null_ _null_ ));
DESCR("restriction selectivity for network operators");
@@ -2706,6 +2769,24 @@ DESCR("current user privilege on any column by rel name");
DATA(insert OID = 3029 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_id _null_ _null_ _null_ ));
DESCR("current user privilege on any column by rel oid");
+DATA(insert OID = 3355 ( pg_ndistinct_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 3361 "2275" _null_ _null_ _null_ _null_ _null_ pg_ndistinct_in _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3356 ( pg_ndistinct_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "3361" _null_ _null_ _null_ _null_ _null_ pg_ndistinct_out _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3357 ( pg_ndistinct_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 3361 "2281" _null_ _null_ _null_ _null_ _null_ pg_ndistinct_recv _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3358 ( pg_ndistinct_send PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 17 "3361" _null_ _null_ _null_ _null_ _null_ pg_ndistinct_send _null_ _null_ _null_ ));
+DESCR("I/O");
+
+DATA(insert OID = 3404 ( pg_dependencies_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 3402 "2275" _null_ _null_ _null_ _null_ _null_ pg_dependencies_in _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3405 ( pg_dependencies_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "3402" _null_ _null_ _null_ _null_ _null_ pg_dependencies_out _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3406 ( pg_dependencies_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 3402 "2281" _null_ _null_ _null_ _null_ _null_ pg_dependencies_recv _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3407 ( pg_dependencies_send PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 17 "3402" _null_ _null_ _null_ _null_ _null_ pg_dependencies_send _null_ _null_ _null_ ));
+DESCR("I/O");
+
DATA(insert OID = 1928 ( pg_stat_get_numscans PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_numscans _null_ _null_ _null_ ));
DESCR("statistics: number of scans done for table/index");
DATA(insert OID = 1929 ( pg_stat_get_tuples_returned PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_returned _null_ _null_ _null_ ));
@@ -2748,14 +2829,16 @@ DATA(insert OID = 3057 ( pg_stat_get_autoanalyze_count PGNSP PGUID 12 1 0 0 0 f
DESCR("statistics: number of auto analyzes for a table");
DATA(insert OID = 1936 ( pg_stat_get_backend_idset PGNSP PGUID 12 1 100 0 0 f f f f t t s r 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_idset _null_ _null_ _null_ ));
DESCR("statistics: currently active backend IDs");
-DATA(insert OID = 2022 ( pg_stat_get_activity PGNSP PGUID 12 1 100 0 0 f f f f f t s r 1 0 2249 "23" "{23,26,23,26,25,25,25,25,25,1184,1184,1184,1184,869,25,23,28,28,16,25,25,23,16,25}" "{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,pid,usesysid,application_name,state,query,wait_event_type,wait_event,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,ssl,sslversion,sslcipher,sslbits,sslcompression,sslclientdn}" _null_ _null_ pg_stat_get_activity _null_ _null_ _null_ ));
+DATA(insert OID = 2022 ( pg_stat_get_activity PGNSP PGUID 12 1 100 0 0 f f f f f t s r 1 0 2249 "23" "{23,26,23,26,25,25,25,25,25,1184,1184,1184,1184,869,25,23,28,28,25,16,25,25,23,16,25}" "{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,pid,usesysid,application_name,state,query,wait_event_type,wait_event,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,backend_type,ssl,sslversion,sslcipher,sslbits,sslcompression,sslclientdn}" _null_ _null_ pg_stat_get_activity _null_ _null_ _null_ ));
DESCR("statistics: information about currently active backends");
DATA(insert OID = 3318 ( pg_stat_get_progress_info PGNSP PGUID 12 1 100 0 0 f f f f t t s r 1 0 2249 "25" "{25,23,26,26,20,20,20,20,20,20,20,20,20,20}" "{i,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{cmdtype,pid,datid,relid,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10}" _null_ _null_ pg_stat_get_progress_info _null_ _null_ _null_ ));
DESCR("statistics: information about progress of backends running maintenance command");
-DATA(insert OID = 3099 ( pg_stat_get_wal_senders PGNSP PGUID 12 1 10 0 0 f f f f f t s r 0 0 2249 "" "{23,25,3220,3220,3220,3220,23,25}" "{o,o,o,o,o,o,o,o}" "{pid,state,sent_location,write_location,flush_location,replay_location,sync_priority,sync_state}" _null_ _null_ pg_stat_get_wal_senders _null_ _null_ _null_ ));
+DATA(insert OID = 3099 ( pg_stat_get_wal_senders PGNSP PGUID 12 1 10 0 0 f f f f f t s r 0 0 2249 "" "{23,25,3220,3220,3220,3220,1186,1186,1186,23,25}" "{o,o,o,o,o,o,o,o,o,o,o}" "{pid,state,sent_lsn,write_lsn,flush_lsn,replay_lsn,write_lag,flush_lag,replay_lag,sync_priority,sync_state}" _null_ _null_ pg_stat_get_wal_senders _null_ _null_ _null_ ));
DESCR("statistics: information about currently active replication");
DATA(insert OID = 3317 ( pg_stat_get_wal_receiver PGNSP PGUID 12 1 0 0 0 f f f f f f s r 0 0 2249 "" "{23,25,3220,23,3220,23,1184,1184,3220,1184,25,25}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,status,receive_start_lsn,receive_start_tli,received_lsn,received_tli,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time,slot_name,conninfo}" _null_ _null_ pg_stat_get_wal_receiver _null_ _null_ _null_ ));
DESCR("statistics: information about WAL receiver");
+DATA(insert OID = 6118 ( pg_stat_get_subscription PGNSP PGUID 12 1 0 0 0 f f f f f f s r 1 0 2249 "26" "{26,26,26,23,3220,1184,1184,3220,1184}" "{i,o,o,o,o,o,o,o,o}" "{subid,subid,relid,pid,received_lsn,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time}" _null_ _null_ pg_stat_get_subscription _null_ _null_ _null_ ));
+DESCR("statistics: information about subscription");
DATA(insert OID = 2026 ( pg_backend_pid PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_backend_pid _null_ _null_ _null_ ));
DESCR("statistics: current backend PID");
DATA(insert OID = 1937 ( pg_stat_get_backend_pid PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_pid _null_ _null_ _null_ ));
@@ -2821,9 +2904,9 @@ DESCR("statistics: number of temporary files written");
DATA(insert OID = 3151 ( pg_stat_get_db_temp_bytes PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_temp_bytes _null_ _null_ _null_ ));
DESCR("statistics: number of bytes in temporary files written");
DATA(insert OID = 2844 ( pg_stat_get_db_blk_read_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_blk_read_time _null_ _null_ _null_ ));
-DESCR("statistics: block read time, in msec");
+DESCR("statistics: block read time, in milliseconds");
DATA(insert OID = 2845 ( pg_stat_get_db_blk_write_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_blk_write_time _null_ _null_ _null_ ));
-DESCR("statistics: block write time, in msec");
+DESCR("statistics: block write time, in milliseconds");
DATA(insert OID = 3195 ( pg_stat_get_archiver PGNSP PGUID 12 1 0 0 0 f f f f f f s r 0 0 2249 "" "{20,25,1184,20,25,1184,1184}" "{o,o,o,o,o,o,o}" "{archived_count,last_archived_wal,last_archived_time,failed_count,last_failed_wal,last_failed_time,stats_reset}" _null_ _null_ pg_stat_get_archiver _null_ _null_ _null_ ));
DESCR("statistics: information about WAL archiver");
DATA(insert OID = 2769 ( pg_stat_get_bgwriter_timed_checkpoints PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_timed_checkpoints _null_ _null_ _null_ ));
@@ -2839,9 +2922,9 @@ DESCR("statistics: number of times the bgwriter stopped processing when it had w
DATA(insert OID = 3075 ( pg_stat_get_bgwriter_stat_reset_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_stat_reset_time _null_ _null_ _null_ ));
DESCR("statistics: last reset for the bgwriter");
DATA(insert OID = 3160 ( pg_stat_get_checkpoint_write_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 701 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_checkpoint_write_time _null_ _null_ _null_ ));
-DESCR("statistics: checkpoint time spent writing buffers to disk, in msec");
+DESCR("statistics: checkpoint time spent writing buffers to disk, in milliseconds");
DATA(insert OID = 3161 ( pg_stat_get_checkpoint_sync_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 701 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_checkpoint_sync_time _null_ _null_ _null_ ));
-DESCR("statistics: checkpoint time spent synchronizing buffers to disk, in msec");
+DESCR("statistics: checkpoint time spent synchronizing buffers to disk, in milliseconds");
DATA(insert OID = 2775 ( pg_stat_get_buf_written_backend PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_buf_written_backend _null_ _null_ _null_ ));
DESCR("statistics: number of buffers written by backends");
DATA(insert OID = 3063 ( pg_stat_get_buf_fsync_backend PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_buf_fsync_backend _null_ _null_ _null_ ));
@@ -2852,9 +2935,9 @@ DESCR("statistics: number of buffer allocations");
DATA(insert OID = 2978 ( pg_stat_get_function_calls PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_function_calls _null_ _null_ _null_ ));
DESCR("statistics: number of function calls");
DATA(insert OID = 2979 ( pg_stat_get_function_total_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_function_total_time _null_ _null_ _null_ ));
-DESCR("statistics: total execution time of function, in msec");
+DESCR("statistics: total execution time of function, in milliseconds");
DATA(insert OID = 2980 ( pg_stat_get_function_self_time PGNSP PGUID 12 1 0 0 0 f f f f t f s r 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_function_self_time _null_ _null_ _null_ ));
-DESCR("statistics: self execution time of function, in msec");
+DESCR("statistics: self execution time of function, in milliseconds");
DATA(insert OID = 3037 ( pg_stat_get_xact_numscans PGNSP PGUID 12 1 0 0 0 f f f f t f v r 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_numscans _null_ _null_ _null_ ));
DESCR("statistics: number of scans done for table/index in current transaction");
@@ -2877,9 +2960,9 @@ DESCR("statistics: number of blocks found in cache in current transaction");
DATA(insert OID = 3046 ( pg_stat_get_xact_function_calls PGNSP PGUID 12 1 0 0 0 f f f f t f v r 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_function_calls _null_ _null_ _null_ ));
DESCR("statistics: number of function calls in current transaction");
DATA(insert OID = 3047 ( pg_stat_get_xact_function_total_time PGNSP PGUID 12 1 0 0 0 f f f f t f v r 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_function_total_time _null_ _null_ _null_ ));
-DESCR("statistics: total execution time of function in current transaction, in msec");
+DESCR("statistics: total execution time of function in current transaction, in milliseconds");
DATA(insert OID = 3048 ( pg_stat_get_xact_function_self_time PGNSP PGUID 12 1 0 0 0 f f f f t f v r 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_function_self_time _null_ _null_ _null_ ));
-DESCR("statistics: self execution time of function in current transaction, in msec");
+DESCR("statistics: self execution time of function in current transaction, in milliseconds");
DATA(insert OID = 3788 ( pg_stat_get_snapshot_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_snapshot_timestamp _null_ _null_ _null_ ));
DESCR("statistics: timestamp of the current statistics snapshot");
@@ -2894,7 +2977,7 @@ DESCR("statistics: reset collected statistics for a single table or index in the
DATA(insert OID = 3777 ( pg_stat_reset_single_function_counters PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_reset_single_function_counters _null_ _null_ _null_ ));
DESCR("statistics: reset collected statistics for a single function in the current database");
-DATA(insert OID = 3163 ( pg_trigger_depth PGNSP PGUID 12 1 0 0 0 f f f f t f s s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_trigger_depth _null_ _null_ _null_ ));
+DATA(insert OID = 3163 ( pg_trigger_depth PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_trigger_depth _null_ _null_ _null_ ));
DESCR("current trigger depth");
DATA(insert OID = 3778 ( pg_tablespace_location PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_tablespace_location _null_ _null_ _null_ ));
@@ -3054,10 +3137,16 @@ DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 1 1000 0 0 f f f f
DESCR("SHOW ALL as a function");
DATA(insert OID = 3329 ( pg_show_all_file_settings PGNSP PGUID 12 1 1000 0 0 f f f f t t v s 0 0 2249 "" "{25,23,23,25,25,16,25}" "{o,o,o,o,o,o,o}" "{sourcefile,sourceline,seqno,name,setting,applied,error}" _null_ _null_ show_all_file_settings _null_ _null_ _null_ ));
DESCR("show config file settings");
+DATA(insert OID = 3401 ( pg_hba_file_rules PGNSP PGUID 12 1 1000 0 0 f f f f t t v s 0 0 2249 "" "{23,25,1009,1009,25,25,25,1009,25}" "{o,o,o,o,o,o,o,o,o}" "{line_number,type,database,user_name,address,netmask,auth_method,options,error}" _null_ _null_ pg_hba_file_rules _null_ _null_ _null_ ));
+DESCR("show pg_hba.conf rules");
DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 1 1000 0 0 f f f f t t v s 0 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted,fastpath}" _null_ _null_ pg_lock_status _null_ _null_ _null_ ));
DESCR("view system lock information");
DATA(insert OID = 2561 ( pg_blocking_pids PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 1007 "23" _null_ _null_ _null_ _null_ _null_ pg_blocking_pids _null_ _null_ _null_ ));
-DESCR("get array of PIDs of sessions blocking specified backend PID");
+DESCR("get array of PIDs of sessions blocking specified backend PID from acquiring a heavyweight lock");
+DATA(insert OID = 3376 ( pg_safe_snapshot_blocking_pids PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 1007 "23" _null_ _null_ _null_ _null_ _null_ pg_safe_snapshot_blocking_pids _null_ _null_ _null_ ));
+DESCR("get array of PIDs of sessions blocking specified backend PID from acquiring a safe snapshot");
+DATA(insert OID = 3378 ( pg_isolation_test_session_is_blocked PGNSP PGUID 12 1 0 0 0 f f f f t f v s 2 0 16 "23 1007" _null_ _null_ _null_ _null_ _null_ pg_isolation_test_session_is_blocked _null_ _null_ _null_ ));
+DESCR("isolationtester support function");
DATA(insert OID = 1065 ( pg_prepared_xact PGNSP PGUID 12 1 1000 0 0 f f f f t t v s 0 0 2249 "" "{28,25,1184,26,26}" "{o,o,o,o,o}" "{transaction,gid,prepared,ownerid,dbid}" _null_ _null_ pg_prepared_xact _null_ _null_ _null_ ));
DESCR("view two-phase transactions");
DATA(insert OID = 3819 ( pg_get_multixact_members PGNSP PGUID 12 1 1000 0 0 f f f f t t v s 1 0 2249 "28" "{28,28,25}" "{i,o,o}" "{multixid,xid,mode}" _null_ _null_ pg_get_multixact_members _null_ _null_ _null_ ));
@@ -3072,13 +3161,13 @@ DESCR("get transaction Id and commit timestamp of latest transaction commit");
DATA(insert OID = 3537 ( pg_describe_object PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 25 "26 26 23" _null_ _null_ _null_ _null_ _null_ pg_describe_object _null_ _null_ _null_ ));
DESCR("get identification of SQL object");
-DATA(insert OID = 3839 ( pg_identify_object PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 2249 "26 26 23" "{26,26,23,25,25,25,25}" "{i,i,i,o,o,o,o}" "{classid,objid,subobjid,type,schema,name,identity}" _null_ _null_ pg_identify_object _null_ _null_ _null_ ));
+DATA(insert OID = 3839 ( pg_identify_object PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 2249 "26 26 23" "{26,26,23,25,25,25,25}" "{i,i,i,o,o,o,o}" "{classid,objid,objsubid,type,schema,name,identity}" _null_ _null_ pg_identify_object _null_ _null_ _null_ ));
DESCR("get machine-parseable identification of SQL object");
-DATA(insert OID = 3382 ( pg_identify_object_as_address PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 2249 "26 26 23" "{26,26,23,25,1009,1009}" "{i,i,i,o,o,o}" "{classid,objid,subobjid,type,object_names,object_args}" _null_ _null_ pg_identify_object_as_address _null_ _null_ _null_ ));
+DATA(insert OID = 3382 ( pg_identify_object_as_address PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 2249 "26 26 23" "{26,26,23,25,1009,1009}" "{i,i,i,o,o,o}" "{classid,objid,objsubid,type,object_names,object_args}" _null_ _null_ pg_identify_object_as_address _null_ _null_ _null_ ));
DESCR("get identification of SQL object for pg_get_object_address()");
-DATA(insert OID = 3954 ( pg_get_object_address PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 2249 "25 1009 1009" "{25,1009,1009,26,26,23}" "{i,i,i,o,o,o}" "{type,name,args,classid,objid,subobjid}" _null_ _null_ pg_get_object_address _null_ _null_ _null_ ));
+DATA(insert OID = 3954 ( pg_get_object_address PGNSP PGUID 12 1 0 0 0 f f f f t f s s 3 0 2249 "25 1009 1009" "{25,1009,1009,26,26,23}" "{i,i,i,o,o,o}" "{type,name,args,classid,objid,objsubid}" _null_ _null_ pg_get_object_address _null_ _null_ _null_ ));
DESCR("get OID-based object address from name/args arrays");
DATA(insert OID = 2079 ( pg_table_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_table_is_visible _null_ _null_ _null_ ));
@@ -3095,6 +3184,8 @@ DATA(insert OID = 3829 ( pg_opfamily_is_visible PGNSP PGUID 12 10 0 0 0 f f f f
DESCR("is opfamily visible in search path?");
DATA(insert OID = 2093 ( pg_conversion_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_conversion_is_visible _null_ _null_ _null_ ));
DESCR("is conversion visible in search path?");
+DATA(insert OID = 3403 ( pg_statistics_obj_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_statistics_obj_is_visible _null_ _null_ _null_ ));
+DESCR("is statistics object visible in search path?");
DATA(insert OID = 3756 ( pg_ts_parser_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_ts_parser_is_visible _null_ _null_ _null_ ));
DESCR("is text search parser visible in search path?");
DATA(insert OID = 3757 ( pg_ts_dict_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_ts_dict_is_visible _null_ _null_ _null_ ));
@@ -3117,31 +3208,31 @@ DATA(insert OID = 2096 ( pg_terminate_backend PGNSP PGUID 12 1 0 0 0 f f f f t
DESCR("terminate a server process");
DATA(insert OID = 2172 ( pg_start_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v r 3 0 3220 "25 16 16" _null_ _null_ _null_ _null_ _null_ pg_start_backup _null_ _null_ _null_ ));
DESCR("prepare for taking an online backup");
-DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
+DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v r 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));
DESCR("finish taking an online backup");
-DATA(insert OID = 2739 ( pg_stop_backup PGNSP PGUID 12 1 1 0 0 f f f f t t v s 1 0 2249 "16" "{16,3220,25,25}" "{i,o,o,o}" "{exclusive,lsn,labelfile,spcmapfile}" _null_ _null_ pg_stop_backup_v2 _null_ _null_ _null_ ));
+DATA(insert OID = 2739 ( pg_stop_backup PGNSP PGUID 12 1 1 0 0 f f f f t t v r 2 0 2249 "16 16" "{16,16,3220,25,25}" "{i,i,o,o,o}" "{exclusive,wait_for_archive,lsn,labelfile,spcmapfile}" _null_ _null_ pg_stop_backup_v2 _null_ _null_ _null_ ));
DESCR("finish taking an online backup");
DATA(insert OID = 3813 ( pg_is_in_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_in_backup _null_ _null_ _null_ ));
DESCR("true if server is in online backup");
DATA(insert OID = 3814 ( pg_backup_start_time PGNSP PGUID 12 1 0 0 0 f f f f t f s s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_backup_start_time _null_ _null_ _null_ ));
DESCR("start time of an online backup");
-DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));
-DESCR("switch to new xlog file");
+DATA(insert OID = 2848 ( pg_switch_wal PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_switch_wal _null_ _null_ _null_ ));
+DESCR("switch to new wal file");
DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 3220 "25" _null_ _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));
DESCR("create a named restore point");
-DATA(insert OID = 2849 ( pg_current_xlog_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_location _null_ _null_ _null_ ));
-DESCR("current xlog write location");
-DATA(insert OID = 2852 ( pg_current_xlog_insert_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_insert_location _null_ _null_ _null_ ));
-DESCR("current xlog insert location");
-DATA(insert OID = 3330 ( pg_current_xlog_flush_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_flush_location _null_ _null_ _null_ ));
-DESCR("current xlog flush location");
-DATA(insert OID = 2850 ( pg_xlogfile_name_offset PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2249 "3220" "{3220,25,23}" "{i,o,o}" "{wal_location,file_name,file_offset}" _null_ _null_ pg_xlogfile_name_offset _null_ _null_ _null_ ));
-DESCR("xlog filename and byte offset, given an xlog location");
-DATA(insert OID = 2851 ( pg_xlogfile_name PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 25 "3220" _null_ _null_ _null_ _null_ _null_ pg_xlogfile_name _null_ _null_ _null_ ));
-DESCR("xlog filename, given an xlog location");
-
-DATA(insert OID = 3165 ( pg_xlog_location_diff PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1700 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_xlog_location_diff _null_ _null_ _null_ ));
-DESCR("difference in bytes, given two xlog locations");
+DATA(insert OID = 2849 ( pg_current_wal_lsn PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_wal_lsn _null_ _null_ _null_ ));
+DESCR("current wal write location");
+DATA(insert OID = 2852 ( pg_current_wal_insert_lsn PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_wal_insert_lsn _null_ _null_ _null_ ));
+DESCR("current wal insert location");
+DATA(insert OID = 3330 ( pg_current_wal_flush_lsn PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_wal_flush_lsn _null_ _null_ _null_ ));
+DESCR("current wal flush location");
+DATA(insert OID = 2850 ( pg_walfile_name_offset PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2249 "3220" "{3220,25,23}" "{i,o,o}" "{lsn,file_name,file_offset}" _null_ _null_ pg_walfile_name_offset _null_ _null_ _null_ ));
+DESCR("wal filename and byte offset, given a wal location");
+DATA(insert OID = 2851 ( pg_walfile_name PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 25 "3220" _null_ _null_ _null_ _null_ _null_ pg_walfile_name _null_ _null_ _null_ ));
+DESCR("wal filename, given a wal location");
+
+DATA(insert OID = 3165 ( pg_wal_lsn_diff PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 1700 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_wal_lsn_diff _null_ _null_ _null_ ));
+DESCR("difference in bytes, given two wal locations");
DATA(insert OID = 3809 ( pg_export_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f v u 0 0 25 "" _null_ _null_ _null_ _null_ _null_ pg_export_snapshot _null_ _null_ _null_ ));
DESCR("export a snapshot");
@@ -3149,24 +3240,28 @@ DESCR("export a snapshot");
DATA(insert OID = 3810 ( pg_is_in_recovery PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_in_recovery _null_ _null_ _null_ ));
DESCR("true if server is in recovery");
-DATA(insert OID = 3820 ( pg_last_xlog_receive_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_last_xlog_receive_location _null_ _null_ _null_ ));
-DESCR("current xlog flush location");
-DATA(insert OID = 3821 ( pg_last_xlog_replay_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_last_xlog_replay_location _null_ _null_ _null_ ));
-DESCR("last xlog replay location");
+DATA(insert OID = 3820 ( pg_last_wal_receive_lsn PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_last_wal_receive_lsn _null_ _null_ _null_ ));
+DESCR("current wal flush location");
+DATA(insert OID = 3821 ( pg_last_wal_replay_lsn PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_last_wal_replay_lsn _null_ _null_ _null_ ));
+DESCR("last wal replay location");
DATA(insert OID = 3830 ( pg_last_xact_replay_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_last_xact_replay_timestamp _null_ _null_ _null_ ));
DESCR("timestamp of last replay xact");
-DATA(insert OID = 3071 ( pg_xlog_replay_pause PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_xlog_replay_pause _null_ _null_ _null_ ));
-DESCR("pause xlog replay");
-DATA(insert OID = 3072 ( pg_xlog_replay_resume PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_xlog_replay_resume _null_ _null_ _null_ ));
-DESCR("resume xlog replay, if it was paused");
-DATA(insert OID = 3073 ( pg_is_xlog_replay_paused PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_xlog_replay_paused _null_ _null_ _null_ ));
-DESCR("true if xlog replay is paused");
+DATA(insert OID = 3071 ( pg_wal_replay_pause PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_wal_replay_pause _null_ _null_ _null_ ));
+DESCR("pause wal replay");
+DATA(insert OID = 3072 ( pg_wal_replay_resume PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_wal_replay_resume _null_ _null_ _null_ ));
+DESCR("resume wal replay, if it was paused");
+DATA(insert OID = 3073 ( pg_is_wal_replay_paused PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_wal_replay_paused _null_ _null_ _null_ ));
+DESCR("true if wal replay is paused");
DATA(insert OID = 2621 ( pg_reload_conf PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_reload_conf _null_ _null_ _null_ ));
DESCR("reload configuration files");
DATA(insert OID = 2622 ( pg_rotate_logfile PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_rotate_logfile _null_ _null_ _null_ ));
DESCR("rotate log file");
+DATA(insert OID = 3800 ( pg_current_logfile PGNSP PGUID 12 1 0 0 0 f f f f f f v s 0 0 25 "" _null_ _null_ _null_ _null_ _null_ pg_current_logfile _null_ _null_ _null_ ));
+DESCR("current logging collector file location");
+DATA(insert OID = 3801 ( pg_current_logfile PGNSP PGUID 12 1 0 0 0 f f f f f f v s 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ pg_current_logfile_1arg _null_ _null_ _null_ ));
+DESCR("current logging collector file location");
DATA(insert OID = 2623 ( pg_stat_file PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 2249 "25" "{25,20,1184,1184,1184,1184,16}" "{i,o,o,o,o,o,o}" "{filename,size,access,modification,change,creation,isdir}" _null_ _null_ pg_stat_file_1arg _null_ _null_ _null_ ));
DESCR("get information about file");
@@ -4028,6 +4123,10 @@ DATA(insert OID = 3120 ( void_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s
DESCR("I/O");
DATA(insert OID = 3121 ( void_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "2278" _null_ _null_ _null_ _null_ _null_ void_send _null_ _null_ _null_ ));
DESCR("I/O");
+DATA(insert OID = 3446 ( macaddr8_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "2281" _null_ _null_ _null_ _null_ _null_ macaddr8_recv _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3447 ( macaddr8_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "774" _null_ _null_ _null_ _null_ _null_ macaddr8_send _null_ _null_ _null_ ));
+DESCR("I/O");
/* System-view support functions with pretty-print option */
DATA(insert OID = 2504 ( pg_get_ruledef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_ruledef_ext _null_ _null_ _null_ ));
@@ -4735,6 +4834,24 @@ DESCR("generate headline");
DATA(insert OID = 3755 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s s 2 0 25 "25 3615" _null_ _null_ _null_ _null_ _null_ ts_headline _null_ _null_ _null_ ));
DESCR("generate headline");
+DATA(insert OID = 4201 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f i s 4 0 3802 "3734 3802 3615 25" _null_ _null_ _null_ _null_ _null_ ts_headline_jsonb_byid_opt _null_ _null_ _null_ ));
+DESCR("generate headline from jsonb");
+DATA(insert OID = 4202 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f i s 3 0 3802 "3734 3802 3615" _null_ _null_ _null_ _null_ _null_ ts_headline_jsonb_byid _null_ _null_ _null_ ));
+DESCR("generate headline from jsonb");
+DATA(insert OID = 4203 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s s 3 0 3802 "3802 3615 25" _null_ _null_ _null_ _null_ _null_ ts_headline_jsonb_opt _null_ _null_ _null_ ));
+DESCR("generate headline from jsonb");
+DATA(insert OID = 4204 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s s 2 0 3802 "3802 3615" _null_ _null_ _null_ _null_ _null_ ts_headline_jsonb _null_ _null_ _null_ ));
+DESCR("generate headline from jsonb");
+
+DATA(insert OID = 4205 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f i s 4 0 114 "3734 114 3615 25" _null_ _null_ _null_ _null_ _null_ ts_headline_json_byid_opt _null_ _null_ _null_ ));
+DESCR("generate headline from json");
+DATA(insert OID = 4206 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f i s 3 0 114 "3734 114 3615" _null_ _null_ _null_ _null_ _null_ ts_headline_json_byid _null_ _null_ _null_ ));
+DESCR("generate headline from json");
+DATA(insert OID = 4207 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s s 3 0 114 "114 3615 25" _null_ _null_ _null_ _null_ _null_ ts_headline_json_opt _null_ _null_ _null_ ));
+DESCR("generate headline from json");
+DATA(insert OID = 4208 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s s 2 0 114 "114 3615" _null_ _null_ _null_ _null_ _null_ ts_headline_json _null_ _null_ _null_ ));
+DESCR("generate headline from json");
+
DATA(insert OID = 3745 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f i s 2 0 3614 "3734 25" _null_ _null_ _null_ _null_ _null_ to_tsvector_byid _null_ _null_ _null_ ));
DESCR("transform to tsvector");
DATA(insert OID = 3746 ( to_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f i s 2 0 3615 "3734 25" _null_ _null_ _null_ _null_ _null_ to_tsquery_byid _null_ _null_ _null_ ));
@@ -4751,6 +4868,14 @@ DATA(insert OID = 3751 ( plainto_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f s
DESCR("transform to tsquery");
DATA(insert OID = 5001 ( phraseto_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f s s 1 0 3615 "25" _null_ _null_ _null_ _null_ _null_ phraseto_tsquery _null_ _null_ _null_ ));
DESCR("transform to tsquery");
+DATA(insert OID = 4209 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f s s 1 0 3614 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_to_tsvector _null_ _null_ _null_ ));
+DESCR("transform jsonb to tsvector");
+DATA(insert OID = 4210 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f s s 1 0 3614 "114" _null_ _null_ _null_ _null_ _null_ json_to_tsvector _null_ _null_ _null_ ));
+DESCR("transform json to tsvector");
+DATA(insert OID = 4211 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f s s 2 0 3614 "3734 3802" _null_ _null_ _null_ _null_ _null_ jsonb_to_tsvector_byid _null_ _null_ _null_ ));
+DESCR("transform jsonb to tsvector");
+DATA(insert OID = 4212 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f s s 2 0 3614 "3734 114" _null_ _null_ _null_ _null_ _null_ json_to_tsvector_byid _null_ _null_ _null_ ));
+DESCR("transform json to tsvector");
DATA(insert OID = 3752 ( tsvector_update_trigger PGNSP PGUID 12 1 0 0 0 f f f f f f v s 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ tsvector_update_trigger_byid _null_ _null_ _null_ ));
DESCR("trigger for automatic update of tsvector column");
@@ -4883,6 +5008,7 @@ DESCR("GIN support");
DATA(insert OID = 3301 ( jsonb_concat PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3802 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_concat _null_ _null_ _null_ ));
DATA(insert OID = 3302 ( jsonb_delete PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3802 "3802 25" _null_ _null_ _null_ _null_ _null_ jsonb_delete _null_ _null_ _null_ ));
DATA(insert OID = 3303 ( jsonb_delete PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3802 "3802 23" _null_ _null_ _null_ _null_ _null_ jsonb_delete_idx _null_ _null_ _null_ ));
+DATA(insert OID = 3343 ( jsonb_delete PGNSP PGUID 12 1 0 25 0 f f f f t f i s 2 0 3802 "3802 1009" "{3802,1009}" "{i,v}" "{from_json,path_elems}" _null_ _null_ jsonb_delete_array _null_ _null_ _null_ ));
DATA(insert OID = 3304 ( jsonb_delete_path PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 3802 "3802 1009" _null_ _null_ _null_ _null_ _null_ jsonb_delete_path _null_ _null_ _null_ ));
DATA(insert OID = 3305 ( jsonb_set PGNSP PGUID 12 1 0 0 0 f f f f t f i s 4 0 3802 "3802 1009 3802 16" _null_ _null_ _null_ _null_ _null_ jsonb_set _null_ _null_ _null_ ));
DESCR("Set part of a jsonb");
@@ -4901,6 +5027,8 @@ DATA(insert OID = 2942 ( txid_snapshot_send PGNSP PGUID 12 1 0 0 0 f f f f t
DESCR("I/O");
DATA(insert OID = 2943 ( txid_current PGNSP PGUID 12 1 0 0 0 f f f f t f s u 0 0 20 "" _null_ _null_ _null_ _null_ _null_ txid_current _null_ _null_ _null_ ));
DESCR("get current transaction ID");
+DATA(insert OID = 3348 ( txid_current_if_assigned PGNSP PGUID 12 1 0 0 0 f f f f t f s u 0 0 20 "" _null_ _null_ _null_ _null_ _null_ txid_current_if_assigned _null_ _null_ _null_ ));
+DESCR("get current transaction ID");
DATA(insert OID = 2944 ( txid_current_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f s s 0 0 2970 "" _null_ _null_ _null_ _null_ _null_ txid_current_snapshot _null_ _null_ _null_ ));
DESCR("get current snapshot");
DATA(insert OID = 2945 ( txid_snapshot_xmin PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 20 "2970" _null_ _null_ _null_ _null_ _null_ txid_snapshot_xmin _null_ _null_ _null_ ));
@@ -4911,6 +5039,8 @@ DATA(insert OID = 2947 ( txid_snapshot_xip PGNSP PGUID 12 1 50 0 0 f f f f t
DESCR("get set of in-progress txids in snapshot");
DATA(insert OID = 2948 ( txid_visible_in_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "20 2970" _null_ _null_ _null_ _null_ _null_ txid_visible_in_snapshot _null_ _null_ _null_ ));
DESCR("is txid visible in snapshot?");
+DATA(insert OID = 3360 ( txid_status PGNSP PGUID 12 1 0 0 0 f f f f t f v s 1 0 25 "20" _null_ _null_ _null_ _null_ _null_ txid_status _null_ _null_ _null_ ));
+DESCR("commit status of transaction");
/* record comparison using normal comparison rules */
DATA(insert OID = 2981 ( record_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_eq _null_ _null_ _null_ ));
@@ -5160,21 +5290,21 @@ DATA(insert OID = 5016 ( spg_box_quad_leaf_consistent PGNSP PGUID 12 1 0 0 0 f
DESCR("SP-GiST support for quad tree over box");
/* replication slots */
-DATA(insert OID = 3779 ( pg_create_physical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 2249 "19 16" "{19,16,19,3220}" "{i,i,o,o}" "{slot_name,immediately_reserve,slot_name,xlog_position}" _null_ _null_ pg_create_physical_replication_slot _null_ _null_ _null_ ));
+DATA(insert OID = 3779 ( pg_create_physical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 2249 "19 16 16" "{19,16,16,19,3220}" "{i,i,i,o,o}" "{slot_name,immediately_reserve,temporary,slot_name,lsn}" _null_ _null_ pg_create_physical_replication_slot _null_ _null_ _null_ ));
DESCR("create a physical replication slot");
DATA(insert OID = 3780 ( pg_drop_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v u 1 0 2278 "19" _null_ _null_ _null_ _null_ _null_ pg_drop_replication_slot _null_ _null_ _null_ ));
DESCR("drop a replication slot");
-DATA(insert OID = 3781 ( pg_get_replication_slots PGNSP PGUID 12 1 10 0 0 f f f f f t s s 0 0 2249 "" "{19,19,25,26,16,23,28,28,3220,3220}" "{o,o,o,o,o,o,o,o,o,o}" "{slot_name,plugin,slot_type,datoid,active,active_pid,xmin,catalog_xmin,restart_lsn,confirmed_flush_lsn}" _null_ _null_ pg_get_replication_slots _null_ _null_ _null_ ));
+DATA(insert OID = 3781 ( pg_get_replication_slots PGNSP PGUID 12 1 10 0 0 f f f f f t s s 0 0 2249 "" "{19,19,25,26,16,16,23,28,28,3220,3220}" "{o,o,o,o,o,o,o,o,o,o,o}" "{slot_name,plugin,slot_type,datoid,temporary,active,active_pid,xmin,catalog_xmin,restart_lsn,confirmed_flush_lsn}" _null_ _null_ pg_get_replication_slots _null_ _null_ _null_ ));
DESCR("information about replication slots currently in use");
-DATA(insert OID = 3786 ( pg_create_logical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 2249 "19 19" "{19,19,25,3220}" "{i,i,o,o}" "{slot_name,plugin,slot_name,xlog_position}" _null_ _null_ pg_create_logical_replication_slot _null_ _null_ _null_ ));
+DATA(insert OID = 3786 ( pg_create_logical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 2249 "19 19 16" "{19,19,16,25,3220}" "{i,i,i,o,o}" "{slot_name,plugin,temporary,slot_name,lsn}" _null_ _null_ pg_create_logical_replication_slot _null_ _null_ _null_ ));
DESCR("set up a logical replication slot");
-DATA(insert OID = 3782 ( pg_logical_slot_get_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_get_changes _null_ _null_ _null_ ));
+DATA(insert OID = 3782 ( pg_logical_slot_get_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,lsn,xid,data}" _null_ _null_ pg_logical_slot_get_changes _null_ _null_ _null_ ));
DESCR("get changes from replication slot");
-DATA(insert OID = 3783 ( pg_logical_slot_get_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_get_binary_changes _null_ _null_ _null_ ));
+DATA(insert OID = 3783 ( pg_logical_slot_get_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,lsn,xid,data}" _null_ _null_ pg_logical_slot_get_binary_changes _null_ _null_ _null_ ));
DESCR("get binary changes from replication slot");
-DATA(insert OID = 3784 ( pg_logical_slot_peek_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_peek_changes _null_ _null_ _null_ ));
+DATA(insert OID = 3784 ( pg_logical_slot_peek_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,lsn,xid,data}" _null_ _null_ pg_logical_slot_peek_changes _null_ _null_ _null_ ));
DESCR("peek at changes from replication slot");
-DATA(insert OID = 3785 ( pg_logical_slot_peek_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_peek_binary_changes _null_ _null_ _null_ ));
+DATA(insert OID = 3785 ( pg_logical_slot_peek_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v u 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,lsn,xid,data}" _null_ _null_ pg_logical_slot_peek_binary_changes _null_ _null_ _null_ ));
DESCR("peek at binary changes from replication slot");
DATA(insert OID = 3577 ( pg_logical_emit_message PGNSP PGUID 12 1 0 0 0 f f f f t f v u 3 0 3220 "16 25 25" _null_ _null_ _null_ _null_ _null_ pg_logical_emit_message_text _null_ _null_ _null_ ));
DESCR("emit a textual logical decoding message");
@@ -5182,13 +5312,13 @@ DATA(insert OID = 3578 ( pg_logical_emit_message PGNSP PGUID 12 1 0 0 0 f f f f
DESCR("emit a binary logical decoding message");
/* event triggers */
-DATA(insert OID = 3566 ( pg_event_trigger_dropped_objects PGNSP PGUID 12 10 100 0 0 f f f f t t s s 0 0 2249 "" "{26,26,23,16,16,16,25,25,25,25,1009,1009}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, is_temporary, object_type, schema_name, object_name, object_identity, address_names, address_args}" _null_ _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ ));
+DATA(insert OID = 3566 ( pg_event_trigger_dropped_objects PGNSP PGUID 12 10 100 0 0 f f f f t t s r 0 0 2249 "" "{26,26,23,16,16,16,25,25,25,25,1009,1009}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, is_temporary, object_type, schema_name, object_name, object_identity, address_names, address_args}" _null_ _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ ));
DESCR("list objects dropped by the current command");
-DATA(insert OID = 4566 ( pg_event_trigger_table_rewrite_oid PGNSP PGUID 12 1 0 0 0 f f f f t f s s 0 0 26 "" "{26}" "{o}" "{oid}" _null_ _null_ pg_event_trigger_table_rewrite_oid _null_ _null_ _null_ ));
+DATA(insert OID = 4566 ( pg_event_trigger_table_rewrite_oid PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 26 "" "{26}" "{o}" "{oid}" _null_ _null_ pg_event_trigger_table_rewrite_oid _null_ _null_ _null_ ));
DESCR("return Oid of the table getting rewritten");
-DATA(insert OID = 4567 ( pg_event_trigger_table_rewrite_reason PGNSP PGUID 12 1 0 0 0 f f f f t f s s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_event_trigger_table_rewrite_reason _null_ _null_ _null_ ));
+DATA(insert OID = 4567 ( pg_event_trigger_table_rewrite_reason PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_event_trigger_table_rewrite_reason _null_ _null_ _null_ ));
DESCR("return reason code for table getting rewritten");
-DATA(insert OID = 4568 ( pg_event_trigger_ddl_commands PGNSP PGUID 12 10 100 0 0 f f f f t t s s 0 0 2249 "" "{26,26,23,25,25,25,25,16,32}" "{o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, command_tag, object_type, schema_name, object_identity, in_extension, command}" _null_ _null_ pg_event_trigger_ddl_commands _null_ _null_ _null_ ));
+DATA(insert OID = 4568 ( pg_event_trigger_ddl_commands PGNSP PGUID 12 10 100 0 0 f f f f t t s r 0 0 2249 "" "{26,26,23,25,25,25,25,16,32}" "{o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, command_tag, object_type, schema_name, object_identity, in_extension, command}" _null_ _null_ pg_event_trigger_ddl_commands _null_ _null_ _null_ ));
DESCR("list DDL actions being executed by the current command");
/* generic transition functions for ordered-set aggregates */
@@ -5311,7 +5441,7 @@ DATA(insert OID = 6011 ( pg_replication_origin_xact_reset PGNSP PGUID 12 1 0 0 0
DESCR("reset the transaction's origin lsn and timestamp");
DATA(insert OID = 6012 ( pg_replication_origin_advance PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 2278 "25 3220" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_advance _null_ _null_ _null_ ));
-DESCR("advance replication itentifier to specific location");
+DESCR("advance replication identifier to specific location");
DATA(insert OID = 6013 ( pg_replication_origin_progress PGNSP PGUID 12 1 0 0 0 f f f f t f v u 2 0 3220 "25 16" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_progress _null_ _null_ _null_ ));
DESCR("get an individual replication origin's replication progress");
@@ -5333,6 +5463,9 @@ DESCR("all current/future processes to honour overriden log levels");
DATA(insert OID = 6020 ( pg_msgmodule_disable_all PGNSP PGUID 12 1 1 0 0 f f f f t t i s 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_msgmodule_disable_all _null_ _null_ _null_ ));
DESCR("all processes to ignore overriden log levels");
#endif
+/* publications */
+DATA(insert OID = 6119 ( pg_get_publication_tables PGNSP PGUID 12 1 1000 0 0 f f t f t t s s 1 0 26 "25" "{25,26}" "{i,o}" "{pubname,relid}" _null_ _null_ pg_get_publication_tables _null_ _null_ _null_ ));
+DESCR("get OIDs of tables in a publication");
/* rls */
DATA(insert OID = 3298 ( row_security_active PGNSP PGUID 12 1 0 0 0 f f f f t f s s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ row_security_active _null_ _null_ _null_ ));
@@ -5348,15 +5481,27 @@ DESCR("pg_config binary as a function");
DATA(insert OID = 3441 ( pg_control_system PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{23,23,20,1184}" "{o,o,o,o}" "{pg_control_version,catalog_version_no,system_identifier,pg_control_last_modified}" _null_ _null_ pg_control_system _null_ _null_ _null_ ));
DESCR("pg_controldata general state information as a function");
-DATA(insert OID = 3442 ( pg_control_checkpoint PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{3220,3220,3220,25,23,23,16,25,26,28,28,28,26,28,28,26,28,28,1184}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{checkpoint_location,prior_location,redo_location,redo_wal_file,timeline_id,prev_timeline_id,full_page_writes,next_xid,next_oid,next_multixact_id,next_multi_offset,oldest_xid,oldest_xid_dbid,oldest_active_xid,oldest_multi_xid,oldest_multi_dbid,oldest_commit_ts_xid,newest_commit_ts_xid,checkpoint_time}" _null_ _null_ pg_control_checkpoint _null_ _null_ _null_ ));
+DATA(insert OID = 3442 ( pg_control_checkpoint PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{3220,3220,3220,25,23,23,16,25,26,28,28,28,26,28,28,26,28,28,1184}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{checkpoint_lsn,prior_lsn,redo_lsn,redo_wal_file,timeline_id,prev_timeline_id,full_page_writes,next_xid,next_oid,next_multixact_id,next_multi_offset,oldest_xid,oldest_xid_dbid,oldest_active_xid,oldest_multi_xid,oldest_multi_dbid,oldest_commit_ts_xid,newest_commit_ts_xid,checkpoint_time}" _null_ _null_ pg_control_checkpoint _null_ _null_ _null_ ));
DESCR("pg_controldata checkpoint state information as a function");
-DATA(insert OID = 3443 ( pg_control_recovery PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{3220,23,3220,3220,16}" "{o,o,o,o,o}" "{min_recovery_end_location,min_recovery_end_timeline,backup_start_location,backup_end_location,end_of_backup_record_required}" _null_ _null_ pg_control_recovery _null_ _null_ _null_ ));
+DATA(insert OID = 3443 ( pg_control_recovery PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{3220,23,3220,3220,16}" "{o,o,o,o,o}" "{min_recovery_end_lsn,min_recovery_end_timeline,backup_start_lsn,backup_end_lsn,end_of_backup_record_required}" _null_ _null_ pg_control_recovery _null_ _null_ _null_ ));
DESCR("pg_controldata recovery state information as a function");
-DATA(insert OID = 3444 ( pg_control_init PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{23,23,23,23,23,23,23,23,23,16,16,16,23}" "{o,o,o,o,o,o,o,o,o,o,o,o,o}" "{max_data_alignment,database_block_size,blocks_per_segment,wal_block_size,bytes_per_wal_segment,max_identifier_length,max_index_columns,max_toast_chunk_size,large_object_chunk_size,bigint_timestamps,float4_pass_by_value,float8_pass_by_value,data_page_checksum_version}" _null_ _null_ pg_control_init _null_ _null_ _null_ ));
+DATA(insert OID = 3444 ( pg_control_init PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 2249 "" "{23,23,23,23,23,23,23,23,23,16,16,23}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{max_data_alignment,database_block_size,blocks_per_segment,wal_block_size,bytes_per_wal_segment,max_identifier_length,max_index_columns,max_toast_chunk_size,large_object_chunk_size,float4_pass_by_value,float8_pass_by_value,data_page_checksum_version}" _null_ _null_ pg_control_init _null_ _null_ _null_ ));
DESCR("pg_controldata init state information as a function");
+DATA(insert OID = 3445 ( pg_import_system_collations PGNSP PGUID 12 100 0 0 0 f f f f t f v r 2 0 2278 "16 4089" _null_ _null_ "{if_not_exists,schema}" _null_ _null_ pg_import_system_collations _null_ _null_ _null_ ));
+DESCR("import collations from operating system");
+
+DATA(insert OID = 3448 ( pg_collation_actual_version PGNSP PGUID 12 100 0 0 0 f f f f t f v s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_collation_actual_version _null_ _null_ _null_ ));
+DESCR("import collations from operating system");
+
+/* system management/monitoring related functions */
+DATA(insert OID = 3353 ( pg_ls_logdir PGNSP PGUID 12 10 20 0 0 f f f f t t v s 0 0 2249 "" "{25,20,1184}" "{o,o,o}" "{name,size,modification}" _null_ _null_ pg_ls_logdir _null_ _null_ _null_ ));
+DESCR("list files in the log directory");
+DATA(insert OID = 3354 ( pg_ls_waldir PGNSP PGUID 12 10 20 0 0 f f f f t t v s 0 0 2249 "" "{25,20,1184}" "{o,o,o}" "{name,size,modification}" _null_ _null_ pg_ls_waldir _null_ _null_ _null_ ));
+DESCR("list of files in the WAL directory");
+
/*
* Symbolic values for provolatile column: these indicate whether the result
* of a function is dependent *only* on the values of its explicit arguments,
diff --git a/src/include/catalog/pg_proc_fn.h b/src/include/catalog/pg_proc_fn.h
index 8d666d8e79..993278a91a 100644
--- a/src/include/catalog/pg_proc_fn.h
+++ b/src/include/catalog/pg_proc_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_proc.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_proc_fn.h
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h
new file mode 100644
index 0000000000..c2086c1f42
--- /dev/null
+++ b/src/include/catalog/pg_publication.h
@@ -0,0 +1,104 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_publication.h
+ * definition of the relation sets relation (pg_publication)
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/catalog/pg_publication.h
+ *
+ * NOTES
+ * the genbki.pl script reads this file and generates .bki
+ * information from the DATA() statements.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_PUBLICATION_H
+#define PG_PUBLICATION_H
+
+#include "catalog/genbki.h"
+#include "catalog/objectaddress.h"
+
+/* ----------------
+ * pg_publication definition. cpp turns this into
+ * typedef struct FormData_pg_publication
+ *
+ * ----------------
+ */
+#define PublicationRelationId 6104
+
+CATALOG(pg_publication,6104)
+{
+ NameData pubname; /* name of the publication */
+
+ Oid pubowner; /* publication owner */
+
+ /*
+ * indicates that this is special publication which should encompass all
+ * tables in the database (except for the unlogged and temp ones)
+ */
+ bool puballtables;
+
+ /* true if inserts are published */
+ bool pubinsert;
+
+ /* true if updates are published */
+ bool pubupdate;
+
+ /* true if deletes are published */
+ bool pubdelete;
+
+} FormData_pg_publication;
+
+/* ----------------
+ * Form_pg_publication corresponds to a pointer to a tuple with
+ * the format of pg_publication relation.
+ * ----------------
+ */
+typedef FormData_pg_publication *Form_pg_publication;
+
+/* ----------------
+ * compiler constants for pg_publication
+ * ----------------
+ */
+
+#define Natts_pg_publication 6
+#define Anum_pg_publication_pubname 1
+#define Anum_pg_publication_pubowner 2
+#define Anum_pg_publication_puballtables 3
+#define Anum_pg_publication_pubinsert 4
+#define Anum_pg_publication_pubupdate 5
+#define Anum_pg_publication_pubdelete 6
+
+typedef struct PublicationActions
+{
+ bool pubinsert;
+ bool pubupdate;
+ bool pubdelete;
+} PublicationActions;
+
+typedef struct Publication
+{
+ Oid oid;
+ char *name;
+ bool alltables;
+ PublicationActions pubactions;
+} Publication;
+
+extern Publication *GetPublication(Oid pubid);
+extern Publication *GetPublicationByName(const char *pubname, bool missing_ok);
+extern List *GetRelationPublications(Oid relid);
+extern List *GetPublicationRelations(Oid pubid);
+extern List *GetAllTablesPublications(void);
+extern List *GetAllTablesPublicationRelations(void);
+
+extern ObjectAddress publication_add_relation(Oid pubid, Relation targetrel,
+ bool if_not_exists);
+
+extern Oid get_publication_oid(const char *pubname, bool missing_ok);
+extern char *get_publication_name(Oid pubid);
+
+extern Datum pg_get_publication_tables(PG_FUNCTION_ARGS);
+
+#endif /* PG_PUBLICATION_H */
diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h
new file mode 100644
index 0000000000..f889b6f4db
--- /dev/null
+++ b/src/include/catalog/pg_publication_rel.h
@@ -0,0 +1,52 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_publication_rel.h
+ * definition of the publication to relation map (pg_publication_rel)
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/catalog/pg_publication_rel.h
+ *
+ * NOTES
+ * the genbki.pl script reads this file and generates .bki
+ * information from the DATA() statements.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_PUBLICATION_REL_H
+#define PG_PUBLICATION_REL_H
+
+#include "catalog/genbki.h"
+
+/* ----------------
+ * pg_publication_rel definition. cpp turns this into
+ * typedef struct FormData_pg_publication_rel
+ *
+ * ----------------
+ */
+#define PublicationRelRelationId 6106
+
+CATALOG(pg_publication_rel,6106)
+{
+ Oid prpubid; /* Oid of the publication */
+ Oid prrelid; /* Oid of the relation */
+} FormData_pg_publication_rel;
+
+/* ----------------
+ * Form_pg_publication_rel corresponds to a pointer to a tuple with
+ * the format of pg_publication_rel relation.
+ * ----------------
+ */
+typedef FormData_pg_publication_rel *Form_pg_publication_rel;
+
+/* ----------------
+ * compiler constants for pg_publication_rel
+ * ----------------
+ */
+
+#define Natts_pg_publication_rel 2
+#define Anum_pg_publication_rel_prpubid 1
+#define Anum_pg_publication_rel_prrelid 2
+
+#endif /* PG_PUBLICATION_REL_H */
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index 14d3b12315..4ed57fe2e9 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_range.h
diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h
index 5f0538edb2..c22831f517 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -3,7 +3,7 @@
* pg_replication_origin.h
* Persistent replication origin registry
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_replication_origin.h
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index c6c87f6adb..425a336755 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -8,7 +8,7 @@
* --- ie, rule names are only unique among the rules of a given table.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_rewrite.h
diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h
index 11cda559b3..01e14e77c0 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -3,7 +3,7 @@
* pg_seclabel.h
* definition of the system "security label" relation (pg_seclabel)
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* -------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_sequence.h b/src/include/catalog/pg_sequence.h
new file mode 100644
index 0000000000..26d2993674
--- /dev/null
+++ b/src/include/catalog/pg_sequence.h
@@ -0,0 +1,32 @@
+#ifndef PG_SEQUENCE_H
+#define PG_SEQUENCE_H
+
+#include "catalog/genbki.h"
+
+#define SequenceRelationId 2224
+
+CATALOG(pg_sequence,2224) BKI_WITHOUT_OIDS
+{
+ Oid seqrelid;
+ Oid seqtypid;
+ int64 seqstart;
+ int64 seqincrement;
+ int64 seqmax;
+ int64 seqmin;
+ int64 seqcache;
+ bool seqcycle;
+} FormData_pg_sequence;
+
+typedef FormData_pg_sequence *Form_pg_sequence;
+
+#define Natts_pg_sequence 8
+#define Anum_pg_sequence_seqrelid 1
+#define Anum_pg_sequence_seqtypid 2
+#define Anum_pg_sequence_seqstart 3
+#define Anum_pg_sequence_seqincrement 4
+#define Anum_pg_sequence_seqmax 5
+#define Anum_pg_sequence_seqmin 6
+#define Anum_pg_sequence_seqcache 7
+#define Anum_pg_sequence_seqcycle 8
+
+#endif /* PG_SEQUENCE_H */
diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h
index 92c492b296..ae1aa4f952 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_shdepend.h
diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h
index bf79d4a908..21086447fa 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -12,7 +12,7 @@
* across tables.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_shdescription.h
diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h
index c39e11df34..a88f65c169 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -3,7 +3,7 @@
* pg_shseclabel.h
* definition of the system "security label" relation (pg_shseclabel)
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* -------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index c1a624d979..3576419a2f 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_statistic.h
@@ -275,7 +275,7 @@ typedef FormData_pg_statistic *Form_pg_statistic;
* fraction of empty ranges. stavalues is a histogram of non-empty lengths, in
* a format similar to STATISTIC_KIND_HISTOGRAM: it contains M (>=2) range
* values that divide the column data values into M-1 bins of approximately
- * equal population. The lengths are stores as float8s, as measured by the
+ * equal population. The lengths are stored as float8s, as measured by the
* range type's subdiff function. Only non-null rows are considered.
*/
#define STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM 6
diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h
new file mode 100644
index 0000000000..d302b7fc01
--- /dev/null
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -0,0 +1,80 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_statistic_ext.h
+ * definition of the system "extended statistic" relation (pg_statistic_ext)
+ * along with the relation's initial contents.
+ *
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/catalog/pg_statistic_ext.h
+ *
+ * NOTES
+ * the genbki.pl script reads this file and generates .bki
+ * information from the DATA() statements.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_STATISTIC_EXT_H
+#define PG_STATISTIC_EXT_H
+
+#include "catalog/genbki.h"
+
+/* ----------------
+ * pg_statistic_ext definition. cpp turns this into
+ * typedef struct FormData_pg_statistic_ext
+ * ----------------
+ */
+#define StatisticExtRelationId 3381
+
+CATALOG(pg_statistic_ext,3381)
+{
+ Oid stxrelid; /* relation containing attributes */
+
+ /* These two fields form the unique key for the entry: */
+ NameData stxname; /* statistics object name */
+ Oid stxnamespace; /* OID of statistics object's namespace */
+
+ Oid stxowner; /* statistics object's owner */
+
+ /*
+ * variable-length fields start here, but we allow direct access to
+ * stxkeys
+ */
+ int2vector stxkeys; /* array of column keys */
+
+#ifdef CATALOG_VARLEN
+ char stxkind[1] BKI_FORCE_NOT_NULL; /* statistic types requested
+ * to build */
+ pg_ndistinct stxndistinct; /* ndistinct coefficients (serialized) */
+ pg_dependencies stxdependencies; /* dependencies (serialized) */
+#endif
+
+} FormData_pg_statistic_ext;
+
+/* ----------------
+ * Form_pg_statistic_ext corresponds to a pointer to a tuple with
+ * the format of pg_statistic_ext relation.
+ * ----------------
+ */
+typedef FormData_pg_statistic_ext *Form_pg_statistic_ext;
+
+/* ----------------
+ * compiler constants for pg_statistic_ext
+ * ----------------
+ */
+#define Natts_pg_statistic_ext 8
+#define Anum_pg_statistic_ext_stxrelid 1
+#define Anum_pg_statistic_ext_stxname 2
+#define Anum_pg_statistic_ext_stxnamespace 3
+#define Anum_pg_statistic_ext_stxowner 4
+#define Anum_pg_statistic_ext_stxkeys 5
+#define Anum_pg_statistic_ext_stxkind 6
+#define Anum_pg_statistic_ext_stxndistinct 7
+#define Anum_pg_statistic_ext_stxdependencies 8
+
+#define STATS_EXT_NDISTINCT 'd'
+#define STATS_EXT_DEPENDENCIES 'f'
+
+#endif /* PG_STATISTIC_EXT_H */
diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h
new file mode 100644
index 0000000000..b2cebd4a4b
--- /dev/null
+++ b/src/include/catalog/pg_subscription.h
@@ -0,0 +1,96 @@
+/* -------------------------------------------------------------------------
+ *
+ * pg_subscription.h
+ * Definition of the subscription catalog (pg_subscription).
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * -------------------------------------------------------------------------
+ */
+#ifndef PG_SUBSCRIPTION_H
+#define PG_SUBSCRIPTION_H
+
+#include "catalog/genbki.h"
+#include "nodes/pg_list.h"
+
+/* ----------------
+ * pg_subscription definition. cpp turns this into
+ * typedef struct FormData_pg_subscription
+ * ----------------
+ */
+#define SubscriptionRelationId 6100
+#define SubscriptionRelation_Rowtype_Id 6101
+
+/*
+ * Technically, the subscriptions live inside the database, so a shared catalog
+ * seems weird, but the replication launcher process needs to access all of
+ * them to be able to start the workers, so we have to put them in a shared,
+ * nailed catalog.
+ *
+ * NOTE: When adding a column, also update system_views.sql.
+ */
+CATALOG(pg_subscription,6100) BKI_SHARED_RELATION BKI_ROWTYPE_OID(6101) BKI_SCHEMA_MACRO
+{
+ Oid subdbid; /* Database the subscription is in. */
+ NameData subname; /* Name of the subscription */
+
+ Oid subowner; /* Owner of the subscription */
+
+ bool subenabled; /* True if the subscription is enabled (the
+ * worker should be running) */
+
+#ifdef CATALOG_VARLEN /* variable-length fields start here */
+ /* Connection string to the publisher */
+ text subconninfo BKI_FORCE_NOT_NULL;
+
+ /* Slot name on publisher */
+ NameData subslotname;
+
+ /* Synchronous commit setting for worker */
+ text subsynccommit BKI_FORCE_NOT_NULL;
+
+ /* List of publications subscribed to */
+ text subpublications[1] BKI_FORCE_NOT_NULL;
+#endif
+} FormData_pg_subscription;
+
+typedef FormData_pg_subscription *Form_pg_subscription;
+
+/* ----------------
+ * compiler constants for pg_subscription
+ * ----------------
+ */
+#define Natts_pg_subscription 8
+#define Anum_pg_subscription_subdbid 1
+#define Anum_pg_subscription_subname 2
+#define Anum_pg_subscription_subowner 3
+#define Anum_pg_subscription_subenabled 4
+#define Anum_pg_subscription_subconninfo 5
+#define Anum_pg_subscription_subslotname 6
+#define Anum_pg_subscription_subsynccommit 7
+#define Anum_pg_subscription_subpublications 8
+
+
+typedef struct Subscription
+{
+ Oid oid; /* Oid of the subscription */
+ Oid dbid; /* Oid of the database which subscription is
+ * in */
+ char *name; /* Name of the subscription */
+ Oid owner; /* Oid of the subscription owner */
+ bool enabled; /* Indicates if the subscription is enabled */
+ char *conninfo; /* Connection string to the publisher */
+ char *slotname; /* Name of the replication slot */
+ char *synccommit; /* Synchronous commit setting for worker */
+ List *publications; /* List of publication names to subscribe to */
+} Subscription;
+
+extern Subscription *GetSubscription(Oid subid, bool missing_ok);
+extern void FreeSubscription(Subscription *sub);
+extern Oid get_subscription_oid(const char *subname, bool missing_ok);
+extern char *get_subscription_name(Oid subid);
+
+extern int CountDBSubscriptions(Oid dbid);
+
+#endif /* PG_SUBSCRIPTION_H */
diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h
new file mode 100644
index 0000000000..391f96b76e
--- /dev/null
+++ b/src/include/catalog/pg_subscription_rel.h
@@ -0,0 +1,82 @@
+/* -------------------------------------------------------------------------
+ *
+ * pg_subscription_rel.h
+ * Local info about tables that come from the publisher of a
+ * subscription (pg_subscription_rel).
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * -------------------------------------------------------------------------
+ */
+#ifndef PG_SUBSCRIPTION_REL_H
+#define PG_SUBSCRIPTION_REL_H
+
+#include "access/xlogdefs.h"
+#include "catalog/genbki.h"
+#include "nodes/pg_list.h"
+
+/* ----------------
+ * pg_subscription_rel definition. cpp turns this into
+ * typedef struct FormData_pg_subscription_rel
+ * ----------------
+ */
+#define SubscriptionRelRelationId 6102
+
+/* Workaround for genbki not knowing about XLogRecPtr */
+#define pg_lsn XLogRecPtr
+
+CATALOG(pg_subscription_rel,6102) BKI_WITHOUT_OIDS
+{
+ Oid srsubid; /* Oid of subscription */
+ Oid srrelid; /* Oid of relation */
+ char srsubstate; /* state of the relation in subscription */
+ pg_lsn srsublsn; /* remote lsn of the state change used for
+ * synchronization coordination */
+} FormData_pg_subscription_rel;
+
+typedef FormData_pg_subscription_rel *Form_pg_subscription_rel;
+
+/* ----------------
+ * compiler constants for pg_subscription_rel
+ * ----------------
+ */
+#define Natts_pg_subscription_rel 4
+#define Anum_pg_subscription_rel_srsubid 1
+#define Anum_pg_subscription_rel_srrelid 2
+#define Anum_pg_subscription_rel_srsubstate 3
+#define Anum_pg_subscription_rel_srsublsn 4
+
+/* ----------------
+ * substate constants
+ * ----------------
+ */
+#define SUBREL_STATE_INIT 'i' /* initializing (sublsn NULL) */
+#define SUBREL_STATE_DATASYNC 'd' /* data is being synchronized (sublsn
+ * NULL) */
+#define SUBREL_STATE_SYNCDONE 's' /* synchronization finished in front
+ * of apply (sublsn set) */
+#define SUBREL_STATE_READY 'r' /* ready (sublsn set) */
+
+/* These are never stored in the catalog, we only use them for IPC. */
+#define SUBREL_STATE_UNKNOWN '\0' /* unknown state */
+#define SUBREL_STATE_SYNCWAIT 'w' /* waiting for sync */
+#define SUBREL_STATE_CATCHUP 'c' /* catching up with apply */
+
+typedef struct SubscriptionRelState
+{
+ Oid relid;
+ XLogRecPtr lsn;
+ char state;
+} SubscriptionRelState;
+
+extern Oid SetSubscriptionRelState(Oid subid, Oid relid, char state,
+ XLogRecPtr sublsn);
+extern char GetSubscriptionRelState(Oid subid, Oid relid,
+ XLogRecPtr *sublsn, bool missing_ok);
+extern void RemoveSubscriptionRel(Oid subid, Oid relid);
+
+extern List *GetSubscriptionRelations(Oid subid);
+extern List *GetSubscriptionNotReadyRelations(Oid subid);
+
+#endif /* PG_SUBSCRIPTION_REL_H */
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index 61b8020b8e..d9ea4b7d63 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_tablespace.h
diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h
index e55c3e1bc2..3415db3bd6 100644
--- a/src/include/catalog/pg_transform.h
+++ b/src/include/catalog/pg_transform.h
@@ -2,7 +2,7 @@
*
* pg_transform.h
*
- * Copyright (c) 2012-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2012-2017, PostgreSQL Global Development Group
*
* src/include/catalog/pg_transform.h
*
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index eb39c50e63..547332fe65 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -5,7 +5,7 @@
* along with the relation's initial contents.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_trigger.h
@@ -59,6 +59,8 @@ CATALOG(pg_trigger,2620)
#ifdef CATALOG_VARLEN
bytea tgargs BKI_FORCE_NOT_NULL; /* first\000second\000tgnargs\000 */
pg_node_tree tgqual; /* WHEN expression, or NULL if none */
+ NameData tgoldtable; /* old transition table, or NULL if none */
+ NameData tgnewtable; /* new transition table, or NULL if none */
#endif
} FormData_pg_trigger;
@@ -73,7 +75,7 @@ typedef FormData_pg_trigger *Form_pg_trigger;
* compiler constants for pg_trigger
* ----------------
*/
-#define Natts_pg_trigger 15
+#define Natts_pg_trigger 17
#define Anum_pg_trigger_tgrelid 1
#define Anum_pg_trigger_tgname 2
#define Anum_pg_trigger_tgfoid 3
@@ -89,6 +91,8 @@ typedef FormData_pg_trigger *Form_pg_trigger;
#define Anum_pg_trigger_tgattr 13
#define Anum_pg_trigger_tgargs 14
#define Anum_pg_trigger_tgqual 15
+#define Anum_pg_trigger_tgoldtable 16
+#define Anum_pg_trigger_tgnewtable 17
/* Bits within tgtype */
#define TRIGGER_TYPE_ROW (1 << 0)
@@ -142,4 +146,11 @@ typedef FormData_pg_trigger *Form_pg_trigger;
#define TRIGGER_TYPE_MATCHES(type, level, timing, event) \
(((type) & (TRIGGER_TYPE_LEVEL_MASK | TRIGGER_TYPE_TIMING_MASK | (event))) == ((level) | (timing) | (event)))
+/*
+ * Macro to determine whether tgnewtable or tgoldtable has been specified for
+ * a trigger.
+ */
+#define TRIGGER_USES_TRANSITION_TABLE(namepointer) \
+ ((namepointer) != (char *) NULL)
+
#endif /* PG_TRIGGER_H */
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index ad450c34de..b61cf857d9 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -4,7 +4,7 @@
* definition of configuration of tsearch
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_ts_config.h
diff --git a/src/include/catalog/pg_ts_config_map.h b/src/include/catalog/pg_ts_config_map.h
index c1753a346e..fc9467fd9c 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -4,7 +4,7 @@
* definition of token mappings for configurations of tsearch
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_ts_config_map.h
diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h
index e3c00f9175..28b7bb7c0d 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -4,7 +4,7 @@
* definition of dictionaries for tsearch
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_ts_dict.h
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index 016ef14d12..cfb87b4d56 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -4,7 +4,7 @@
* definition of parsers for tsearch
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_ts_parser.h
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index 39191a2a82..5fc6eea243 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -4,7 +4,7 @@
* definition of dictionary templates for tsearch
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_ts_template.h
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 439a22605e..8dfbc8a15f 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -6,7 +6,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_type.h
@@ -365,6 +365,14 @@ DATA(insert OID = 194 ( pg_node_tree PGNSP PGUID -1 f b S f t \054 0 0 0 pg_node
DESCR("string representing an internal node tree");
#define PGNODETREEOID 194
+DATA(insert OID = 3361 ( pg_ndistinct PGNSP PGUID -1 f b S f t \054 0 0 0 pg_ndistinct_in pg_ndistinct_out pg_ndistinct_recv pg_ndistinct_send - - - i x f 0 -1 0 100 _null_ _null_ _null_ ));
+DESCR("multivariate ndistinct coefficients");
+#define PGNDISTINCTOID 3361
+
+DATA(insert OID = 3402 ( pg_dependencies PGNSP PGUID -1 f b S f t \054 0 0 0 pg_dependencies_in pg_dependencies_out pg_dependencies_recv pg_dependencies_send - - - i x f 0 -1 0 100 _null_ _null_ _null_ ));
+DESCR("multivariate dependencies");
+#define PGDEPENDENCIESOID 3402
+
DATA(insert OID = 32 ( pg_ddl_command PGNSP PGUID SIZEOF_POINTER t p P f t \054 0 0 0 pg_ddl_command_in pg_ddl_command_out pg_ddl_command_recv pg_ddl_command_send - - - ALIGNOF_POINTER p f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("internal type for passing CollectedCommand");
#define PGDDLCOMMANDOID 32
@@ -419,7 +427,7 @@ DESCR("relative, limited-range time interval (Unix delta time)");
DATA(insert OID = 704 ( tinterval PGNSP PGUID 12 f b T f t \054 0 0 1025 tintervalin tintervalout tintervalrecv tintervalsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("(abstime,abstime), time interval");
#define TINTERVALOID 704
-DATA(insert OID = 705 ( unknown PGNSP PGUID -2 f b X f t \054 0 0 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));
+DATA(insert OID = 705 ( unknown PGNSP PGUID -2 f p X f t \054 0 0 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("");
#define UNKNOWNOID 705
@@ -442,6 +450,9 @@ DESCR("IP address/netmask, host address, netmask optional");
DATA(insert OID = 650 ( cidr PGNSP PGUID -1 f b I f t \054 0 0 651 cidr_in cidr_out cidr_recv cidr_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("network IP address/netmask, network address");
#define CIDROID 650
+DATA(insert OID = 774 ( macaddr8 PGNSP PGUID 8 f b U f t \054 0 0 775 macaddr8_in macaddr8_out macaddr8_recv macaddr8_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
+DESCR("XX:XX:XX:XX:XX:XX:XX:XX, MAC address");
+#define MACADDR8OID 774
/* OIDS 900 - 999 */
@@ -483,6 +494,7 @@ DESCR("access control list");
#define ACLITEMOID 1033
DATA(insert OID = 1034 ( _aclitem PGNSP PGUID -1 f b A f t \054 0 1033 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 1040 ( _macaddr PGNSP PGUID -1 f b A f t \054 0 829 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
+DATA(insert OID = 775 ( _macaddr8 PGNSP PGUID -1 f b A f t \054 0 774 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 1041 ( _inet PGNSP PGUID -1 f b A f t \054 0 869 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 651 ( _cidr PGNSP PGUID -1 f b A f t \054 0 650 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 1263 ( _cstring PGNSP PGUID -1 f b A f t \054 0 2275 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
diff --git a/src/include/catalog/pg_type_fn.h b/src/include/catalog/pg_type_fn.h
index d7bbfdb012..01f095612d 100644
--- a/src/include/catalog/pg_type_fn.h
+++ b/src/include/catalog/pg_type_fn.h
@@ -4,7 +4,7 @@
* prototypes for functions in catalog/pg_type.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_type_fn.h
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index a8bb9d9005..1ebf4611df 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -3,7 +3,7 @@
* pg_user_mapping.h
* definition of the system "user mapping" relation (pg_user_mapping)
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_user_mapping.h
diff --git a/src/include/catalog/storage.h b/src/include/catalog/storage.h
index ef960da921..fea96deba3 100644
--- a/src/include/catalog/storage.h
+++ b/src/include/catalog/storage.h
@@ -4,7 +4,7 @@
* prototypes for functions in backend/catalog/storage.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/storage.h
diff --git a/src/include/catalog/storage_xlog.h b/src/include/catalog/storage_xlog.h
index 500e663b5f..fcdd0233b1 100644
--- a/src/include/catalog/storage_xlog.h
+++ b/src/include/catalog/storage_xlog.h
@@ -4,7 +4,7 @@
* prototypes for XLog support for backend/catalog/storage.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/storage_xlog.h
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index b7a38ced3d..00d0a8326f 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -4,7 +4,7 @@
* This file provides some definitions to support creation of toast tables
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/toasting.h
@@ -53,6 +53,7 @@ DECLARE_TOAST(pg_proc, 2836, 2837);
DECLARE_TOAST(pg_rewrite, 2838, 2839);
DECLARE_TOAST(pg_seclabel, 3598, 3599);
DECLARE_TOAST(pg_statistic, 2840, 2841);
+DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
DECLARE_TOAST(pg_trigger, 2336, 2337);
/* shared catalogs */
diff --git a/src/include/commands/alter.h b/src/include/commands/alter.h
index e116bc73b7..b7aa86cb57 100644
--- a/src/include/commands/alter.h
+++ b/src/include/commands/alter.h
@@ -4,7 +4,7 @@
* prototypes for commands/alter.c
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/alter.h
diff --git a/src/include/commands/async.h b/src/include/commands/async.h
index 93cb92aea6..b7842d1a0f 100644
--- a/src/include/commands/async.h
+++ b/src/include/commands/async.h
@@ -3,7 +3,7 @@
* async.h
* Asynchronous notification: NOTIFY, LISTEN, UNLISTEN
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/async.h
@@ -38,11 +38,6 @@ extern void Async_Listen(const char *channel);
extern void Async_Unlisten(const char *channel);
extern void Async_UnlistenAll(void);
-/* notify-related SQL functions */
-extern Datum pg_listening_channels(PG_FUNCTION_ARGS);
-extern Datum pg_notify(PG_FUNCTION_ARGS);
-extern Datum pg_notification_queue_usage(PG_FUNCTION_ARGS);
-
/* perform (or cancel) outbound notify processing at transaction commit */
extern void PreCommit_Notify(void);
extern void AtCommit_Notify(void);
diff --git a/src/include/commands/cluster.h b/src/include/commands/cluster.h
index e9222fe999..7c9d4746d9 100644
--- a/src/include/commands/cluster.h
+++ b/src/include/commands/cluster.h
@@ -3,7 +3,7 @@
* cluster.h
* header file for postgres cluster command stuff
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California
*
* src/include/commands/cluster.h
diff --git a/src/include/commands/collationcmds.h b/src/include/commands/collationcmds.h
index d1e5e0ad84..df5623ccb6 100644
--- a/src/include/commands/collationcmds.h
+++ b/src/include/commands/collationcmds.h
@@ -4,7 +4,7 @@
* prototypes for collationcmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/collationcmds.h
@@ -18,7 +18,8 @@
#include "catalog/objectaddress.h"
#include "nodes/parsenodes.h"
-extern ObjectAddress DefineCollation(List *names, List *parameters);
+extern ObjectAddress DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_exists);
extern void IsThereCollationInNamespace(const char *collname, Oid nspOid);
+extern ObjectAddress AlterCollation(AlterCollationStmt *stmt);
#endif /* COLLATIONCMDS_H */
diff --git a/src/include/commands/comment.h b/src/include/commands/comment.h
index 0790d9ff79..684ea8b697 100644
--- a/src/include/commands/comment.h
+++ b/src/include/commands/comment.h
@@ -7,7 +7,7 @@
*
* Prototypes for functions in commands/comment.c
*
- * Copyright (c) 1999-2016, PostgreSQL Global Development Group
+ * Copyright (c) 1999-2017, PostgreSQL Global Development Group
*
*-------------------------------------------------------------------------
*/
diff --git a/src/include/commands/conversioncmds.h b/src/include/commands/conversioncmds.h
index e1498ad888..20d7f0e9b1 100644
--- a/src/include/commands/conversioncmds.h
+++ b/src/include/commands/conversioncmds.h
@@ -4,7 +4,7 @@
* prototypes for conversioncmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/conversioncmds.h
diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h
index 314d1f7e27..f081f2219f 100644
--- a/src/include/commands/copy.h
+++ b/src/include/commands/copy.h
@@ -4,7 +4,7 @@
* Definitions for using the POSTGRES copy command.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/copy.h
@@ -16,17 +16,20 @@
#include "nodes/execnodes.h"
#include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
#include "tcop/dest.h"
/* CopyStateData is private in commands/copy.c */
typedef struct CopyStateData *CopyState;
+typedef int (*copy_data_source_cb) (void *outbuf, int minread, int maxread);
-extern Oid DoCopy(const CopyStmt *stmt, const char *queryString,
+extern void DoCopy(ParseState *state, const CopyStmt *stmt,
+ int stmt_location, int stmt_len,
uint64 *processed);
-extern void ProcessCopyOptions(CopyState cstate, bool is_from, List *options);
-extern CopyState BeginCopyFrom(Relation rel, const char *filename,
- bool is_program, List *attnamelist, List *options);
+extern void ProcessCopyOptions(ParseState *pstate, CopyState cstate, bool is_from, List *options);
+extern CopyState BeginCopyFrom(ParseState *pstate, Relation rel, const char *filename,
+ bool is_program, copy_data_source_cb data_source_cb, List *attnamelist, List *options);
extern void EndCopyFrom(CopyState cstate);
extern bool NextCopyFrom(CopyState cstate, ExprContext *econtext,
Datum *values, bool *nulls, Oid *tupleOid);
@@ -34,6 +37,8 @@ extern bool NextCopyFromRawFields(CopyState cstate,
char ***fields, int *nfields);
extern void CopyFromErrorCallback(void *arg);
+extern uint64 CopyFrom(CopyState cstate);
+
extern DestReceiver *CreateCopyDestReceiver(void);
#endif /* COPY_H */
diff --git a/src/include/commands/createas.h b/src/include/commands/createas.h
index 3c4286417a..c3c43f6b36 100644
--- a/src/include/commands/createas.h
+++ b/src/include/commands/createas.h
@@ -4,7 +4,7 @@
* prototypes for createas.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/createas.h
@@ -18,10 +18,11 @@
#include "nodes/params.h"
#include "nodes/parsenodes.h"
#include "tcop/dest.h"
+#include "utils/queryenvironment.h"
extern ObjectAddress ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
- ParamListInfo params, char *completionTag);
+ ParamListInfo params, QueryEnvironment *queryEnv, char *completionTag);
extern int GetIntoRelEFlags(IntoClause *intoClause);
diff --git a/src/include/commands/dbcommands.h b/src/include/commands/dbcommands.h
index 023af52242..5a74a02a5d 100644
--- a/src/include/commands/dbcommands.h
+++ b/src/include/commands/dbcommands.h
@@ -4,7 +4,7 @@
* Database management commands (create/drop database).
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/dbcommands.h
@@ -19,10 +19,10 @@
#include "lib/stringinfo.h"
#include "nodes/parsenodes.h"
-extern Oid createdb(const CreatedbStmt *stmt);
+extern Oid createdb(ParseState *pstate, const CreatedbStmt *stmt);
extern void dropdb(const char *dbname, bool missing_ok);
extern ObjectAddress RenameDatabase(const char *oldname, const char *newname);
-extern Oid AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel);
+extern Oid AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel);
extern Oid AlterDatabaseSet(AlterDatabaseSetStmt *stmt);
extern ObjectAddress AlterDatabaseOwner(const char *dbname, Oid newOwnerId);
diff --git a/src/include/commands/dbcommands_xlog.h b/src/include/commands/dbcommands_xlog.h
index 62ed5120a0..6583d0d5bd 100644
--- a/src/include/commands/dbcommands_xlog.h
+++ b/src/include/commands/dbcommands_xlog.h
@@ -4,7 +4,7 @@
* Database resource manager XLOG definitions (create/drop database).
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/dbcommands_xlog.h
diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h
index b064eb4836..79f3be36e4 100644
--- a/src/include/commands/defrem.h
+++ b/src/include/commands/defrem.h
@@ -4,7 +4,7 @@
* POSTGRES define and remove utility definitions.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/defrem.h
@@ -42,13 +42,15 @@ extern bool CheckIndexCompatible(Oid oldId,
List *attributeList,
List *exclusionOpNames);
extern Oid GetDefaultOpClass(Oid type_id, Oid am_id);
+extern Oid ResolveOpClass(List *opclass, Oid attrType,
+ char *accessMethodName, Oid accessMethodId);
/* commands/functioncmds.c */
-extern ObjectAddress CreateFunction(CreateFunctionStmt *stmt, const char *queryString);
+extern ObjectAddress CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt);
extern void RemoveFunctionById(Oid funcOid);
extern void SetFunctionReturnType(Oid funcOid, Oid newRetType);
extern void SetFunctionArgType(Oid funcOid, int argIndex, Oid newArgType);
-extern ObjectAddress AlterFunction(AlterFunctionStmt *stmt);
+extern ObjectAddress AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt);
extern ObjectAddress CreateCast(CreateCastStmt *stmt);
extern void DropCastById(Oid castOid);
extern ObjectAddress CreateTransform(CreateTransformStmt *stmt);
@@ -58,10 +60,10 @@ extern void IsThereFunctionInNamespace(const char *proname, int pronargs,
extern void ExecuteDoStmt(DoStmt *stmt);
extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);
extern Oid get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok);
-extern void interpret_function_parameter_list(List *parameters,
+extern void interpret_function_parameter_list(ParseState *pstate,
+ List *parameters,
Oid languageOid,
bool is_aggregate,
- const char *queryString,
oidvector **parameterTypes,
ArrayType **allParameterTypes,
ArrayType **parameterModes,
@@ -75,9 +77,16 @@ extern ObjectAddress DefineOperator(List *names, List *parameters);
extern void RemoveOperatorById(Oid operOid);
extern ObjectAddress AlterOperator(AlterOperatorStmt *stmt);
+/* commands/statscmds.c */
+extern ObjectAddress CreateStatistics(CreateStatsStmt *stmt);
+extern void RemoveStatisticsById(Oid statsOid);
+extern void UpdateStatisticsForTypeChange(Oid statsOid,
+ Oid relationOid, int attnum,
+ Oid oldColumnType, Oid newColumnType);
+
/* commands/aggregatecmds.c */
-extern ObjectAddress DefineAggregate(List *name, List *args, bool oldstyle,
- List *parameters, const char *queryString);
+extern ObjectAddress DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle,
+ List *parameters);
/* commands/opclasscmds.c */
extern ObjectAddress DefineOpClass(CreateOpClassStmt *stmt);
@@ -152,6 +161,6 @@ extern int64 defGetInt64(DefElem *def);
extern List *defGetQualifiedName(DefElem *def);
extern TypeName *defGetTypeName(DefElem *def);
extern int defGetTypeLength(DefElem *def);
-extern DefElem *defWithOids(bool value);
+extern List *defGetStringList(DefElem *def);
#endif /* DEFREM_H */
diff --git a/src/include/commands/discard.h b/src/include/commands/discard.h
index 24ea786f97..b960cab51f 100644
--- a/src/include/commands/discard.h
+++ b/src/include/commands/discard.h
@@ -4,7 +4,7 @@
* prototypes for discard.c.
*
*
- * Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Copyright (c) 1996-2017, PostgreSQL Global Development Group
*
* src/include/commands/discard.h
*
diff --git a/src/include/commands/event_trigger.h b/src/include/commands/event_trigger.h
index 0e91bf6ada..0017bd0cd4 100644
--- a/src/include/commands/event_trigger.h
+++ b/src/include/commands/event_trigger.h
@@ -3,7 +3,7 @@
* event_trigger.h
* Declarations for command trigger handling.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/event_trigger.h
diff --git a/src/include/commands/explain.h b/src/include/commands/explain.h
index bd9fc84ad9..5882aff24d 100644
--- a/src/include/commands/explain.h
+++ b/src/include/commands/explain.h
@@ -3,7 +3,7 @@
* explain.h
* prototypes for explain.c
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California
*
* src/include/commands/explain.h
@@ -15,6 +15,7 @@
#include "executor/executor.h"
#include "lib/stringinfo.h"
+#include "parser/parse_node.h"
typedef enum ExplainFormat
{
@@ -52,6 +53,7 @@ typedef struct ExplainState
/* Hook for plugins to get control in ExplainOneQuery() */
typedef void (*ExplainOneQuery_hook_type) (Query *query,
+ int cursorOptions,
IntoClause *into,
ExplainState *es,
const char *queryString,
@@ -63,20 +65,21 @@ typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);
extern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;
-extern void ExplainQuery(ExplainStmt *stmt, const char *queryString,
- ParamListInfo params, DestReceiver *dest);
+extern void ExplainQuery(ParseState *pstate, ExplainStmt *stmt, const char *queryString,
+ ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest);
extern ExplainState *NewExplainState(void);
extern TupleDesc ExplainResultDesc(ExplainStmt *stmt);
extern void ExplainOneUtility(Node *utilityStmt, IntoClause *into,
- ExplainState *es,
- const char *queryString, ParamListInfo params);
+ ExplainState *es, const char *queryString,
+ ParamListInfo params, QueryEnvironment *queryEnv);
extern void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into,
ExplainState *es, const char *queryString,
- ParamListInfo params, const instr_time *planduration);
+ ParamListInfo params, QueryEnvironment *queryEnv,
+ const instr_time *planduration);
extern void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc);
extern void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc);
diff --git a/src/include/commands/extension.h b/src/include/commands/extension.h
index 94354ab04d..7f027d9dc7 100644
--- a/src/include/commands/extension.h
+++ b/src/include/commands/extension.h
@@ -4,7 +4,7 @@
* Extension management commands (create/drop extension).
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/extension.h
@@ -19,16 +19,19 @@
/*
- * creating_extension is only true while running a CREATE EXTENSION command.
- * It instructs recordDependencyOnCurrentExtension() to register a dependency
- * on the current pg_extension object for each SQL object created by its
- * installation script.
+ * creating_extension is only true while running a CREATE EXTENSION or ALTER
+ * EXTENSION UPDATE command. It instructs recordDependencyOnCurrentExtension()
+ * to register a dependency on the current pg_extension object for each SQL
+ * object created by an extension script. It also instructs performDeletion()
+ * to remove such dependencies without following them, so that extension
+ * scripts can drop member objects without having to explicitly dissociate
+ * them from the extension first.
*/
extern PGDLLIMPORT bool creating_extension;
extern Oid CurrentExtensionObject;
-extern ObjectAddress CreateExtension(CreateExtensionStmt *stmt);
+extern ObjectAddress CreateExtension(ParseState *pstate, CreateExtensionStmt *stmt);
extern void RemoveExtensionById(Oid extId);
@@ -37,7 +40,7 @@ extern ObjectAddress InsertExtensionTuple(const char *extName, Oid extOwner,
Datum extConfig, Datum extCondition,
List *requiredExtensions);
-extern ObjectAddress ExecAlterExtensionStmt(AlterExtensionStmt *stmt);
+extern ObjectAddress ExecAlterExtensionStmt(ParseState *pstate, AlterExtensionStmt *stmt);
extern ObjectAddress ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt,
ObjectAddress *objAddress);
@@ -45,7 +48,7 @@ extern ObjectAddress ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *
extern Oid get_extension_oid(const char *extname, bool missing_ok);
extern char *get_extension_name(Oid ext_oid);
-extern ObjectAddress AlterExtensionNamespace(List *names, const char *newschema,
+extern ObjectAddress AlterExtensionNamespace(const char *extensionName, const char *newschema,
Oid *oldschema);
extern void AlterExtensionOwner_oid(Oid extensionOid, Oid newOwnerId);
diff --git a/src/include/commands/lockcmds.h b/src/include/commands/lockcmds.h
index 8881352dd7..45ed96d4d1 100644
--- a/src/include/commands/lockcmds.h
+++ b/src/include/commands/lockcmds.h
@@ -4,7 +4,7 @@
* prototypes for lockcmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/lockcmds.h
diff --git a/src/include/commands/matview.h b/src/include/commands/matview.h
index 82e06c2460..129fb92f59 100644
--- a/src/include/commands/matview.h
+++ b/src/include/commands/matview.h
@@ -4,7 +4,7 @@
* prototypes for matview.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/matview.h
diff --git a/src/include/commands/policy.h b/src/include/commands/policy.h
index dbf782464b..cff93a6cb0 100644
--- a/src/include/commands/policy.h
+++ b/src/include/commands/policy.h
@@ -4,7 +4,7 @@
* prototypes for policy.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/policy.h
diff --git a/src/include/commands/portalcmds.h b/src/include/commands/portalcmds.h
index 8abd3e72bf..8f0e6c48f4 100644
--- a/src/include/commands/portalcmds.h
+++ b/src/include/commands/portalcmds.h
@@ -4,7 +4,7 @@
* prototypes for portalcmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/portalcmds.h
@@ -18,7 +18,7 @@
#include "utils/portal.h"
-extern void PerformCursorOpen(PlannedStmt *stmt, ParamListInfo params,
+extern void PerformCursorOpen(DeclareCursorStmt *cstmt, ParamListInfo params,
const char *queryString, bool isTopLevel);
extern void PerformPortalFetch(FetchStmt *stmt, DestReceiver *dest,
diff --git a/src/include/commands/prepare.h b/src/include/commands/prepare.h
index 072ce78580..147f22b870 100644
--- a/src/include/commands/prepare.h
+++ b/src/include/commands/prepare.h
@@ -4,7 +4,7 @@
* PREPARE, EXECUTE and DEALLOCATE commands, and prepared-stmt storage
*
*
- * Copyright (c) 2002-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2002-2017, PostgreSQL Global Development Group
*
* src/include/commands/prepare.h
*
@@ -47,14 +47,15 @@ typedef struct
#endif
/* Utility statements PREPARE, EXECUTE, DEALLOCATE, EXPLAIN EXECUTE */
-extern void PrepareQuery(PrepareStmt *stmt, const char *queryString);
+extern void PrepareQuery(PrepareStmt *stmt, const char *queryString,
+ int stmt_location, int stmt_len);
extern void ExecuteQuery(ExecuteStmt *stmt, IntoClause *intoClause,
const char *queryString, ParamListInfo params,
DestReceiver *dest, char *completionTag);
extern void DeallocateQuery(DeallocateStmt *stmt);
extern void ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into,
- ExplainState *es,
- const char *queryString, ParamListInfo params);
+ ExplainState *es, const char *queryString,
+ ParamListInfo params, QueryEnvironment *queryEnv);
/* Low-level access to stored prepared statements */
extern void StorePreparedStatement(const char *stmt_name,
diff --git a/src/include/commands/progress.h b/src/include/commands/progress.h
index c48d23be2b..9472ecca63 100644
--- a/src/include/commands/progress.h
+++ b/src/include/commands/progress.h
@@ -7,7 +7,7 @@
* constants, you probably also need to update the views based on them
* in system_views.sql.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/progress.h
diff --git a/src/include/commands/publicationcmds.h b/src/include/commands/publicationcmds.h
new file mode 100644
index 0000000000..7f12ff0a1b
--- /dev/null
+++ b/src/include/commands/publicationcmds.h
@@ -0,0 +1,29 @@
+/*-------------------------------------------------------------------------
+ *
+ * publicationcmds.h
+ * prototypes for publicationcmds.c.
+ *
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/commands/publicationcmds.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PUBLICATIONCMDS_H
+#define PUBLICATIONCMDS_H
+
+#include "catalog/objectaddress.h"
+#include "nodes/parsenodes.h"
+
+extern ObjectAddress CreatePublication(CreatePublicationStmt *stmt);
+extern void AlterPublication(AlterPublicationStmt *stmt);
+extern void RemovePublicationById(Oid pubid);
+extern void RemovePublicationRelById(Oid proid);
+
+extern ObjectAddress AlterPublicationOwner(const char *name, Oid newOwnerId);
+extern void AlterPublicationOwner_oid(Oid pubid, Oid newOwnerId);
+
+#endif /* PUBLICATIONCMDS_H */
diff --git a/src/include/commands/schemacmds.h b/src/include/commands/schemacmds.h
index b87a10dd40..7079bfbf5a 100644
--- a/src/include/commands/schemacmds.h
+++ b/src/include/commands/schemacmds.h
@@ -4,7 +4,7 @@
* prototypes for schemacmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/schemacmds.h
@@ -18,13 +18,11 @@
#include "catalog/objectaddress.h"
#include "nodes/parsenodes.h"
-#ifdef PGXC
extern Oid CreateSchemaCommand(CreateSchemaStmt *parsetree,
- const char *queryString, bool is_top_level);
-#else
-extern Oid CreateSchemaCommand(CreateSchemaStmt *parsetree,
- const char *queryString);
-#endif
+ const char *queryString,
+ bool is_top_level,
+ int stmt_location, int stmt_len);
+
extern void RemoveSchemaById(Oid schemaOid);
extern ObjectAddress RenameSchema(const char *oldname, const char *newname);
diff --git a/src/include/commands/seclabel.h b/src/include/commands/seclabel.h
index 6671bfdfee..d317f39485 100644
--- a/src/include/commands/seclabel.h
+++ b/src/include/commands/seclabel.h
@@ -3,7 +3,7 @@
*
* Prototypes for functions in commands/seclabel.c
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*/
#ifndef SECLABEL_H
diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h
index 0f82def1f1..0e9533cc2d 100644
--- a/src/include/commands/sequence.h
+++ b/src/include/commands/sequence.h
@@ -4,7 +4,7 @@
* prototypes for sequence.c.
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/sequence.h
@@ -19,6 +19,7 @@
#include "fmgr.h"
#include "lib/stringinfo.h"
#include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
#include "storage/relfilenode.h"
#ifdef PGXC
@@ -27,38 +28,24 @@
#include "access/xact.h"
#endif
-typedef struct FormData_pg_sequence
+typedef struct FormData_pg_sequence_data
{
- NameData sequence_name;
int64 last_value;
- int64 start_value;
- int64 increment_by;
- int64 max_value;
- int64 min_value;
- int64 cache_value;
int64 log_cnt;
- bool is_cycled;
bool is_called;
-} FormData_pg_sequence;
+} FormData_pg_sequence_data;
-typedef FormData_pg_sequence *Form_pg_sequence;
+typedef FormData_pg_sequence_data *Form_pg_sequence_data;
/*
* Columns of a sequence relation
*/
-#define SEQ_COL_NAME 1
-#define SEQ_COL_LASTVAL 2
-#define SEQ_COL_STARTVAL 3
-#define SEQ_COL_INCBY 4
-#define SEQ_COL_MAXVALUE 5
-#define SEQ_COL_MINVALUE 6
-#define SEQ_COL_CACHE 7
-#define SEQ_COL_LOG 8
-#define SEQ_COL_CYCLE 9
-#define SEQ_COL_CALLED 10
+#define SEQ_COL_LASTVAL 1
+#define SEQ_COL_LOG 2
+#define SEQ_COL_CALLED 3
-#define SEQ_COL_FIRSTCOL SEQ_COL_NAME
+#define SEQ_COL_FIRSTCOL SEQ_COL_LASTVAL
#define SEQ_COL_LASTCOL SEQ_COL_CALLED
/* XLOG stuff */
@@ -70,23 +57,20 @@ typedef struct xl_seq_rec
/* SEQUENCE TUPLE DATA FOLLOWS AT THE END */
} xl_seq_rec;
+extern int64 nextval_internal(Oid relid, bool check_permissions);
extern Datum nextval(PG_FUNCTION_ARGS);
-extern Datum nextval_oid(PG_FUNCTION_ARGS);
-extern Datum currval_oid(PG_FUNCTION_ARGS);
-extern Datum setval_oid(PG_FUNCTION_ARGS);
-extern Datum setval3_oid(PG_FUNCTION_ARGS);
-extern Datum lastval(PG_FUNCTION_ARGS);
+extern List *sequence_options(Oid relid);
-extern Datum pg_sequence_parameters(PG_FUNCTION_ARGS);
-
-extern ObjectAddress DefineSequence(CreateSeqStmt *stmt);
-extern ObjectAddress AlterSequence(AlterSeqStmt *stmt);
+extern ObjectAddress DefineSequence(ParseState *pstate, CreateSeqStmt *stmt);
+extern ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt);
+extern void DeleteSequenceTuple(Oid relid);
extern void ResetSequence(Oid seq_relid);
extern void ResetSequenceCaches(void);
extern void seq_redo(XLogReaderState *rptr);
extern void seq_desc(StringInfo buf, XLogReaderState *rptr);
extern const char *seq_identify(uint8 info);
+extern void seq_mask(char *pagedata, BlockNumber blkno);
#ifdef XCP
#define DEFAULT_CACHEVAL 1
diff --git a/src/include/commands/subscriptioncmds.h b/src/include/commands/subscriptioncmds.h
new file mode 100644
index 0000000000..1e4428e617
--- /dev/null
+++ b/src/include/commands/subscriptioncmds.h
@@ -0,0 +1,29 @@
+/*-------------------------------------------------------------------------
+ *
+ * subscriptioncmds.h
+ * prototypes for subscriptioncmds.c.
+ *
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/commands/subscriptioncmds.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef SUBSCRIPTIONCMDS_H
+#define SUBSCRIPTIONCMDS_H
+
+#include "catalog/objectaddress.h"
+#include "nodes/parsenodes.h"
+
+extern ObjectAddress CreateSubscription(CreateSubscriptionStmt *stmt,
+ bool isTopLevel);
+extern ObjectAddress AlterSubscription(AlterSubscriptionStmt *stmt);
+extern void DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel);
+
+extern ObjectAddress AlterSubscriptionOwner(const char *name, Oid newOwnerId);
+extern void AlterSubscriptionOwner_oid(Oid subid, Oid newOwnerId);
+
+#endif /* SUBSCRIPTIONCMDS_H */
diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h
index 0296651a87..a27fdfbfce 100644
--- a/src/include/commands/tablecmds.h
+++ b/src/include/commands/tablecmds.h
@@ -4,7 +4,7 @@
* prototypes for tablecmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/tablecmds.h
@@ -23,7 +23,7 @@
extern ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
- ObjectAddress *typaddress);
+ ObjectAddress *typaddress, const char *queryString);
extern void RemoveRelations(DropStmt *drop);
diff --git a/src/include/commands/tablespace.h b/src/include/commands/tablespace.h
index 9e59da24a4..3ea13bdf14 100644
--- a/src/include/commands/tablespace.h
+++ b/src/include/commands/tablespace.h
@@ -4,7 +4,7 @@
* Tablespace management commands (create/drop tablespace).
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/tablespace.h
diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h
index fc32d2cf54..de9462d402 100644
--- a/src/include/commands/trigger.h
+++ b/src/include/commands/trigger.h
@@ -3,7 +3,7 @@
* trigger.h
* Declarations for trigger handling.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/trigger.h
@@ -37,6 +37,8 @@ typedef struct TriggerData
Trigger *tg_trigger;
Buffer tg_trigtuplebuf;
Buffer tg_newtuplebuf;
+ Tuplestorestate *tg_oldtable;
+ Tuplestorestate *tg_newtable;
} TriggerData;
/*
@@ -217,6 +219,4 @@ extern bool RI_Initial_Check(Trigger *trigger,
extern int RI_FKey_trigger_type(Oid tgfoid);
-extern Datum pg_trigger_depth(PG_FUNCTION_ARGS);
-
#endif /* TRIGGER_H */
diff --git a/src/include/commands/typecmds.h b/src/include/commands/typecmds.h
index e4c86f1b1d..c18f93adb2 100644
--- a/src/include/commands/typecmds.h
+++ b/src/include/commands/typecmds.h
@@ -4,7 +4,7 @@
* prototypes for typecmds.c.
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/typecmds.h
@@ -21,12 +21,12 @@
#define DEFAULT_TYPDELIM ','
-extern ObjectAddress DefineType(List *names, List *parameters);
+extern ObjectAddress DefineType(ParseState *pstate, List *names, List *parameters);
extern void RemoveTypeById(Oid typeOid);
extern ObjectAddress DefineDomain(CreateDomainStmt *stmt);
extern ObjectAddress DefineEnum(CreateEnumStmt *stmt);
extern ObjectAddress DefineRange(CreateRangeStmt *stmt);
-extern ObjectAddress AlterEnum(AlterEnumStmt *stmt, bool isTopLevel);
+extern ObjectAddress AlterEnum(AlterEnumStmt *stmt);
extern ObjectAddress DefineCompositeType(RangeVar *typevar, List *coldeflist);
extern Oid AssignTypeArrayOid(void);
diff --git a/src/include/commands/user.h b/src/include/commands/user.h
index d35cb0c90d..08037e0f81 100644
--- a/src/include/commands/user.h
+++ b/src/include/commands/user.h
@@ -12,18 +12,19 @@
#define USER_H
#include "catalog/objectaddress.h"
+#include "libpq/crypt.h"
#include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
+/* GUC. Is actually of type PasswordType. */
+extern int Password_encryption;
/* Hook to check passwords in CreateRole() and AlterRole() */
-#define PASSWORD_TYPE_PLAINTEXT 0
-#define PASSWORD_TYPE_MD5 1
-
-typedef void (*check_password_hook_type) (const char *username, const char *password, int password_type, Datum validuntil_time, bool validuntil_null);
+typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);
extern PGDLLIMPORT check_password_hook_type check_password_hook;
-extern Oid CreateRole(CreateRoleStmt *stmt);
+extern Oid CreateRole(ParseState *pstate, CreateRoleStmt *stmt);
extern Oid AlterRole(AlterRoleStmt *stmt);
extern Oid AlterRoleSet(AlterRoleSetStmt *stmt);
extern void DropRole(DropRoleStmt *stmt);
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index b87bf2ace9..fd2dc860dd 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -5,7 +5,7 @@
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/vacuum.h
diff --git a/src/include/commands/variable.h b/src/include/commands/variable.h
index 4997e1e166..e0fb3332df 100644
--- a/src/include/commands/variable.h
+++ b/src/include/commands/variable.h
@@ -3,7 +3,7 @@
* Routines for handling specialized SET variables.
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/variable.h
diff --git a/src/include/commands/view.h b/src/include/commands/view.h
index 99e456449d..39763913c8 100644
--- a/src/include/commands/view.h
+++ b/src/include/commands/view.h
@@ -4,7 +4,7 @@
*
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/view.h
@@ -19,7 +19,8 @@
extern void validateWithCheckOption(char *value);
-extern ObjectAddress DefineView(ViewStmt *stmt, const char *queryString);
+extern ObjectAddress DefineView(ViewStmt *stmt, const char *queryString,
+ int stmt_location, int stmt_len);
extern void StoreViewQuery(Oid viewOid, Query *viewParse, bool replace);
diff --git a/src/include/common/base64.h b/src/include/common/base64.h
new file mode 100644
index 0000000000..09b69b1656
--- /dev/null
+++ b/src/include/common/base64.h
@@ -0,0 +1,19 @@
+/*
+ * base64.h
+ * Encoding and decoding routines for base64 without whitespace
+ * support.
+ *
+ * Portions Copyright (c) 2001-2017, PostgreSQL Global Development Group
+ *
+ * src/include/common/base64.h
+ */
+#ifndef BASE64_H
+#define BASE64_H
+
+/* base 64 */
+extern int pg_b64_encode(const char *src, int len, char *dst);
+extern int pg_b64_decode(const char *src, int len, char *dst);
+extern int pg_b64_enc_len(int srclen);
+extern int pg_b64_dec_len(int srclen);
+
+#endif /* BASE64_H */
diff --git a/src/include/common/config_info.h b/src/include/common/config_info.h
index a695a42c0a..656e26fdb0 100644
--- a/src/include/common/config_info.h
+++ b/src/include/common/config_info.h
@@ -2,7 +2,7 @@
* config_info.h
* Common code for pg_config output
*
- * Copyright (c) 2016, PostgreSQL Global Development Group
+ * Copyright (c) 2016-2017, PostgreSQL Global Development Group
*
* src/include/common/config_info.h
*/
diff --git a/src/include/common/controldata_utils.h b/src/include/common/controldata_utils.h
index a355d2252d..82ea426afe 100644
--- a/src/include/common/controldata_utils.h
+++ b/src/include/common/controldata_utils.h
@@ -2,7 +2,7 @@
* controldata_utils.h
* Common code for pg_controldata output
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/common/controldata_utils.h
@@ -12,6 +12,6 @@
#include "catalog/pg_control.h"
-extern ControlFileData *get_controlfile(char *DataDir, const char *progname);
+extern ControlFileData *get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p);
#endif /* COMMON_CONTROLDATA_UTILS_H */
diff --git a/src/include/common/fe_memutils.h b/src/include/common/fe_memutils.h
index b4ce3d41ef..cb381bd9f5 100644
--- a/src/include/common/fe_memutils.h
+++ b/src/include/common/fe_memutils.h
@@ -2,7 +2,7 @@
* fe_memutils.h
* memory management support for frontend code
*
- * Copyright (c) 2003-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2003-2017, PostgreSQL Global Development Group
*
* src/include/common/fe_memutils.h
*/
diff --git a/src/include/common/file_utils.h b/src/include/common/file_utils.h
new file mode 100644
index 0000000000..95c001905d
--- /dev/null
+++ b/src/include/common/file_utils.h
@@ -0,0 +1,27 @@
+/*-------------------------------------------------------------------------
+ *
+ * File-processing utility routines for frontend code
+ *
+ * Assorted utility functions to work on files.
+ *
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/file_utils.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FILE_UTILS_H
+#define FILE_UTILS_H
+
+extern int fsync_fname(const char *fname, bool isdir,
+ const char *progname);
+extern void fsync_pgdata(const char *pg_data, const char *progname,
+ int serverVersion);
+extern void fsync_dir_recurse(const char *dir, const char *progname);
+extern int durable_rename(const char *oldfile, const char *newfile,
+ const char *progname);
+extern int fsync_parent_path(const char *fname, const char *progname);
+
+#endif /* FILE_UTILS_H */
diff --git a/src/include/common/int128.h b/src/include/common/int128.h
new file mode 100644
index 0000000000..4c46e26f40
--- /dev/null
+++ b/src/include/common/int128.h
@@ -0,0 +1,276 @@
+/*-------------------------------------------------------------------------
+ *
+ * int128.h
+ * Roll-our-own 128-bit integer arithmetic.
+ *
+ * We make use of the native int128 type if there is one, otherwise
+ * implement things the hard way based on two int64 halves.
+ *
+ * See src/tools/testint128.c for a simple test harness for this file.
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * src/include/common/int128.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef INT128_H
+#define INT128_H
+
+/*
+ * For testing purposes, use of native int128 can be switched on/off by
+ * predefining USE_NATIVE_INT128.
+ */
+#ifndef USE_NATIVE_INT128
+#ifdef HAVE_INT128
+#define USE_NATIVE_INT128 1
+#else
+#define USE_NATIVE_INT128 0
+#endif
+#endif
+
+
+#if USE_NATIVE_INT128
+
+typedef int128 INT128;
+
+/*
+ * Add an unsigned int64 value into an INT128 variable.
+ */
+static inline void
+int128_add_uint64(INT128 *i128, uint64 v)
+{
+ *i128 += v;
+}
+
+/*
+ * Add a signed int64 value into an INT128 variable.
+ */
+static inline void
+int128_add_int64(INT128 *i128, int64 v)
+{
+ *i128 += v;
+}
+
+/*
+ * Add the 128-bit product of two int64 values into an INT128 variable.
+ *
+ * XXX with a stupid compiler, this could actually be less efficient than
+ * the other implementation; maybe we should do it by hand always?
+ */
+static inline void
+int128_add_int64_mul_int64(INT128 *i128, int64 x, int64 y)
+{
+ *i128 += (int128) x *(int128) y;
+}
+
+/*
+ * Compare two INT128 values, return -1, 0, or +1.
+ */
+static inline int
+int128_compare(INT128 x, INT128 y)
+{
+ if (x < y)
+ return -1;
+ if (x > y)
+ return 1;
+ return 0;
+}
+
+/*
+ * Widen int64 to INT128.
+ */
+static inline INT128
+int64_to_int128(int64 v)
+{
+ return (INT128) v;
+}
+
+/*
+ * Convert INT128 to int64 (losing any high-order bits).
+ * This also works fine for casting down to uint64.
+ */
+static inline int64
+int128_to_int64(INT128 val)
+{
+ return (int64) val;
+}
+
+#else /* !USE_NATIVE_INT128 */
+
+/*
+ * We lay out the INT128 structure with the same content and byte ordering
+ * that a native int128 type would (probably) have. This makes no difference
+ * for ordinary use of INT128, but allows union'ing INT128 with int128 for
+ * testing purposes.
+ */
+typedef struct
+{
+#ifdef WORDS_BIGENDIAN
+ int64 hi; /* most significant 64 bits, including sign */
+ uint64 lo; /* least significant 64 bits, without sign */
+#else
+ uint64 lo; /* least significant 64 bits, without sign */
+ int64 hi; /* most significant 64 bits, including sign */
+#endif
+} INT128;
+
+/*
+ * Add an unsigned int64 value into an INT128 variable.
+ */
+static inline void
+int128_add_uint64(INT128 *i128, uint64 v)
+{
+ /*
+ * First add the value to the .lo part, then check to see if a carry needs
+ * to be propagated into the .hi part. A carry is needed if both inputs
+ * have high bits set, or if just one input has high bit set while the new
+ * .lo part doesn't. Remember that .lo part is unsigned; we cast to
+ * signed here just as a cheap way to check the high bit.
+ */
+ uint64 oldlo = i128->lo;
+
+ i128->lo += v;
+ if (((int64) v < 0 && (int64) oldlo < 0) ||
+ (((int64) v < 0 || (int64) oldlo < 0) && (int64) i128->lo >= 0))
+ i128->hi++;
+}
+
+/*
+ * Add a signed int64 value into an INT128 variable.
+ */
+static inline void
+int128_add_int64(INT128 *i128, int64 v)
+{
+ /*
+ * This is much like the above except that the carry logic differs for
+ * negative v. Ordinarily we'd need to subtract 1 from the .hi part
+ * (corresponding to adding the sign-extended bits of v to it); but if
+ * there is a carry out of the .lo part, that cancels and we do nothing.
+ */
+ uint64 oldlo = i128->lo;
+
+ i128->lo += v;
+ if (v >= 0)
+ {
+ if ((int64) oldlo < 0 && (int64) i128->lo >= 0)
+ i128->hi++;
+ }
+ else
+ {
+ if (!((int64) oldlo < 0 || (int64) i128->lo >= 0))
+ i128->hi--;
+ }
+}
+
+/*
+ * INT64_AU32 extracts the most significant 32 bits of int64 as int64, while
+ * INT64_AL32 extracts the least significant 32 bits as uint64.
+ */
+#define INT64_AU32(i64) ((i64) >> 32)
+#define INT64_AL32(i64) ((i64) & UINT64CONST(0xFFFFFFFF))
+
+/*
+ * Add the 128-bit product of two int64 values into an INT128 variable.
+ */
+static inline void
+int128_add_int64_mul_int64(INT128 *i128, int64 x, int64 y)
+{
+ /* INT64_AU32 must use arithmetic right shift */
+ StaticAssertStmt(((int64) -1 >> 1) == (int64) -1,
+ "arithmetic right shift is needed");
+
+ /*----------
+ * Form the 128-bit product x * y using 64-bit arithmetic.
+ * Considering each 64-bit input as having 32-bit high and low parts,
+ * we can compute
+ *
+ * x * y = ((x.hi << 32) + x.lo) * (((y.hi << 32) + y.lo)
+ * = (x.hi * y.hi) << 64 +
+ * (x.hi * y.lo) << 32 +
+ * (x.lo * y.hi) << 32 +
+ * x.lo * y.lo
+ *
+ * Each individual product is of 32-bit terms so it won't overflow when
+ * computed in 64-bit arithmetic. Then we just have to shift it to the
+ * correct position while adding into the 128-bit result. We must also
+ * keep in mind that the "lo" parts must be treated as unsigned.
+ *----------
+ */
+
+ /* No need to work hard if product must be zero */
+ if (x != 0 && y != 0)
+ {
+ int64 x_u32 = INT64_AU32(x);
+ uint64 x_l32 = INT64_AL32(x);
+ int64 y_u32 = INT64_AU32(y);
+ uint64 y_l32 = INT64_AL32(y);
+ int64 tmp;
+
+ /* the first term */
+ i128->hi += x_u32 * y_u32;
+
+ /* the second term: sign-extend it only if x is negative */
+ tmp = x_u32 * y_l32;
+ if (x < 0)
+ i128->hi += INT64_AU32(tmp);
+ else
+ i128->hi += ((uint64) tmp) >> 32;
+ int128_add_uint64(i128, ((uint64) INT64_AL32(tmp)) << 32);
+
+ /* the third term: sign-extend it only if y is negative */
+ tmp = x_l32 * y_u32;
+ if (y < 0)
+ i128->hi += INT64_AU32(tmp);
+ else
+ i128->hi += ((uint64) tmp) >> 32;
+ int128_add_uint64(i128, ((uint64) INT64_AL32(tmp)) << 32);
+
+ /* the fourth term: always unsigned */
+ int128_add_uint64(i128, x_l32 * y_l32);
+ }
+}
+
+/*
+ * Compare two INT128 values, return -1, 0, or +1.
+ */
+static inline int
+int128_compare(INT128 x, INT128 y)
+{
+ if (x.hi < y.hi)
+ return -1;
+ if (x.hi > y.hi)
+ return 1;
+ if (x.lo < y.lo)
+ return -1;
+ if (x.lo > y.lo)
+ return 1;
+ return 0;
+}
+
+/*
+ * Widen int64 to INT128.
+ */
+static inline INT128
+int64_to_int128(int64 v)
+{
+ INT128 val;
+
+ val.lo = (uint64) v;
+ val.hi = (v < 0) ? -INT64CONST(1) : INT64CONST(0);
+ return val;
+}
+
+/*
+ * Convert INT128 to int64 (losing any high-order bits).
+ * This also works fine for casting down to uint64.
+ */
+static inline int64
+int128_to_int64(INT128 val)
+{
+ return (int64) val.lo;
+}
+
+#endif /* USE_NATIVE_INT128 */
+
+#endif /* INT128_H */
diff --git a/src/include/libpq/ip.h b/src/include/common/ip.h
index ce9bc6e225..815e6ccad3 100644
--- a/src/include/libpq/ip.h
+++ b/src/include/common/ip.h
@@ -3,12 +3,11 @@
* ip.h
* Definitions for IPv6-aware network access.
*
- * These definitions are used by both frontend and backend code. Be careful
- * what you include here!
+ * These definitions are used by both frontend and backend code.
*
- * Copyright (c) 2003-2016, PostgreSQL Global Development Group
+ * Copyright (c) 2003-2017, PostgreSQL Global Development Group
*
- * src/include/libpq/ip.h
+ * src/include/common/ip.h
*
*-------------------------------------------------------------------------
*/
@@ -25,10 +24,6 @@
#define IS_AF_UNIX(fam) (0)
#endif
-typedef void (*PgIfAddrCallback) (struct sockaddr * addr,
- struct sockaddr * netmask,
- void *cb_data);
-
extern int pg_getaddrinfo_all(const char *hostname, const char *servname,
const struct addrinfo * hintp,
struct addrinfo ** result);
@@ -39,13 +34,4 @@ extern int pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen,
char *service, int servicelen,
int flags);
-extern int pg_range_sockaddr(const struct sockaddr_storage * addr,
- const struct sockaddr_storage * netaddr,
- const struct sockaddr_storage * netmask);
-
-extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask,
- char *numbits, int family);
-
-extern int pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data);
-
#endif /* IP_H */
diff --git a/src/include/common/keywords.h b/src/include/common/keywords.h
index 97c830521c..34e066be6b 100644
--- a/src/include/common/keywords.h
+++ b/src/include/common/keywords.h
@@ -4,7 +4,7 @@
* lexical token lookup for key words in PostgreSQL
*
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/common/keywords.h
diff --git a/src/include/libpq/md5.h b/src/include/common/md5.h
index f3eec8b4f4..ccaaeddbf4 100644
--- a/src/include/libpq/md5.h
+++ b/src/include/common/md5.h
@@ -6,10 +6,10 @@
* These definitions are needed by both frontend and backend code to work
* with MD5-encrypted passwords.
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * src/include/libpq/md5.h
+ * src/include/common/md5.h
*
*-------------------------------------------------------------------------
*/
@@ -18,10 +18,6 @@
#define MD5_PASSWD_LEN 35
-#define isMD5(passwd) (strncmp(passwd, "md5", 3) == 0 && \
- strlen(passwd) == MD5_PASSWD_LEN)
-
-
extern bool pg_md5_hash(const void *buff, size_t len, char *hexsum);
extern bool pg_md5_binary(const void *buff, size_t len, void *outbuf);
extern bool pg_md5_encrypt(const char *passwd, const char *salt,
diff --git a/src/include/common/relpath.h b/src/include/common/relpath.h
index ed357ae93d..8468c0c6f6 100644
--- a/src/include/common/relpath.h
+++ b/src/include/common/relpath.h
@@ -3,7 +3,7 @@
* relpath.h
* Declarations for GetRelationPath() and friends
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/common/relpath.h
diff --git a/src/include/common/restricted_token.h b/src/include/common/restricted_token.h
index fb4ebd4cad..7441a55119 100644
--- a/src/include/common/restricted_token.h
+++ b/src/include/common/restricted_token.h
@@ -2,7 +2,7 @@
* restricted_token.h
* helper routine to ensure restricted token on Windows
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/common/restricted_token.h
diff --git a/src/include/common/saslprep.h b/src/include/common/saslprep.h
new file mode 100644
index 0000000000..ec5c8ce361
--- /dev/null
+++ b/src/include/common/saslprep.h
@@ -0,0 +1,30 @@
+/*-------------------------------------------------------------------------
+ *
+ * saslprep.h
+ * SASLprep normalization, for SCRAM authentication
+ *
+ * These definitions are used by both frontend and backend code.
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * src/include/common/saslprep.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef SASLPREP_H
+#define SASLPREP_H
+
+/*
+ * Return codes for pg_saslprep() function.
+ */
+typedef enum
+{
+ SASLPREP_SUCCESS = 0,
+ SASLPREP_OOM = -1, /* out of memory (only in frontend) */
+ SASLPREP_INVALID_UTF8 = -2, /* input is not a valid UTF-8 string */
+ SASLPREP_PROHIBITED = -3 /* output would contain prohibited characters */
+} pg_saslprep_rc;
+
+extern pg_saslprep_rc pg_saslprep(const char *input, char **output);
+
+#endif /* SASLPREP_H */
diff --git a/src/include/common/scram-common.h b/src/include/common/scram-common.h
new file mode 100644
index 0000000000..2ee51fbaec
--- /dev/null
+++ b/src/include/common/scram-common.h
@@ -0,0 +1,59 @@
+/*-------------------------------------------------------------------------
+ *
+ * scram-common.h
+ * Declarations for helper functions used for SCRAM authentication
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/scram-common.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef SCRAM_COMMON_H
+#define SCRAM_COMMON_H
+
+#include "common/sha2.h"
+
+/* Length of SCRAM keys (client and server) */
+#define SCRAM_KEY_LEN PG_SHA256_DIGEST_LENGTH
+
+/* length of HMAC */
+#define SHA256_HMAC_B PG_SHA256_BLOCK_LENGTH
+
+/*
+ * Size of random nonce generated in the authentication exchange. This
+ * is in "raw" number of bytes, the actual nonces sent over the wire are
+ * encoded using only ASCII-printable characters.
+ */
+#define SCRAM_RAW_NONCE_LEN 18
+
+/* length of salt when generating new verifiers */
+#define SCRAM_DEFAULT_SALT_LEN 12
+
+/* default number of iterations when generating verifier */
+#define SCRAM_DEFAULT_ITERATIONS 4096
+
+/*
+ * Context data for HMAC used in SCRAM authentication.
+ */
+typedef struct
+{
+ pg_sha256_ctx sha256ctx;
+ uint8 k_opad[SHA256_HMAC_B];
+} scram_HMAC_ctx;
+
+extern void scram_HMAC_init(scram_HMAC_ctx *ctx, const uint8 *key, int keylen);
+extern void scram_HMAC_update(scram_HMAC_ctx *ctx, const char *str, int slen);
+extern void scram_HMAC_final(uint8 *result, scram_HMAC_ctx *ctx);
+
+extern void scram_SaltedPassword(const char *password, const char *salt,
+ int saltlen, int iterations, uint8 *result);
+extern void scram_H(const uint8 *str, int len, uint8 *result);
+extern void scram_ClientKey(const uint8 *salted_password, uint8 *result);
+extern void scram_ServerKey(const uint8 *salted_password, uint8 *result);
+
+extern char *scram_build_verifier(const char *salt, int saltlen, int iterations,
+ const char *password);
+
+#endif /* SCRAM_COMMON_H */
diff --git a/src/include/common/sha2.h b/src/include/common/sha2.h
new file mode 100644
index 0000000000..09107cfc3b
--- /dev/null
+++ b/src/include/common/sha2.h
@@ -0,0 +1,115 @@
+/*-------------------------------------------------------------------------
+ *
+ * sha2.h
+ * Generic headers for SHA224, 256, 384 AND 512 functions of PostgreSQL.
+ *
+ * Portions Copyright (c) 2016, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/include/common/sha2.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/* $OpenBSD: sha2.h,v 1.2 2004/04/28 23:11:57 millert Exp $ */
+
+/*
+ * FILE: sha2.h
+ * AUTHOR: Aaron D. Gifford <me@aarongifford.com>
+ *
+ * Copyright (c) 2000-2001, Aaron D. Gifford
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $From: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
+ */
+
+#ifndef _PG_SHA2_H_
+#define _PG_SHA2_H_
+
+#ifdef USE_SSL
+#include <openssl/sha.h>
+#endif
+
+/*** SHA224/256/384/512 Various Length Definitions ***********************/
+#define PG_SHA224_BLOCK_LENGTH 64
+#define PG_SHA224_DIGEST_LENGTH 28
+#define PG_SHA224_DIGEST_STRING_LENGTH (PG_SHA224_DIGEST_LENGTH * 2 + 1)
+#define PG_SHA256_BLOCK_LENGTH 64
+#define PG_SHA256_DIGEST_LENGTH 32
+#define PG_SHA256_DIGEST_STRING_LENGTH (PG_SHA256_DIGEST_LENGTH * 2 + 1)
+#define PG_SHA384_BLOCK_LENGTH 128
+#define PG_SHA384_DIGEST_LENGTH 48
+#define PG_SHA384_DIGEST_STRING_LENGTH (PG_SHA384_DIGEST_LENGTH * 2 + 1)
+#define PG_SHA512_BLOCK_LENGTH 128
+#define PG_SHA512_DIGEST_LENGTH 64
+#define PG_SHA512_DIGEST_STRING_LENGTH (PG_SHA512_DIGEST_LENGTH * 2 + 1)
+
+/* Context Structures for SHA-1/224/256/384/512 */
+#ifdef USE_SSL
+typedef SHA256_CTX pg_sha256_ctx;
+typedef SHA512_CTX pg_sha512_ctx;
+typedef SHA256_CTX pg_sha224_ctx;
+typedef SHA512_CTX pg_sha384_ctx;
+#else
+typedef struct pg_sha256_ctx
+{
+ uint32 state[8];
+ uint64 bitcount;
+ uint8 buffer[PG_SHA256_BLOCK_LENGTH];
+} pg_sha256_ctx;
+typedef struct pg_sha512_ctx
+{
+ uint64 state[8];
+ uint64 bitcount[2];
+ uint8 buffer[PG_SHA512_BLOCK_LENGTH];
+} pg_sha512_ctx;
+typedef struct pg_sha256_ctx pg_sha224_ctx;
+typedef struct pg_sha512_ctx pg_sha384_ctx;
+#endif /* USE_SSL */
+
+/* Interface routines for SHA224/256/384/512 */
+extern void pg_sha224_init(pg_sha224_ctx *ctx);
+extern void pg_sha224_update(pg_sha224_ctx *ctx, const uint8 *input0,
+ size_t len);
+extern void pg_sha224_final(pg_sha224_ctx *ctx, uint8 *dest);
+
+extern void pg_sha256_init(pg_sha256_ctx *ctx);
+extern void pg_sha256_update(pg_sha256_ctx *ctx, const uint8 *input0,
+ size_t len);
+extern void pg_sha256_final(pg_sha256_ctx *ctx, uint8 *dest);
+
+extern void pg_sha384_init(pg_sha384_ctx *ctx);
+extern void pg_sha384_update(pg_sha384_ctx *ctx,
+ const uint8 *, size_t len);
+extern void pg_sha384_final(pg_sha384_ctx *ctx, uint8 *dest);
+
+extern void pg_sha512_init(pg_sha512_ctx *ctx);
+extern void pg_sha512_update(pg_sha512_ctx *ctx, const uint8 *input0,
+ size_t len);
+extern void pg_sha512_final(pg_sha512_ctx *ctx, uint8 *dest);
+
+#endif /* _PG_SHA2_H_ */
diff --git a/src/include/common/string.h b/src/include/common/string.h
index bb54d28fcb..ec9ee9a740 100644
--- a/src/include/common/string.h
+++ b/src/include/common/string.h
@@ -2,7 +2,7 @@
* string.h
* string handling helpers
*
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/common/string.h
diff --git a/src/include/common/unicode_norm.h b/src/include/common/unicode_norm.h
new file mode 100644
index 0000000000..488f964d2c
--- /dev/null
+++ b/src/include/common/unicode_norm.h
@@ -0,0 +1,21 @@
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm.h
+ * Routines for normalizing Unicode strings
+ *
+ * These definitions are used by both frontend and backend code.
+ *
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ *
+ * src/include/common/unicode_norm.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef UNICODE_NORM_H
+#define UNICODE_NORM_H
+
+#include "mb/pg_wchar.h"
+
+extern pg_wchar *unicode_normalize_kc(const pg_wchar *input);
+
+#endif /* UNICODE_NORM_H */
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
new file mode 100644
index 0000000000..3bcf05e5ee
--- /dev/null
+++ b/src/include/common/unicode_norm_table.h
@@ -0,0 +1,8859 @@
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_table.h
+ * Composition table used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_table.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_TABLE_H
+ * here.
+ */
+typedef struct
+{
+ uint32 codepoint; /* Unicode codepoint */
+ uint8 comb_class; /* combining class of character */
+ uint8 dec_size_flags; /* size and flags of decomposition code list */
+ uint16 dec_index; /* index into UnicodeDecomp_codepoints, or the
+ * decomposition itself if DECOMP_INLINE */
+} pg_unicode_decomposition;
+
+#define DECOMP_NO_COMPOSE 0x80 /* don't use for re-composition */
+#define DECOMP_INLINE 0x40 /* decomposition is stored inline in dec_index */
+
+#define DECOMPOSITION_SIZE(x) ((x)->dec_size_flags & 0x3F)
+#define DECOMPOSITION_NO_COMPOSE(x) (((x)->dec_size_flags & DECOMP_NO_COMPOSE) != 0)
+#define DECOMPOSITION_IS_INLINE(x) (((x)->dec_size_flags & DECOMP_INLINE) != 0)
+
+/* Table of Unicode codepoints and their decompositions */
+static const pg_unicode_decomposition UnicodeDecompMain[6532] =
+{
+ {0x00A0, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x00A8, 0, 2 | DECOMP_NO_COMPOSE, 0}, /* compatibility mapping */
+ {0x00AA, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x00AF, 0, 2 | DECOMP_NO_COMPOSE, 2}, /* compatibility mapping */
+ {0x00B2, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x00B3, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x00B4, 0, 2 | DECOMP_NO_COMPOSE, 4}, /* compatibility mapping */
+ {0x00B5, 0, 1 | DECOMP_INLINE, 0x03BC},
+ {0x00B8, 0, 2 | DECOMP_NO_COMPOSE, 6}, /* compatibility mapping */
+ {0x00B9, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x00BA, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x00BC, 0, 3, 8},
+ {0x00BD, 0, 3, 11},
+ {0x00BE, 0, 3, 14},
+ {0x00C0, 0, 2, 17},
+ {0x00C1, 0, 2, 19},
+ {0x00C2, 0, 2, 21},
+ {0x00C3, 0, 2, 23},
+ {0x00C4, 0, 2, 25},
+ {0x00C5, 0, 2, 27},
+ {0x00C7, 0, 2, 29},
+ {0x00C8, 0, 2, 31},
+ {0x00C9, 0, 2, 33},
+ {0x00CA, 0, 2, 35},
+ {0x00CB, 0, 2, 37},
+ {0x00CC, 0, 2, 39},
+ {0x00CD, 0, 2, 41},
+ {0x00CE, 0, 2, 43},
+ {0x00CF, 0, 2, 45},
+ {0x00D1, 0, 2, 47},
+ {0x00D2, 0, 2, 49},
+ {0x00D3, 0, 2, 51},
+ {0x00D4, 0, 2, 53},
+ {0x00D5, 0, 2, 55},
+ {0x00D6, 0, 2, 57},
+ {0x00D9, 0, 2, 59},
+ {0x00DA, 0, 2, 61},
+ {0x00DB, 0, 2, 63},
+ {0x00DC, 0, 2, 65},
+ {0x00DD, 0, 2, 67},
+ {0x00E0, 0, 2, 69},
+ {0x00E1, 0, 2, 71},
+ {0x00E2, 0, 2, 73},
+ {0x00E3, 0, 2, 75},
+ {0x00E4, 0, 2, 77},
+ {0x00E5, 0, 2, 79},
+ {0x00E7, 0, 2, 81},
+ {0x00E8, 0, 2, 83},
+ {0x00E9, 0, 2, 85},
+ {0x00EA, 0, 2, 87},
+ {0x00EB, 0, 2, 89},
+ {0x00EC, 0, 2, 91},
+ {0x00ED, 0, 2, 93},
+ {0x00EE, 0, 2, 95},
+ {0x00EF, 0, 2, 97},
+ {0x00F1, 0, 2, 99},
+ {0x00F2, 0, 2, 101},
+ {0x00F3, 0, 2, 103},
+ {0x00F4, 0, 2, 105},
+ {0x00F5, 0, 2, 107},
+ {0x00F6, 0, 2, 109},
+ {0x00F9, 0, 2, 111},
+ {0x00FA, 0, 2, 113},
+ {0x00FB, 0, 2, 115},
+ {0x00FC, 0, 2, 117},
+ {0x00FD, 0, 2, 119},
+ {0x00FF, 0, 2, 121},
+ {0x0100, 0, 2, 123},
+ {0x0101, 0, 2, 125},
+ {0x0102, 0, 2, 127},
+ {0x0103, 0, 2, 129},
+ {0x0104, 0, 2, 131},
+ {0x0105, 0, 2, 133},
+ {0x0106, 0, 2, 135},
+ {0x0107, 0, 2, 137},
+ {0x0108, 0, 2, 139},
+ {0x0109, 0, 2, 141},
+ {0x010A, 0, 2, 143},
+ {0x010B, 0, 2, 145},
+ {0x010C, 0, 2, 147},
+ {0x010D, 0, 2, 149},
+ {0x010E, 0, 2, 151},
+ {0x010F, 0, 2, 153},
+ {0x0112, 0, 2, 155},
+ {0x0113, 0, 2, 157},
+ {0x0114, 0, 2, 159},
+ {0x0115, 0, 2, 161},
+ {0x0116, 0, 2, 163},
+ {0x0117, 0, 2, 165},
+ {0x0118, 0, 2, 167},
+ {0x0119, 0, 2, 169},
+ {0x011A, 0, 2, 171},
+ {0x011B, 0, 2, 173},
+ {0x011C, 0, 2, 175},
+ {0x011D, 0, 2, 177},
+ {0x011E, 0, 2, 179},
+ {0x011F, 0, 2, 181},
+ {0x0120, 0, 2, 183},
+ {0x0121, 0, 2, 185},
+ {0x0122, 0, 2, 187},
+ {0x0123, 0, 2, 189},
+ {0x0124, 0, 2, 191},
+ {0x0125, 0, 2, 193},
+ {0x0128, 0, 2, 195},
+ {0x0129, 0, 2, 197},
+ {0x012A, 0, 2, 199},
+ {0x012B, 0, 2, 201},
+ {0x012C, 0, 2, 203},
+ {0x012D, 0, 2, 205},
+ {0x012E, 0, 2, 207},
+ {0x012F, 0, 2, 209},
+ {0x0130, 0, 2, 211},
+ {0x0132, 0, 2 | DECOMP_NO_COMPOSE, 213}, /* compatibility mapping */
+ {0x0133, 0, 2 | DECOMP_NO_COMPOSE, 215}, /* compatibility mapping */
+ {0x0134, 0, 2, 217},
+ {0x0135, 0, 2, 219},
+ {0x0136, 0, 2, 221},
+ {0x0137, 0, 2, 223},
+ {0x0139, 0, 2, 225},
+ {0x013A, 0, 2, 227},
+ {0x013B, 0, 2, 229},
+ {0x013C, 0, 2, 231},
+ {0x013D, 0, 2, 233},
+ {0x013E, 0, 2, 235},
+ {0x013F, 0, 2 | DECOMP_NO_COMPOSE, 237}, /* compatibility mapping */
+ {0x0140, 0, 2 | DECOMP_NO_COMPOSE, 239}, /* compatibility mapping */
+ {0x0143, 0, 2, 241},
+ {0x0144, 0, 2, 243},
+ {0x0145, 0, 2, 245},
+ {0x0146, 0, 2, 247},
+ {0x0147, 0, 2, 249},
+ {0x0148, 0, 2, 251},
+ {0x0149, 0, 2 | DECOMP_NO_COMPOSE, 253}, /* compatibility mapping */
+ {0x014C, 0, 2, 255},
+ {0x014D, 0, 2, 257},
+ {0x014E, 0, 2, 259},
+ {0x014F, 0, 2, 261},
+ {0x0150, 0, 2, 263},
+ {0x0151, 0, 2, 265},
+ {0x0154, 0, 2, 267},
+ {0x0155, 0, 2, 269},
+ {0x0156, 0, 2, 271},
+ {0x0157, 0, 2, 273},
+ {0x0158, 0, 2, 275},
+ {0x0159, 0, 2, 277},
+ {0x015A, 0, 2, 279},
+ {0x015B, 0, 2, 281},
+ {0x015C, 0, 2, 283},
+ {0x015D, 0, 2, 285},
+ {0x015E, 0, 2, 287},
+ {0x015F, 0, 2, 289},
+ {0x0160, 0, 2, 291},
+ {0x0161, 0, 2, 293},
+ {0x0162, 0, 2, 295},
+ {0x0163, 0, 2, 297},
+ {0x0164, 0, 2, 299},
+ {0x0165, 0, 2, 301},
+ {0x0168, 0, 2, 303},
+ {0x0169, 0, 2, 305},
+ {0x016A, 0, 2, 307},
+ {0x016B, 0, 2, 309},
+ {0x016C, 0, 2, 311},
+ {0x016D, 0, 2, 313},
+ {0x016E, 0, 2, 315},
+ {0x016F, 0, 2, 317},
+ {0x0170, 0, 2, 319},
+ {0x0171, 0, 2, 321},
+ {0x0172, 0, 2, 323},
+ {0x0173, 0, 2, 325},
+ {0x0174, 0, 2, 327},
+ {0x0175, 0, 2, 329},
+ {0x0176, 0, 2, 331},
+ {0x0177, 0, 2, 333},
+ {0x0178, 0, 2, 335},
+ {0x0179, 0, 2, 337},
+ {0x017A, 0, 2, 339},
+ {0x017B, 0, 2, 341},
+ {0x017C, 0, 2, 343},
+ {0x017D, 0, 2, 345},
+ {0x017E, 0, 2, 347},
+ {0x017F, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x01A0, 0, 2, 349},
+ {0x01A1, 0, 2, 351},
+ {0x01AF, 0, 2, 353},
+ {0x01B0, 0, 2, 355},
+ {0x01C4, 0, 2 | DECOMP_NO_COMPOSE, 357}, /* compatibility mapping */
+ {0x01C5, 0, 2 | DECOMP_NO_COMPOSE, 359}, /* compatibility mapping */
+ {0x01C6, 0, 2 | DECOMP_NO_COMPOSE, 361}, /* compatibility mapping */
+ {0x01C7, 0, 2 | DECOMP_NO_COMPOSE, 363}, /* compatibility mapping */
+ {0x01C8, 0, 2 | DECOMP_NO_COMPOSE, 365}, /* compatibility mapping */
+ {0x01C9, 0, 2 | DECOMP_NO_COMPOSE, 367}, /* compatibility mapping */
+ {0x01CA, 0, 2 | DECOMP_NO_COMPOSE, 369}, /* compatibility mapping */
+ {0x01CB, 0, 2 | DECOMP_NO_COMPOSE, 371}, /* compatibility mapping */
+ {0x01CC, 0, 2 | DECOMP_NO_COMPOSE, 373}, /* compatibility mapping */
+ {0x01CD, 0, 2, 375},
+ {0x01CE, 0, 2, 377},
+ {0x01CF, 0, 2, 379},
+ {0x01D0, 0, 2, 381},
+ {0x01D1, 0, 2, 383},
+ {0x01D2, 0, 2, 385},
+ {0x01D3, 0, 2, 387},
+ {0x01D4, 0, 2, 389},
+ {0x01D5, 0, 2, 391},
+ {0x01D6, 0, 2, 393},
+ {0x01D7, 0, 2, 395},
+ {0x01D8, 0, 2, 397},
+ {0x01D9, 0, 2, 399},
+ {0x01DA, 0, 2, 401},
+ {0x01DB, 0, 2, 403},
+ {0x01DC, 0, 2, 405},
+ {0x01DE, 0, 2, 407},
+ {0x01DF, 0, 2, 409},
+ {0x01E0, 0, 2, 411},
+ {0x01E1, 0, 2, 413},
+ {0x01E2, 0, 2, 415},
+ {0x01E3, 0, 2, 417},
+ {0x01E6, 0, 2, 419},
+ {0x01E7, 0, 2, 421},
+ {0x01E8, 0, 2, 423},
+ {0x01E9, 0, 2, 425},
+ {0x01EA, 0, 2, 427},
+ {0x01EB, 0, 2, 429},
+ {0x01EC, 0, 2, 431},
+ {0x01ED, 0, 2, 433},
+ {0x01EE, 0, 2, 435},
+ {0x01EF, 0, 2, 437},
+ {0x01F0, 0, 2, 439},
+ {0x01F1, 0, 2 | DECOMP_NO_COMPOSE, 441}, /* compatibility mapping */
+ {0x01F2, 0, 2 | DECOMP_NO_COMPOSE, 443}, /* compatibility mapping */
+ {0x01F3, 0, 2 | DECOMP_NO_COMPOSE, 445}, /* compatibility mapping */
+ {0x01F4, 0, 2, 447},
+ {0x01F5, 0, 2, 449},
+ {0x01F8, 0, 2, 451},
+ {0x01F9, 0, 2, 453},
+ {0x01FA, 0, 2, 455},
+ {0x01FB, 0, 2, 457},
+ {0x01FC, 0, 2, 459},
+ {0x01FD, 0, 2, 461},
+ {0x01FE, 0, 2, 463},
+ {0x01FF, 0, 2, 465},
+ {0x0200, 0, 2, 467},
+ {0x0201, 0, 2, 469},
+ {0x0202, 0, 2, 471},
+ {0x0203, 0, 2, 473},
+ {0x0204, 0, 2, 475},
+ {0x0205, 0, 2, 477},
+ {0x0206, 0, 2, 479},
+ {0x0207, 0, 2, 481},
+ {0x0208, 0, 2, 483},
+ {0x0209, 0, 2, 485},
+ {0x020A, 0, 2, 487},
+ {0x020B, 0, 2, 489},
+ {0x020C, 0, 2, 491},
+ {0x020D, 0, 2, 493},
+ {0x020E, 0, 2, 495},
+ {0x020F, 0, 2, 497},
+ {0x0210, 0, 2, 499},
+ {0x0211, 0, 2, 501},
+ {0x0212, 0, 2, 503},
+ {0x0213, 0, 2, 505},
+ {0x0214, 0, 2, 507},
+ {0x0215, 0, 2, 509},
+ {0x0216, 0, 2, 511},
+ {0x0217, 0, 2, 513},
+ {0x0218, 0, 2, 515},
+ {0x0219, 0, 2, 517},
+ {0x021A, 0, 2, 519},
+ {0x021B, 0, 2, 521},
+ {0x021E, 0, 2, 523},
+ {0x021F, 0, 2, 525},
+ {0x0226, 0, 2, 527},
+ {0x0227, 0, 2, 529},
+ {0x0228, 0, 2, 531},
+ {0x0229, 0, 2, 533},
+ {0x022A, 0, 2, 535},
+ {0x022B, 0, 2, 537},
+ {0x022C, 0, 2, 539},
+ {0x022D, 0, 2, 541},
+ {0x022E, 0, 2, 543},
+ {0x022F, 0, 2, 545},
+ {0x0230, 0, 2, 547},
+ {0x0231, 0, 2, 549},
+ {0x0232, 0, 2, 551},
+ {0x0233, 0, 2, 553},
+ {0x02B0, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x02B1, 0, 1 | DECOMP_INLINE, 0x0266},
+ {0x02B2, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x02B3, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x02B4, 0, 1 | DECOMP_INLINE, 0x0279},
+ {0x02B5, 0, 1 | DECOMP_INLINE, 0x027B},
+ {0x02B6, 0, 1 | DECOMP_INLINE, 0x0281},
+ {0x02B7, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x02B8, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x02D8, 0, 2 | DECOMP_NO_COMPOSE, 555}, /* compatibility mapping */
+ {0x02D9, 0, 2 | DECOMP_NO_COMPOSE, 557}, /* compatibility mapping */
+ {0x02DA, 0, 2 | DECOMP_NO_COMPOSE, 559}, /* compatibility mapping */
+ {0x02DB, 0, 2 | DECOMP_NO_COMPOSE, 561}, /* compatibility mapping */
+ {0x02DC, 0, 2 | DECOMP_NO_COMPOSE, 563}, /* compatibility mapping */
+ {0x02DD, 0, 2 | DECOMP_NO_COMPOSE, 565}, /* compatibility mapping */
+ {0x02E0, 0, 1 | DECOMP_INLINE, 0x0263},
+ {0x02E1, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x02E2, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x02E3, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x02E4, 0, 1 | DECOMP_INLINE, 0x0295},
+ {0x0300, 230, 0, 0},
+ {0x0301, 230, 0, 0},
+ {0x0302, 230, 0, 0},
+ {0x0303, 230, 0, 0},
+ {0x0304, 230, 0, 0},
+ {0x0305, 230, 0, 0},
+ {0x0306, 230, 0, 0},
+ {0x0307, 230, 0, 0},
+ {0x0308, 230, 0, 0},
+ {0x0309, 230, 0, 0},
+ {0x030A, 230, 0, 0},
+ {0x030B, 230, 0, 0},
+ {0x030C, 230, 0, 0},
+ {0x030D, 230, 0, 0},
+ {0x030E, 230, 0, 0},
+ {0x030F, 230, 0, 0},
+ {0x0310, 230, 0, 0},
+ {0x0311, 230, 0, 0},
+ {0x0312, 230, 0, 0},
+ {0x0313, 230, 0, 0},
+ {0x0314, 230, 0, 0},
+ {0x0315, 232, 0, 0},
+ {0x0316, 220, 0, 0},
+ {0x0317, 220, 0, 0},
+ {0x0318, 220, 0, 0},
+ {0x0319, 220, 0, 0},
+ {0x031A, 232, 0, 0},
+ {0x031B, 216, 0, 0},
+ {0x031C, 220, 0, 0},
+ {0x031D, 220, 0, 0},
+ {0x031E, 220, 0, 0},
+ {0x031F, 220, 0, 0},
+ {0x0320, 220, 0, 0},
+ {0x0321, 202, 0, 0},
+ {0x0322, 202, 0, 0},
+ {0x0323, 220, 0, 0},
+ {0x0324, 220, 0, 0},
+ {0x0325, 220, 0, 0},
+ {0x0326, 220, 0, 0},
+ {0x0327, 202, 0, 0},
+ {0x0328, 202, 0, 0},
+ {0x0329, 220, 0, 0},
+ {0x032A, 220, 0, 0},
+ {0x032B, 220, 0, 0},
+ {0x032C, 220, 0, 0},
+ {0x032D, 220, 0, 0},
+ {0x032E, 220, 0, 0},
+ {0x032F, 220, 0, 0},
+ {0x0330, 220, 0, 0},
+ {0x0331, 220, 0, 0},
+ {0x0332, 220, 0, 0},
+ {0x0333, 220, 0, 0},
+ {0x0334, 1, 0, 0},
+ {0x0335, 1, 0, 0},
+ {0x0336, 1, 0, 0},
+ {0x0337, 1, 0, 0},
+ {0x0338, 1, 0, 0},
+ {0x0339, 220, 0, 0},
+ {0x033A, 220, 0, 0},
+ {0x033B, 220, 0, 0},
+ {0x033C, 220, 0, 0},
+ {0x033D, 230, 0, 0},
+ {0x033E, 230, 0, 0},
+ {0x033F, 230, 0, 0},
+ {0x0340, 230, 1 | DECOMP_INLINE, 0x0300},
+ {0x0341, 230, 1 | DECOMP_INLINE, 0x0301},
+ {0x0342, 230, 0, 0},
+ {0x0343, 230, 1 | DECOMP_INLINE, 0x0313},
+ {0x0344, 230, 2 | DECOMP_NO_COMPOSE, 567}, /* non-starter decomposition */
+ {0x0345, 240, 0, 0},
+ {0x0346, 230, 0, 0},
+ {0x0347, 220, 0, 0},
+ {0x0348, 220, 0, 0},
+ {0x0349, 220, 0, 0},
+ {0x034A, 230, 0, 0},
+ {0x034B, 230, 0, 0},
+ {0x034C, 230, 0, 0},
+ {0x034D, 220, 0, 0},
+ {0x034E, 220, 0, 0},
+ {0x0350, 230, 0, 0},
+ {0x0351, 230, 0, 0},
+ {0x0352, 230, 0, 0},
+ {0x0353, 220, 0, 0},
+ {0x0354, 220, 0, 0},
+ {0x0355, 220, 0, 0},
+ {0x0356, 220, 0, 0},
+ {0x0357, 230, 0, 0},
+ {0x0358, 232, 0, 0},
+ {0x0359, 220, 0, 0},
+ {0x035A, 220, 0, 0},
+ {0x035B, 230, 0, 0},
+ {0x035C, 233, 0, 0},
+ {0x035D, 234, 0, 0},
+ {0x035E, 234, 0, 0},
+ {0x035F, 233, 0, 0},
+ {0x0360, 234, 0, 0},
+ {0x0361, 234, 0, 0},
+ {0x0362, 233, 0, 0},
+ {0x0363, 230, 0, 0},
+ {0x0364, 230, 0, 0},
+ {0x0365, 230, 0, 0},
+ {0x0366, 230, 0, 0},
+ {0x0367, 230, 0, 0},
+ {0x0368, 230, 0, 0},
+ {0x0369, 230, 0, 0},
+ {0x036A, 230, 0, 0},
+ {0x036B, 230, 0, 0},
+ {0x036C, 230, 0, 0},
+ {0x036D, 230, 0, 0},
+ {0x036E, 230, 0, 0},
+ {0x036F, 230, 0, 0},
+ {0x0374, 0, 1 | DECOMP_INLINE, 0x02B9},
+ {0x037A, 0, 2 | DECOMP_NO_COMPOSE, 569}, /* compatibility mapping */
+ {0x037E, 0, 1 | DECOMP_INLINE, 0x003B},
+ {0x0384, 0, 2 | DECOMP_NO_COMPOSE, 571}, /* compatibility mapping */
+ {0x0385, 0, 2, 573},
+ {0x0386, 0, 2, 575},
+ {0x0387, 0, 1 | DECOMP_INLINE, 0x00B7},
+ {0x0388, 0, 2, 577},
+ {0x0389, 0, 2, 579},
+ {0x038A, 0, 2, 581},
+ {0x038C, 0, 2, 583},
+ {0x038E, 0, 2, 585},
+ {0x038F, 0, 2, 587},
+ {0x0390, 0, 2, 589},
+ {0x03AA, 0, 2, 591},
+ {0x03AB, 0, 2, 593},
+ {0x03AC, 0, 2, 595},
+ {0x03AD, 0, 2, 597},
+ {0x03AE, 0, 2, 599},
+ {0x03AF, 0, 2, 601},
+ {0x03B0, 0, 2, 603},
+ {0x03CA, 0, 2, 605},
+ {0x03CB, 0, 2, 607},
+ {0x03CC, 0, 2, 609},
+ {0x03CD, 0, 2, 611},
+ {0x03CE, 0, 2, 613},
+ {0x03D0, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x03D1, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x03D2, 0, 1 | DECOMP_INLINE, 0x03A5},
+ {0x03D3, 0, 2, 615},
+ {0x03D4, 0, 2, 617},
+ {0x03D5, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x03D6, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x03F0, 0, 1 | DECOMP_INLINE, 0x03BA},
+ {0x03F1, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x03F2, 0, 1 | DECOMP_INLINE, 0x03C2},
+ {0x03F4, 0, 1 | DECOMP_INLINE, 0x0398},
+ {0x03F5, 0, 1 | DECOMP_INLINE, 0x03B5},
+ {0x03F9, 0, 1 | DECOMP_INLINE, 0x03A3},
+ {0x0400, 0, 2, 619},
+ {0x0401, 0, 2, 621},
+ {0x0403, 0, 2, 623},
+ {0x0407, 0, 2, 625},
+ {0x040C, 0, 2, 627},
+ {0x040D, 0, 2, 629},
+ {0x040E, 0, 2, 631},
+ {0x0419, 0, 2, 633},
+ {0x0439, 0, 2, 635},
+ {0x0450, 0, 2, 637},
+ {0x0451, 0, 2, 639},
+ {0x0453, 0, 2, 641},
+ {0x0457, 0, 2, 643},
+ {0x045C, 0, 2, 645},
+ {0x045D, 0, 2, 647},
+ {0x045E, 0, 2, 649},
+ {0x0476, 0, 2, 651},
+ {0x0477, 0, 2, 653},
+ {0x0483, 230, 0, 0},
+ {0x0484, 230, 0, 0},
+ {0x0485, 230, 0, 0},
+ {0x0486, 230, 0, 0},
+ {0x0487, 230, 0, 0},
+ {0x04C1, 0, 2, 655},
+ {0x04C2, 0, 2, 657},
+ {0x04D0, 0, 2, 659},
+ {0x04D1, 0, 2, 661},
+ {0x04D2, 0, 2, 663},
+ {0x04D3, 0, 2, 665},
+ {0x04D6, 0, 2, 667},
+ {0x04D7, 0, 2, 669},
+ {0x04DA, 0, 2, 671},
+ {0x04DB, 0, 2, 673},
+ {0x04DC, 0, 2, 675},
+ {0x04DD, 0, 2, 677},
+ {0x04DE, 0, 2, 679},
+ {0x04DF, 0, 2, 681},
+ {0x04E2, 0, 2, 683},
+ {0x04E3, 0, 2, 685},
+ {0x04E4, 0, 2, 687},
+ {0x04E5, 0, 2, 689},
+ {0x04E6, 0, 2, 691},
+ {0x04E7, 0, 2, 693},
+ {0x04EA, 0, 2, 695},
+ {0x04EB, 0, 2, 697},
+ {0x04EC, 0, 2, 699},
+ {0x04ED, 0, 2, 701},
+ {0x04EE, 0, 2, 703},
+ {0x04EF, 0, 2, 705},
+ {0x04F0, 0, 2, 707},
+ {0x04F1, 0, 2, 709},
+ {0x04F2, 0, 2, 711},
+ {0x04F3, 0, 2, 713},
+ {0x04F4, 0, 2, 715},
+ {0x04F5, 0, 2, 717},
+ {0x04F8, 0, 2, 719},
+ {0x04F9, 0, 2, 721},
+ {0x0587, 0, 2 | DECOMP_NO_COMPOSE, 723}, /* compatibility mapping */
+ {0x0591, 220, 0, 0},
+ {0x0592, 230, 0, 0},
+ {0x0593, 230, 0, 0},
+ {0x0594, 230, 0, 0},
+ {0x0595, 230, 0, 0},
+ {0x0596, 220, 0, 0},
+ {0x0597, 230, 0, 0},
+ {0x0598, 230, 0, 0},
+ {0x0599, 230, 0, 0},
+ {0x059A, 222, 0, 0},
+ {0x059B, 220, 0, 0},
+ {0x059C, 230, 0, 0},
+ {0x059D, 230, 0, 0},
+ {0x059E, 230, 0, 0},
+ {0x059F, 230, 0, 0},
+ {0x05A0, 230, 0, 0},
+ {0x05A1, 230, 0, 0},
+ {0x05A2, 220, 0, 0},
+ {0x05A3, 220, 0, 0},
+ {0x05A4, 220, 0, 0},
+ {0x05A5, 220, 0, 0},
+ {0x05A6, 220, 0, 0},
+ {0x05A7, 220, 0, 0},
+ {0x05A8, 230, 0, 0},
+ {0x05A9, 230, 0, 0},
+ {0x05AA, 220, 0, 0},
+ {0x05AB, 230, 0, 0},
+ {0x05AC, 230, 0, 0},
+ {0x05AD, 222, 0, 0},
+ {0x05AE, 228, 0, 0},
+ {0x05AF, 230, 0, 0},
+ {0x05B0, 10, 0, 0},
+ {0x05B1, 11, 0, 0},
+ {0x05B2, 12, 0, 0},
+ {0x05B3, 13, 0, 0},
+ {0x05B4, 14, 0, 0},
+ {0x05B5, 15, 0, 0},
+ {0x05B6, 16, 0, 0},
+ {0x05B7, 17, 0, 0},
+ {0x05B8, 18, 0, 0},
+ {0x05B9, 19, 0, 0},
+ {0x05BA, 19, 0, 0},
+ {0x05BB, 20, 0, 0},
+ {0x05BC, 21, 0, 0},
+ {0x05BD, 22, 0, 0},
+ {0x05BF, 23, 0, 0},
+ {0x05C1, 24, 0, 0},
+ {0x05C2, 25, 0, 0},
+ {0x05C4, 230, 0, 0},
+ {0x05C5, 220, 0, 0},
+ {0x05C7, 18, 0, 0},
+ {0x0610, 230, 0, 0},
+ {0x0611, 230, 0, 0},
+ {0x0612, 230, 0, 0},
+ {0x0613, 230, 0, 0},
+ {0x0614, 230, 0, 0},
+ {0x0615, 230, 0, 0},
+ {0x0616, 230, 0, 0},
+ {0x0617, 230, 0, 0},
+ {0x0618, 30, 0, 0},
+ {0x0619, 31, 0, 0},
+ {0x061A, 32, 0, 0},
+ {0x0622, 0, 2, 725},
+ {0x0623, 0, 2, 727},
+ {0x0624, 0, 2, 729},
+ {0x0625, 0, 2, 731},
+ {0x0626, 0, 2, 733},
+ {0x064B, 27, 0, 0},
+ {0x064C, 28, 0, 0},
+ {0x064D, 29, 0, 0},
+ {0x064E, 30, 0, 0},
+ {0x064F, 31, 0, 0},
+ {0x0650, 32, 0, 0},
+ {0x0651, 33, 0, 0},
+ {0x0652, 34, 0, 0},
+ {0x0653, 230, 0, 0},
+ {0x0654, 230, 0, 0},
+ {0x0655, 220, 0, 0},
+ {0x0656, 220, 0, 0},
+ {0x0657, 230, 0, 0},
+ {0x0658, 230, 0, 0},
+ {0x0659, 230, 0, 0},
+ {0x065A, 230, 0, 0},
+ {0x065B, 230, 0, 0},
+ {0x065C, 220, 0, 0},
+ {0x065D, 230, 0, 0},
+ {0x065E, 230, 0, 0},
+ {0x065F, 220, 0, 0},
+ {0x0670, 35, 0, 0},
+ {0x0675, 0, 2 | DECOMP_NO_COMPOSE, 735}, /* compatibility mapping */
+ {0x0676, 0, 2 | DECOMP_NO_COMPOSE, 737}, /* compatibility mapping */
+ {0x0677, 0, 2 | DECOMP_NO_COMPOSE, 739}, /* compatibility mapping */
+ {0x0678, 0, 2 | DECOMP_NO_COMPOSE, 741}, /* compatibility mapping */
+ {0x06C0, 0, 2, 743},
+ {0x06C2, 0, 2, 745},
+ {0x06D3, 0, 2, 747},
+ {0x06D6, 230, 0, 0},
+ {0x06D7, 230, 0, 0},
+ {0x06D8, 230, 0, 0},
+ {0x06D9, 230, 0, 0},
+ {0x06DA, 230, 0, 0},
+ {0x06DB, 230, 0, 0},
+ {0x06DC, 230, 0, 0},
+ {0x06DF, 230, 0, 0},
+ {0x06E0, 230, 0, 0},
+ {0x06E1, 230, 0, 0},
+ {0x06E2, 230, 0, 0},
+ {0x06E3, 220, 0, 0},
+ {0x06E4, 230, 0, 0},
+ {0x06E7, 230, 0, 0},
+ {0x06E8, 230, 0, 0},
+ {0x06EA, 220, 0, 0},
+ {0x06EB, 230, 0, 0},
+ {0x06EC, 230, 0, 0},
+ {0x06ED, 220, 0, 0},
+ {0x0711, 36, 0, 0},
+ {0x0730, 230, 0, 0},
+ {0x0731, 220, 0, 0},
+ {0x0732, 230, 0, 0},
+ {0x0733, 230, 0, 0},
+ {0x0734, 220, 0, 0},
+ {0x0735, 230, 0, 0},
+ {0x0736, 230, 0, 0},
+ {0x0737, 220, 0, 0},
+ {0x0738, 220, 0, 0},
+ {0x0739, 220, 0, 0},
+ {0x073A, 230, 0, 0},
+ {0x073B, 220, 0, 0},
+ {0x073C, 220, 0, 0},
+ {0x073D, 230, 0, 0},
+ {0x073E, 220, 0, 0},
+ {0x073F, 230, 0, 0},
+ {0x0740, 230, 0, 0},
+ {0x0741, 230, 0, 0},
+ {0x0742, 220, 0, 0},
+ {0x0743, 230, 0, 0},
+ {0x0744, 220, 0, 0},
+ {0x0745, 230, 0, 0},
+ {0x0746, 220, 0, 0},
+ {0x0747, 230, 0, 0},
+ {0x0748, 220, 0, 0},
+ {0x0749, 230, 0, 0},
+ {0x074A, 230, 0, 0},
+ {0x07EB, 230, 0, 0},
+ {0x07EC, 230, 0, 0},
+ {0x07ED, 230, 0, 0},
+ {0x07EE, 230, 0, 0},
+ {0x07EF, 230, 0, 0},
+ {0x07F0, 230, 0, 0},
+ {0x07F1, 230, 0, 0},
+ {0x07F2, 220, 0, 0},
+ {0x07F3, 230, 0, 0},
+ {0x0816, 230, 0, 0},
+ {0x0817, 230, 0, 0},
+ {0x0818, 230, 0, 0},
+ {0x0819, 230, 0, 0},
+ {0x081B, 230, 0, 0},
+ {0x081C, 230, 0, 0},
+ {0x081D, 230, 0, 0},
+ {0x081E, 230, 0, 0},
+ {0x081F, 230, 0, 0},
+ {0x0820, 230, 0, 0},
+ {0x0821, 230, 0, 0},
+ {0x0822, 230, 0, 0},
+ {0x0823, 230, 0, 0},
+ {0x0825, 230, 0, 0},
+ {0x0826, 230, 0, 0},
+ {0x0827, 230, 0, 0},
+ {0x0829, 230, 0, 0},
+ {0x082A, 230, 0, 0},
+ {0x082B, 230, 0, 0},
+ {0x082C, 230, 0, 0},
+ {0x082D, 230, 0, 0},
+ {0x0859, 220, 0, 0},
+ {0x085A, 220, 0, 0},
+ {0x085B, 220, 0, 0},
+ {0x08D4, 230, 0, 0},
+ {0x08D5, 230, 0, 0},
+ {0x08D6, 230, 0, 0},
+ {0x08D7, 230, 0, 0},
+ {0x08D8, 230, 0, 0},
+ {0x08D9, 230, 0, 0},
+ {0x08DA, 230, 0, 0},
+ {0x08DB, 230, 0, 0},
+ {0x08DC, 230, 0, 0},
+ {0x08DD, 230, 0, 0},
+ {0x08DE, 230, 0, 0},
+ {0x08DF, 230, 0, 0},
+ {0x08E0, 230, 0, 0},
+ {0x08E1, 230, 0, 0},
+ {0x08E3, 220, 0, 0},
+ {0x08E4, 230, 0, 0},
+ {0x08E5, 230, 0, 0},
+ {0x08E6, 220, 0, 0},
+ {0x08E7, 230, 0, 0},
+ {0x08E8, 230, 0, 0},
+ {0x08E9, 220, 0, 0},
+ {0x08EA, 230, 0, 0},
+ {0x08EB, 230, 0, 0},
+ {0x08EC, 230, 0, 0},
+ {0x08ED, 220, 0, 0},
+ {0x08EE, 220, 0, 0},
+ {0x08EF, 220, 0, 0},
+ {0x08F0, 27, 0, 0},
+ {0x08F1, 28, 0, 0},
+ {0x08F2, 29, 0, 0},
+ {0x08F3, 230, 0, 0},
+ {0x08F4, 230, 0, 0},
+ {0x08F5, 230, 0, 0},
+ {0x08F6, 220, 0, 0},
+ {0x08F7, 230, 0, 0},
+ {0x08F8, 230, 0, 0},
+ {0x08F9, 220, 0, 0},
+ {0x08FA, 220, 0, 0},
+ {0x08FB, 230, 0, 0},
+ {0x08FC, 230, 0, 0},
+ {0x08FD, 230, 0, 0},
+ {0x08FE, 230, 0, 0},
+ {0x08FF, 230, 0, 0},
+ {0x0929, 0, 2, 749},
+ {0x0931, 0, 2, 751},
+ {0x0934, 0, 2, 753},
+ {0x093C, 7, 0, 0},
+ {0x094D, 9, 0, 0},
+ {0x0951, 230, 0, 0},
+ {0x0952, 220, 0, 0},
+ {0x0953, 230, 0, 0},
+ {0x0954, 230, 0, 0},
+ {0x0958, 0, 2 | DECOMP_NO_COMPOSE, 755}, /* in exclusion list */
+ {0x0959, 0, 2 | DECOMP_NO_COMPOSE, 757}, /* in exclusion list */
+ {0x095A, 0, 2 | DECOMP_NO_COMPOSE, 759}, /* in exclusion list */
+ {0x095B, 0, 2 | DECOMP_NO_COMPOSE, 761}, /* in exclusion list */
+ {0x095C, 0, 2 | DECOMP_NO_COMPOSE, 763}, /* in exclusion list */
+ {0x095D, 0, 2 | DECOMP_NO_COMPOSE, 765}, /* in exclusion list */
+ {0x095E, 0, 2 | DECOMP_NO_COMPOSE, 767}, /* in exclusion list */
+ {0x095F, 0, 2 | DECOMP_NO_COMPOSE, 769}, /* in exclusion list */
+ {0x09BC, 7, 0, 0},
+ {0x09CB, 0, 2, 771},
+ {0x09CC, 0, 2, 773},
+ {0x09CD, 9, 0, 0},
+ {0x09DC, 0, 2 | DECOMP_NO_COMPOSE, 775}, /* in exclusion list */
+ {0x09DD, 0, 2 | DECOMP_NO_COMPOSE, 777}, /* in exclusion list */
+ {0x09DF, 0, 2 | DECOMP_NO_COMPOSE, 779}, /* in exclusion list */
+ {0x0A33, 0, 2 | DECOMP_NO_COMPOSE, 781}, /* in exclusion list */
+ {0x0A36, 0, 2 | DECOMP_NO_COMPOSE, 783}, /* in exclusion list */
+ {0x0A3C, 7, 0, 0},
+ {0x0A4D, 9, 0, 0},
+ {0x0A59, 0, 2 | DECOMP_NO_COMPOSE, 785}, /* in exclusion list */
+ {0x0A5A, 0, 2 | DECOMP_NO_COMPOSE, 787}, /* in exclusion list */
+ {0x0A5B, 0, 2 | DECOMP_NO_COMPOSE, 789}, /* in exclusion list */
+ {0x0A5E, 0, 2 | DECOMP_NO_COMPOSE, 791}, /* in exclusion list */
+ {0x0ABC, 7, 0, 0},
+ {0x0ACD, 9, 0, 0},
+ {0x0B3C, 7, 0, 0},
+ {0x0B48, 0, 2, 793},
+ {0x0B4B, 0, 2, 795},
+ {0x0B4C, 0, 2, 797},
+ {0x0B4D, 9, 0, 0},
+ {0x0B5C, 0, 2 | DECOMP_NO_COMPOSE, 799}, /* in exclusion list */
+ {0x0B5D, 0, 2 | DECOMP_NO_COMPOSE, 801}, /* in exclusion list */
+ {0x0B94, 0, 2, 803},
+ {0x0BCA, 0, 2, 805},
+ {0x0BCB, 0, 2, 807},
+ {0x0BCC, 0, 2, 809},
+ {0x0BCD, 9, 0, 0},
+ {0x0C48, 0, 2, 811},
+ {0x0C4D, 9, 0, 0},
+ {0x0C55, 84, 0, 0},
+ {0x0C56, 91, 0, 0},
+ {0x0CBC, 7, 0, 0},
+ {0x0CC0, 0, 2, 813},
+ {0x0CC7, 0, 2, 815},
+ {0x0CC8, 0, 2, 817},
+ {0x0CCA, 0, 2, 819},
+ {0x0CCB, 0, 2, 821},
+ {0x0CCD, 9, 0, 0},
+ {0x0D4A, 0, 2, 823},
+ {0x0D4B, 0, 2, 825},
+ {0x0D4C, 0, 2, 827},
+ {0x0D4D, 9, 0, 0},
+ {0x0DCA, 9, 0, 0},
+ {0x0DDA, 0, 2, 829},
+ {0x0DDC, 0, 2, 831},
+ {0x0DDD, 0, 2, 833},
+ {0x0DDE, 0, 2, 835},
+ {0x0E33, 0, 2 | DECOMP_NO_COMPOSE, 837}, /* compatibility mapping */
+ {0x0E38, 103, 0, 0},
+ {0x0E39, 103, 0, 0},
+ {0x0E3A, 9, 0, 0},
+ {0x0E48, 107, 0, 0},
+ {0x0E49, 107, 0, 0},
+ {0x0E4A, 107, 0, 0},
+ {0x0E4B, 107, 0, 0},
+ {0x0EB3, 0, 2 | DECOMP_NO_COMPOSE, 839}, /* compatibility mapping */
+ {0x0EB8, 118, 0, 0},
+ {0x0EB9, 118, 0, 0},
+ {0x0EC8, 122, 0, 0},
+ {0x0EC9, 122, 0, 0},
+ {0x0ECA, 122, 0, 0},
+ {0x0ECB, 122, 0, 0},
+ {0x0EDC, 0, 2 | DECOMP_NO_COMPOSE, 841}, /* compatibility mapping */
+ {0x0EDD, 0, 2 | DECOMP_NO_COMPOSE, 843}, /* compatibility mapping */
+ {0x0F0C, 0, 1 | DECOMP_INLINE, 0x0F0B},
+ {0x0F18, 220, 0, 0},
+ {0x0F19, 220, 0, 0},
+ {0x0F35, 220, 0, 0},
+ {0x0F37, 220, 0, 0},
+ {0x0F39, 216, 0, 0},
+ {0x0F43, 0, 2 | DECOMP_NO_COMPOSE, 845}, /* in exclusion list */
+ {0x0F4D, 0, 2 | DECOMP_NO_COMPOSE, 847}, /* in exclusion list */
+ {0x0F52, 0, 2 | DECOMP_NO_COMPOSE, 849}, /* in exclusion list */
+ {0x0F57, 0, 2 | DECOMP_NO_COMPOSE, 851}, /* in exclusion list */
+ {0x0F5C, 0, 2 | DECOMP_NO_COMPOSE, 853}, /* in exclusion list */
+ {0x0F69, 0, 2 | DECOMP_NO_COMPOSE, 855}, /* in exclusion list */
+ {0x0F71, 129, 0, 0},
+ {0x0F72, 130, 0, 0},
+ {0x0F73, 0, 2 | DECOMP_NO_COMPOSE, 857}, /* non-starter decomposition */
+ {0x0F74, 132, 0, 0},
+ {0x0F75, 0, 2 | DECOMP_NO_COMPOSE, 859}, /* non-starter decomposition */
+ {0x0F76, 0, 2 | DECOMP_NO_COMPOSE, 861}, /* in exclusion list */
+ {0x0F77, 0, 2 | DECOMP_NO_COMPOSE, 863}, /* compatibility mapping */
+ {0x0F78, 0, 2 | DECOMP_NO_COMPOSE, 865}, /* in exclusion list */
+ {0x0F79, 0, 2 | DECOMP_NO_COMPOSE, 867}, /* compatibility mapping */
+ {0x0F7A, 130, 0, 0},
+ {0x0F7B, 130, 0, 0},
+ {0x0F7C, 130, 0, 0},
+ {0x0F7D, 130, 0, 0},
+ {0x0F80, 130, 0, 0},
+ {0x0F81, 0, 2 | DECOMP_NO_COMPOSE, 869}, /* non-starter decomposition */
+ {0x0F82, 230, 0, 0},
+ {0x0F83, 230, 0, 0},
+ {0x0F84, 9, 0, 0},
+ {0x0F86, 230, 0, 0},
+ {0x0F87, 230, 0, 0},
+ {0x0F93, 0, 2 | DECOMP_NO_COMPOSE, 871}, /* in exclusion list */
+ {0x0F9D, 0, 2 | DECOMP_NO_COMPOSE, 873}, /* in exclusion list */
+ {0x0FA2, 0, 2 | DECOMP_NO_COMPOSE, 875}, /* in exclusion list */
+ {0x0FA7, 0, 2 | DECOMP_NO_COMPOSE, 877}, /* in exclusion list */
+ {0x0FAC, 0, 2 | DECOMP_NO_COMPOSE, 879}, /* in exclusion list */
+ {0x0FB9, 0, 2 | DECOMP_NO_COMPOSE, 881}, /* in exclusion list */
+ {0x0FC6, 220, 0, 0},
+ {0x1026, 0, 2, 883},
+ {0x1037, 7, 0, 0},
+ {0x1039, 9, 0, 0},
+ {0x103A, 9, 0, 0},
+ {0x108D, 220, 0, 0},
+ {0x10FC, 0, 1 | DECOMP_INLINE, 0x10DC},
+ {0x135D, 230, 0, 0},
+ {0x135E, 230, 0, 0},
+ {0x135F, 230, 0, 0},
+ {0x1714, 9, 0, 0},
+ {0x1734, 9, 0, 0},
+ {0x17D2, 9, 0, 0},
+ {0x17DD, 230, 0, 0},
+ {0x18A9, 228, 0, 0},
+ {0x1939, 222, 0, 0},
+ {0x193A, 230, 0, 0},
+ {0x193B, 220, 0, 0},
+ {0x1A17, 230, 0, 0},
+ {0x1A18, 220, 0, 0},
+ {0x1A60, 9, 0, 0},
+ {0x1A75, 230, 0, 0},
+ {0x1A76, 230, 0, 0},
+ {0x1A77, 230, 0, 0},
+ {0x1A78, 230, 0, 0},
+ {0x1A79, 230, 0, 0},
+ {0x1A7A, 230, 0, 0},
+ {0x1A7B, 230, 0, 0},
+ {0x1A7C, 230, 0, 0},
+ {0x1A7F, 220, 0, 0},
+ {0x1AB0, 230, 0, 0},
+ {0x1AB1, 230, 0, 0},
+ {0x1AB2, 230, 0, 0},
+ {0x1AB3, 230, 0, 0},
+ {0x1AB4, 230, 0, 0},
+ {0x1AB5, 220, 0, 0},
+ {0x1AB6, 220, 0, 0},
+ {0x1AB7, 220, 0, 0},
+ {0x1AB8, 220, 0, 0},
+ {0x1AB9, 220, 0, 0},
+ {0x1ABA, 220, 0, 0},
+ {0x1ABB, 230, 0, 0},
+ {0x1ABC, 230, 0, 0},
+ {0x1ABD, 220, 0, 0},
+ {0x1B06, 0, 2, 885},
+ {0x1B08, 0, 2, 887},
+ {0x1B0A, 0, 2, 889},
+ {0x1B0C, 0, 2, 891},
+ {0x1B0E, 0, 2, 893},
+ {0x1B12, 0, 2, 895},
+ {0x1B34, 7, 0, 0},
+ {0x1B3B, 0, 2, 897},
+ {0x1B3D, 0, 2, 899},
+ {0x1B40, 0, 2, 901},
+ {0x1B41, 0, 2, 903},
+ {0x1B43, 0, 2, 905},
+ {0x1B44, 9, 0, 0},
+ {0x1B6B, 230, 0, 0},
+ {0x1B6C, 220, 0, 0},
+ {0x1B6D, 230, 0, 0},
+ {0x1B6E, 230, 0, 0},
+ {0x1B6F, 230, 0, 0},
+ {0x1B70, 230, 0, 0},
+ {0x1B71, 230, 0, 0},
+ {0x1B72, 230, 0, 0},
+ {0x1B73, 230, 0, 0},
+ {0x1BAA, 9, 0, 0},
+ {0x1BAB, 9, 0, 0},
+ {0x1BE6, 7, 0, 0},
+ {0x1BF2, 9, 0, 0},
+ {0x1BF3, 9, 0, 0},
+ {0x1C37, 7, 0, 0},
+ {0x1CD0, 230, 0, 0},
+ {0x1CD1, 230, 0, 0},
+ {0x1CD2, 230, 0, 0},
+ {0x1CD4, 1, 0, 0},
+ {0x1CD5, 220, 0, 0},
+ {0x1CD6, 220, 0, 0},
+ {0x1CD7, 220, 0, 0},
+ {0x1CD8, 220, 0, 0},
+ {0x1CD9, 220, 0, 0},
+ {0x1CDA, 230, 0, 0},
+ {0x1CDB, 230, 0, 0},
+ {0x1CDC, 220, 0, 0},
+ {0x1CDD, 220, 0, 0},
+ {0x1CDE, 220, 0, 0},
+ {0x1CDF, 220, 0, 0},
+ {0x1CE0, 230, 0, 0},
+ {0x1CE2, 1, 0, 0},
+ {0x1CE3, 1, 0, 0},
+ {0x1CE4, 1, 0, 0},
+ {0x1CE5, 1, 0, 0},
+ {0x1CE6, 1, 0, 0},
+ {0x1CE7, 1, 0, 0},
+ {0x1CE8, 1, 0, 0},
+ {0x1CED, 220, 0, 0},
+ {0x1CF4, 230, 0, 0},
+ {0x1CF8, 230, 0, 0},
+ {0x1CF9, 230, 0, 0},
+ {0x1D2C, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D2D, 0, 1 | DECOMP_INLINE, 0x00C6},
+ {0x1D2E, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D30, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D31, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D32, 0, 1 | DECOMP_INLINE, 0x018E},
+ {0x1D33, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D34, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D35, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D36, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D37, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D38, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D39, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D3A, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D3C, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D3D, 0, 1 | DECOMP_INLINE, 0x0222},
+ {0x1D3E, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D3F, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D40, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D41, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D42, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D43, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D44, 0, 1 | DECOMP_INLINE, 0x0250},
+ {0x1D45, 0, 1 | DECOMP_INLINE, 0x0251},
+ {0x1D46, 0, 1 | DECOMP_INLINE, 0x1D02},
+ {0x1D47, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D48, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D49, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D4A, 0, 1 | DECOMP_INLINE, 0x0259},
+ {0x1D4B, 0, 1 | DECOMP_INLINE, 0x025B},
+ {0x1D4C, 0, 1 | DECOMP_INLINE, 0x025C},
+ {0x1D4D, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D4F, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D50, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D51, 0, 1 | DECOMP_INLINE, 0x014B},
+ {0x1D52, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D53, 0, 1 | DECOMP_INLINE, 0x0254},
+ {0x1D54, 0, 1 | DECOMP_INLINE, 0x1D16},
+ {0x1D55, 0, 1 | DECOMP_INLINE, 0x1D17},
+ {0x1D56, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D57, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D58, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D59, 0, 1 | DECOMP_INLINE, 0x1D1D},
+ {0x1D5A, 0, 1 | DECOMP_INLINE, 0x026F},
+ {0x1D5B, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D5C, 0, 1 | DECOMP_INLINE, 0x1D25},
+ {0x1D5D, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D5E, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D5F, 0, 1 | DECOMP_INLINE, 0x03B4},
+ {0x1D60, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D61, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D62, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D63, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D64, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D65, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D66, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D67, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D68, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x1D69, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D6A, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D78, 0, 1 | DECOMP_INLINE, 0x043D},
+ {0x1D9B, 0, 1 | DECOMP_INLINE, 0x0252},
+ {0x1D9C, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D9D, 0, 1 | DECOMP_INLINE, 0x0255},
+ {0x1D9E, 0, 1 | DECOMP_INLINE, 0x00F0},
+ {0x1D9F, 0, 1 | DECOMP_INLINE, 0x025C},
+ {0x1DA0, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1DA1, 0, 1 | DECOMP_INLINE, 0x025F},
+ {0x1DA2, 0, 1 | DECOMP_INLINE, 0x0261},
+ {0x1DA3, 0, 1 | DECOMP_INLINE, 0x0265},
+ {0x1DA4, 0, 1 | DECOMP_INLINE, 0x0268},
+ {0x1DA5, 0, 1 | DECOMP_INLINE, 0x0269},
+ {0x1DA6, 0, 1 | DECOMP_INLINE, 0x026A},
+ {0x1DA7, 0, 1 | DECOMP_INLINE, 0x1D7B},
+ {0x1DA8, 0, 1 | DECOMP_INLINE, 0x029D},
+ {0x1DA9, 0, 1 | DECOMP_INLINE, 0x026D},
+ {0x1DAA, 0, 1 | DECOMP_INLINE, 0x1D85},
+ {0x1DAB, 0, 1 | DECOMP_INLINE, 0x029F},
+ {0x1DAC, 0, 1 | DECOMP_INLINE, 0x0271},
+ {0x1DAD, 0, 1 | DECOMP_INLINE, 0x0270},
+ {0x1DAE, 0, 1 | DECOMP_INLINE, 0x0272},
+ {0x1DAF, 0, 1 | DECOMP_INLINE, 0x0273},
+ {0x1DB0, 0, 1 | DECOMP_INLINE, 0x0274},
+ {0x1DB1, 0, 1 | DECOMP_INLINE, 0x0275},
+ {0x1DB2, 0, 1 | DECOMP_INLINE, 0x0278},
+ {0x1DB3, 0, 1 | DECOMP_INLINE, 0x0282},
+ {0x1DB4, 0, 1 | DECOMP_INLINE, 0x0283},
+ {0x1DB5, 0, 1 | DECOMP_INLINE, 0x01AB},
+ {0x1DB6, 0, 1 | DECOMP_INLINE, 0x0289},
+ {0x1DB7, 0, 1 | DECOMP_INLINE, 0x028A},
+ {0x1DB8, 0, 1 | DECOMP_INLINE, 0x1D1C},
+ {0x1DB9, 0, 1 | DECOMP_INLINE, 0x028B},
+ {0x1DBA, 0, 1 | DECOMP_INLINE, 0x028C},
+ {0x1DBB, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1DBC, 0, 1 | DECOMP_INLINE, 0x0290},
+ {0x1DBD, 0, 1 | DECOMP_INLINE, 0x0291},
+ {0x1DBE, 0, 1 | DECOMP_INLINE, 0x0292},
+ {0x1DBF, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x1DC0, 230, 0, 0},
+ {0x1DC1, 230, 0, 0},
+ {0x1DC2, 220, 0, 0},
+ {0x1DC3, 230, 0, 0},
+ {0x1DC4, 230, 0, 0},
+ {0x1DC5, 230, 0, 0},
+ {0x1DC6, 230, 0, 0},
+ {0x1DC7, 230, 0, 0},
+ {0x1DC8, 230, 0, 0},
+ {0x1DC9, 230, 0, 0},
+ {0x1DCA, 220, 0, 0},
+ {0x1DCB, 230, 0, 0},
+ {0x1DCC, 230, 0, 0},
+ {0x1DCD, 234, 0, 0},
+ {0x1DCE, 214, 0, 0},
+ {0x1DCF, 220, 0, 0},
+ {0x1DD0, 202, 0, 0},
+ {0x1DD1, 230, 0, 0},
+ {0x1DD2, 230, 0, 0},
+ {0x1DD3, 230, 0, 0},
+ {0x1DD4, 230, 0, 0},
+ {0x1DD5, 230, 0, 0},
+ {0x1DD6, 230, 0, 0},
+ {0x1DD7, 230, 0, 0},
+ {0x1DD8, 230, 0, 0},
+ {0x1DD9, 230, 0, 0},
+ {0x1DDA, 230, 0, 0},
+ {0x1DDB, 230, 0, 0},
+ {0x1DDC, 230, 0, 0},
+ {0x1DDD, 230, 0, 0},
+ {0x1DDE, 230, 0, 0},
+ {0x1DDF, 230, 0, 0},
+ {0x1DE0, 230, 0, 0},
+ {0x1DE1, 230, 0, 0},
+ {0x1DE2, 230, 0, 0},
+ {0x1DE3, 230, 0, 0},
+ {0x1DE4, 230, 0, 0},
+ {0x1DE5, 230, 0, 0},
+ {0x1DE6, 230, 0, 0},
+ {0x1DE7, 230, 0, 0},
+ {0x1DE8, 230, 0, 0},
+ {0x1DE9, 230, 0, 0},
+ {0x1DEA, 230, 0, 0},
+ {0x1DEB, 230, 0, 0},
+ {0x1DEC, 230, 0, 0},
+ {0x1DED, 230, 0, 0},
+ {0x1DEE, 230, 0, 0},
+ {0x1DEF, 230, 0, 0},
+ {0x1DF0, 230, 0, 0},
+ {0x1DF1, 230, 0, 0},
+ {0x1DF2, 230, 0, 0},
+ {0x1DF3, 230, 0, 0},
+ {0x1DF4, 230, 0, 0},
+ {0x1DF5, 230, 0, 0},
+ {0x1DFB, 230, 0, 0},
+ {0x1DFC, 233, 0, 0},
+ {0x1DFD, 220, 0, 0},
+ {0x1DFE, 230, 0, 0},
+ {0x1DFF, 220, 0, 0},
+ {0x1E00, 0, 2, 907},
+ {0x1E01, 0, 2, 909},
+ {0x1E02, 0, 2, 911},
+ {0x1E03, 0, 2, 913},
+ {0x1E04, 0, 2, 915},
+ {0x1E05, 0, 2, 917},
+ {0x1E06, 0, 2, 919},
+ {0x1E07, 0, 2, 921},
+ {0x1E08, 0, 2, 923},
+ {0x1E09, 0, 2, 925},
+ {0x1E0A, 0, 2, 927},
+ {0x1E0B, 0, 2, 929},
+ {0x1E0C, 0, 2, 931},
+ {0x1E0D, 0, 2, 933},
+ {0x1E0E, 0, 2, 935},
+ {0x1E0F, 0, 2, 937},
+ {0x1E10, 0, 2, 939},
+ {0x1E11, 0, 2, 941},
+ {0x1E12, 0, 2, 943},
+ {0x1E13, 0, 2, 945},
+ {0x1E14, 0, 2, 947},
+ {0x1E15, 0, 2, 949},
+ {0x1E16, 0, 2, 951},
+ {0x1E17, 0, 2, 953},
+ {0x1E18, 0, 2, 955},
+ {0x1E19, 0, 2, 957},
+ {0x1E1A, 0, 2, 959},
+ {0x1E1B, 0, 2, 961},
+ {0x1E1C, 0, 2, 963},
+ {0x1E1D, 0, 2, 965},
+ {0x1E1E, 0, 2, 967},
+ {0x1E1F, 0, 2, 969},
+ {0x1E20, 0, 2, 971},
+ {0x1E21, 0, 2, 973},
+ {0x1E22, 0, 2, 975},
+ {0x1E23, 0, 2, 977},
+ {0x1E24, 0, 2, 979},
+ {0x1E25, 0, 2, 981},
+ {0x1E26, 0, 2, 983},
+ {0x1E27, 0, 2, 985},
+ {0x1E28, 0, 2, 987},
+ {0x1E29, 0, 2, 989},
+ {0x1E2A, 0, 2, 991},
+ {0x1E2B, 0, 2, 993},
+ {0x1E2C, 0, 2, 995},
+ {0x1E2D, 0, 2, 997},
+ {0x1E2E, 0, 2, 999},
+ {0x1E2F, 0, 2, 1001},
+ {0x1E30, 0, 2, 1003},
+ {0x1E31, 0, 2, 1005},
+ {0x1E32, 0, 2, 1007},
+ {0x1E33, 0, 2, 1009},
+ {0x1E34, 0, 2, 1011},
+ {0x1E35, 0, 2, 1013},
+ {0x1E36, 0, 2, 1015},
+ {0x1E37, 0, 2, 1017},
+ {0x1E38, 0, 2, 1019},
+ {0x1E39, 0, 2, 1021},
+ {0x1E3A, 0, 2, 1023},
+ {0x1E3B, 0, 2, 1025},
+ {0x1E3C, 0, 2, 1027},
+ {0x1E3D, 0, 2, 1029},
+ {0x1E3E, 0, 2, 1031},
+ {0x1E3F, 0, 2, 1033},
+ {0x1E40, 0, 2, 1035},
+ {0x1E41, 0, 2, 1037},
+ {0x1E42, 0, 2, 1039},
+ {0x1E43, 0, 2, 1041},
+ {0x1E44, 0, 2, 1043},
+ {0x1E45, 0, 2, 1045},
+ {0x1E46, 0, 2, 1047},
+ {0x1E47, 0, 2, 1049},
+ {0x1E48, 0, 2, 1051},
+ {0x1E49, 0, 2, 1053},
+ {0x1E4A, 0, 2, 1055},
+ {0x1E4B, 0, 2, 1057},
+ {0x1E4C, 0, 2, 1059},
+ {0x1E4D, 0, 2, 1061},
+ {0x1E4E, 0, 2, 1063},
+ {0x1E4F, 0, 2, 1065},
+ {0x1E50, 0, 2, 1067},
+ {0x1E51, 0, 2, 1069},
+ {0x1E52, 0, 2, 1071},
+ {0x1E53, 0, 2, 1073},
+ {0x1E54, 0, 2, 1075},
+ {0x1E55, 0, 2, 1077},
+ {0x1E56, 0, 2, 1079},
+ {0x1E57, 0, 2, 1081},
+ {0x1E58, 0, 2, 1083},
+ {0x1E59, 0, 2, 1085},
+ {0x1E5A, 0, 2, 1087},
+ {0x1E5B, 0, 2, 1089},
+ {0x1E5C, 0, 2, 1091},
+ {0x1E5D, 0, 2, 1093},
+ {0x1E5E, 0, 2, 1095},
+ {0x1E5F, 0, 2, 1097},
+ {0x1E60, 0, 2, 1099},
+ {0x1E61, 0, 2, 1101},
+ {0x1E62, 0, 2, 1103},
+ {0x1E63, 0, 2, 1105},
+ {0x1E64, 0, 2, 1107},
+ {0x1E65, 0, 2, 1109},
+ {0x1E66, 0, 2, 1111},
+ {0x1E67, 0, 2, 1113},
+ {0x1E68, 0, 2, 1115},
+ {0x1E69, 0, 2, 1117},
+ {0x1E6A, 0, 2, 1119},
+ {0x1E6B, 0, 2, 1121},
+ {0x1E6C, 0, 2, 1123},
+ {0x1E6D, 0, 2, 1125},
+ {0x1E6E, 0, 2, 1127},
+ {0x1E6F, 0, 2, 1129},
+ {0x1E70, 0, 2, 1131},
+ {0x1E71, 0, 2, 1133},
+ {0x1E72, 0, 2, 1135},
+ {0x1E73, 0, 2, 1137},
+ {0x1E74, 0, 2, 1139},
+ {0x1E75, 0, 2, 1141},
+ {0x1E76, 0, 2, 1143},
+ {0x1E77, 0, 2, 1145},
+ {0x1E78, 0, 2, 1147},
+ {0x1E79, 0, 2, 1149},
+ {0x1E7A, 0, 2, 1151},
+ {0x1E7B, 0, 2, 1153},
+ {0x1E7C, 0, 2, 1155},
+ {0x1E7D, 0, 2, 1157},
+ {0x1E7E, 0, 2, 1159},
+ {0x1E7F, 0, 2, 1161},
+ {0x1E80, 0, 2, 1163},
+ {0x1E81, 0, 2, 1165},
+ {0x1E82, 0, 2, 1167},
+ {0x1E83, 0, 2, 1169},
+ {0x1E84, 0, 2, 1171},
+ {0x1E85, 0, 2, 1173},
+ {0x1E86, 0, 2, 1175},
+ {0x1E87, 0, 2, 1177},
+ {0x1E88, 0, 2, 1179},
+ {0x1E89, 0, 2, 1181},
+ {0x1E8A, 0, 2, 1183},
+ {0x1E8B, 0, 2, 1185},
+ {0x1E8C, 0, 2, 1187},
+ {0x1E8D, 0, 2, 1189},
+ {0x1E8E, 0, 2, 1191},
+ {0x1E8F, 0, 2, 1193},
+ {0x1E90, 0, 2, 1195},
+ {0x1E91, 0, 2, 1197},
+ {0x1E92, 0, 2, 1199},
+ {0x1E93, 0, 2, 1201},
+ {0x1E94, 0, 2, 1203},
+ {0x1E95, 0, 2, 1205},
+ {0x1E96, 0, 2, 1207},
+ {0x1E97, 0, 2, 1209},
+ {0x1E98, 0, 2, 1211},
+ {0x1E99, 0, 2, 1213},
+ {0x1E9A, 0, 2 | DECOMP_NO_COMPOSE, 1215}, /* compatibility mapping */
+ {0x1E9B, 0, 2, 1217},
+ {0x1EA0, 0, 2, 1219},
+ {0x1EA1, 0, 2, 1221},
+ {0x1EA2, 0, 2, 1223},
+ {0x1EA3, 0, 2, 1225},
+ {0x1EA4, 0, 2, 1227},
+ {0x1EA5, 0, 2, 1229},
+ {0x1EA6, 0, 2, 1231},
+ {0x1EA7, 0, 2, 1233},
+ {0x1EA8, 0, 2, 1235},
+ {0x1EA9, 0, 2, 1237},
+ {0x1EAA, 0, 2, 1239},
+ {0x1EAB, 0, 2, 1241},
+ {0x1EAC, 0, 2, 1243},
+ {0x1EAD, 0, 2, 1245},
+ {0x1EAE, 0, 2, 1247},
+ {0x1EAF, 0, 2, 1249},
+ {0x1EB0, 0, 2, 1251},
+ {0x1EB1, 0, 2, 1253},
+ {0x1EB2, 0, 2, 1255},
+ {0x1EB3, 0, 2, 1257},
+ {0x1EB4, 0, 2, 1259},
+ {0x1EB5, 0, 2, 1261},
+ {0x1EB6, 0, 2, 1263},
+ {0x1EB7, 0, 2, 1265},
+ {0x1EB8, 0, 2, 1267},
+ {0x1EB9, 0, 2, 1269},
+ {0x1EBA, 0, 2, 1271},
+ {0x1EBB, 0, 2, 1273},
+ {0x1EBC, 0, 2, 1275},
+ {0x1EBD, 0, 2, 1277},
+ {0x1EBE, 0, 2, 1279},
+ {0x1EBF, 0, 2, 1281},
+ {0x1EC0, 0, 2, 1283},
+ {0x1EC1, 0, 2, 1285},
+ {0x1EC2, 0, 2, 1287},
+ {0x1EC3, 0, 2, 1289},
+ {0x1EC4, 0, 2, 1291},
+ {0x1EC5, 0, 2, 1293},
+ {0x1EC6, 0, 2, 1295},
+ {0x1EC7, 0, 2, 1297},
+ {0x1EC8, 0, 2, 1299},
+ {0x1EC9, 0, 2, 1301},
+ {0x1ECA, 0, 2, 1303},
+ {0x1ECB, 0, 2, 1305},
+ {0x1ECC, 0, 2, 1307},
+ {0x1ECD, 0, 2, 1309},
+ {0x1ECE, 0, 2, 1311},
+ {0x1ECF, 0, 2, 1313},
+ {0x1ED0, 0, 2, 1315},
+ {0x1ED1, 0, 2, 1317},
+ {0x1ED2, 0, 2, 1319},
+ {0x1ED3, 0, 2, 1321},
+ {0x1ED4, 0, 2, 1323},
+ {0x1ED5, 0, 2, 1325},
+ {0x1ED6, 0, 2, 1327},
+ {0x1ED7, 0, 2, 1329},
+ {0x1ED8, 0, 2, 1331},
+ {0x1ED9, 0, 2, 1333},
+ {0x1EDA, 0, 2, 1335},
+ {0x1EDB, 0, 2, 1337},
+ {0x1EDC, 0, 2, 1339},
+ {0x1EDD, 0, 2, 1341},
+ {0x1EDE, 0, 2, 1343},
+ {0x1EDF, 0, 2, 1345},
+ {0x1EE0, 0, 2, 1347},
+ {0x1EE1, 0, 2, 1349},
+ {0x1EE2, 0, 2, 1351},
+ {0x1EE3, 0, 2, 1353},
+ {0x1EE4, 0, 2, 1355},
+ {0x1EE5, 0, 2, 1357},
+ {0x1EE6, 0, 2, 1359},
+ {0x1EE7, 0, 2, 1361},
+ {0x1EE8, 0, 2, 1363},
+ {0x1EE9, 0, 2, 1365},
+ {0x1EEA, 0, 2, 1367},
+ {0x1EEB, 0, 2, 1369},
+ {0x1EEC, 0, 2, 1371},
+ {0x1EED, 0, 2, 1373},
+ {0x1EEE, 0, 2, 1375},
+ {0x1EEF, 0, 2, 1377},
+ {0x1EF0, 0, 2, 1379},
+ {0x1EF1, 0, 2, 1381},
+ {0x1EF2, 0, 2, 1383},
+ {0x1EF3, 0, 2, 1385},
+ {0x1EF4, 0, 2, 1387},
+ {0x1EF5, 0, 2, 1389},
+ {0x1EF6, 0, 2, 1391},
+ {0x1EF7, 0, 2, 1393},
+ {0x1EF8, 0, 2, 1395},
+ {0x1EF9, 0, 2, 1397},
+ {0x1F00, 0, 2, 1399},
+ {0x1F01, 0, 2, 1401},
+ {0x1F02, 0, 2, 1403},
+ {0x1F03, 0, 2, 1405},
+ {0x1F04, 0, 2, 1407},
+ {0x1F05, 0, 2, 1409},
+ {0x1F06, 0, 2, 1411},
+ {0x1F07, 0, 2, 1413},
+ {0x1F08, 0, 2, 1415},
+ {0x1F09, 0, 2, 1417},
+ {0x1F0A, 0, 2, 1419},
+ {0x1F0B, 0, 2, 1421},
+ {0x1F0C, 0, 2, 1423},
+ {0x1F0D, 0, 2, 1425},
+ {0x1F0E, 0, 2, 1427},
+ {0x1F0F, 0, 2, 1429},
+ {0x1F10, 0, 2, 1431},
+ {0x1F11, 0, 2, 1433},
+ {0x1F12, 0, 2, 1435},
+ {0x1F13, 0, 2, 1437},
+ {0x1F14, 0, 2, 1439},
+ {0x1F15, 0, 2, 1441},
+ {0x1F18, 0, 2, 1443},
+ {0x1F19, 0, 2, 1445},
+ {0x1F1A, 0, 2, 1447},
+ {0x1F1B, 0, 2, 1449},
+ {0x1F1C, 0, 2, 1451},
+ {0x1F1D, 0, 2, 1453},
+ {0x1F20, 0, 2, 1455},
+ {0x1F21, 0, 2, 1457},
+ {0x1F22, 0, 2, 1459},
+ {0x1F23, 0, 2, 1461},
+ {0x1F24, 0, 2, 1463},
+ {0x1F25, 0, 2, 1465},
+ {0x1F26, 0, 2, 1467},
+ {0x1F27, 0, 2, 1469},
+ {0x1F28, 0, 2, 1471},
+ {0x1F29, 0, 2, 1473},
+ {0x1F2A, 0, 2, 1475},
+ {0x1F2B, 0, 2, 1477},
+ {0x1F2C, 0, 2, 1479},
+ {0x1F2D, 0, 2, 1481},
+ {0x1F2E, 0, 2, 1483},
+ {0x1F2F, 0, 2, 1485},
+ {0x1F30, 0, 2, 1487},
+ {0x1F31, 0, 2, 1489},
+ {0x1F32, 0, 2, 1491},
+ {0x1F33, 0, 2, 1493},
+ {0x1F34, 0, 2, 1495},
+ {0x1F35, 0, 2, 1497},
+ {0x1F36, 0, 2, 1499},
+ {0x1F37, 0, 2, 1501},
+ {0x1F38, 0, 2, 1503},
+ {0x1F39, 0, 2, 1505},
+ {0x1F3A, 0, 2, 1507},
+ {0x1F3B, 0, 2, 1509},
+ {0x1F3C, 0, 2, 1511},
+ {0x1F3D, 0, 2, 1513},
+ {0x1F3E, 0, 2, 1515},
+ {0x1F3F, 0, 2, 1517},
+ {0x1F40, 0, 2, 1519},
+ {0x1F41, 0, 2, 1521},
+ {0x1F42, 0, 2, 1523},
+ {0x1F43, 0, 2, 1525},
+ {0x1F44, 0, 2, 1527},
+ {0x1F45, 0, 2, 1529},
+ {0x1F48, 0, 2, 1531},
+ {0x1F49, 0, 2, 1533},
+ {0x1F4A, 0, 2, 1535},
+ {0x1F4B, 0, 2, 1537},
+ {0x1F4C, 0, 2, 1539},
+ {0x1F4D, 0, 2, 1541},
+ {0x1F50, 0, 2, 1543},
+ {0x1F51, 0, 2, 1545},
+ {0x1F52, 0, 2, 1547},
+ {0x1F53, 0, 2, 1549},
+ {0x1F54, 0, 2, 1551},
+ {0x1F55, 0, 2, 1553},
+ {0x1F56, 0, 2, 1555},
+ {0x1F57, 0, 2, 1557},
+ {0x1F59, 0, 2, 1559},
+ {0x1F5B, 0, 2, 1561},
+ {0x1F5D, 0, 2, 1563},
+ {0x1F5F, 0, 2, 1565},
+ {0x1F60, 0, 2, 1567},
+ {0x1F61, 0, 2, 1569},
+ {0x1F62, 0, 2, 1571},
+ {0x1F63, 0, 2, 1573},
+ {0x1F64, 0, 2, 1575},
+ {0x1F65, 0, 2, 1577},
+ {0x1F66, 0, 2, 1579},
+ {0x1F67, 0, 2, 1581},
+ {0x1F68, 0, 2, 1583},
+ {0x1F69, 0, 2, 1585},
+ {0x1F6A, 0, 2, 1587},
+ {0x1F6B, 0, 2, 1589},
+ {0x1F6C, 0, 2, 1591},
+ {0x1F6D, 0, 2, 1593},
+ {0x1F6E, 0, 2, 1595},
+ {0x1F6F, 0, 2, 1597},
+ {0x1F70, 0, 2, 1599},
+ {0x1F71, 0, 1 | DECOMP_INLINE, 0x03AC},
+ {0x1F72, 0, 2, 1601},
+ {0x1F73, 0, 1 | DECOMP_INLINE, 0x03AD},
+ {0x1F74, 0, 2, 1603},
+ {0x1F75, 0, 1 | DECOMP_INLINE, 0x03AE},
+ {0x1F76, 0, 2, 1605},
+ {0x1F77, 0, 1 | DECOMP_INLINE, 0x03AF},
+ {0x1F78, 0, 2, 1607},
+ {0x1F79, 0, 1 | DECOMP_INLINE, 0x03CC},
+ {0x1F7A, 0, 2, 1609},
+ {0x1F7B, 0, 1 | DECOMP_INLINE, 0x03CD},
+ {0x1F7C, 0, 2, 1611},
+ {0x1F7D, 0, 1 | DECOMP_INLINE, 0x03CE},
+ {0x1F80, 0, 2, 1613},
+ {0x1F81, 0, 2, 1615},
+ {0x1F82, 0, 2, 1617},
+ {0x1F83, 0, 2, 1619},
+ {0x1F84, 0, 2, 1621},
+ {0x1F85, 0, 2, 1623},
+ {0x1F86, 0, 2, 1625},
+ {0x1F87, 0, 2, 1627},
+ {0x1F88, 0, 2, 1629},
+ {0x1F89, 0, 2, 1631},
+ {0x1F8A, 0, 2, 1633},
+ {0x1F8B, 0, 2, 1635},
+ {0x1F8C, 0, 2, 1637},
+ {0x1F8D, 0, 2, 1639},
+ {0x1F8E, 0, 2, 1641},
+ {0x1F8F, 0, 2, 1643},
+ {0x1F90, 0, 2, 1645},
+ {0x1F91, 0, 2, 1647},
+ {0x1F92, 0, 2, 1649},
+ {0x1F93, 0, 2, 1651},
+ {0x1F94, 0, 2, 1653},
+ {0x1F95, 0, 2, 1655},
+ {0x1F96, 0, 2, 1657},
+ {0x1F97, 0, 2, 1659},
+ {0x1F98, 0, 2, 1661},
+ {0x1F99, 0, 2, 1663},
+ {0x1F9A, 0, 2, 1665},
+ {0x1F9B, 0, 2, 1667},
+ {0x1F9C, 0, 2, 1669},
+ {0x1F9D, 0, 2, 1671},
+ {0x1F9E, 0, 2, 1673},
+ {0x1F9F, 0, 2, 1675},
+ {0x1FA0, 0, 2, 1677},
+ {0x1FA1, 0, 2, 1679},
+ {0x1FA2, 0, 2, 1681},
+ {0x1FA3, 0, 2, 1683},
+ {0x1FA4, 0, 2, 1685},
+ {0x1FA5, 0, 2, 1687},
+ {0x1FA6, 0, 2, 1689},
+ {0x1FA7, 0, 2, 1691},
+ {0x1FA8, 0, 2, 1693},
+ {0x1FA9, 0, 2, 1695},
+ {0x1FAA, 0, 2, 1697},
+ {0x1FAB, 0, 2, 1699},
+ {0x1FAC, 0, 2, 1701},
+ {0x1FAD, 0, 2, 1703},
+ {0x1FAE, 0, 2, 1705},
+ {0x1FAF, 0, 2, 1707},
+ {0x1FB0, 0, 2, 1709},
+ {0x1FB1, 0, 2, 1711},
+ {0x1FB2, 0, 2, 1713},
+ {0x1FB3, 0, 2, 1715},
+ {0x1FB4, 0, 2, 1717},
+ {0x1FB6, 0, 2, 1719},
+ {0x1FB7, 0, 2, 1721},
+ {0x1FB8, 0, 2, 1723},
+ {0x1FB9, 0, 2, 1725},
+ {0x1FBA, 0, 2, 1727},
+ {0x1FBB, 0, 1 | DECOMP_INLINE, 0x0386},
+ {0x1FBC, 0, 2, 1729},
+ {0x1FBD, 0, 2 | DECOMP_NO_COMPOSE, 1731}, /* compatibility mapping */
+ {0x1FBE, 0, 1 | DECOMP_INLINE, 0x03B9},
+ {0x1FBF, 0, 2 | DECOMP_NO_COMPOSE, 1733}, /* compatibility mapping */
+ {0x1FC0, 0, 2 | DECOMP_NO_COMPOSE, 1735}, /* compatibility mapping */
+ {0x1FC1, 0, 2, 1737},
+ {0x1FC2, 0, 2, 1739},
+ {0x1FC3, 0, 2, 1741},
+ {0x1FC4, 0, 2, 1743},
+ {0x1FC6, 0, 2, 1745},
+ {0x1FC7, 0, 2, 1747},
+ {0x1FC8, 0, 2, 1749},
+ {0x1FC9, 0, 1 | DECOMP_INLINE, 0x0388},
+ {0x1FCA, 0, 2, 1751},
+ {0x1FCB, 0, 1 | DECOMP_INLINE, 0x0389},
+ {0x1FCC, 0, 2, 1753},
+ {0x1FCD, 0, 2, 1755},
+ {0x1FCE, 0, 2, 1757},
+ {0x1FCF, 0, 2, 1759},
+ {0x1FD0, 0, 2, 1761},
+ {0x1FD1, 0, 2, 1763},
+ {0x1FD2, 0, 2, 1765},
+ {0x1FD3, 0, 1 | DECOMP_INLINE, 0x0390},
+ {0x1FD6, 0, 2, 1767},
+ {0x1FD7, 0, 2, 1769},
+ {0x1FD8, 0, 2, 1771},
+ {0x1FD9, 0, 2, 1773},
+ {0x1FDA, 0, 2, 1775},
+ {0x1FDB, 0, 1 | DECOMP_INLINE, 0x038A},
+ {0x1FDD, 0, 2, 1777},
+ {0x1FDE, 0, 2, 1779},
+ {0x1FDF, 0, 2, 1781},
+ {0x1FE0, 0, 2, 1783},
+ {0x1FE1, 0, 2, 1785},
+ {0x1FE2, 0, 2, 1787},
+ {0x1FE3, 0, 1 | DECOMP_INLINE, 0x03B0},
+ {0x1FE4, 0, 2, 1789},
+ {0x1FE5, 0, 2, 1791},
+ {0x1FE6, 0, 2, 1793},
+ {0x1FE7, 0, 2, 1795},
+ {0x1FE8, 0, 2, 1797},
+ {0x1FE9, 0, 2, 1799},
+ {0x1FEA, 0, 2, 1801},
+ {0x1FEB, 0, 1 | DECOMP_INLINE, 0x038E},
+ {0x1FEC, 0, 2, 1803},
+ {0x1FED, 0, 2, 1805},
+ {0x1FEE, 0, 1 | DECOMP_INLINE, 0x0385},
+ {0x1FEF, 0, 1 | DECOMP_INLINE, 0x0060},
+ {0x1FF2, 0, 2, 1807},
+ {0x1FF3, 0, 2, 1809},
+ {0x1FF4, 0, 2, 1811},
+ {0x1FF6, 0, 2, 1813},
+ {0x1FF7, 0, 2, 1815},
+ {0x1FF8, 0, 2, 1817},
+ {0x1FF9, 0, 1 | DECOMP_INLINE, 0x038C},
+ {0x1FFA, 0, 2, 1819},
+ {0x1FFB, 0, 1 | DECOMP_INLINE, 0x038F},
+ {0x1FFC, 0, 2, 1821},
+ {0x1FFD, 0, 1 | DECOMP_INLINE, 0x00B4},
+ {0x1FFE, 0, 2 | DECOMP_NO_COMPOSE, 1823}, /* compatibility mapping */
+ {0x2000, 0, 1 | DECOMP_INLINE, 0x2002},
+ {0x2001, 0, 1 | DECOMP_INLINE, 0x2003},
+ {0x2002, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2003, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2004, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2005, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2006, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2007, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2008, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2009, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x200A, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2011, 0, 1 | DECOMP_INLINE, 0x2010},
+ {0x2017, 0, 2 | DECOMP_NO_COMPOSE, 1825}, /* compatibility mapping */
+ {0x2024, 0, 1 | DECOMP_INLINE, 0x002E},
+ {0x2025, 0, 2 | DECOMP_NO_COMPOSE, 1827}, /* compatibility mapping */
+ {0x2026, 0, 3, 1829},
+ {0x202F, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2033, 0, 2 | DECOMP_NO_COMPOSE, 1832}, /* compatibility mapping */
+ {0x2034, 0, 3, 1834},
+ {0x2036, 0, 2 | DECOMP_NO_COMPOSE, 1837}, /* compatibility mapping */
+ {0x2037, 0, 3, 1839},
+ {0x203C, 0, 2 | DECOMP_NO_COMPOSE, 1842}, /* compatibility mapping */
+ {0x203E, 0, 2 | DECOMP_NO_COMPOSE, 1844}, /* compatibility mapping */
+ {0x2047, 0, 2 | DECOMP_NO_COMPOSE, 1846}, /* compatibility mapping */
+ {0x2048, 0, 2 | DECOMP_NO_COMPOSE, 1848}, /* compatibility mapping */
+ {0x2049, 0, 2 | DECOMP_NO_COMPOSE, 1850}, /* compatibility mapping */
+ {0x2057, 0, 4, 1852},
+ {0x205F, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x2070, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x2071, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x2074, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x2075, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x2076, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x2077, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x2078, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x2079, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x207A, 0, 1 | DECOMP_INLINE, 0x002B},
+ {0x207B, 0, 1 | DECOMP_INLINE, 0x2212},
+ {0x207C, 0, 1 | DECOMP_INLINE, 0x003D},
+ {0x207D, 0, 1 | DECOMP_INLINE, 0x0028},
+ {0x207E, 0, 1 | DECOMP_INLINE, 0x0029},
+ {0x207F, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x2080, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x2081, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x2082, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x2083, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x2084, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x2085, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x2086, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x2087, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x2088, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x2089, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x208A, 0, 1 | DECOMP_INLINE, 0x002B},
+ {0x208B, 0, 1 | DECOMP_INLINE, 0x2212},
+ {0x208C, 0, 1 | DECOMP_INLINE, 0x003D},
+ {0x208D, 0, 1 | DECOMP_INLINE, 0x0028},
+ {0x208E, 0, 1 | DECOMP_INLINE, 0x0029},
+ {0x2090, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x2091, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x2092, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x2093, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x2094, 0, 1 | DECOMP_INLINE, 0x0259},
+ {0x2095, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x2096, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x2097, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x2098, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x2099, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x209A, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x209B, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x209C, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x20A8, 0, 2 | DECOMP_NO_COMPOSE, 1856}, /* compatibility mapping */
+ {0x20D0, 230, 0, 0},
+ {0x20D1, 230, 0, 0},
+ {0x20D2, 1, 0, 0},
+ {0x20D3, 1, 0, 0},
+ {0x20D4, 230, 0, 0},
+ {0x20D5, 230, 0, 0},
+ {0x20D6, 230, 0, 0},
+ {0x20D7, 230, 0, 0},
+ {0x20D8, 1, 0, 0},
+ {0x20D9, 1, 0, 0},
+ {0x20DA, 1, 0, 0},
+ {0x20DB, 230, 0, 0},
+ {0x20DC, 230, 0, 0},
+ {0x20E1, 230, 0, 0},
+ {0x20E5, 1, 0, 0},
+ {0x20E6, 1, 0, 0},
+ {0x20E7, 230, 0, 0},
+ {0x20E8, 220, 0, 0},
+ {0x20E9, 230, 0, 0},
+ {0x20EA, 1, 0, 0},
+ {0x20EB, 1, 0, 0},
+ {0x20EC, 220, 0, 0},
+ {0x20ED, 220, 0, 0},
+ {0x20EE, 220, 0, 0},
+ {0x20EF, 220, 0, 0},
+ {0x20F0, 230, 0, 0},
+ {0x2100, 0, 3, 1858},
+ {0x2101, 0, 3, 1861},
+ {0x2102, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x2103, 0, 2 | DECOMP_NO_COMPOSE, 1864}, /* compatibility mapping */
+ {0x2105, 0, 3, 1866},
+ {0x2106, 0, 3, 1869},
+ {0x2107, 0, 1 | DECOMP_INLINE, 0x0190},
+ {0x2109, 0, 2 | DECOMP_NO_COMPOSE, 1872}, /* compatibility mapping */
+ {0x210A, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x210B, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x210C, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x210D, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x210E, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x210F, 0, 1 | DECOMP_INLINE, 0x0127},
+ {0x2110, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x2111, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x2112, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x2113, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x2115, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x2116, 0, 2 | DECOMP_NO_COMPOSE, 1874}, /* compatibility mapping */
+ {0x2119, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x211A, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x211B, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x211C, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x211D, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x2120, 0, 2 | DECOMP_NO_COMPOSE, 1876}, /* compatibility mapping */
+ {0x2121, 0, 3, 1878},
+ {0x2122, 0, 2 | DECOMP_NO_COMPOSE, 1881}, /* compatibility mapping */
+ {0x2124, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x2126, 0, 1 | DECOMP_INLINE, 0x03A9},
+ {0x2128, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x212A, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x212B, 0, 1 | DECOMP_INLINE, 0x00C5},
+ {0x212C, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x212D, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x212F, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x2130, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x2131, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x2133, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x2134, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x2135, 0, 1 | DECOMP_INLINE, 0x05D0},
+ {0x2136, 0, 1 | DECOMP_INLINE, 0x05D1},
+ {0x2137, 0, 1 | DECOMP_INLINE, 0x05D2},
+ {0x2138, 0, 1 | DECOMP_INLINE, 0x05D3},
+ {0x2139, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x213B, 0, 3, 1883},
+ {0x213C, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x213D, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x213E, 0, 1 | DECOMP_INLINE, 0x0393},
+ {0x213F, 0, 1 | DECOMP_INLINE, 0x03A0},
+ {0x2140, 0, 1 | DECOMP_INLINE, 0x2211},
+ {0x2145, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x2146, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x2147, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x2148, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x2149, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x2150, 0, 3, 1886},
+ {0x2151, 0, 3, 1889},
+ {0x2152, 0, 4, 1892},
+ {0x2153, 0, 3, 1896},
+ {0x2154, 0, 3, 1899},
+ {0x2155, 0, 3, 1902},
+ {0x2156, 0, 3, 1905},
+ {0x2157, 0, 3, 1908},
+ {0x2158, 0, 3, 1911},
+ {0x2159, 0, 3, 1914},
+ {0x215A, 0, 3, 1917},
+ {0x215B, 0, 3, 1920},
+ {0x215C, 0, 3, 1923},
+ {0x215D, 0, 3, 1926},
+ {0x215E, 0, 3, 1929},
+ {0x215F, 0, 2 | DECOMP_NO_COMPOSE, 1932}, /* compatibility mapping */
+ {0x2160, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x2161, 0, 2 | DECOMP_NO_COMPOSE, 1934}, /* compatibility mapping */
+ {0x2162, 0, 3, 1936},
+ {0x2163, 0, 2 | DECOMP_NO_COMPOSE, 1939}, /* compatibility mapping */
+ {0x2164, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x2165, 0, 2 | DECOMP_NO_COMPOSE, 1941}, /* compatibility mapping */
+ {0x2166, 0, 3, 1943},
+ {0x2167, 0, 4, 1946},
+ {0x2168, 0, 2 | DECOMP_NO_COMPOSE, 1950}, /* compatibility mapping */
+ {0x2169, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x216A, 0, 2 | DECOMP_NO_COMPOSE, 1952}, /* compatibility mapping */
+ {0x216B, 0, 3, 1954},
+ {0x216C, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x216D, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x216E, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x216F, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x2170, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x2171, 0, 2 | DECOMP_NO_COMPOSE, 1957}, /* compatibility mapping */
+ {0x2172, 0, 3, 1959},
+ {0x2173, 0, 2 | DECOMP_NO_COMPOSE, 1962}, /* compatibility mapping */
+ {0x2174, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x2175, 0, 2 | DECOMP_NO_COMPOSE, 1964}, /* compatibility mapping */
+ {0x2176, 0, 3, 1966},
+ {0x2177, 0, 4, 1969},
+ {0x2178, 0, 2 | DECOMP_NO_COMPOSE, 1973}, /* compatibility mapping */
+ {0x2179, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x217A, 0, 2 | DECOMP_NO_COMPOSE, 1975}, /* compatibility mapping */
+ {0x217B, 0, 3, 1977},
+ {0x217C, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x217D, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x217E, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x217F, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x2189, 0, 3, 1980},
+ {0x219A, 0, 2, 1983},
+ {0x219B, 0, 2, 1985},
+ {0x21AE, 0, 2, 1987},
+ {0x21CD, 0, 2, 1989},
+ {0x21CE, 0, 2, 1991},
+ {0x21CF, 0, 2, 1993},
+ {0x2204, 0, 2, 1995},
+ {0x2209, 0, 2, 1997},
+ {0x220C, 0, 2, 1999},
+ {0x2224, 0, 2, 2001},
+ {0x2226, 0, 2, 2003},
+ {0x222C, 0, 2 | DECOMP_NO_COMPOSE, 2005}, /* compatibility mapping */
+ {0x222D, 0, 3, 2007},
+ {0x222F, 0, 2 | DECOMP_NO_COMPOSE, 2010}, /* compatibility mapping */
+ {0x2230, 0, 3, 2012},
+ {0x2241, 0, 2, 2015},
+ {0x2244, 0, 2, 2017},
+ {0x2247, 0, 2, 2019},
+ {0x2249, 0, 2, 2021},
+ {0x2260, 0, 2, 2023},
+ {0x2262, 0, 2, 2025},
+ {0x226D, 0, 2, 2027},
+ {0x226E, 0, 2, 2029},
+ {0x226F, 0, 2, 2031},
+ {0x2270, 0, 2, 2033},
+ {0x2271, 0, 2, 2035},
+ {0x2274, 0, 2, 2037},
+ {0x2275, 0, 2, 2039},
+ {0x2278, 0, 2, 2041},
+ {0x2279, 0, 2, 2043},
+ {0x2280, 0, 2, 2045},
+ {0x2281, 0, 2, 2047},
+ {0x2284, 0, 2, 2049},
+ {0x2285, 0, 2, 2051},
+ {0x2288, 0, 2, 2053},
+ {0x2289, 0, 2, 2055},
+ {0x22AC, 0, 2, 2057},
+ {0x22AD, 0, 2, 2059},
+ {0x22AE, 0, 2, 2061},
+ {0x22AF, 0, 2, 2063},
+ {0x22E0, 0, 2, 2065},
+ {0x22E1, 0, 2, 2067},
+ {0x22E2, 0, 2, 2069},
+ {0x22E3, 0, 2, 2071},
+ {0x22EA, 0, 2, 2073},
+ {0x22EB, 0, 2, 2075},
+ {0x22EC, 0, 2, 2077},
+ {0x22ED, 0, 2, 2079},
+ {0x2329, 0, 1 | DECOMP_INLINE, 0x3008},
+ {0x232A, 0, 1 | DECOMP_INLINE, 0x3009},
+ {0x2460, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x2461, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x2462, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x2463, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x2464, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x2465, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x2466, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x2467, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x2468, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x2469, 0, 2 | DECOMP_NO_COMPOSE, 2081}, /* compatibility mapping */
+ {0x246A, 0, 2 | DECOMP_NO_COMPOSE, 2083}, /* compatibility mapping */
+ {0x246B, 0, 2 | DECOMP_NO_COMPOSE, 2085}, /* compatibility mapping */
+ {0x246C, 0, 2 | DECOMP_NO_COMPOSE, 2087}, /* compatibility mapping */
+ {0x246D, 0, 2 | DECOMP_NO_COMPOSE, 2089}, /* compatibility mapping */
+ {0x246E, 0, 2 | DECOMP_NO_COMPOSE, 2091}, /* compatibility mapping */
+ {0x246F, 0, 2 | DECOMP_NO_COMPOSE, 2093}, /* compatibility mapping */
+ {0x2470, 0, 2 | DECOMP_NO_COMPOSE, 2095}, /* compatibility mapping */
+ {0x2471, 0, 2 | DECOMP_NO_COMPOSE, 2097}, /* compatibility mapping */
+ {0x2472, 0, 2 | DECOMP_NO_COMPOSE, 2099}, /* compatibility mapping */
+ {0x2473, 0, 2 | DECOMP_NO_COMPOSE, 2101}, /* compatibility mapping */
+ {0x2474, 0, 3, 2103},
+ {0x2475, 0, 3, 2106},
+ {0x2476, 0, 3, 2109},
+ {0x2477, 0, 3, 2112},
+ {0x2478, 0, 3, 2115},
+ {0x2479, 0, 3, 2118},
+ {0x247A, 0, 3, 2121},
+ {0x247B, 0, 3, 2124},
+ {0x247C, 0, 3, 2127},
+ {0x247D, 0, 4, 2130},
+ {0x247E, 0, 4, 2134},
+ {0x247F, 0, 4, 2138},
+ {0x2480, 0, 4, 2142},
+ {0x2481, 0, 4, 2146},
+ {0x2482, 0, 4, 2150},
+ {0x2483, 0, 4, 2154},
+ {0x2484, 0, 4, 2158},
+ {0x2485, 0, 4, 2162},
+ {0x2486, 0, 4, 2166},
+ {0x2487, 0, 4, 2170},
+ {0x2488, 0, 2 | DECOMP_NO_COMPOSE, 2174}, /* compatibility mapping */
+ {0x2489, 0, 2 | DECOMP_NO_COMPOSE, 2176}, /* compatibility mapping */
+ {0x248A, 0, 2 | DECOMP_NO_COMPOSE, 2178}, /* compatibility mapping */
+ {0x248B, 0, 2 | DECOMP_NO_COMPOSE, 2180}, /* compatibility mapping */
+ {0x248C, 0, 2 | DECOMP_NO_COMPOSE, 2182}, /* compatibility mapping */
+ {0x248D, 0, 2 | DECOMP_NO_COMPOSE, 2184}, /* compatibility mapping */
+ {0x248E, 0, 2 | DECOMP_NO_COMPOSE, 2186}, /* compatibility mapping */
+ {0x248F, 0, 2 | DECOMP_NO_COMPOSE, 2188}, /* compatibility mapping */
+ {0x2490, 0, 2 | DECOMP_NO_COMPOSE, 2190}, /* compatibility mapping */
+ {0x2491, 0, 3, 2192},
+ {0x2492, 0, 3, 2195},
+ {0x2493, 0, 3, 2198},
+ {0x2494, 0, 3, 2201},
+ {0x2495, 0, 3, 2204},
+ {0x2496, 0, 3, 2207},
+ {0x2497, 0, 3, 2210},
+ {0x2498, 0, 3, 2213},
+ {0x2499, 0, 3, 2216},
+ {0x249A, 0, 3, 2219},
+ {0x249B, 0, 3, 2222},
+ {0x249C, 0, 3, 2225},
+ {0x249D, 0, 3, 2228},
+ {0x249E, 0, 3, 2231},
+ {0x249F, 0, 3, 2234},
+ {0x24A0, 0, 3, 2237},
+ {0x24A1, 0, 3, 2240},
+ {0x24A2, 0, 3, 2243},
+ {0x24A3, 0, 3, 2246},
+ {0x24A4, 0, 3, 2249},
+ {0x24A5, 0, 3, 2252},
+ {0x24A6, 0, 3, 2255},
+ {0x24A7, 0, 3, 2258},
+ {0x24A8, 0, 3, 2261},
+ {0x24A9, 0, 3, 2264},
+ {0x24AA, 0, 3, 2267},
+ {0x24AB, 0, 3, 2270},
+ {0x24AC, 0, 3, 2273},
+ {0x24AD, 0, 3, 2276},
+ {0x24AE, 0, 3, 2279},
+ {0x24AF, 0, 3, 2282},
+ {0x24B0, 0, 3, 2285},
+ {0x24B1, 0, 3, 2288},
+ {0x24B2, 0, 3, 2291},
+ {0x24B3, 0, 3, 2294},
+ {0x24B4, 0, 3, 2297},
+ {0x24B5, 0, 3, 2300},
+ {0x24B6, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x24B7, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x24B8, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x24B9, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x24BA, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x24BB, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x24BC, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x24BD, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x24BE, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x24BF, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x24C0, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x24C1, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x24C2, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x24C3, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x24C4, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x24C5, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x24C6, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x24C7, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x24C8, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x24C9, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x24CA, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x24CB, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x24CC, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x24CD, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x24CE, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x24CF, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x24D0, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x24D1, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x24D2, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x24D3, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x24D4, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x24D5, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x24D6, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x24D7, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x24D8, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x24D9, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x24DA, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x24DB, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x24DC, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x24DD, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x24DE, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x24DF, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x24E0, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x24E1, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x24E2, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x24E3, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x24E4, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x24E5, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x24E6, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x24E7, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x24E8, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x24E9, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x24EA, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x2A0C, 0, 4, 2303},
+ {0x2A74, 0, 3, 2307},
+ {0x2A75, 0, 2 | DECOMP_NO_COMPOSE, 2310}, /* compatibility mapping */
+ {0x2A76, 0, 3, 2312},
+ {0x2ADC, 0, 2 | DECOMP_NO_COMPOSE, 2315}, /* in exclusion list */
+ {0x2C7C, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x2C7D, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x2CEF, 230, 0, 0},
+ {0x2CF0, 230, 0, 0},
+ {0x2CF1, 230, 0, 0},
+ {0x2D6F, 0, 1 | DECOMP_INLINE, 0x2D61},
+ {0x2D7F, 9, 0, 0},
+ {0x2DE0, 230, 0, 0},
+ {0x2DE1, 230, 0, 0},
+ {0x2DE2, 230, 0, 0},
+ {0x2DE3, 230, 0, 0},
+ {0x2DE4, 230, 0, 0},
+ {0x2DE5, 230, 0, 0},
+ {0x2DE6, 230, 0, 0},
+ {0x2DE7, 230, 0, 0},
+ {0x2DE8, 230, 0, 0},
+ {0x2DE9, 230, 0, 0},
+ {0x2DEA, 230, 0, 0},
+ {0x2DEB, 230, 0, 0},
+ {0x2DEC, 230, 0, 0},
+ {0x2DED, 230, 0, 0},
+ {0x2DEE, 230, 0, 0},
+ {0x2DEF, 230, 0, 0},
+ {0x2DF0, 230, 0, 0},
+ {0x2DF1, 230, 0, 0},
+ {0x2DF2, 230, 0, 0},
+ {0x2DF3, 230, 0, 0},
+ {0x2DF4, 230, 0, 0},
+ {0x2DF5, 230, 0, 0},
+ {0x2DF6, 230, 0, 0},
+ {0x2DF7, 230, 0, 0},
+ {0x2DF8, 230, 0, 0},
+ {0x2DF9, 230, 0, 0},
+ {0x2DFA, 230, 0, 0},
+ {0x2DFB, 230, 0, 0},
+ {0x2DFC, 230, 0, 0},
+ {0x2DFD, 230, 0, 0},
+ {0x2DFE, 230, 0, 0},
+ {0x2DFF, 230, 0, 0},
+ {0x2E9F, 0, 1 | DECOMP_INLINE, 0x6BCD},
+ {0x2EF3, 0, 1 | DECOMP_INLINE, 0x9F9F},
+ {0x2F00, 0, 1 | DECOMP_INLINE, 0x4E00},
+ {0x2F01, 0, 1 | DECOMP_INLINE, 0x4E28},
+ {0x2F02, 0, 1 | DECOMP_INLINE, 0x4E36},
+ {0x2F03, 0, 1 | DECOMP_INLINE, 0x4E3F},
+ {0x2F04, 0, 1 | DECOMP_INLINE, 0x4E59},
+ {0x2F05, 0, 1 | DECOMP_INLINE, 0x4E85},
+ {0x2F06, 0, 1 | DECOMP_INLINE, 0x4E8C},
+ {0x2F07, 0, 1 | DECOMP_INLINE, 0x4EA0},
+ {0x2F08, 0, 1 | DECOMP_INLINE, 0x4EBA},
+ {0x2F09, 0, 1 | DECOMP_INLINE, 0x513F},
+ {0x2F0A, 0, 1 | DECOMP_INLINE, 0x5165},
+ {0x2F0B, 0, 1 | DECOMP_INLINE, 0x516B},
+ {0x2F0C, 0, 1 | DECOMP_INLINE, 0x5182},
+ {0x2F0D, 0, 1 | DECOMP_INLINE, 0x5196},
+ {0x2F0E, 0, 1 | DECOMP_INLINE, 0x51AB},
+ {0x2F0F, 0, 1 | DECOMP_INLINE, 0x51E0},
+ {0x2F10, 0, 1 | DECOMP_INLINE, 0x51F5},
+ {0x2F11, 0, 1 | DECOMP_INLINE, 0x5200},
+ {0x2F12, 0, 1 | DECOMP_INLINE, 0x529B},
+ {0x2F13, 0, 1 | DECOMP_INLINE, 0x52F9},
+ {0x2F14, 0, 1 | DECOMP_INLINE, 0x5315},
+ {0x2F15, 0, 1 | DECOMP_INLINE, 0x531A},
+ {0x2F16, 0, 1 | DECOMP_INLINE, 0x5338},
+ {0x2F17, 0, 1 | DECOMP_INLINE, 0x5341},
+ {0x2F18, 0, 1 | DECOMP_INLINE, 0x535C},
+ {0x2F19, 0, 1 | DECOMP_INLINE, 0x5369},
+ {0x2F1A, 0, 1 | DECOMP_INLINE, 0x5382},
+ {0x2F1B, 0, 1 | DECOMP_INLINE, 0x53B6},
+ {0x2F1C, 0, 1 | DECOMP_INLINE, 0x53C8},
+ {0x2F1D, 0, 1 | DECOMP_INLINE, 0x53E3},
+ {0x2F1E, 0, 1 | DECOMP_INLINE, 0x56D7},
+ {0x2F1F, 0, 1 | DECOMP_INLINE, 0x571F},
+ {0x2F20, 0, 1 | DECOMP_INLINE, 0x58EB},
+ {0x2F21, 0, 1 | DECOMP_INLINE, 0x5902},
+ {0x2F22, 0, 1 | DECOMP_INLINE, 0x590A},
+ {0x2F23, 0, 1 | DECOMP_INLINE, 0x5915},
+ {0x2F24, 0, 1 | DECOMP_INLINE, 0x5927},
+ {0x2F25, 0, 1 | DECOMP_INLINE, 0x5973},
+ {0x2F26, 0, 1 | DECOMP_INLINE, 0x5B50},
+ {0x2F27, 0, 1 | DECOMP_INLINE, 0x5B80},
+ {0x2F28, 0, 1 | DECOMP_INLINE, 0x5BF8},
+ {0x2F29, 0, 1 | DECOMP_INLINE, 0x5C0F},
+ {0x2F2A, 0, 1 | DECOMP_INLINE, 0x5C22},
+ {0x2F2B, 0, 1 | DECOMP_INLINE, 0x5C38},
+ {0x2F2C, 0, 1 | DECOMP_INLINE, 0x5C6E},
+ {0x2F2D, 0, 1 | DECOMP_INLINE, 0x5C71},
+ {0x2F2E, 0, 1 | DECOMP_INLINE, 0x5DDB},
+ {0x2F2F, 0, 1 | DECOMP_INLINE, 0x5DE5},
+ {0x2F30, 0, 1 | DECOMP_INLINE, 0x5DF1},
+ {0x2F31, 0, 1 | DECOMP_INLINE, 0x5DFE},
+ {0x2F32, 0, 1 | DECOMP_INLINE, 0x5E72},
+ {0x2F33, 0, 1 | DECOMP_INLINE, 0x5E7A},
+ {0x2F34, 0, 1 | DECOMP_INLINE, 0x5E7F},
+ {0x2F35, 0, 1 | DECOMP_INLINE, 0x5EF4},
+ {0x2F36, 0, 1 | DECOMP_INLINE, 0x5EFE},
+ {0x2F37, 0, 1 | DECOMP_INLINE, 0x5F0B},
+ {0x2F38, 0, 1 | DECOMP_INLINE, 0x5F13},
+ {0x2F39, 0, 1 | DECOMP_INLINE, 0x5F50},
+ {0x2F3A, 0, 1 | DECOMP_INLINE, 0x5F61},
+ {0x2F3B, 0, 1 | DECOMP_INLINE, 0x5F73},
+ {0x2F3C, 0, 1 | DECOMP_INLINE, 0x5FC3},
+ {0x2F3D, 0, 1 | DECOMP_INLINE, 0x6208},
+ {0x2F3E, 0, 1 | DECOMP_INLINE, 0x6236},
+ {0x2F3F, 0, 1 | DECOMP_INLINE, 0x624B},
+ {0x2F40, 0, 1 | DECOMP_INLINE, 0x652F},
+ {0x2F41, 0, 1 | DECOMP_INLINE, 0x6534},
+ {0x2F42, 0, 1 | DECOMP_INLINE, 0x6587},
+ {0x2F43, 0, 1 | DECOMP_INLINE, 0x6597},
+ {0x2F44, 0, 1 | DECOMP_INLINE, 0x65A4},
+ {0x2F45, 0, 1 | DECOMP_INLINE, 0x65B9},
+ {0x2F46, 0, 1 | DECOMP_INLINE, 0x65E0},
+ {0x2F47, 0, 1 | DECOMP_INLINE, 0x65E5},
+ {0x2F48, 0, 1 | DECOMP_INLINE, 0x66F0},
+ {0x2F49, 0, 1 | DECOMP_INLINE, 0x6708},
+ {0x2F4A, 0, 1 | DECOMP_INLINE, 0x6728},
+ {0x2F4B, 0, 1 | DECOMP_INLINE, 0x6B20},
+ {0x2F4C, 0, 1 | DECOMP_INLINE, 0x6B62},
+ {0x2F4D, 0, 1 | DECOMP_INLINE, 0x6B79},
+ {0x2F4E, 0, 1 | DECOMP_INLINE, 0x6BB3},
+ {0x2F4F, 0, 1 | DECOMP_INLINE, 0x6BCB},
+ {0x2F50, 0, 1 | DECOMP_INLINE, 0x6BD4},
+ {0x2F51, 0, 1 | DECOMP_INLINE, 0x6BDB},
+ {0x2F52, 0, 1 | DECOMP_INLINE, 0x6C0F},
+ {0x2F53, 0, 1 | DECOMP_INLINE, 0x6C14},
+ {0x2F54, 0, 1 | DECOMP_INLINE, 0x6C34},
+ {0x2F55, 0, 1 | DECOMP_INLINE, 0x706B},
+ {0x2F56, 0, 1 | DECOMP_INLINE, 0x722A},
+ {0x2F57, 0, 1 | DECOMP_INLINE, 0x7236},
+ {0x2F58, 0, 1 | DECOMP_INLINE, 0x723B},
+ {0x2F59, 0, 1 | DECOMP_INLINE, 0x723F},
+ {0x2F5A, 0, 1 | DECOMP_INLINE, 0x7247},
+ {0x2F5B, 0, 1 | DECOMP_INLINE, 0x7259},
+ {0x2F5C, 0, 1 | DECOMP_INLINE, 0x725B},
+ {0x2F5D, 0, 1 | DECOMP_INLINE, 0x72AC},
+ {0x2F5E, 0, 1 | DECOMP_INLINE, 0x7384},
+ {0x2F5F, 0, 1 | DECOMP_INLINE, 0x7389},
+ {0x2F60, 0, 1 | DECOMP_INLINE, 0x74DC},
+ {0x2F61, 0, 1 | DECOMP_INLINE, 0x74E6},
+ {0x2F62, 0, 1 | DECOMP_INLINE, 0x7518},
+ {0x2F63, 0, 1 | DECOMP_INLINE, 0x751F},
+ {0x2F64, 0, 1 | DECOMP_INLINE, 0x7528},
+ {0x2F65, 0, 1 | DECOMP_INLINE, 0x7530},
+ {0x2F66, 0, 1 | DECOMP_INLINE, 0x758B},
+ {0x2F67, 0, 1 | DECOMP_INLINE, 0x7592},
+ {0x2F68, 0, 1 | DECOMP_INLINE, 0x7676},
+ {0x2F69, 0, 1 | DECOMP_INLINE, 0x767D},
+ {0x2F6A, 0, 1 | DECOMP_INLINE, 0x76AE},
+ {0x2F6B, 0, 1 | DECOMP_INLINE, 0x76BF},
+ {0x2F6C, 0, 1 | DECOMP_INLINE, 0x76EE},
+ {0x2F6D, 0, 1 | DECOMP_INLINE, 0x77DB},
+ {0x2F6E, 0, 1 | DECOMP_INLINE, 0x77E2},
+ {0x2F6F, 0, 1 | DECOMP_INLINE, 0x77F3},
+ {0x2F70, 0, 1 | DECOMP_INLINE, 0x793A},
+ {0x2F71, 0, 1 | DECOMP_INLINE, 0x79B8},
+ {0x2F72, 0, 1 | DECOMP_INLINE, 0x79BE},
+ {0x2F73, 0, 1 | DECOMP_INLINE, 0x7A74},
+ {0x2F74, 0, 1 | DECOMP_INLINE, 0x7ACB},
+ {0x2F75, 0, 1 | DECOMP_INLINE, 0x7AF9},
+ {0x2F76, 0, 1 | DECOMP_INLINE, 0x7C73},
+ {0x2F77, 0, 1 | DECOMP_INLINE, 0x7CF8},
+ {0x2F78, 0, 1 | DECOMP_INLINE, 0x7F36},
+ {0x2F79, 0, 1 | DECOMP_INLINE, 0x7F51},
+ {0x2F7A, 0, 1 | DECOMP_INLINE, 0x7F8A},
+ {0x2F7B, 0, 1 | DECOMP_INLINE, 0x7FBD},
+ {0x2F7C, 0, 1 | DECOMP_INLINE, 0x8001},
+ {0x2F7D, 0, 1 | DECOMP_INLINE, 0x800C},
+ {0x2F7E, 0, 1 | DECOMP_INLINE, 0x8012},
+ {0x2F7F, 0, 1 | DECOMP_INLINE, 0x8033},
+ {0x2F80, 0, 1 | DECOMP_INLINE, 0x807F},
+ {0x2F81, 0, 1 | DECOMP_INLINE, 0x8089},
+ {0x2F82, 0, 1 | DECOMP_INLINE, 0x81E3},
+ {0x2F83, 0, 1 | DECOMP_INLINE, 0x81EA},
+ {0x2F84, 0, 1 | DECOMP_INLINE, 0x81F3},
+ {0x2F85, 0, 1 | DECOMP_INLINE, 0x81FC},
+ {0x2F86, 0, 1 | DECOMP_INLINE, 0x820C},
+ {0x2F87, 0, 1 | DECOMP_INLINE, 0x821B},
+ {0x2F88, 0, 1 | DECOMP_INLINE, 0x821F},
+ {0x2F89, 0, 1 | DECOMP_INLINE, 0x826E},
+ {0x2F8A, 0, 1 | DECOMP_INLINE, 0x8272},
+ {0x2F8B, 0, 1 | DECOMP_INLINE, 0x8278},
+ {0x2F8C, 0, 1 | DECOMP_INLINE, 0x864D},
+ {0x2F8D, 0, 1 | DECOMP_INLINE, 0x866B},
+ {0x2F8E, 0, 1 | DECOMP_INLINE, 0x8840},
+ {0x2F8F, 0, 1 | DECOMP_INLINE, 0x884C},
+ {0x2F90, 0, 1 | DECOMP_INLINE, 0x8863},
+ {0x2F91, 0, 1 | DECOMP_INLINE, 0x897E},
+ {0x2F92, 0, 1 | DECOMP_INLINE, 0x898B},
+ {0x2F93, 0, 1 | DECOMP_INLINE, 0x89D2},
+ {0x2F94, 0, 1 | DECOMP_INLINE, 0x8A00},
+ {0x2F95, 0, 1 | DECOMP_INLINE, 0x8C37},
+ {0x2F96, 0, 1 | DECOMP_INLINE, 0x8C46},
+ {0x2F97, 0, 1 | DECOMP_INLINE, 0x8C55},
+ {0x2F98, 0, 1 | DECOMP_INLINE, 0x8C78},
+ {0x2F99, 0, 1 | DECOMP_INLINE, 0x8C9D},
+ {0x2F9A, 0, 1 | DECOMP_INLINE, 0x8D64},
+ {0x2F9B, 0, 1 | DECOMP_INLINE, 0x8D70},
+ {0x2F9C, 0, 1 | DECOMP_INLINE, 0x8DB3},
+ {0x2F9D, 0, 1 | DECOMP_INLINE, 0x8EAB},
+ {0x2F9E, 0, 1 | DECOMP_INLINE, 0x8ECA},
+ {0x2F9F, 0, 1 | DECOMP_INLINE, 0x8F9B},
+ {0x2FA0, 0, 1 | DECOMP_INLINE, 0x8FB0},
+ {0x2FA1, 0, 1 | DECOMP_INLINE, 0x8FB5},
+ {0x2FA2, 0, 1 | DECOMP_INLINE, 0x9091},
+ {0x2FA3, 0, 1 | DECOMP_INLINE, 0x9149},
+ {0x2FA4, 0, 1 | DECOMP_INLINE, 0x91C6},
+ {0x2FA5, 0, 1 | DECOMP_INLINE, 0x91CC},
+ {0x2FA6, 0, 1 | DECOMP_INLINE, 0x91D1},
+ {0x2FA7, 0, 1 | DECOMP_INLINE, 0x9577},
+ {0x2FA8, 0, 1 | DECOMP_INLINE, 0x9580},
+ {0x2FA9, 0, 1 | DECOMP_INLINE, 0x961C},
+ {0x2FAA, 0, 1 | DECOMP_INLINE, 0x96B6},
+ {0x2FAB, 0, 1 | DECOMP_INLINE, 0x96B9},
+ {0x2FAC, 0, 1 | DECOMP_INLINE, 0x96E8},
+ {0x2FAD, 0, 1 | DECOMP_INLINE, 0x9751},
+ {0x2FAE, 0, 1 | DECOMP_INLINE, 0x975E},
+ {0x2FAF, 0, 1 | DECOMP_INLINE, 0x9762},
+ {0x2FB0, 0, 1 | DECOMP_INLINE, 0x9769},
+ {0x2FB1, 0, 1 | DECOMP_INLINE, 0x97CB},
+ {0x2FB2, 0, 1 | DECOMP_INLINE, 0x97ED},
+ {0x2FB3, 0, 1 | DECOMP_INLINE, 0x97F3},
+ {0x2FB4, 0, 1 | DECOMP_INLINE, 0x9801},
+ {0x2FB5, 0, 1 | DECOMP_INLINE, 0x98A8},
+ {0x2FB6, 0, 1 | DECOMP_INLINE, 0x98DB},
+ {0x2FB7, 0, 1 | DECOMP_INLINE, 0x98DF},
+ {0x2FB8, 0, 1 | DECOMP_INLINE, 0x9996},
+ {0x2FB9, 0, 1 | DECOMP_INLINE, 0x9999},
+ {0x2FBA, 0, 1 | DECOMP_INLINE, 0x99AC},
+ {0x2FBB, 0, 1 | DECOMP_INLINE, 0x9AA8},
+ {0x2FBC, 0, 1 | DECOMP_INLINE, 0x9AD8},
+ {0x2FBD, 0, 1 | DECOMP_INLINE, 0x9ADF},
+ {0x2FBE, 0, 1 | DECOMP_INLINE, 0x9B25},
+ {0x2FBF, 0, 1 | DECOMP_INLINE, 0x9B2F},
+ {0x2FC0, 0, 1 | DECOMP_INLINE, 0x9B32},
+ {0x2FC1, 0, 1 | DECOMP_INLINE, 0x9B3C},
+ {0x2FC2, 0, 1 | DECOMP_INLINE, 0x9B5A},
+ {0x2FC3, 0, 1 | DECOMP_INLINE, 0x9CE5},
+ {0x2FC4, 0, 1 | DECOMP_INLINE, 0x9E75},
+ {0x2FC5, 0, 1 | DECOMP_INLINE, 0x9E7F},
+ {0x2FC6, 0, 1 | DECOMP_INLINE, 0x9EA5},
+ {0x2FC7, 0, 1 | DECOMP_INLINE, 0x9EBB},
+ {0x2FC8, 0, 1 | DECOMP_INLINE, 0x9EC3},
+ {0x2FC9, 0, 1 | DECOMP_INLINE, 0x9ECD},
+ {0x2FCA, 0, 1 | DECOMP_INLINE, 0x9ED1},
+ {0x2FCB, 0, 1 | DECOMP_INLINE, 0x9EF9},
+ {0x2FCC, 0, 1 | DECOMP_INLINE, 0x9EFD},
+ {0x2FCD, 0, 1 | DECOMP_INLINE, 0x9F0E},
+ {0x2FCE, 0, 1 | DECOMP_INLINE, 0x9F13},
+ {0x2FCF, 0, 1 | DECOMP_INLINE, 0x9F20},
+ {0x2FD0, 0, 1 | DECOMP_INLINE, 0x9F3B},
+ {0x2FD1, 0, 1 | DECOMP_INLINE, 0x9F4A},
+ {0x2FD2, 0, 1 | DECOMP_INLINE, 0x9F52},
+ {0x2FD3, 0, 1 | DECOMP_INLINE, 0x9F8D},
+ {0x2FD4, 0, 1 | DECOMP_INLINE, 0x9F9C},
+ {0x2FD5, 0, 1 | DECOMP_INLINE, 0x9FA0},
+ {0x3000, 0, 1 | DECOMP_INLINE, 0x0020},
+ {0x302A, 218, 0, 0},
+ {0x302B, 228, 0, 0},
+ {0x302C, 232, 0, 0},
+ {0x302D, 222, 0, 0},
+ {0x302E, 224, 0, 0},
+ {0x302F, 224, 0, 0},
+ {0x3036, 0, 1 | DECOMP_INLINE, 0x3012},
+ {0x3038, 0, 1 | DECOMP_INLINE, 0x5341},
+ {0x3039, 0, 1 | DECOMP_INLINE, 0x5344},
+ {0x303A, 0, 1 | DECOMP_INLINE, 0x5345},
+ {0x304C, 0, 2, 2317},
+ {0x304E, 0, 2, 2319},
+ {0x3050, 0, 2, 2321},
+ {0x3052, 0, 2, 2323},
+ {0x3054, 0, 2, 2325},
+ {0x3056, 0, 2, 2327},
+ {0x3058, 0, 2, 2329},
+ {0x305A, 0, 2, 2331},
+ {0x305C, 0, 2, 2333},
+ {0x305E, 0, 2, 2335},
+ {0x3060, 0, 2, 2337},
+ {0x3062, 0, 2, 2339},
+ {0x3065, 0, 2, 2341},
+ {0x3067, 0, 2, 2343},
+ {0x3069, 0, 2, 2345},
+ {0x3070, 0, 2, 2347},
+ {0x3071, 0, 2, 2349},
+ {0x3073, 0, 2, 2351},
+ {0x3074, 0, 2, 2353},
+ {0x3076, 0, 2, 2355},
+ {0x3077, 0, 2, 2357},
+ {0x3079, 0, 2, 2359},
+ {0x307A, 0, 2, 2361},
+ {0x307C, 0, 2, 2363},
+ {0x307D, 0, 2, 2365},
+ {0x3094, 0, 2, 2367},
+ {0x3099, 8, 0, 0},
+ {0x309A, 8, 0, 0},
+ {0x309B, 0, 2 | DECOMP_NO_COMPOSE, 2369}, /* compatibility mapping */
+ {0x309C, 0, 2 | DECOMP_NO_COMPOSE, 2371}, /* compatibility mapping */
+ {0x309E, 0, 2, 2373},
+ {0x309F, 0, 2 | DECOMP_NO_COMPOSE, 2375}, /* compatibility mapping */
+ {0x30AC, 0, 2, 2377},
+ {0x30AE, 0, 2, 2379},
+ {0x30B0, 0, 2, 2381},
+ {0x30B2, 0, 2, 2383},
+ {0x30B4, 0, 2, 2385},
+ {0x30B6, 0, 2, 2387},
+ {0x30B8, 0, 2, 2389},
+ {0x30BA, 0, 2, 2391},
+ {0x30BC, 0, 2, 2393},
+ {0x30BE, 0, 2, 2395},
+ {0x30C0, 0, 2, 2397},
+ {0x30C2, 0, 2, 2399},
+ {0x30C5, 0, 2, 2401},
+ {0x30C7, 0, 2, 2403},
+ {0x30C9, 0, 2, 2405},
+ {0x30D0, 0, 2, 2407},
+ {0x30D1, 0, 2, 2409},
+ {0x30D3, 0, 2, 2411},
+ {0x30D4, 0, 2, 2413},
+ {0x30D6, 0, 2, 2415},
+ {0x30D7, 0, 2, 2417},
+ {0x30D9, 0, 2, 2419},
+ {0x30DA, 0, 2, 2421},
+ {0x30DC, 0, 2, 2423},
+ {0x30DD, 0, 2, 2425},
+ {0x30F4, 0, 2, 2427},
+ {0x30F7, 0, 2, 2429},
+ {0x30F8, 0, 2, 2431},
+ {0x30F9, 0, 2, 2433},
+ {0x30FA, 0, 2, 2435},
+ {0x30FE, 0, 2, 2437},
+ {0x30FF, 0, 2 | DECOMP_NO_COMPOSE, 2439}, /* compatibility mapping */
+ {0x3131, 0, 1 | DECOMP_INLINE, 0x1100},
+ {0x3132, 0, 1 | DECOMP_INLINE, 0x1101},
+ {0x3133, 0, 1 | DECOMP_INLINE, 0x11AA},
+ {0x3134, 0, 1 | DECOMP_INLINE, 0x1102},
+ {0x3135, 0, 1 | DECOMP_INLINE, 0x11AC},
+ {0x3136, 0, 1 | DECOMP_INLINE, 0x11AD},
+ {0x3137, 0, 1 | DECOMP_INLINE, 0x1103},
+ {0x3138, 0, 1 | DECOMP_INLINE, 0x1104},
+ {0x3139, 0, 1 | DECOMP_INLINE, 0x1105},
+ {0x313A, 0, 1 | DECOMP_INLINE, 0x11B0},
+ {0x313B, 0, 1 | DECOMP_INLINE, 0x11B1},
+ {0x313C, 0, 1 | DECOMP_INLINE, 0x11B2},
+ {0x313D, 0, 1 | DECOMP_INLINE, 0x11B3},
+ {0x313E, 0, 1 | DECOMP_INLINE, 0x11B4},
+ {0x313F, 0, 1 | DECOMP_INLINE, 0x11B5},
+ {0x3140, 0, 1 | DECOMP_INLINE, 0x111A},
+ {0x3141, 0, 1 | DECOMP_INLINE, 0x1106},
+ {0x3142, 0, 1 | DECOMP_INLINE, 0x1107},
+ {0x3143, 0, 1 | DECOMP_INLINE, 0x1108},
+ {0x3144, 0, 1 | DECOMP_INLINE, 0x1121},
+ {0x3145, 0, 1 | DECOMP_INLINE, 0x1109},
+ {0x3146, 0, 1 | DECOMP_INLINE, 0x110A},
+ {0x3147, 0, 1 | DECOMP_INLINE, 0x110B},
+ {0x3148, 0, 1 | DECOMP_INLINE, 0x110C},
+ {0x3149, 0, 1 | DECOMP_INLINE, 0x110D},
+ {0x314A, 0, 1 | DECOMP_INLINE, 0x110E},
+ {0x314B, 0, 1 | DECOMP_INLINE, 0x110F},
+ {0x314C, 0, 1 | DECOMP_INLINE, 0x1110},
+ {0x314D, 0, 1 | DECOMP_INLINE, 0x1111},
+ {0x314E, 0, 1 | DECOMP_INLINE, 0x1112},
+ {0x314F, 0, 1 | DECOMP_INLINE, 0x1161},
+ {0x3150, 0, 1 | DECOMP_INLINE, 0x1162},
+ {0x3151, 0, 1 | DECOMP_INLINE, 0x1163},
+ {0x3152, 0, 1 | DECOMP_INLINE, 0x1164},
+ {0x3153, 0, 1 | DECOMP_INLINE, 0x1165},
+ {0x3154, 0, 1 | DECOMP_INLINE, 0x1166},
+ {0x3155, 0, 1 | DECOMP_INLINE, 0x1167},
+ {0x3156, 0, 1 | DECOMP_INLINE, 0x1168},
+ {0x3157, 0, 1 | DECOMP_INLINE, 0x1169},
+ {0x3158, 0, 1 | DECOMP_INLINE, 0x116A},
+ {0x3159, 0, 1 | DECOMP_INLINE, 0x116B},
+ {0x315A, 0, 1 | DECOMP_INLINE, 0x116C},
+ {0x315B, 0, 1 | DECOMP_INLINE, 0x116D},
+ {0x315C, 0, 1 | DECOMP_INLINE, 0x116E},
+ {0x315D, 0, 1 | DECOMP_INLINE, 0x116F},
+ {0x315E, 0, 1 | DECOMP_INLINE, 0x1170},
+ {0x315F, 0, 1 | DECOMP_INLINE, 0x1171},
+ {0x3160, 0, 1 | DECOMP_INLINE, 0x1172},
+ {0x3161, 0, 1 | DECOMP_INLINE, 0x1173},
+ {0x3162, 0, 1 | DECOMP_INLINE, 0x1174},
+ {0x3163, 0, 1 | DECOMP_INLINE, 0x1175},
+ {0x3164, 0, 1 | DECOMP_INLINE, 0x1160},
+ {0x3165, 0, 1 | DECOMP_INLINE, 0x1114},
+ {0x3166, 0, 1 | DECOMP_INLINE, 0x1115},
+ {0x3167, 0, 1 | DECOMP_INLINE, 0x11C7},
+ {0x3168, 0, 1 | DECOMP_INLINE, 0x11C8},
+ {0x3169, 0, 1 | DECOMP_INLINE, 0x11CC},
+ {0x316A, 0, 1 | DECOMP_INLINE, 0x11CE},
+ {0x316B, 0, 1 | DECOMP_INLINE, 0x11D3},
+ {0x316C, 0, 1 | DECOMP_INLINE, 0x11D7},
+ {0x316D, 0, 1 | DECOMP_INLINE, 0x11D9},
+ {0x316E, 0, 1 | DECOMP_INLINE, 0x111C},
+ {0x316F, 0, 1 | DECOMP_INLINE, 0x11DD},
+ {0x3170, 0, 1 | DECOMP_INLINE, 0x11DF},
+ {0x3171, 0, 1 | DECOMP_INLINE, 0x111D},
+ {0x3172, 0, 1 | DECOMP_INLINE, 0x111E},
+ {0x3173, 0, 1 | DECOMP_INLINE, 0x1120},
+ {0x3174, 0, 1 | DECOMP_INLINE, 0x1122},
+ {0x3175, 0, 1 | DECOMP_INLINE, 0x1123},
+ {0x3176, 0, 1 | DECOMP_INLINE, 0x1127},
+ {0x3177, 0, 1 | DECOMP_INLINE, 0x1129},
+ {0x3178, 0, 1 | DECOMP_INLINE, 0x112B},
+ {0x3179, 0, 1 | DECOMP_INLINE, 0x112C},
+ {0x317A, 0, 1 | DECOMP_INLINE, 0x112D},
+ {0x317B, 0, 1 | DECOMP_INLINE, 0x112E},
+ {0x317C, 0, 1 | DECOMP_INLINE, 0x112F},
+ {0x317D, 0, 1 | DECOMP_INLINE, 0x1132},
+ {0x317E, 0, 1 | DECOMP_INLINE, 0x1136},
+ {0x317F, 0, 1 | DECOMP_INLINE, 0x1140},
+ {0x3180, 0, 1 | DECOMP_INLINE, 0x1147},
+ {0x3181, 0, 1 | DECOMP_INLINE, 0x114C},
+ {0x3182, 0, 1 | DECOMP_INLINE, 0x11F1},
+ {0x3183, 0, 1 | DECOMP_INLINE, 0x11F2},
+ {0x3184, 0, 1 | DECOMP_INLINE, 0x1157},
+ {0x3185, 0, 1 | DECOMP_INLINE, 0x1158},
+ {0x3186, 0, 1 | DECOMP_INLINE, 0x1159},
+ {0x3187, 0, 1 | DECOMP_INLINE, 0x1184},
+ {0x3188, 0, 1 | DECOMP_INLINE, 0x1185},
+ {0x3189, 0, 1 | DECOMP_INLINE, 0x1188},
+ {0x318A, 0, 1 | DECOMP_INLINE, 0x1191},
+ {0x318B, 0, 1 | DECOMP_INLINE, 0x1192},
+ {0x318C, 0, 1 | DECOMP_INLINE, 0x1194},
+ {0x318D, 0, 1 | DECOMP_INLINE, 0x119E},
+ {0x318E, 0, 1 | DECOMP_INLINE, 0x11A1},
+ {0x3192, 0, 1 | DECOMP_INLINE, 0x4E00},
+ {0x3193, 0, 1 | DECOMP_INLINE, 0x4E8C},
+ {0x3194, 0, 1 | DECOMP_INLINE, 0x4E09},
+ {0x3195, 0, 1 | DECOMP_INLINE, 0x56DB},
+ {0x3196, 0, 1 | DECOMP_INLINE, 0x4E0A},
+ {0x3197, 0, 1 | DECOMP_INLINE, 0x4E2D},
+ {0x3198, 0, 1 | DECOMP_INLINE, 0x4E0B},
+ {0x3199, 0, 1 | DECOMP_INLINE, 0x7532},
+ {0x319A, 0, 1 | DECOMP_INLINE, 0x4E59},
+ {0x319B, 0, 1 | DECOMP_INLINE, 0x4E19},
+ {0x319C, 0, 1 | DECOMP_INLINE, 0x4E01},
+ {0x319D, 0, 1 | DECOMP_INLINE, 0x5929},
+ {0x319E, 0, 1 | DECOMP_INLINE, 0x5730},
+ {0x319F, 0, 1 | DECOMP_INLINE, 0x4EBA},
+ {0x3200, 0, 3, 2441},
+ {0x3201, 0, 3, 2444},
+ {0x3202, 0, 3, 2447},
+ {0x3203, 0, 3, 2450},
+ {0x3204, 0, 3, 2453},
+ {0x3205, 0, 3, 2456},
+ {0x3206, 0, 3, 2459},
+ {0x3207, 0, 3, 2462},
+ {0x3208, 0, 3, 2465},
+ {0x3209, 0, 3, 2468},
+ {0x320A, 0, 3, 2471},
+ {0x320B, 0, 3, 2474},
+ {0x320C, 0, 3, 2477},
+ {0x320D, 0, 3, 2480},
+ {0x320E, 0, 4, 2483},
+ {0x320F, 0, 4, 2487},
+ {0x3210, 0, 4, 2491},
+ {0x3211, 0, 4, 2495},
+ {0x3212, 0, 4, 2499},
+ {0x3213, 0, 4, 2503},
+ {0x3214, 0, 4, 2507},
+ {0x3215, 0, 4, 2511},
+ {0x3216, 0, 4, 2515},
+ {0x3217, 0, 4, 2519},
+ {0x3218, 0, 4, 2523},
+ {0x3219, 0, 4, 2527},
+ {0x321A, 0, 4, 2531},
+ {0x321B, 0, 4, 2535},
+ {0x321C, 0, 4, 2539},
+ {0x321D, 0, 7, 2543},
+ {0x321E, 0, 6, 2550},
+ {0x3220, 0, 3, 2556},
+ {0x3221, 0, 3, 2559},
+ {0x3222, 0, 3, 2562},
+ {0x3223, 0, 3, 2565},
+ {0x3224, 0, 3, 2568},
+ {0x3225, 0, 3, 2571},
+ {0x3226, 0, 3, 2574},
+ {0x3227, 0, 3, 2577},
+ {0x3228, 0, 3, 2580},
+ {0x3229, 0, 3, 2583},
+ {0x322A, 0, 3, 2586},
+ {0x322B, 0, 3, 2589},
+ {0x322C, 0, 3, 2592},
+ {0x322D, 0, 3, 2595},
+ {0x322E, 0, 3, 2598},
+ {0x322F, 0, 3, 2601},
+ {0x3230, 0, 3, 2604},
+ {0x3231, 0, 3, 2607},
+ {0x3232, 0, 3, 2610},
+ {0x3233, 0, 3, 2613},
+ {0x3234, 0, 3, 2616},
+ {0x3235, 0, 3, 2619},
+ {0x3236, 0, 3, 2622},
+ {0x3237, 0, 3, 2625},
+ {0x3238, 0, 3, 2628},
+ {0x3239, 0, 3, 2631},
+ {0x323A, 0, 3, 2634},
+ {0x323B, 0, 3, 2637},
+ {0x323C, 0, 3, 2640},
+ {0x323D, 0, 3, 2643},
+ {0x323E, 0, 3, 2646},
+ {0x323F, 0, 3, 2649},
+ {0x3240, 0, 3, 2652},
+ {0x3241, 0, 3, 2655},
+ {0x3242, 0, 3, 2658},
+ {0x3243, 0, 3, 2661},
+ {0x3244, 0, 1 | DECOMP_INLINE, 0x554F},
+ {0x3245, 0, 1 | DECOMP_INLINE, 0x5E7C},
+ {0x3246, 0, 1 | DECOMP_INLINE, 0x6587},
+ {0x3247, 0, 1 | DECOMP_INLINE, 0x7B8F},
+ {0x3250, 0, 3, 2664},
+ {0x3251, 0, 2 | DECOMP_NO_COMPOSE, 2667}, /* compatibility mapping */
+ {0x3252, 0, 2 | DECOMP_NO_COMPOSE, 2669}, /* compatibility mapping */
+ {0x3253, 0, 2 | DECOMP_NO_COMPOSE, 2671}, /* compatibility mapping */
+ {0x3254, 0, 2 | DECOMP_NO_COMPOSE, 2673}, /* compatibility mapping */
+ {0x3255, 0, 2 | DECOMP_NO_COMPOSE, 2675}, /* compatibility mapping */
+ {0x3256, 0, 2 | DECOMP_NO_COMPOSE, 2677}, /* compatibility mapping */
+ {0x3257, 0, 2 | DECOMP_NO_COMPOSE, 2679}, /* compatibility mapping */
+ {0x3258, 0, 2 | DECOMP_NO_COMPOSE, 2681}, /* compatibility mapping */
+ {0x3259, 0, 2 | DECOMP_NO_COMPOSE, 2683}, /* compatibility mapping */
+ {0x325A, 0, 2 | DECOMP_NO_COMPOSE, 2685}, /* compatibility mapping */
+ {0x325B, 0, 2 | DECOMP_NO_COMPOSE, 2687}, /* compatibility mapping */
+ {0x325C, 0, 2 | DECOMP_NO_COMPOSE, 2689}, /* compatibility mapping */
+ {0x325D, 0, 2 | DECOMP_NO_COMPOSE, 2691}, /* compatibility mapping */
+ {0x325E, 0, 2 | DECOMP_NO_COMPOSE, 2693}, /* compatibility mapping */
+ {0x325F, 0, 2 | DECOMP_NO_COMPOSE, 2695}, /* compatibility mapping */
+ {0x3260, 0, 1 | DECOMP_INLINE, 0x1100},
+ {0x3261, 0, 1 | DECOMP_INLINE, 0x1102},
+ {0x3262, 0, 1 | DECOMP_INLINE, 0x1103},
+ {0x3263, 0, 1 | DECOMP_INLINE, 0x1105},
+ {0x3264, 0, 1 | DECOMP_INLINE, 0x1106},
+ {0x3265, 0, 1 | DECOMP_INLINE, 0x1107},
+ {0x3266, 0, 1 | DECOMP_INLINE, 0x1109},
+ {0x3267, 0, 1 | DECOMP_INLINE, 0x110B},
+ {0x3268, 0, 1 | DECOMP_INLINE, 0x110C},
+ {0x3269, 0, 1 | DECOMP_INLINE, 0x110E},
+ {0x326A, 0, 1 | DECOMP_INLINE, 0x110F},
+ {0x326B, 0, 1 | DECOMP_INLINE, 0x1110},
+ {0x326C, 0, 1 | DECOMP_INLINE, 0x1111},
+ {0x326D, 0, 1 | DECOMP_INLINE, 0x1112},
+ {0x326E, 0, 2 | DECOMP_NO_COMPOSE, 2697}, /* compatibility mapping */
+ {0x326F, 0, 2 | DECOMP_NO_COMPOSE, 2699}, /* compatibility mapping */
+ {0x3270, 0, 2 | DECOMP_NO_COMPOSE, 2701}, /* compatibility mapping */
+ {0x3271, 0, 2 | DECOMP_NO_COMPOSE, 2703}, /* compatibility mapping */
+ {0x3272, 0, 2 | DECOMP_NO_COMPOSE, 2705}, /* compatibility mapping */
+ {0x3273, 0, 2 | DECOMP_NO_COMPOSE, 2707}, /* compatibility mapping */
+ {0x3274, 0, 2 | DECOMP_NO_COMPOSE, 2709}, /* compatibility mapping */
+ {0x3275, 0, 2 | DECOMP_NO_COMPOSE, 2711}, /* compatibility mapping */
+ {0x3276, 0, 2 | DECOMP_NO_COMPOSE, 2713}, /* compatibility mapping */
+ {0x3277, 0, 2 | DECOMP_NO_COMPOSE, 2715}, /* compatibility mapping */
+ {0x3278, 0, 2 | DECOMP_NO_COMPOSE, 2717}, /* compatibility mapping */
+ {0x3279, 0, 2 | DECOMP_NO_COMPOSE, 2719}, /* compatibility mapping */
+ {0x327A, 0, 2 | DECOMP_NO_COMPOSE, 2721}, /* compatibility mapping */
+ {0x327B, 0, 2 | DECOMP_NO_COMPOSE, 2723}, /* compatibility mapping */
+ {0x327C, 0, 5, 2725},
+ {0x327D, 0, 4, 2730},
+ {0x327E, 0, 2 | DECOMP_NO_COMPOSE, 2734}, /* compatibility mapping */
+ {0x3280, 0, 1 | DECOMP_INLINE, 0x4E00},
+ {0x3281, 0, 1 | DECOMP_INLINE, 0x4E8C},
+ {0x3282, 0, 1 | DECOMP_INLINE, 0x4E09},
+ {0x3283, 0, 1 | DECOMP_INLINE, 0x56DB},
+ {0x3284, 0, 1 | DECOMP_INLINE, 0x4E94},
+ {0x3285, 0, 1 | DECOMP_INLINE, 0x516D},
+ {0x3286, 0, 1 | DECOMP_INLINE, 0x4E03},
+ {0x3287, 0, 1 | DECOMP_INLINE, 0x516B},
+ {0x3288, 0, 1 | DECOMP_INLINE, 0x4E5D},
+ {0x3289, 0, 1 | DECOMP_INLINE, 0x5341},
+ {0x328A, 0, 1 | DECOMP_INLINE, 0x6708},
+ {0x328B, 0, 1 | DECOMP_INLINE, 0x706B},
+ {0x328C, 0, 1 | DECOMP_INLINE, 0x6C34},
+ {0x328D, 0, 1 | DECOMP_INLINE, 0x6728},
+ {0x328E, 0, 1 | DECOMP_INLINE, 0x91D1},
+ {0x328F, 0, 1 | DECOMP_INLINE, 0x571F},
+ {0x3290, 0, 1 | DECOMP_INLINE, 0x65E5},
+ {0x3291, 0, 1 | DECOMP_INLINE, 0x682A},
+ {0x3292, 0, 1 | DECOMP_INLINE, 0x6709},
+ {0x3293, 0, 1 | DECOMP_INLINE, 0x793E},
+ {0x3294, 0, 1 | DECOMP_INLINE, 0x540D},
+ {0x3295, 0, 1 | DECOMP_INLINE, 0x7279},
+ {0x3296, 0, 1 | DECOMP_INLINE, 0x8CA1},
+ {0x3297, 0, 1 | DECOMP_INLINE, 0x795D},
+ {0x3298, 0, 1 | DECOMP_INLINE, 0x52B4},
+ {0x3299, 0, 1 | DECOMP_INLINE, 0x79D8},
+ {0x329A, 0, 1 | DECOMP_INLINE, 0x7537},
+ {0x329B, 0, 1 | DECOMP_INLINE, 0x5973},
+ {0x329C, 0, 1 | DECOMP_INLINE, 0x9069},
+ {0x329D, 0, 1 | DECOMP_INLINE, 0x512A},
+ {0x329E, 0, 1 | DECOMP_INLINE, 0x5370},
+ {0x329F, 0, 1 | DECOMP_INLINE, 0x6CE8},
+ {0x32A0, 0, 1 | DECOMP_INLINE, 0x9805},
+ {0x32A1, 0, 1 | DECOMP_INLINE, 0x4F11},
+ {0x32A2, 0, 1 | DECOMP_INLINE, 0x5199},
+ {0x32A3, 0, 1 | DECOMP_INLINE, 0x6B63},
+ {0x32A4, 0, 1 | DECOMP_INLINE, 0x4E0A},
+ {0x32A5, 0, 1 | DECOMP_INLINE, 0x4E2D},
+ {0x32A6, 0, 1 | DECOMP_INLINE, 0x4E0B},
+ {0x32A7, 0, 1 | DECOMP_INLINE, 0x5DE6},
+ {0x32A8, 0, 1 | DECOMP_INLINE, 0x53F3},
+ {0x32A9, 0, 1 | DECOMP_INLINE, 0x533B},
+ {0x32AA, 0, 1 | DECOMP_INLINE, 0x5B97},
+ {0x32AB, 0, 1 | DECOMP_INLINE, 0x5B66},
+ {0x32AC, 0, 1 | DECOMP_INLINE, 0x76E3},
+ {0x32AD, 0, 1 | DECOMP_INLINE, 0x4F01},
+ {0x32AE, 0, 1 | DECOMP_INLINE, 0x8CC7},
+ {0x32AF, 0, 1 | DECOMP_INLINE, 0x5354},
+ {0x32B0, 0, 1 | DECOMP_INLINE, 0x591C},
+ {0x32B1, 0, 2 | DECOMP_NO_COMPOSE, 2736}, /* compatibility mapping */
+ {0x32B2, 0, 2 | DECOMP_NO_COMPOSE, 2738}, /* compatibility mapping */
+ {0x32B3, 0, 2 | DECOMP_NO_COMPOSE, 2740}, /* compatibility mapping */
+ {0x32B4, 0, 2 | DECOMP_NO_COMPOSE, 2742}, /* compatibility mapping */
+ {0x32B5, 0, 2 | DECOMP_NO_COMPOSE, 2744}, /* compatibility mapping */
+ {0x32B6, 0, 2 | DECOMP_NO_COMPOSE, 2746}, /* compatibility mapping */
+ {0x32B7, 0, 2 | DECOMP_NO_COMPOSE, 2748}, /* compatibility mapping */
+ {0x32B8, 0, 2 | DECOMP_NO_COMPOSE, 2750}, /* compatibility mapping */
+ {0x32B9, 0, 2 | DECOMP_NO_COMPOSE, 2752}, /* compatibility mapping */
+ {0x32BA, 0, 2 | DECOMP_NO_COMPOSE, 2754}, /* compatibility mapping */
+ {0x32BB, 0, 2 | DECOMP_NO_COMPOSE, 2756}, /* compatibility mapping */
+ {0x32BC, 0, 2 | DECOMP_NO_COMPOSE, 2758}, /* compatibility mapping */
+ {0x32BD, 0, 2 | DECOMP_NO_COMPOSE, 2760}, /* compatibility mapping */
+ {0x32BE, 0, 2 | DECOMP_NO_COMPOSE, 2762}, /* compatibility mapping */
+ {0x32BF, 0, 2 | DECOMP_NO_COMPOSE, 2764}, /* compatibility mapping */
+ {0x32C0, 0, 2 | DECOMP_NO_COMPOSE, 2766}, /* compatibility mapping */
+ {0x32C1, 0, 2 | DECOMP_NO_COMPOSE, 2768}, /* compatibility mapping */
+ {0x32C2, 0, 2 | DECOMP_NO_COMPOSE, 2770}, /* compatibility mapping */
+ {0x32C3, 0, 2 | DECOMP_NO_COMPOSE, 2772}, /* compatibility mapping */
+ {0x32C4, 0, 2 | DECOMP_NO_COMPOSE, 2774}, /* compatibility mapping */
+ {0x32C5, 0, 2 | DECOMP_NO_COMPOSE, 2776}, /* compatibility mapping */
+ {0x32C6, 0, 2 | DECOMP_NO_COMPOSE, 2778}, /* compatibility mapping */
+ {0x32C7, 0, 2 | DECOMP_NO_COMPOSE, 2780}, /* compatibility mapping */
+ {0x32C8, 0, 2 | DECOMP_NO_COMPOSE, 2782}, /* compatibility mapping */
+ {0x32C9, 0, 3, 2784},
+ {0x32CA, 0, 3, 2787},
+ {0x32CB, 0, 3, 2790},
+ {0x32CC, 0, 2 | DECOMP_NO_COMPOSE, 2793}, /* compatibility mapping */
+ {0x32CD, 0, 3, 2795},
+ {0x32CE, 0, 2 | DECOMP_NO_COMPOSE, 2798}, /* compatibility mapping */
+ {0x32CF, 0, 3, 2800},
+ {0x32D0, 0, 1 | DECOMP_INLINE, 0x30A2},
+ {0x32D1, 0, 1 | DECOMP_INLINE, 0x30A4},
+ {0x32D2, 0, 1 | DECOMP_INLINE, 0x30A6},
+ {0x32D3, 0, 1 | DECOMP_INLINE, 0x30A8},
+ {0x32D4, 0, 1 | DECOMP_INLINE, 0x30AA},
+ {0x32D5, 0, 1 | DECOMP_INLINE, 0x30AB},
+ {0x32D6, 0, 1 | DECOMP_INLINE, 0x30AD},
+ {0x32D7, 0, 1 | DECOMP_INLINE, 0x30AF},
+ {0x32D8, 0, 1 | DECOMP_INLINE, 0x30B1},
+ {0x32D9, 0, 1 | DECOMP_INLINE, 0x30B3},
+ {0x32DA, 0, 1 | DECOMP_INLINE, 0x30B5},
+ {0x32DB, 0, 1 | DECOMP_INLINE, 0x30B7},
+ {0x32DC, 0, 1 | DECOMP_INLINE, 0x30B9},
+ {0x32DD, 0, 1 | DECOMP_INLINE, 0x30BB},
+ {0x32DE, 0, 1 | DECOMP_INLINE, 0x30BD},
+ {0x32DF, 0, 1 | DECOMP_INLINE, 0x30BF},
+ {0x32E0, 0, 1 | DECOMP_INLINE, 0x30C1},
+ {0x32E1, 0, 1 | DECOMP_INLINE, 0x30C4},
+ {0x32E2, 0, 1 | DECOMP_INLINE, 0x30C6},
+ {0x32E3, 0, 1 | DECOMP_INLINE, 0x30C8},
+ {0x32E4, 0, 1 | DECOMP_INLINE, 0x30CA},
+ {0x32E5, 0, 1 | DECOMP_INLINE, 0x30CB},
+ {0x32E6, 0, 1 | DECOMP_INLINE, 0x30CC},
+ {0x32E7, 0, 1 | DECOMP_INLINE, 0x30CD},
+ {0x32E8, 0, 1 | DECOMP_INLINE, 0x30CE},
+ {0x32E9, 0, 1 | DECOMP_INLINE, 0x30CF},
+ {0x32EA, 0, 1 | DECOMP_INLINE, 0x30D2},
+ {0x32EB, 0, 1 | DECOMP_INLINE, 0x30D5},
+ {0x32EC, 0, 1 | DECOMP_INLINE, 0x30D8},
+ {0x32ED, 0, 1 | DECOMP_INLINE, 0x30DB},
+ {0x32EE, 0, 1 | DECOMP_INLINE, 0x30DE},
+ {0x32EF, 0, 1 | DECOMP_INLINE, 0x30DF},
+ {0x32F0, 0, 1 | DECOMP_INLINE, 0x30E0},
+ {0x32F1, 0, 1 | DECOMP_INLINE, 0x30E1},
+ {0x32F2, 0, 1 | DECOMP_INLINE, 0x30E2},
+ {0x32F3, 0, 1 | DECOMP_INLINE, 0x30E4},
+ {0x32F4, 0, 1 | DECOMP_INLINE, 0x30E6},
+ {0x32F5, 0, 1 | DECOMP_INLINE, 0x30E8},
+ {0x32F6, 0, 1 | DECOMP_INLINE, 0x30E9},
+ {0x32F7, 0, 1 | DECOMP_INLINE, 0x30EA},
+ {0x32F8, 0, 1 | DECOMP_INLINE, 0x30EB},
+ {0x32F9, 0, 1 | DECOMP_INLINE, 0x30EC},
+ {0x32FA, 0, 1 | DECOMP_INLINE, 0x30ED},
+ {0x32FB, 0, 1 | DECOMP_INLINE, 0x30EF},
+ {0x32FC, 0, 1 | DECOMP_INLINE, 0x30F0},
+ {0x32FD, 0, 1 | DECOMP_INLINE, 0x30F1},
+ {0x32FE, 0, 1 | DECOMP_INLINE, 0x30F2},
+ {0x3300, 0, 4, 2803},
+ {0x3301, 0, 4, 2807},
+ {0x3302, 0, 4, 2811},
+ {0x3303, 0, 3, 2815},
+ {0x3304, 0, 4, 2818},
+ {0x3305, 0, 3, 2822},
+ {0x3306, 0, 3, 2825},
+ {0x3307, 0, 5, 2828},
+ {0x3308, 0, 4, 2833},
+ {0x3309, 0, 3, 2837},
+ {0x330A, 0, 3, 2840},
+ {0x330B, 0, 3, 2843},
+ {0x330C, 0, 4, 2846},
+ {0x330D, 0, 4, 2850},
+ {0x330E, 0, 3, 2854},
+ {0x330F, 0, 3, 2857},
+ {0x3310, 0, 2 | DECOMP_NO_COMPOSE, 2860}, /* compatibility mapping */
+ {0x3311, 0, 3, 2862},
+ {0x3312, 0, 4, 2865},
+ {0x3313, 0, 4, 2869},
+ {0x3314, 0, 2 | DECOMP_NO_COMPOSE, 2873}, /* compatibility mapping */
+ {0x3315, 0, 5, 2875},
+ {0x3316, 0, 6, 2880},
+ {0x3317, 0, 5, 2886},
+ {0x3318, 0, 3, 2891},
+ {0x3319, 0, 5, 2894},
+ {0x331A, 0, 5, 2899},
+ {0x331B, 0, 4, 2904},
+ {0x331C, 0, 3, 2908},
+ {0x331D, 0, 3, 2911},
+ {0x331E, 0, 3, 2914},
+ {0x331F, 0, 4, 2917},
+ {0x3320, 0, 5, 2921},
+ {0x3321, 0, 4, 2926},
+ {0x3322, 0, 3, 2930},
+ {0x3323, 0, 3, 2933},
+ {0x3324, 0, 3, 2936},
+ {0x3325, 0, 2 | DECOMP_NO_COMPOSE, 2939}, /* compatibility mapping */
+ {0x3326, 0, 2 | DECOMP_NO_COMPOSE, 2941}, /* compatibility mapping */
+ {0x3327, 0, 2 | DECOMP_NO_COMPOSE, 2943}, /* compatibility mapping */
+ {0x3328, 0, 2 | DECOMP_NO_COMPOSE, 2945}, /* compatibility mapping */
+ {0x3329, 0, 3, 2947},
+ {0x332A, 0, 3, 2950},
+ {0x332B, 0, 5, 2953},
+ {0x332C, 0, 3, 2958},
+ {0x332D, 0, 4, 2961},
+ {0x332E, 0, 5, 2965},
+ {0x332F, 0, 3, 2970},
+ {0x3330, 0, 2 | DECOMP_NO_COMPOSE, 2973}, /* compatibility mapping */
+ {0x3331, 0, 2 | DECOMP_NO_COMPOSE, 2975}, /* compatibility mapping */
+ {0x3332, 0, 5, 2977},
+ {0x3333, 0, 4, 2982},
+ {0x3334, 0, 5, 2986},
+ {0x3335, 0, 3, 2991},
+ {0x3336, 0, 5, 2994},
+ {0x3337, 0, 2 | DECOMP_NO_COMPOSE, 2999}, /* compatibility mapping */
+ {0x3338, 0, 3, 3001},
+ {0x3339, 0, 3, 3004},
+ {0x333A, 0, 3, 3007},
+ {0x333B, 0, 3, 3010},
+ {0x333C, 0, 3, 3013},
+ {0x333D, 0, 4, 3016},
+ {0x333E, 0, 3, 3020},
+ {0x333F, 0, 2 | DECOMP_NO_COMPOSE, 3023}, /* compatibility mapping */
+ {0x3340, 0, 3, 3025},
+ {0x3341, 0, 3, 3028},
+ {0x3342, 0, 3, 3031},
+ {0x3343, 0, 4, 3034},
+ {0x3344, 0, 3, 3038},
+ {0x3345, 0, 3, 3041},
+ {0x3346, 0, 3, 3044},
+ {0x3347, 0, 5, 3047},
+ {0x3348, 0, 4, 3052},
+ {0x3349, 0, 2 | DECOMP_NO_COMPOSE, 3056}, /* compatibility mapping */
+ {0x334A, 0, 5, 3058},
+ {0x334B, 0, 2 | DECOMP_NO_COMPOSE, 3063}, /* compatibility mapping */
+ {0x334C, 0, 4, 3065},
+ {0x334D, 0, 4, 3069},
+ {0x334E, 0, 3, 3073},
+ {0x334F, 0, 3, 3076},
+ {0x3350, 0, 3, 3079},
+ {0x3351, 0, 4, 3082},
+ {0x3352, 0, 2 | DECOMP_NO_COMPOSE, 3086}, /* compatibility mapping */
+ {0x3353, 0, 3, 3088},
+ {0x3354, 0, 4, 3091},
+ {0x3355, 0, 2 | DECOMP_NO_COMPOSE, 3095}, /* compatibility mapping */
+ {0x3356, 0, 5, 3097},
+ {0x3357, 0, 3, 3102},
+ {0x3358, 0, 2 | DECOMP_NO_COMPOSE, 3105}, /* compatibility mapping */
+ {0x3359, 0, 2 | DECOMP_NO_COMPOSE, 3107}, /* compatibility mapping */
+ {0x335A, 0, 2 | DECOMP_NO_COMPOSE, 3109}, /* compatibility mapping */
+ {0x335B, 0, 2 | DECOMP_NO_COMPOSE, 3111}, /* compatibility mapping */
+ {0x335C, 0, 2 | DECOMP_NO_COMPOSE, 3113}, /* compatibility mapping */
+ {0x335D, 0, 2 | DECOMP_NO_COMPOSE, 3115}, /* compatibility mapping */
+ {0x335E, 0, 2 | DECOMP_NO_COMPOSE, 3117}, /* compatibility mapping */
+ {0x335F, 0, 2 | DECOMP_NO_COMPOSE, 3119}, /* compatibility mapping */
+ {0x3360, 0, 2 | DECOMP_NO_COMPOSE, 3121}, /* compatibility mapping */
+ {0x3361, 0, 2 | DECOMP_NO_COMPOSE, 3123}, /* compatibility mapping */
+ {0x3362, 0, 3, 3125},
+ {0x3363, 0, 3, 3128},
+ {0x3364, 0, 3, 3131},
+ {0x3365, 0, 3, 3134},
+ {0x3366, 0, 3, 3137},
+ {0x3367, 0, 3, 3140},
+ {0x3368, 0, 3, 3143},
+ {0x3369, 0, 3, 3146},
+ {0x336A, 0, 3, 3149},
+ {0x336B, 0, 3, 3152},
+ {0x336C, 0, 3, 3155},
+ {0x336D, 0, 3, 3158},
+ {0x336E, 0, 3, 3161},
+ {0x336F, 0, 3, 3164},
+ {0x3370, 0, 3, 3167},
+ {0x3371, 0, 3, 3170},
+ {0x3372, 0, 2 | DECOMP_NO_COMPOSE, 3173}, /* compatibility mapping */
+ {0x3373, 0, 2 | DECOMP_NO_COMPOSE, 3175}, /* compatibility mapping */
+ {0x3374, 0, 3, 3177},
+ {0x3375, 0, 2 | DECOMP_NO_COMPOSE, 3180}, /* compatibility mapping */
+ {0x3376, 0, 2 | DECOMP_NO_COMPOSE, 3182}, /* compatibility mapping */
+ {0x3377, 0, 2 | DECOMP_NO_COMPOSE, 3184}, /* compatibility mapping */
+ {0x3378, 0, 3, 3186},
+ {0x3379, 0, 3, 3189},
+ {0x337A, 0, 2 | DECOMP_NO_COMPOSE, 3192}, /* compatibility mapping */
+ {0x337B, 0, 2 | DECOMP_NO_COMPOSE, 3194}, /* compatibility mapping */
+ {0x337C, 0, 2 | DECOMP_NO_COMPOSE, 3196}, /* compatibility mapping */
+ {0x337D, 0, 2 | DECOMP_NO_COMPOSE, 3198}, /* compatibility mapping */
+ {0x337E, 0, 2 | DECOMP_NO_COMPOSE, 3200}, /* compatibility mapping */
+ {0x337F, 0, 4, 3202},
+ {0x3380, 0, 2 | DECOMP_NO_COMPOSE, 3206}, /* compatibility mapping */
+ {0x3381, 0, 2 | DECOMP_NO_COMPOSE, 3208}, /* compatibility mapping */
+ {0x3382, 0, 2 | DECOMP_NO_COMPOSE, 3210}, /* compatibility mapping */
+ {0x3383, 0, 2 | DECOMP_NO_COMPOSE, 3212}, /* compatibility mapping */
+ {0x3384, 0, 2 | DECOMP_NO_COMPOSE, 3214}, /* compatibility mapping */
+ {0x3385, 0, 2 | DECOMP_NO_COMPOSE, 3216}, /* compatibility mapping */
+ {0x3386, 0, 2 | DECOMP_NO_COMPOSE, 3218}, /* compatibility mapping */
+ {0x3387, 0, 2 | DECOMP_NO_COMPOSE, 3220}, /* compatibility mapping */
+ {0x3388, 0, 3, 3222},
+ {0x3389, 0, 4, 3225},
+ {0x338A, 0, 2 | DECOMP_NO_COMPOSE, 3229}, /* compatibility mapping */
+ {0x338B, 0, 2 | DECOMP_NO_COMPOSE, 3231}, /* compatibility mapping */
+ {0x338C, 0, 2 | DECOMP_NO_COMPOSE, 3233}, /* compatibility mapping */
+ {0x338D, 0, 2 | DECOMP_NO_COMPOSE, 3235}, /* compatibility mapping */
+ {0x338E, 0, 2 | DECOMP_NO_COMPOSE, 3237}, /* compatibility mapping */
+ {0x338F, 0, 2 | DECOMP_NO_COMPOSE, 3239}, /* compatibility mapping */
+ {0x3390, 0, 2 | DECOMP_NO_COMPOSE, 3241}, /* compatibility mapping */
+ {0x3391, 0, 3, 3243},
+ {0x3392, 0, 3, 3246},
+ {0x3393, 0, 3, 3249},
+ {0x3394, 0, 3, 3252},
+ {0x3395, 0, 2 | DECOMP_NO_COMPOSE, 3255}, /* compatibility mapping */
+ {0x3396, 0, 2 | DECOMP_NO_COMPOSE, 3257}, /* compatibility mapping */
+ {0x3397, 0, 2 | DECOMP_NO_COMPOSE, 3259}, /* compatibility mapping */
+ {0x3398, 0, 2 | DECOMP_NO_COMPOSE, 3261}, /* compatibility mapping */
+ {0x3399, 0, 2 | DECOMP_NO_COMPOSE, 3263}, /* compatibility mapping */
+ {0x339A, 0, 2 | DECOMP_NO_COMPOSE, 3265}, /* compatibility mapping */
+ {0x339B, 0, 2 | DECOMP_NO_COMPOSE, 3267}, /* compatibility mapping */
+ {0x339C, 0, 2 | DECOMP_NO_COMPOSE, 3269}, /* compatibility mapping */
+ {0x339D, 0, 2 | DECOMP_NO_COMPOSE, 3271}, /* compatibility mapping */
+ {0x339E, 0, 2 | DECOMP_NO_COMPOSE, 3273}, /* compatibility mapping */
+ {0x339F, 0, 3, 3275},
+ {0x33A0, 0, 3, 3278},
+ {0x33A1, 0, 2 | DECOMP_NO_COMPOSE, 3281}, /* compatibility mapping */
+ {0x33A2, 0, 3, 3283},
+ {0x33A3, 0, 3, 3286},
+ {0x33A4, 0, 3, 3289},
+ {0x33A5, 0, 2 | DECOMP_NO_COMPOSE, 3292}, /* compatibility mapping */
+ {0x33A6, 0, 3, 3294},
+ {0x33A7, 0, 3, 3297},
+ {0x33A8, 0, 4, 3300},
+ {0x33A9, 0, 2 | DECOMP_NO_COMPOSE, 3304}, /* compatibility mapping */
+ {0x33AA, 0, 3, 3306},
+ {0x33AB, 0, 3, 3309},
+ {0x33AC, 0, 3, 3312},
+ {0x33AD, 0, 3, 3315},
+ {0x33AE, 0, 5, 3318},
+ {0x33AF, 0, 6, 3323},
+ {0x33B0, 0, 2 | DECOMP_NO_COMPOSE, 3329}, /* compatibility mapping */
+ {0x33B1, 0, 2 | DECOMP_NO_COMPOSE, 3331}, /* compatibility mapping */
+ {0x33B2, 0, 2 | DECOMP_NO_COMPOSE, 3333}, /* compatibility mapping */
+ {0x33B3, 0, 2 | DECOMP_NO_COMPOSE, 3335}, /* compatibility mapping */
+ {0x33B4, 0, 2 | DECOMP_NO_COMPOSE, 3337}, /* compatibility mapping */
+ {0x33B5, 0, 2 | DECOMP_NO_COMPOSE, 3339}, /* compatibility mapping */
+ {0x33B6, 0, 2 | DECOMP_NO_COMPOSE, 3341}, /* compatibility mapping */
+ {0x33B7, 0, 2 | DECOMP_NO_COMPOSE, 3343}, /* compatibility mapping */
+ {0x33B8, 0, 2 | DECOMP_NO_COMPOSE, 3345}, /* compatibility mapping */
+ {0x33B9, 0, 2 | DECOMP_NO_COMPOSE, 3347}, /* compatibility mapping */
+ {0x33BA, 0, 2 | DECOMP_NO_COMPOSE, 3349}, /* compatibility mapping */
+ {0x33BB, 0, 2 | DECOMP_NO_COMPOSE, 3351}, /* compatibility mapping */
+ {0x33BC, 0, 2 | DECOMP_NO_COMPOSE, 3353}, /* compatibility mapping */
+ {0x33BD, 0, 2 | DECOMP_NO_COMPOSE, 3355}, /* compatibility mapping */
+ {0x33BE, 0, 2 | DECOMP_NO_COMPOSE, 3357}, /* compatibility mapping */
+ {0x33BF, 0, 2 | DECOMP_NO_COMPOSE, 3359}, /* compatibility mapping */
+ {0x33C0, 0, 2 | DECOMP_NO_COMPOSE, 3361}, /* compatibility mapping */
+ {0x33C1, 0, 2 | DECOMP_NO_COMPOSE, 3363}, /* compatibility mapping */
+ {0x33C2, 0, 4, 3365},
+ {0x33C3, 0, 2 | DECOMP_NO_COMPOSE, 3369}, /* compatibility mapping */
+ {0x33C4, 0, 2 | DECOMP_NO_COMPOSE, 3371}, /* compatibility mapping */
+ {0x33C5, 0, 2 | DECOMP_NO_COMPOSE, 3373}, /* compatibility mapping */
+ {0x33C6, 0, 4, 3375},
+ {0x33C7, 0, 3, 3379},
+ {0x33C8, 0, 2 | DECOMP_NO_COMPOSE, 3382}, /* compatibility mapping */
+ {0x33C9, 0, 2 | DECOMP_NO_COMPOSE, 3384}, /* compatibility mapping */
+ {0x33CA, 0, 2 | DECOMP_NO_COMPOSE, 3386}, /* compatibility mapping */
+ {0x33CB, 0, 2 | DECOMP_NO_COMPOSE, 3388}, /* compatibility mapping */
+ {0x33CC, 0, 2 | DECOMP_NO_COMPOSE, 3390}, /* compatibility mapping */
+ {0x33CD, 0, 2 | DECOMP_NO_COMPOSE, 3392}, /* compatibility mapping */
+ {0x33CE, 0, 2 | DECOMP_NO_COMPOSE, 3394}, /* compatibility mapping */
+ {0x33CF, 0, 2 | DECOMP_NO_COMPOSE, 3396}, /* compatibility mapping */
+ {0x33D0, 0, 2 | DECOMP_NO_COMPOSE, 3398}, /* compatibility mapping */
+ {0x33D1, 0, 2 | DECOMP_NO_COMPOSE, 3400}, /* compatibility mapping */
+ {0x33D2, 0, 3, 3402},
+ {0x33D3, 0, 2 | DECOMP_NO_COMPOSE, 3405}, /* compatibility mapping */
+ {0x33D4, 0, 2 | DECOMP_NO_COMPOSE, 3407}, /* compatibility mapping */
+ {0x33D5, 0, 3, 3409},
+ {0x33D6, 0, 3, 3412},
+ {0x33D7, 0, 2 | DECOMP_NO_COMPOSE, 3415}, /* compatibility mapping */
+ {0x33D8, 0, 4, 3417},
+ {0x33D9, 0, 3, 3421},
+ {0x33DA, 0, 2 | DECOMP_NO_COMPOSE, 3424}, /* compatibility mapping */
+ {0x33DB, 0, 2 | DECOMP_NO_COMPOSE, 3426}, /* compatibility mapping */
+ {0x33DC, 0, 2 | DECOMP_NO_COMPOSE, 3428}, /* compatibility mapping */
+ {0x33DD, 0, 2 | DECOMP_NO_COMPOSE, 3430}, /* compatibility mapping */
+ {0x33DE, 0, 3, 3432},
+ {0x33DF, 0, 3, 3435},
+ {0x33E0, 0, 2 | DECOMP_NO_COMPOSE, 3438}, /* compatibility mapping */
+ {0x33E1, 0, 2 | DECOMP_NO_COMPOSE, 3440}, /* compatibility mapping */
+ {0x33E2, 0, 2 | DECOMP_NO_COMPOSE, 3442}, /* compatibility mapping */
+ {0x33E3, 0, 2 | DECOMP_NO_COMPOSE, 3444}, /* compatibility mapping */
+ {0x33E4, 0, 2 | DECOMP_NO_COMPOSE, 3446}, /* compatibility mapping */
+ {0x33E5, 0, 2 | DECOMP_NO_COMPOSE, 3448}, /* compatibility mapping */
+ {0x33E6, 0, 2 | DECOMP_NO_COMPOSE, 3450}, /* compatibility mapping */
+ {0x33E7, 0, 2 | DECOMP_NO_COMPOSE, 3452}, /* compatibility mapping */
+ {0x33E8, 0, 2 | DECOMP_NO_COMPOSE, 3454}, /* compatibility mapping */
+ {0x33E9, 0, 3, 3456},
+ {0x33EA, 0, 3, 3459},
+ {0x33EB, 0, 3, 3462},
+ {0x33EC, 0, 3, 3465},
+ {0x33ED, 0, 3, 3468},
+ {0x33EE, 0, 3, 3471},
+ {0x33EF, 0, 3, 3474},
+ {0x33F0, 0, 3, 3477},
+ {0x33F1, 0, 3, 3480},
+ {0x33F2, 0, 3, 3483},
+ {0x33F3, 0, 3, 3486},
+ {0x33F4, 0, 3, 3489},
+ {0x33F5, 0, 3, 3492},
+ {0x33F6, 0, 3, 3495},
+ {0x33F7, 0, 3, 3498},
+ {0x33F8, 0, 3, 3501},
+ {0x33F9, 0, 3, 3504},
+ {0x33FA, 0, 3, 3507},
+ {0x33FB, 0, 3, 3510},
+ {0x33FC, 0, 3, 3513},
+ {0x33FD, 0, 3, 3516},
+ {0x33FE, 0, 3, 3519},
+ {0x33FF, 0, 3, 3522},
+ {0xA66F, 230, 0, 0},
+ {0xA674, 230, 0, 0},
+ {0xA675, 230, 0, 0},
+ {0xA676, 230, 0, 0},
+ {0xA677, 230, 0, 0},
+ {0xA678, 230, 0, 0},
+ {0xA679, 230, 0, 0},
+ {0xA67A, 230, 0, 0},
+ {0xA67B, 230, 0, 0},
+ {0xA67C, 230, 0, 0},
+ {0xA67D, 230, 0, 0},
+ {0xA69C, 0, 1 | DECOMP_INLINE, 0x044A},
+ {0xA69D, 0, 1 | DECOMP_INLINE, 0x044C},
+ {0xA69E, 230, 0, 0},
+ {0xA69F, 230, 0, 0},
+ {0xA6F0, 230, 0, 0},
+ {0xA6F1, 230, 0, 0},
+ {0xA770, 0, 1 | DECOMP_INLINE, 0xA76F},
+ {0xA7F8, 0, 1 | DECOMP_INLINE, 0x0126},
+ {0xA7F9, 0, 1 | DECOMP_INLINE, 0x0153},
+ {0xA806, 9, 0, 0},
+ {0xA8C4, 9, 0, 0},
+ {0xA8E0, 230, 0, 0},
+ {0xA8E1, 230, 0, 0},
+ {0xA8E2, 230, 0, 0},
+ {0xA8E3, 230, 0, 0},
+ {0xA8E4, 230, 0, 0},
+ {0xA8E5, 230, 0, 0},
+ {0xA8E6, 230, 0, 0},
+ {0xA8E7, 230, 0, 0},
+ {0xA8E8, 230, 0, 0},
+ {0xA8E9, 230, 0, 0},
+ {0xA8EA, 230, 0, 0},
+ {0xA8EB, 230, 0, 0},
+ {0xA8EC, 230, 0, 0},
+ {0xA8ED, 230, 0, 0},
+ {0xA8EE, 230, 0, 0},
+ {0xA8EF, 230, 0, 0},
+ {0xA8F0, 230, 0, 0},
+ {0xA8F1, 230, 0, 0},
+ {0xA92B, 220, 0, 0},
+ {0xA92C, 220, 0, 0},
+ {0xA92D, 220, 0, 0},
+ {0xA953, 9, 0, 0},
+ {0xA9B3, 7, 0, 0},
+ {0xA9C0, 9, 0, 0},
+ {0xAAB0, 230, 0, 0},
+ {0xAAB2, 230, 0, 0},
+ {0xAAB3, 230, 0, 0},
+ {0xAAB4, 220, 0, 0},
+ {0xAAB7, 230, 0, 0},
+ {0xAAB8, 230, 0, 0},
+ {0xAABE, 230, 0, 0},
+ {0xAABF, 230, 0, 0},
+ {0xAAC1, 230, 0, 0},
+ {0xAAF6, 9, 0, 0},
+ {0xAB5C, 0, 1 | DECOMP_INLINE, 0xA727},
+ {0xAB5D, 0, 1 | DECOMP_INLINE, 0xAB37},
+ {0xAB5E, 0, 1 | DECOMP_INLINE, 0x026B},
+ {0xAB5F, 0, 1 | DECOMP_INLINE, 0xAB52},
+ {0xABED, 9, 0, 0},
+ {0xF900, 0, 1 | DECOMP_INLINE, 0x8C48},
+ {0xF901, 0, 1 | DECOMP_INLINE, 0x66F4},
+ {0xF902, 0, 1 | DECOMP_INLINE, 0x8ECA},
+ {0xF903, 0, 1 | DECOMP_INLINE, 0x8CC8},
+ {0xF904, 0, 1 | DECOMP_INLINE, 0x6ED1},
+ {0xF905, 0, 1 | DECOMP_INLINE, 0x4E32},
+ {0xF906, 0, 1 | DECOMP_INLINE, 0x53E5},
+ {0xF907, 0, 1 | DECOMP_INLINE, 0x9F9C},
+ {0xF908, 0, 1 | DECOMP_INLINE, 0x9F9C},
+ {0xF909, 0, 1 | DECOMP_INLINE, 0x5951},
+ {0xF90A, 0, 1 | DECOMP_INLINE, 0x91D1},
+ {0xF90B, 0, 1 | DECOMP_INLINE, 0x5587},
+ {0xF90C, 0, 1 | DECOMP_INLINE, 0x5948},
+ {0xF90D, 0, 1 | DECOMP_INLINE, 0x61F6},
+ {0xF90E, 0, 1 | DECOMP_INLINE, 0x7669},
+ {0xF90F, 0, 1 | DECOMP_INLINE, 0x7F85},
+ {0xF910, 0, 1 | DECOMP_INLINE, 0x863F},
+ {0xF911, 0, 1 | DECOMP_INLINE, 0x87BA},
+ {0xF912, 0, 1 | DECOMP_INLINE, 0x88F8},
+ {0xF913, 0, 1 | DECOMP_INLINE, 0x908F},
+ {0xF914, 0, 1 | DECOMP_INLINE, 0x6A02},
+ {0xF915, 0, 1 | DECOMP_INLINE, 0x6D1B},
+ {0xF916, 0, 1 | DECOMP_INLINE, 0x70D9},
+ {0xF917, 0, 1 | DECOMP_INLINE, 0x73DE},
+ {0xF918, 0, 1 | DECOMP_INLINE, 0x843D},
+ {0xF919, 0, 1 | DECOMP_INLINE, 0x916A},
+ {0xF91A, 0, 1 | DECOMP_INLINE, 0x99F1},
+ {0xF91B, 0, 1 | DECOMP_INLINE, 0x4E82},
+ {0xF91C, 0, 1 | DECOMP_INLINE, 0x5375},
+ {0xF91D, 0, 1 | DECOMP_INLINE, 0x6B04},
+ {0xF91E, 0, 1 | DECOMP_INLINE, 0x721B},
+ {0xF91F, 0, 1 | DECOMP_INLINE, 0x862D},
+ {0xF920, 0, 1 | DECOMP_INLINE, 0x9E1E},
+ {0xF921, 0, 1 | DECOMP_INLINE, 0x5D50},
+ {0xF922, 0, 1 | DECOMP_INLINE, 0x6FEB},
+ {0xF923, 0, 1 | DECOMP_INLINE, 0x85CD},
+ {0xF924, 0, 1 | DECOMP_INLINE, 0x8964},
+ {0xF925, 0, 1 | DECOMP_INLINE, 0x62C9},
+ {0xF926, 0, 1 | DECOMP_INLINE, 0x81D8},
+ {0xF927, 0, 1 | DECOMP_INLINE, 0x881F},
+ {0xF928, 0, 1 | DECOMP_INLINE, 0x5ECA},
+ {0xF929, 0, 1 | DECOMP_INLINE, 0x6717},
+ {0xF92A, 0, 1 | DECOMP_INLINE, 0x6D6A},
+ {0xF92B, 0, 1 | DECOMP_INLINE, 0x72FC},
+ {0xF92C, 0, 1 | DECOMP_INLINE, 0x90CE},
+ {0xF92D, 0, 1 | DECOMP_INLINE, 0x4F86},
+ {0xF92E, 0, 1 | DECOMP_INLINE, 0x51B7},
+ {0xF92F, 0, 1 | DECOMP_INLINE, 0x52DE},
+ {0xF930, 0, 1 | DECOMP_INLINE, 0x64C4},
+ {0xF931, 0, 1 | DECOMP_INLINE, 0x6AD3},
+ {0xF932, 0, 1 | DECOMP_INLINE, 0x7210},
+ {0xF933, 0, 1 | DECOMP_INLINE, 0x76E7},
+ {0xF934, 0, 1 | DECOMP_INLINE, 0x8001},
+ {0xF935, 0, 1 | DECOMP_INLINE, 0x8606},
+ {0xF936, 0, 1 | DECOMP_INLINE, 0x865C},
+ {0xF937, 0, 1 | DECOMP_INLINE, 0x8DEF},
+ {0xF938, 0, 1 | DECOMP_INLINE, 0x9732},
+ {0xF939, 0, 1 | DECOMP_INLINE, 0x9B6F},
+ {0xF93A, 0, 1 | DECOMP_INLINE, 0x9DFA},
+ {0xF93B, 0, 1 | DECOMP_INLINE, 0x788C},
+ {0xF93C, 0, 1 | DECOMP_INLINE, 0x797F},
+ {0xF93D, 0, 1 | DECOMP_INLINE, 0x7DA0},
+ {0xF93E, 0, 1 | DECOMP_INLINE, 0x83C9},
+ {0xF93F, 0, 1 | DECOMP_INLINE, 0x9304},
+ {0xF940, 0, 1 | DECOMP_INLINE, 0x9E7F},
+ {0xF941, 0, 1 | DECOMP_INLINE, 0x8AD6},
+ {0xF942, 0, 1 | DECOMP_INLINE, 0x58DF},
+ {0xF943, 0, 1 | DECOMP_INLINE, 0x5F04},
+ {0xF944, 0, 1 | DECOMP_INLINE, 0x7C60},
+ {0xF945, 0, 1 | DECOMP_INLINE, 0x807E},
+ {0xF946, 0, 1 | DECOMP_INLINE, 0x7262},
+ {0xF947, 0, 1 | DECOMP_INLINE, 0x78CA},
+ {0xF948, 0, 1 | DECOMP_INLINE, 0x8CC2},
+ {0xF949, 0, 1 | DECOMP_INLINE, 0x96F7},
+ {0xF94A, 0, 1 | DECOMP_INLINE, 0x58D8},
+ {0xF94B, 0, 1 | DECOMP_INLINE, 0x5C62},
+ {0xF94C, 0, 1 | DECOMP_INLINE, 0x6A13},
+ {0xF94D, 0, 1 | DECOMP_INLINE, 0x6DDA},
+ {0xF94E, 0, 1 | DECOMP_INLINE, 0x6F0F},
+ {0xF94F, 0, 1 | DECOMP_INLINE, 0x7D2F},
+ {0xF950, 0, 1 | DECOMP_INLINE, 0x7E37},
+ {0xF951, 0, 1 | DECOMP_INLINE, 0x964B},
+ {0xF952, 0, 1 | DECOMP_INLINE, 0x52D2},
+ {0xF953, 0, 1 | DECOMP_INLINE, 0x808B},
+ {0xF954, 0, 1 | DECOMP_INLINE, 0x51DC},
+ {0xF955, 0, 1 | DECOMP_INLINE, 0x51CC},
+ {0xF956, 0, 1 | DECOMP_INLINE, 0x7A1C},
+ {0xF957, 0, 1 | DECOMP_INLINE, 0x7DBE},
+ {0xF958, 0, 1 | DECOMP_INLINE, 0x83F1},
+ {0xF959, 0, 1 | DECOMP_INLINE, 0x9675},
+ {0xF95A, 0, 1 | DECOMP_INLINE, 0x8B80},
+ {0xF95B, 0, 1 | DECOMP_INLINE, 0x62CF},
+ {0xF95C, 0, 1 | DECOMP_INLINE, 0x6A02},
+ {0xF95D, 0, 1 | DECOMP_INLINE, 0x8AFE},
+ {0xF95E, 0, 1 | DECOMP_INLINE, 0x4E39},
+ {0xF95F, 0, 1 | DECOMP_INLINE, 0x5BE7},
+ {0xF960, 0, 1 | DECOMP_INLINE, 0x6012},
+ {0xF961, 0, 1 | DECOMP_INLINE, 0x7387},
+ {0xF962, 0, 1 | DECOMP_INLINE, 0x7570},
+ {0xF963, 0, 1 | DECOMP_INLINE, 0x5317},
+ {0xF964, 0, 1 | DECOMP_INLINE, 0x78FB},
+ {0xF965, 0, 1 | DECOMP_INLINE, 0x4FBF},
+ {0xF966, 0, 1 | DECOMP_INLINE, 0x5FA9},
+ {0xF967, 0, 1 | DECOMP_INLINE, 0x4E0D},
+ {0xF968, 0, 1 | DECOMP_INLINE, 0x6CCC},
+ {0xF969, 0, 1 | DECOMP_INLINE, 0x6578},
+ {0xF96A, 0, 1 | DECOMP_INLINE, 0x7D22},
+ {0xF96B, 0, 1 | DECOMP_INLINE, 0x53C3},
+ {0xF96C, 0, 1 | DECOMP_INLINE, 0x585E},
+ {0xF96D, 0, 1 | DECOMP_INLINE, 0x7701},
+ {0xF96E, 0, 1 | DECOMP_INLINE, 0x8449},
+ {0xF96F, 0, 1 | DECOMP_INLINE, 0x8AAA},
+ {0xF970, 0, 1 | DECOMP_INLINE, 0x6BBA},
+ {0xF971, 0, 1 | DECOMP_INLINE, 0x8FB0},
+ {0xF972, 0, 1 | DECOMP_INLINE, 0x6C88},
+ {0xF973, 0, 1 | DECOMP_INLINE, 0x62FE},
+ {0xF974, 0, 1 | DECOMP_INLINE, 0x82E5},
+ {0xF975, 0, 1 | DECOMP_INLINE, 0x63A0},
+ {0xF976, 0, 1 | DECOMP_INLINE, 0x7565},
+ {0xF977, 0, 1 | DECOMP_INLINE, 0x4EAE},
+ {0xF978, 0, 1 | DECOMP_INLINE, 0x5169},
+ {0xF979, 0, 1 | DECOMP_INLINE, 0x51C9},
+ {0xF97A, 0, 1 | DECOMP_INLINE, 0x6881},
+ {0xF97B, 0, 1 | DECOMP_INLINE, 0x7CE7},
+ {0xF97C, 0, 1 | DECOMP_INLINE, 0x826F},
+ {0xF97D, 0, 1 | DECOMP_INLINE, 0x8AD2},
+ {0xF97E, 0, 1 | DECOMP_INLINE, 0x91CF},
+ {0xF97F, 0, 1 | DECOMP_INLINE, 0x52F5},
+ {0xF980, 0, 1 | DECOMP_INLINE, 0x5442},
+ {0xF981, 0, 1 | DECOMP_INLINE, 0x5973},
+ {0xF982, 0, 1 | DECOMP_INLINE, 0x5EEC},
+ {0xF983, 0, 1 | DECOMP_INLINE, 0x65C5},
+ {0xF984, 0, 1 | DECOMP_INLINE, 0x6FFE},
+ {0xF985, 0, 1 | DECOMP_INLINE, 0x792A},
+ {0xF986, 0, 1 | DECOMP_INLINE, 0x95AD},
+ {0xF987, 0, 1 | DECOMP_INLINE, 0x9A6A},
+ {0xF988, 0, 1 | DECOMP_INLINE, 0x9E97},
+ {0xF989, 0, 1 | DECOMP_INLINE, 0x9ECE},
+ {0xF98A, 0, 1 | DECOMP_INLINE, 0x529B},
+ {0xF98B, 0, 1 | DECOMP_INLINE, 0x66C6},
+ {0xF98C, 0, 1 | DECOMP_INLINE, 0x6B77},
+ {0xF98D, 0, 1 | DECOMP_INLINE, 0x8F62},
+ {0xF98E, 0, 1 | DECOMP_INLINE, 0x5E74},
+ {0xF98F, 0, 1 | DECOMP_INLINE, 0x6190},
+ {0xF990, 0, 1 | DECOMP_INLINE, 0x6200},
+ {0xF991, 0, 1 | DECOMP_INLINE, 0x649A},
+ {0xF992, 0, 1 | DECOMP_INLINE, 0x6F23},
+ {0xF993, 0, 1 | DECOMP_INLINE, 0x7149},
+ {0xF994, 0, 1 | DECOMP_INLINE, 0x7489},
+ {0xF995, 0, 1 | DECOMP_INLINE, 0x79CA},
+ {0xF996, 0, 1 | DECOMP_INLINE, 0x7DF4},
+ {0xF997, 0, 1 | DECOMP_INLINE, 0x806F},
+ {0xF998, 0, 1 | DECOMP_INLINE, 0x8F26},
+ {0xF999, 0, 1 | DECOMP_INLINE, 0x84EE},
+ {0xF99A, 0, 1 | DECOMP_INLINE, 0x9023},
+ {0xF99B, 0, 1 | DECOMP_INLINE, 0x934A},
+ {0xF99C, 0, 1 | DECOMP_INLINE, 0x5217},
+ {0xF99D, 0, 1 | DECOMP_INLINE, 0x52A3},
+ {0xF99E, 0, 1 | DECOMP_INLINE, 0x54BD},
+ {0xF99F, 0, 1 | DECOMP_INLINE, 0x70C8},
+ {0xF9A0, 0, 1 | DECOMP_INLINE, 0x88C2},
+ {0xF9A1, 0, 1 | DECOMP_INLINE, 0x8AAA},
+ {0xF9A2, 0, 1 | DECOMP_INLINE, 0x5EC9},
+ {0xF9A3, 0, 1 | DECOMP_INLINE, 0x5FF5},
+ {0xF9A4, 0, 1 | DECOMP_INLINE, 0x637B},
+ {0xF9A5, 0, 1 | DECOMP_INLINE, 0x6BAE},
+ {0xF9A6, 0, 1 | DECOMP_INLINE, 0x7C3E},
+ {0xF9A7, 0, 1 | DECOMP_INLINE, 0x7375},
+ {0xF9A8, 0, 1 | DECOMP_INLINE, 0x4EE4},
+ {0xF9A9, 0, 1 | DECOMP_INLINE, 0x56F9},
+ {0xF9AA, 0, 1 | DECOMP_INLINE, 0x5BE7},
+ {0xF9AB, 0, 1 | DECOMP_INLINE, 0x5DBA},
+ {0xF9AC, 0, 1 | DECOMP_INLINE, 0x601C},
+ {0xF9AD, 0, 1 | DECOMP_INLINE, 0x73B2},
+ {0xF9AE, 0, 1 | DECOMP_INLINE, 0x7469},
+ {0xF9AF, 0, 1 | DECOMP_INLINE, 0x7F9A},
+ {0xF9B0, 0, 1 | DECOMP_INLINE, 0x8046},
+ {0xF9B1, 0, 1 | DECOMP_INLINE, 0x9234},
+ {0xF9B2, 0, 1 | DECOMP_INLINE, 0x96F6},
+ {0xF9B3, 0, 1 | DECOMP_INLINE, 0x9748},
+ {0xF9B4, 0, 1 | DECOMP_INLINE, 0x9818},
+ {0xF9B5, 0, 1 | DECOMP_INLINE, 0x4F8B},
+ {0xF9B6, 0, 1 | DECOMP_INLINE, 0x79AE},
+ {0xF9B7, 0, 1 | DECOMP_INLINE, 0x91B4},
+ {0xF9B8, 0, 1 | DECOMP_INLINE, 0x96B8},
+ {0xF9B9, 0, 1 | DECOMP_INLINE, 0x60E1},
+ {0xF9BA, 0, 1 | DECOMP_INLINE, 0x4E86},
+ {0xF9BB, 0, 1 | DECOMP_INLINE, 0x50DA},
+ {0xF9BC, 0, 1 | DECOMP_INLINE, 0x5BEE},
+ {0xF9BD, 0, 1 | DECOMP_INLINE, 0x5C3F},
+ {0xF9BE, 0, 1 | DECOMP_INLINE, 0x6599},
+ {0xF9BF, 0, 1 | DECOMP_INLINE, 0x6A02},
+ {0xF9C0, 0, 1 | DECOMP_INLINE, 0x71CE},
+ {0xF9C1, 0, 1 | DECOMP_INLINE, 0x7642},
+ {0xF9C2, 0, 1 | DECOMP_INLINE, 0x84FC},
+ {0xF9C3, 0, 1 | DECOMP_INLINE, 0x907C},
+ {0xF9C4, 0, 1 | DECOMP_INLINE, 0x9F8D},
+ {0xF9C5, 0, 1 | DECOMP_INLINE, 0x6688},
+ {0xF9C6, 0, 1 | DECOMP_INLINE, 0x962E},
+ {0xF9C7, 0, 1 | DECOMP_INLINE, 0x5289},
+ {0xF9C8, 0, 1 | DECOMP_INLINE, 0x677B},
+ {0xF9C9, 0, 1 | DECOMP_INLINE, 0x67F3},
+ {0xF9CA, 0, 1 | DECOMP_INLINE, 0x6D41},
+ {0xF9CB, 0, 1 | DECOMP_INLINE, 0x6E9C},
+ {0xF9CC, 0, 1 | DECOMP_INLINE, 0x7409},
+ {0xF9CD, 0, 1 | DECOMP_INLINE, 0x7559},
+ {0xF9CE, 0, 1 | DECOMP_INLINE, 0x786B},
+ {0xF9CF, 0, 1 | DECOMP_INLINE, 0x7D10},
+ {0xF9D0, 0, 1 | DECOMP_INLINE, 0x985E},
+ {0xF9D1, 0, 1 | DECOMP_INLINE, 0x516D},
+ {0xF9D2, 0, 1 | DECOMP_INLINE, 0x622E},
+ {0xF9D3, 0, 1 | DECOMP_INLINE, 0x9678},
+ {0xF9D4, 0, 1 | DECOMP_INLINE, 0x502B},
+ {0xF9D5, 0, 1 | DECOMP_INLINE, 0x5D19},
+ {0xF9D6, 0, 1 | DECOMP_INLINE, 0x6DEA},
+ {0xF9D7, 0, 1 | DECOMP_INLINE, 0x8F2A},
+ {0xF9D8, 0, 1 | DECOMP_INLINE, 0x5F8B},
+ {0xF9D9, 0, 1 | DECOMP_INLINE, 0x6144},
+ {0xF9DA, 0, 1 | DECOMP_INLINE, 0x6817},
+ {0xF9DB, 0, 1 | DECOMP_INLINE, 0x7387},
+ {0xF9DC, 0, 1 | DECOMP_INLINE, 0x9686},
+ {0xF9DD, 0, 1 | DECOMP_INLINE, 0x5229},
+ {0xF9DE, 0, 1 | DECOMP_INLINE, 0x540F},
+ {0xF9DF, 0, 1 | DECOMP_INLINE, 0x5C65},
+ {0xF9E0, 0, 1 | DECOMP_INLINE, 0x6613},
+ {0xF9E1, 0, 1 | DECOMP_INLINE, 0x674E},
+ {0xF9E2, 0, 1 | DECOMP_INLINE, 0x68A8},
+ {0xF9E3, 0, 1 | DECOMP_INLINE, 0x6CE5},
+ {0xF9E4, 0, 1 | DECOMP_INLINE, 0x7406},
+ {0xF9E5, 0, 1 | DECOMP_INLINE, 0x75E2},
+ {0xF9E6, 0, 1 | DECOMP_INLINE, 0x7F79},
+ {0xF9E7, 0, 1 | DECOMP_INLINE, 0x88CF},
+ {0xF9E8, 0, 1 | DECOMP_INLINE, 0x88E1},
+ {0xF9E9, 0, 1 | DECOMP_INLINE, 0x91CC},
+ {0xF9EA, 0, 1 | DECOMP_INLINE, 0x96E2},
+ {0xF9EB, 0, 1 | DECOMP_INLINE, 0x533F},
+ {0xF9EC, 0, 1 | DECOMP_INLINE, 0x6EBA},
+ {0xF9ED, 0, 1 | DECOMP_INLINE, 0x541D},
+ {0xF9EE, 0, 1 | DECOMP_INLINE, 0x71D0},
+ {0xF9EF, 0, 1 | DECOMP_INLINE, 0x7498},
+ {0xF9F0, 0, 1 | DECOMP_INLINE, 0x85FA},
+ {0xF9F1, 0, 1 | DECOMP_INLINE, 0x96A3},
+ {0xF9F2, 0, 1 | DECOMP_INLINE, 0x9C57},
+ {0xF9F3, 0, 1 | DECOMP_INLINE, 0x9E9F},
+ {0xF9F4, 0, 1 | DECOMP_INLINE, 0x6797},
+ {0xF9F5, 0, 1 | DECOMP_INLINE, 0x6DCB},
+ {0xF9F6, 0, 1 | DECOMP_INLINE, 0x81E8},
+ {0xF9F7, 0, 1 | DECOMP_INLINE, 0x7ACB},
+ {0xF9F8, 0, 1 | DECOMP_INLINE, 0x7B20},
+ {0xF9F9, 0, 1 | DECOMP_INLINE, 0x7C92},
+ {0xF9FA, 0, 1 | DECOMP_INLINE, 0x72C0},
+ {0xF9FB, 0, 1 | DECOMP_INLINE, 0x7099},
+ {0xF9FC, 0, 1 | DECOMP_INLINE, 0x8B58},
+ {0xF9FD, 0, 1 | DECOMP_INLINE, 0x4EC0},
+ {0xF9FE, 0, 1 | DECOMP_INLINE, 0x8336},
+ {0xF9FF, 0, 1 | DECOMP_INLINE, 0x523A},
+ {0xFA00, 0, 1 | DECOMP_INLINE, 0x5207},
+ {0xFA01, 0, 1 | DECOMP_INLINE, 0x5EA6},
+ {0xFA02, 0, 1 | DECOMP_INLINE, 0x62D3},
+ {0xFA03, 0, 1 | DECOMP_INLINE, 0x7CD6},
+ {0xFA04, 0, 1 | DECOMP_INLINE, 0x5B85},
+ {0xFA05, 0, 1 | DECOMP_INLINE, 0x6D1E},
+ {0xFA06, 0, 1 | DECOMP_INLINE, 0x66B4},
+ {0xFA07, 0, 1 | DECOMP_INLINE, 0x8F3B},
+ {0xFA08, 0, 1 | DECOMP_INLINE, 0x884C},
+ {0xFA09, 0, 1 | DECOMP_INLINE, 0x964D},
+ {0xFA0A, 0, 1 | DECOMP_INLINE, 0x898B},
+ {0xFA0B, 0, 1 | DECOMP_INLINE, 0x5ED3},
+ {0xFA0C, 0, 1 | DECOMP_INLINE, 0x5140},
+ {0xFA0D, 0, 1 | DECOMP_INLINE, 0x55C0},
+ {0xFA10, 0, 1 | DECOMP_INLINE, 0x585A},
+ {0xFA12, 0, 1 | DECOMP_INLINE, 0x6674},
+ {0xFA15, 0, 1 | DECOMP_INLINE, 0x51DE},
+ {0xFA16, 0, 1 | DECOMP_INLINE, 0x732A},
+ {0xFA17, 0, 1 | DECOMP_INLINE, 0x76CA},
+ {0xFA18, 0, 1 | DECOMP_INLINE, 0x793C},
+ {0xFA19, 0, 1 | DECOMP_INLINE, 0x795E},
+ {0xFA1A, 0, 1 | DECOMP_INLINE, 0x7965},
+ {0xFA1B, 0, 1 | DECOMP_INLINE, 0x798F},
+ {0xFA1C, 0, 1 | DECOMP_INLINE, 0x9756},
+ {0xFA1D, 0, 1 | DECOMP_INLINE, 0x7CBE},
+ {0xFA1E, 0, 1 | DECOMP_INLINE, 0x7FBD},
+ {0xFA20, 0, 1 | DECOMP_INLINE, 0x8612},
+ {0xFA22, 0, 1 | DECOMP_INLINE, 0x8AF8},
+ {0xFA25, 0, 1 | DECOMP_INLINE, 0x9038},
+ {0xFA26, 0, 1 | DECOMP_INLINE, 0x90FD},
+ {0xFA2A, 0, 1 | DECOMP_INLINE, 0x98EF},
+ {0xFA2B, 0, 1 | DECOMP_INLINE, 0x98FC},
+ {0xFA2C, 0, 1 | DECOMP_INLINE, 0x9928},
+ {0xFA2D, 0, 1 | DECOMP_INLINE, 0x9DB4},
+ {0xFA2E, 0, 1 | DECOMP_INLINE, 0x90DE},
+ {0xFA2F, 0, 1 | DECOMP_INLINE, 0x96B7},
+ {0xFA30, 0, 1 | DECOMP_INLINE, 0x4FAE},
+ {0xFA31, 0, 1 | DECOMP_INLINE, 0x50E7},
+ {0xFA32, 0, 1 | DECOMP_INLINE, 0x514D},
+ {0xFA33, 0, 1 | DECOMP_INLINE, 0x52C9},
+ {0xFA34, 0, 1 | DECOMP_INLINE, 0x52E4},
+ {0xFA35, 0, 1 | DECOMP_INLINE, 0x5351},
+ {0xFA36, 0, 1 | DECOMP_INLINE, 0x559D},
+ {0xFA37, 0, 1 | DECOMP_INLINE, 0x5606},
+ {0xFA38, 0, 1 | DECOMP_INLINE, 0x5668},
+ {0xFA39, 0, 1 | DECOMP_INLINE, 0x5840},
+ {0xFA3A, 0, 1 | DECOMP_INLINE, 0x58A8},
+ {0xFA3B, 0, 1 | DECOMP_INLINE, 0x5C64},
+ {0xFA3C, 0, 1 | DECOMP_INLINE, 0x5C6E},
+ {0xFA3D, 0, 1 | DECOMP_INLINE, 0x6094},
+ {0xFA3E, 0, 1 | DECOMP_INLINE, 0x6168},
+ {0xFA3F, 0, 1 | DECOMP_INLINE, 0x618E},
+ {0xFA40, 0, 1 | DECOMP_INLINE, 0x61F2},
+ {0xFA41, 0, 1 | DECOMP_INLINE, 0x654F},
+ {0xFA42, 0, 1 | DECOMP_INLINE, 0x65E2},
+ {0xFA43, 0, 1 | DECOMP_INLINE, 0x6691},
+ {0xFA44, 0, 1 | DECOMP_INLINE, 0x6885},
+ {0xFA45, 0, 1 | DECOMP_INLINE, 0x6D77},
+ {0xFA46, 0, 1 | DECOMP_INLINE, 0x6E1A},
+ {0xFA47, 0, 1 | DECOMP_INLINE, 0x6F22},
+ {0xFA48, 0, 1 | DECOMP_INLINE, 0x716E},
+ {0xFA49, 0, 1 | DECOMP_INLINE, 0x722B},
+ {0xFA4A, 0, 1 | DECOMP_INLINE, 0x7422},
+ {0xFA4B, 0, 1 | DECOMP_INLINE, 0x7891},
+ {0xFA4C, 0, 1 | DECOMP_INLINE, 0x793E},
+ {0xFA4D, 0, 1 | DECOMP_INLINE, 0x7949},
+ {0xFA4E, 0, 1 | DECOMP_INLINE, 0x7948},
+ {0xFA4F, 0, 1 | DECOMP_INLINE, 0x7950},
+ {0xFA50, 0, 1 | DECOMP_INLINE, 0x7956},
+ {0xFA51, 0, 1 | DECOMP_INLINE, 0x795D},
+ {0xFA52, 0, 1 | DECOMP_INLINE, 0x798D},
+ {0xFA53, 0, 1 | DECOMP_INLINE, 0x798E},
+ {0xFA54, 0, 1 | DECOMP_INLINE, 0x7A40},
+ {0xFA55, 0, 1 | DECOMP_INLINE, 0x7A81},
+ {0xFA56, 0, 1 | DECOMP_INLINE, 0x7BC0},
+ {0xFA57, 0, 1 | DECOMP_INLINE, 0x7DF4},
+ {0xFA58, 0, 1 | DECOMP_INLINE, 0x7E09},
+ {0xFA59, 0, 1 | DECOMP_INLINE, 0x7E41},
+ {0xFA5A, 0, 1 | DECOMP_INLINE, 0x7F72},
+ {0xFA5B, 0, 1 | DECOMP_INLINE, 0x8005},
+ {0xFA5C, 0, 1 | DECOMP_INLINE, 0x81ED},
+ {0xFA5D, 0, 1 | DECOMP_INLINE, 0x8279},
+ {0xFA5E, 0, 1 | DECOMP_INLINE, 0x8279},
+ {0xFA5F, 0, 1 | DECOMP_INLINE, 0x8457},
+ {0xFA60, 0, 1 | DECOMP_INLINE, 0x8910},
+ {0xFA61, 0, 1 | DECOMP_INLINE, 0x8996},
+ {0xFA62, 0, 1 | DECOMP_INLINE, 0x8B01},
+ {0xFA63, 0, 1 | DECOMP_INLINE, 0x8B39},
+ {0xFA64, 0, 1 | DECOMP_INLINE, 0x8CD3},
+ {0xFA65, 0, 1 | DECOMP_INLINE, 0x8D08},
+ {0xFA66, 0, 1 | DECOMP_INLINE, 0x8FB6},
+ {0xFA67, 0, 1 | DECOMP_INLINE, 0x9038},
+ {0xFA68, 0, 1 | DECOMP_INLINE, 0x96E3},
+ {0xFA69, 0, 1 | DECOMP_INLINE, 0x97FF},
+ {0xFA6A, 0, 1 | DECOMP_INLINE, 0x983B},
+ {0xFA6B, 0, 1 | DECOMP_INLINE, 0x6075},
+ {0xFA6C, 0, 1, 3525},
+ {0xFA6D, 0, 1 | DECOMP_INLINE, 0x8218},
+ {0xFA70, 0, 1 | DECOMP_INLINE, 0x4E26},
+ {0xFA71, 0, 1 | DECOMP_INLINE, 0x51B5},
+ {0xFA72, 0, 1 | DECOMP_INLINE, 0x5168},
+ {0xFA73, 0, 1 | DECOMP_INLINE, 0x4F80},
+ {0xFA74, 0, 1 | DECOMP_INLINE, 0x5145},
+ {0xFA75, 0, 1 | DECOMP_INLINE, 0x5180},
+ {0xFA76, 0, 1 | DECOMP_INLINE, 0x52C7},
+ {0xFA77, 0, 1 | DECOMP_INLINE, 0x52FA},
+ {0xFA78, 0, 1 | DECOMP_INLINE, 0x559D},
+ {0xFA79, 0, 1 | DECOMP_INLINE, 0x5555},
+ {0xFA7A, 0, 1 | DECOMP_INLINE, 0x5599},
+ {0xFA7B, 0, 1 | DECOMP_INLINE, 0x55E2},
+ {0xFA7C, 0, 1 | DECOMP_INLINE, 0x585A},
+ {0xFA7D, 0, 1 | DECOMP_INLINE, 0x58B3},
+ {0xFA7E, 0, 1 | DECOMP_INLINE, 0x5944},
+ {0xFA7F, 0, 1 | DECOMP_INLINE, 0x5954},
+ {0xFA80, 0, 1 | DECOMP_INLINE, 0x5A62},
+ {0xFA81, 0, 1 | DECOMP_INLINE, 0x5B28},
+ {0xFA82, 0, 1 | DECOMP_INLINE, 0x5ED2},
+ {0xFA83, 0, 1 | DECOMP_INLINE, 0x5ED9},
+ {0xFA84, 0, 1 | DECOMP_INLINE, 0x5F69},
+ {0xFA85, 0, 1 | DECOMP_INLINE, 0x5FAD},
+ {0xFA86, 0, 1 | DECOMP_INLINE, 0x60D8},
+ {0xFA87, 0, 1 | DECOMP_INLINE, 0x614E},
+ {0xFA88, 0, 1 | DECOMP_INLINE, 0x6108},
+ {0xFA89, 0, 1 | DECOMP_INLINE, 0x618E},
+ {0xFA8A, 0, 1 | DECOMP_INLINE, 0x6160},
+ {0xFA8B, 0, 1 | DECOMP_INLINE, 0x61F2},
+ {0xFA8C, 0, 1 | DECOMP_INLINE, 0x6234},
+ {0xFA8D, 0, 1 | DECOMP_INLINE, 0x63C4},
+ {0xFA8E, 0, 1 | DECOMP_INLINE, 0x641C},
+ {0xFA8F, 0, 1 | DECOMP_INLINE, 0x6452},
+ {0xFA90, 0, 1 | DECOMP_INLINE, 0x6556},
+ {0xFA91, 0, 1 | DECOMP_INLINE, 0x6674},
+ {0xFA92, 0, 1 | DECOMP_INLINE, 0x6717},
+ {0xFA93, 0, 1 | DECOMP_INLINE, 0x671B},
+ {0xFA94, 0, 1 | DECOMP_INLINE, 0x6756},
+ {0xFA95, 0, 1 | DECOMP_INLINE, 0x6B79},
+ {0xFA96, 0, 1 | DECOMP_INLINE, 0x6BBA},
+ {0xFA97, 0, 1 | DECOMP_INLINE, 0x6D41},
+ {0xFA98, 0, 1 | DECOMP_INLINE, 0x6EDB},
+ {0xFA99, 0, 1 | DECOMP_INLINE, 0x6ECB},
+ {0xFA9A, 0, 1 | DECOMP_INLINE, 0x6F22},
+ {0xFA9B, 0, 1 | DECOMP_INLINE, 0x701E},
+ {0xFA9C, 0, 1 | DECOMP_INLINE, 0x716E},
+ {0xFA9D, 0, 1 | DECOMP_INLINE, 0x77A7},
+ {0xFA9E, 0, 1 | DECOMP_INLINE, 0x7235},
+ {0xFA9F, 0, 1 | DECOMP_INLINE, 0x72AF},
+ {0xFAA0, 0, 1 | DECOMP_INLINE, 0x732A},
+ {0xFAA1, 0, 1 | DECOMP_INLINE, 0x7471},
+ {0xFAA2, 0, 1 | DECOMP_INLINE, 0x7506},
+ {0xFAA3, 0, 1 | DECOMP_INLINE, 0x753B},
+ {0xFAA4, 0, 1 | DECOMP_INLINE, 0x761D},
+ {0xFAA5, 0, 1 | DECOMP_INLINE, 0x761F},
+ {0xFAA6, 0, 1 | DECOMP_INLINE, 0x76CA},
+ {0xFAA7, 0, 1 | DECOMP_INLINE, 0x76DB},
+ {0xFAA8, 0, 1 | DECOMP_INLINE, 0x76F4},
+ {0xFAA9, 0, 1 | DECOMP_INLINE, 0x774A},
+ {0xFAAA, 0, 1 | DECOMP_INLINE, 0x7740},
+ {0xFAAB, 0, 1 | DECOMP_INLINE, 0x78CC},
+ {0xFAAC, 0, 1 | DECOMP_INLINE, 0x7AB1},
+ {0xFAAD, 0, 1 | DECOMP_INLINE, 0x7BC0},
+ {0xFAAE, 0, 1 | DECOMP_INLINE, 0x7C7B},
+ {0xFAAF, 0, 1 | DECOMP_INLINE, 0x7D5B},
+ {0xFAB0, 0, 1 | DECOMP_INLINE, 0x7DF4},
+ {0xFAB1, 0, 1 | DECOMP_INLINE, 0x7F3E},
+ {0xFAB2, 0, 1 | DECOMP_INLINE, 0x8005},
+ {0xFAB3, 0, 1 | DECOMP_INLINE, 0x8352},
+ {0xFAB4, 0, 1 | DECOMP_INLINE, 0x83EF},
+ {0xFAB5, 0, 1 | DECOMP_INLINE, 0x8779},
+ {0xFAB6, 0, 1 | DECOMP_INLINE, 0x8941},
+ {0xFAB7, 0, 1 | DECOMP_INLINE, 0x8986},
+ {0xFAB8, 0, 1 | DECOMP_INLINE, 0x8996},
+ {0xFAB9, 0, 1 | DECOMP_INLINE, 0x8ABF},
+ {0xFABA, 0, 1 | DECOMP_INLINE, 0x8AF8},
+ {0xFABB, 0, 1 | DECOMP_INLINE, 0x8ACB},
+ {0xFABC, 0, 1 | DECOMP_INLINE, 0x8B01},
+ {0xFABD, 0, 1 | DECOMP_INLINE, 0x8AFE},
+ {0xFABE, 0, 1 | DECOMP_INLINE, 0x8AED},
+ {0xFABF, 0, 1 | DECOMP_INLINE, 0x8B39},
+ {0xFAC0, 0, 1 | DECOMP_INLINE, 0x8B8A},
+ {0xFAC1, 0, 1 | DECOMP_INLINE, 0x8D08},
+ {0xFAC2, 0, 1 | DECOMP_INLINE, 0x8F38},
+ {0xFAC3, 0, 1 | DECOMP_INLINE, 0x9072},
+ {0xFAC4, 0, 1 | DECOMP_INLINE, 0x9199},
+ {0xFAC5, 0, 1 | DECOMP_INLINE, 0x9276},
+ {0xFAC6, 0, 1 | DECOMP_INLINE, 0x967C},
+ {0xFAC7, 0, 1 | DECOMP_INLINE, 0x96E3},
+ {0xFAC8, 0, 1 | DECOMP_INLINE, 0x9756},
+ {0xFAC9, 0, 1 | DECOMP_INLINE, 0x97DB},
+ {0xFACA, 0, 1 | DECOMP_INLINE, 0x97FF},
+ {0xFACB, 0, 1 | DECOMP_INLINE, 0x980B},
+ {0xFACC, 0, 1 | DECOMP_INLINE, 0x983B},
+ {0xFACD, 0, 1 | DECOMP_INLINE, 0x9B12},
+ {0xFACE, 0, 1 | DECOMP_INLINE, 0x9F9C},
+ {0xFACF, 0, 1, 3526},
+ {0xFAD0, 0, 1, 3527},
+ {0xFAD1, 0, 1, 3528},
+ {0xFAD2, 0, 1 | DECOMP_INLINE, 0x3B9D},
+ {0xFAD3, 0, 1 | DECOMP_INLINE, 0x4018},
+ {0xFAD4, 0, 1 | DECOMP_INLINE, 0x4039},
+ {0xFAD5, 0, 1, 3529},
+ {0xFAD6, 0, 1, 3530},
+ {0xFAD7, 0, 1, 3531},
+ {0xFAD8, 0, 1 | DECOMP_INLINE, 0x9F43},
+ {0xFAD9, 0, 1 | DECOMP_INLINE, 0x9F8E},
+ {0xFB00, 0, 2 | DECOMP_NO_COMPOSE, 3532}, /* compatibility mapping */
+ {0xFB01, 0, 2 | DECOMP_NO_COMPOSE, 3534}, /* compatibility mapping */
+ {0xFB02, 0, 2 | DECOMP_NO_COMPOSE, 3536}, /* compatibility mapping */
+ {0xFB03, 0, 3, 3538},
+ {0xFB04, 0, 3, 3541},
+ {0xFB05, 0, 2 | DECOMP_NO_COMPOSE, 3544}, /* compatibility mapping */
+ {0xFB06, 0, 2 | DECOMP_NO_COMPOSE, 3546}, /* compatibility mapping */
+ {0xFB13, 0, 2 | DECOMP_NO_COMPOSE, 3548}, /* compatibility mapping */
+ {0xFB14, 0, 2 | DECOMP_NO_COMPOSE, 3550}, /* compatibility mapping */
+ {0xFB15, 0, 2 | DECOMP_NO_COMPOSE, 3552}, /* compatibility mapping */
+ {0xFB16, 0, 2 | DECOMP_NO_COMPOSE, 3554}, /* compatibility mapping */
+ {0xFB17, 0, 2 | DECOMP_NO_COMPOSE, 3556}, /* compatibility mapping */
+ {0xFB1D, 0, 2 | DECOMP_NO_COMPOSE, 3558}, /* in exclusion list */
+ {0xFB1E, 26, 0, 0},
+ {0xFB1F, 0, 2 | DECOMP_NO_COMPOSE, 3560}, /* in exclusion list */
+ {0xFB20, 0, 1 | DECOMP_INLINE, 0x05E2},
+ {0xFB21, 0, 1 | DECOMP_INLINE, 0x05D0},
+ {0xFB22, 0, 1 | DECOMP_INLINE, 0x05D3},
+ {0xFB23, 0, 1 | DECOMP_INLINE, 0x05D4},
+ {0xFB24, 0, 1 | DECOMP_INLINE, 0x05DB},
+ {0xFB25, 0, 1 | DECOMP_INLINE, 0x05DC},
+ {0xFB26, 0, 1 | DECOMP_INLINE, 0x05DD},
+ {0xFB27, 0, 1 | DECOMP_INLINE, 0x05E8},
+ {0xFB28, 0, 1 | DECOMP_INLINE, 0x05EA},
+ {0xFB29, 0, 1 | DECOMP_INLINE, 0x002B},
+ {0xFB2A, 0, 2 | DECOMP_NO_COMPOSE, 3562}, /* in exclusion list */
+ {0xFB2B, 0, 2 | DECOMP_NO_COMPOSE, 3564}, /* in exclusion list */
+ {0xFB2C, 0, 2 | DECOMP_NO_COMPOSE, 3566}, /* in exclusion list */
+ {0xFB2D, 0, 2 | DECOMP_NO_COMPOSE, 3568}, /* in exclusion list */
+ {0xFB2E, 0, 2 | DECOMP_NO_COMPOSE, 3570}, /* in exclusion list */
+ {0xFB2F, 0, 2 | DECOMP_NO_COMPOSE, 3572}, /* in exclusion list */
+ {0xFB30, 0, 2 | DECOMP_NO_COMPOSE, 3574}, /* in exclusion list */
+ {0xFB31, 0, 2 | DECOMP_NO_COMPOSE, 3576}, /* in exclusion list */
+ {0xFB32, 0, 2 | DECOMP_NO_COMPOSE, 3578}, /* in exclusion list */
+ {0xFB33, 0, 2 | DECOMP_NO_COMPOSE, 3580}, /* in exclusion list */
+ {0xFB34, 0, 2 | DECOMP_NO_COMPOSE, 3582}, /* in exclusion list */
+ {0xFB35, 0, 2 | DECOMP_NO_COMPOSE, 3584}, /* in exclusion list */
+ {0xFB36, 0, 2 | DECOMP_NO_COMPOSE, 3586}, /* in exclusion list */
+ {0xFB38, 0, 2 | DECOMP_NO_COMPOSE, 3588}, /* in exclusion list */
+ {0xFB39, 0, 2 | DECOMP_NO_COMPOSE, 3590}, /* in exclusion list */
+ {0xFB3A, 0, 2 | DECOMP_NO_COMPOSE, 3592}, /* in exclusion list */
+ {0xFB3B, 0, 2 | DECOMP_NO_COMPOSE, 3594}, /* in exclusion list */
+ {0xFB3C, 0, 2 | DECOMP_NO_COMPOSE, 3596}, /* in exclusion list */
+ {0xFB3E, 0, 2 | DECOMP_NO_COMPOSE, 3598}, /* in exclusion list */
+ {0xFB40, 0, 2 | DECOMP_NO_COMPOSE, 3600}, /* in exclusion list */
+ {0xFB41, 0, 2 | DECOMP_NO_COMPOSE, 3602}, /* in exclusion list */
+ {0xFB43, 0, 2 | DECOMP_NO_COMPOSE, 3604}, /* in exclusion list */
+ {0xFB44, 0, 2 | DECOMP_NO_COMPOSE, 3606}, /* in exclusion list */
+ {0xFB46, 0, 2 | DECOMP_NO_COMPOSE, 3608}, /* in exclusion list */
+ {0xFB47, 0, 2 | DECOMP_NO_COMPOSE, 3610}, /* in exclusion list */
+ {0xFB48, 0, 2 | DECOMP_NO_COMPOSE, 3612}, /* in exclusion list */
+ {0xFB49, 0, 2 | DECOMP_NO_COMPOSE, 3614}, /* in exclusion list */
+ {0xFB4A, 0, 2 | DECOMP_NO_COMPOSE, 3616}, /* in exclusion list */
+ {0xFB4B, 0, 2 | DECOMP_NO_COMPOSE, 3618}, /* in exclusion list */
+ {0xFB4C, 0, 2 | DECOMP_NO_COMPOSE, 3620}, /* in exclusion list */
+ {0xFB4D, 0, 2 | DECOMP_NO_COMPOSE, 3622}, /* in exclusion list */
+ {0xFB4E, 0, 2 | DECOMP_NO_COMPOSE, 3624}, /* in exclusion list */
+ {0xFB4F, 0, 2 | DECOMP_NO_COMPOSE, 3626}, /* compatibility mapping */
+ {0xFB50, 0, 1 | DECOMP_INLINE, 0x0671},
+ {0xFB51, 0, 1 | DECOMP_INLINE, 0x0671},
+ {0xFB52, 0, 1 | DECOMP_INLINE, 0x067B},
+ {0xFB53, 0, 1 | DECOMP_INLINE, 0x067B},
+ {0xFB54, 0, 1 | DECOMP_INLINE, 0x067B},
+ {0xFB55, 0, 1 | DECOMP_INLINE, 0x067B},
+ {0xFB56, 0, 1 | DECOMP_INLINE, 0x067E},
+ {0xFB57, 0, 1 | DECOMP_INLINE, 0x067E},
+ {0xFB58, 0, 1 | DECOMP_INLINE, 0x067E},
+ {0xFB59, 0, 1 | DECOMP_INLINE, 0x067E},
+ {0xFB5A, 0, 1 | DECOMP_INLINE, 0x0680},
+ {0xFB5B, 0, 1 | DECOMP_INLINE, 0x0680},
+ {0xFB5C, 0, 1 | DECOMP_INLINE, 0x0680},
+ {0xFB5D, 0, 1 | DECOMP_INLINE, 0x0680},
+ {0xFB5E, 0, 1 | DECOMP_INLINE, 0x067A},
+ {0xFB5F, 0, 1 | DECOMP_INLINE, 0x067A},
+ {0xFB60, 0, 1 | DECOMP_INLINE, 0x067A},
+ {0xFB61, 0, 1 | DECOMP_INLINE, 0x067A},
+ {0xFB62, 0, 1 | DECOMP_INLINE, 0x067F},
+ {0xFB63, 0, 1 | DECOMP_INLINE, 0x067F},
+ {0xFB64, 0, 1 | DECOMP_INLINE, 0x067F},
+ {0xFB65, 0, 1 | DECOMP_INLINE, 0x067F},
+ {0xFB66, 0, 1 | DECOMP_INLINE, 0x0679},
+ {0xFB67, 0, 1 | DECOMP_INLINE, 0x0679},
+ {0xFB68, 0, 1 | DECOMP_INLINE, 0x0679},
+ {0xFB69, 0, 1 | DECOMP_INLINE, 0x0679},
+ {0xFB6A, 0, 1 | DECOMP_INLINE, 0x06A4},
+ {0xFB6B, 0, 1 | DECOMP_INLINE, 0x06A4},
+ {0xFB6C, 0, 1 | DECOMP_INLINE, 0x06A4},
+ {0xFB6D, 0, 1 | DECOMP_INLINE, 0x06A4},
+ {0xFB6E, 0, 1 | DECOMP_INLINE, 0x06A6},
+ {0xFB6F, 0, 1 | DECOMP_INLINE, 0x06A6},
+ {0xFB70, 0, 1 | DECOMP_INLINE, 0x06A6},
+ {0xFB71, 0, 1 | DECOMP_INLINE, 0x06A6},
+ {0xFB72, 0, 1 | DECOMP_INLINE, 0x0684},
+ {0xFB73, 0, 1 | DECOMP_INLINE, 0x0684},
+ {0xFB74, 0, 1 | DECOMP_INLINE, 0x0684},
+ {0xFB75, 0, 1 | DECOMP_INLINE, 0x0684},
+ {0xFB76, 0, 1 | DECOMP_INLINE, 0x0683},
+ {0xFB77, 0, 1 | DECOMP_INLINE, 0x0683},
+ {0xFB78, 0, 1 | DECOMP_INLINE, 0x0683},
+ {0xFB79, 0, 1 | DECOMP_INLINE, 0x0683},
+ {0xFB7A, 0, 1 | DECOMP_INLINE, 0x0686},
+ {0xFB7B, 0, 1 | DECOMP_INLINE, 0x0686},
+ {0xFB7C, 0, 1 | DECOMP_INLINE, 0x0686},
+ {0xFB7D, 0, 1 | DECOMP_INLINE, 0x0686},
+ {0xFB7E, 0, 1 | DECOMP_INLINE, 0x0687},
+ {0xFB7F, 0, 1 | DECOMP_INLINE, 0x0687},
+ {0xFB80, 0, 1 | DECOMP_INLINE, 0x0687},
+ {0xFB81, 0, 1 | DECOMP_INLINE, 0x0687},
+ {0xFB82, 0, 1 | DECOMP_INLINE, 0x068D},
+ {0xFB83, 0, 1 | DECOMP_INLINE, 0x068D},
+ {0xFB84, 0, 1 | DECOMP_INLINE, 0x068C},
+ {0xFB85, 0, 1 | DECOMP_INLINE, 0x068C},
+ {0xFB86, 0, 1 | DECOMP_INLINE, 0x068E},
+ {0xFB87, 0, 1 | DECOMP_INLINE, 0x068E},
+ {0xFB88, 0, 1 | DECOMP_INLINE, 0x0688},
+ {0xFB89, 0, 1 | DECOMP_INLINE, 0x0688},
+ {0xFB8A, 0, 1 | DECOMP_INLINE, 0x0698},
+ {0xFB8B, 0, 1 | DECOMP_INLINE, 0x0698},
+ {0xFB8C, 0, 1 | DECOMP_INLINE, 0x0691},
+ {0xFB8D, 0, 1 | DECOMP_INLINE, 0x0691},
+ {0xFB8E, 0, 1 | DECOMP_INLINE, 0x06A9},
+ {0xFB8F, 0, 1 | DECOMP_INLINE, 0x06A9},
+ {0xFB90, 0, 1 | DECOMP_INLINE, 0x06A9},
+ {0xFB91, 0, 1 | DECOMP_INLINE, 0x06A9},
+ {0xFB92, 0, 1 | DECOMP_INLINE, 0x06AF},
+ {0xFB93, 0, 1 | DECOMP_INLINE, 0x06AF},
+ {0xFB94, 0, 1 | DECOMP_INLINE, 0x06AF},
+ {0xFB95, 0, 1 | DECOMP_INLINE, 0x06AF},
+ {0xFB96, 0, 1 | DECOMP_INLINE, 0x06B3},
+ {0xFB97, 0, 1 | DECOMP_INLINE, 0x06B3},
+ {0xFB98, 0, 1 | DECOMP_INLINE, 0x06B3},
+ {0xFB99, 0, 1 | DECOMP_INLINE, 0x06B3},
+ {0xFB9A, 0, 1 | DECOMP_INLINE, 0x06B1},
+ {0xFB9B, 0, 1 | DECOMP_INLINE, 0x06B1},
+ {0xFB9C, 0, 1 | DECOMP_INLINE, 0x06B1},
+ {0xFB9D, 0, 1 | DECOMP_INLINE, 0x06B1},
+ {0xFB9E, 0, 1 | DECOMP_INLINE, 0x06BA},
+ {0xFB9F, 0, 1 | DECOMP_INLINE, 0x06BA},
+ {0xFBA0, 0, 1 | DECOMP_INLINE, 0x06BB},
+ {0xFBA1, 0, 1 | DECOMP_INLINE, 0x06BB},
+ {0xFBA2, 0, 1 | DECOMP_INLINE, 0x06BB},
+ {0xFBA3, 0, 1 | DECOMP_INLINE, 0x06BB},
+ {0xFBA4, 0, 1 | DECOMP_INLINE, 0x06C0},
+ {0xFBA5, 0, 1 | DECOMP_INLINE, 0x06C0},
+ {0xFBA6, 0, 1 | DECOMP_INLINE, 0x06C1},
+ {0xFBA7, 0, 1 | DECOMP_INLINE, 0x06C1},
+ {0xFBA8, 0, 1 | DECOMP_INLINE, 0x06C1},
+ {0xFBA9, 0, 1 | DECOMP_INLINE, 0x06C1},
+ {0xFBAA, 0, 1 | DECOMP_INLINE, 0x06BE},
+ {0xFBAB, 0, 1 | DECOMP_INLINE, 0x06BE},
+ {0xFBAC, 0, 1 | DECOMP_INLINE, 0x06BE},
+ {0xFBAD, 0, 1 | DECOMP_INLINE, 0x06BE},
+ {0xFBAE, 0, 1 | DECOMP_INLINE, 0x06D2},
+ {0xFBAF, 0, 1 | DECOMP_INLINE, 0x06D2},
+ {0xFBB0, 0, 1 | DECOMP_INLINE, 0x06D3},
+ {0xFBB1, 0, 1 | DECOMP_INLINE, 0x06D3},
+ {0xFBD3, 0, 1 | DECOMP_INLINE, 0x06AD},
+ {0xFBD4, 0, 1 | DECOMP_INLINE, 0x06AD},
+ {0xFBD5, 0, 1 | DECOMP_INLINE, 0x06AD},
+ {0xFBD6, 0, 1 | DECOMP_INLINE, 0x06AD},
+ {0xFBD7, 0, 1 | DECOMP_INLINE, 0x06C7},
+ {0xFBD8, 0, 1 | DECOMP_INLINE, 0x06C7},
+ {0xFBD9, 0, 1 | DECOMP_INLINE, 0x06C6},
+ {0xFBDA, 0, 1 | DECOMP_INLINE, 0x06C6},
+ {0xFBDB, 0, 1 | DECOMP_INLINE, 0x06C8},
+ {0xFBDC, 0, 1 | DECOMP_INLINE, 0x06C8},
+ {0xFBDD, 0, 1 | DECOMP_INLINE, 0x0677},
+ {0xFBDE, 0, 1 | DECOMP_INLINE, 0x06CB},
+ {0xFBDF, 0, 1 | DECOMP_INLINE, 0x06CB},
+ {0xFBE0, 0, 1 | DECOMP_INLINE, 0x06C5},
+ {0xFBE1, 0, 1 | DECOMP_INLINE, 0x06C5},
+ {0xFBE2, 0, 1 | DECOMP_INLINE, 0x06C9},
+ {0xFBE3, 0, 1 | DECOMP_INLINE, 0x06C9},
+ {0xFBE4, 0, 1 | DECOMP_INLINE, 0x06D0},
+ {0xFBE5, 0, 1 | DECOMP_INLINE, 0x06D0},
+ {0xFBE6, 0, 1 | DECOMP_INLINE, 0x06D0},
+ {0xFBE7, 0, 1 | DECOMP_INLINE, 0x06D0},
+ {0xFBE8, 0, 1 | DECOMP_INLINE, 0x0649},
+ {0xFBE9, 0, 1 | DECOMP_INLINE, 0x0649},
+ {0xFBEA, 0, 2 | DECOMP_NO_COMPOSE, 3628}, /* compatibility mapping */
+ {0xFBEB, 0, 2 | DECOMP_NO_COMPOSE, 3630}, /* compatibility mapping */
+ {0xFBEC, 0, 2 | DECOMP_NO_COMPOSE, 3632}, /* compatibility mapping */
+ {0xFBED, 0, 2 | DECOMP_NO_COMPOSE, 3634}, /* compatibility mapping */
+ {0xFBEE, 0, 2 | DECOMP_NO_COMPOSE, 3636}, /* compatibility mapping */
+ {0xFBEF, 0, 2 | DECOMP_NO_COMPOSE, 3638}, /* compatibility mapping */
+ {0xFBF0, 0, 2 | DECOMP_NO_COMPOSE, 3640}, /* compatibility mapping */
+ {0xFBF1, 0, 2 | DECOMP_NO_COMPOSE, 3642}, /* compatibility mapping */
+ {0xFBF2, 0, 2 | DECOMP_NO_COMPOSE, 3644}, /* compatibility mapping */
+ {0xFBF3, 0, 2 | DECOMP_NO_COMPOSE, 3646}, /* compatibility mapping */
+ {0xFBF4, 0, 2 | DECOMP_NO_COMPOSE, 3648}, /* compatibility mapping */
+ {0xFBF5, 0, 2 | DECOMP_NO_COMPOSE, 3650}, /* compatibility mapping */
+ {0xFBF6, 0, 2 | DECOMP_NO_COMPOSE, 3652}, /* compatibility mapping */
+ {0xFBF7, 0, 2 | DECOMP_NO_COMPOSE, 3654}, /* compatibility mapping */
+ {0xFBF8, 0, 2 | DECOMP_NO_COMPOSE, 3656}, /* compatibility mapping */
+ {0xFBF9, 0, 2 | DECOMP_NO_COMPOSE, 3658}, /* compatibility mapping */
+ {0xFBFA, 0, 2 | DECOMP_NO_COMPOSE, 3660}, /* compatibility mapping */
+ {0xFBFB, 0, 2 | DECOMP_NO_COMPOSE, 3662}, /* compatibility mapping */
+ {0xFBFC, 0, 1 | DECOMP_INLINE, 0x06CC},
+ {0xFBFD, 0, 1 | DECOMP_INLINE, 0x06CC},
+ {0xFBFE, 0, 1 | DECOMP_INLINE, 0x06CC},
+ {0xFBFF, 0, 1 | DECOMP_INLINE, 0x06CC},
+ {0xFC00, 0, 2 | DECOMP_NO_COMPOSE, 3664}, /* compatibility mapping */
+ {0xFC01, 0, 2 | DECOMP_NO_COMPOSE, 3666}, /* compatibility mapping */
+ {0xFC02, 0, 2 | DECOMP_NO_COMPOSE, 3668}, /* compatibility mapping */
+ {0xFC03, 0, 2 | DECOMP_NO_COMPOSE, 3670}, /* compatibility mapping */
+ {0xFC04, 0, 2 | DECOMP_NO_COMPOSE, 3672}, /* compatibility mapping */
+ {0xFC05, 0, 2 | DECOMP_NO_COMPOSE, 3674}, /* compatibility mapping */
+ {0xFC06, 0, 2 | DECOMP_NO_COMPOSE, 3676}, /* compatibility mapping */
+ {0xFC07, 0, 2 | DECOMP_NO_COMPOSE, 3678}, /* compatibility mapping */
+ {0xFC08, 0, 2 | DECOMP_NO_COMPOSE, 3680}, /* compatibility mapping */
+ {0xFC09, 0, 2 | DECOMP_NO_COMPOSE, 3682}, /* compatibility mapping */
+ {0xFC0A, 0, 2 | DECOMP_NO_COMPOSE, 3684}, /* compatibility mapping */
+ {0xFC0B, 0, 2 | DECOMP_NO_COMPOSE, 3686}, /* compatibility mapping */
+ {0xFC0C, 0, 2 | DECOMP_NO_COMPOSE, 3688}, /* compatibility mapping */
+ {0xFC0D, 0, 2 | DECOMP_NO_COMPOSE, 3690}, /* compatibility mapping */
+ {0xFC0E, 0, 2 | DECOMP_NO_COMPOSE, 3692}, /* compatibility mapping */
+ {0xFC0F, 0, 2 | DECOMP_NO_COMPOSE, 3694}, /* compatibility mapping */
+ {0xFC10, 0, 2 | DECOMP_NO_COMPOSE, 3696}, /* compatibility mapping */
+ {0xFC11, 0, 2 | DECOMP_NO_COMPOSE, 3698}, /* compatibility mapping */
+ {0xFC12, 0, 2 | DECOMP_NO_COMPOSE, 3700}, /* compatibility mapping */
+ {0xFC13, 0, 2 | DECOMP_NO_COMPOSE, 3702}, /* compatibility mapping */
+ {0xFC14, 0, 2 | DECOMP_NO_COMPOSE, 3704}, /* compatibility mapping */
+ {0xFC15, 0, 2 | DECOMP_NO_COMPOSE, 3706}, /* compatibility mapping */
+ {0xFC16, 0, 2 | DECOMP_NO_COMPOSE, 3708}, /* compatibility mapping */
+ {0xFC17, 0, 2 | DECOMP_NO_COMPOSE, 3710}, /* compatibility mapping */
+ {0xFC18, 0, 2 | DECOMP_NO_COMPOSE, 3712}, /* compatibility mapping */
+ {0xFC19, 0, 2 | DECOMP_NO_COMPOSE, 3714}, /* compatibility mapping */
+ {0xFC1A, 0, 2 | DECOMP_NO_COMPOSE, 3716}, /* compatibility mapping */
+ {0xFC1B, 0, 2 | DECOMP_NO_COMPOSE, 3718}, /* compatibility mapping */
+ {0xFC1C, 0, 2 | DECOMP_NO_COMPOSE, 3720}, /* compatibility mapping */
+ {0xFC1D, 0, 2 | DECOMP_NO_COMPOSE, 3722}, /* compatibility mapping */
+ {0xFC1E, 0, 2 | DECOMP_NO_COMPOSE, 3724}, /* compatibility mapping */
+ {0xFC1F, 0, 2 | DECOMP_NO_COMPOSE, 3726}, /* compatibility mapping */
+ {0xFC20, 0, 2 | DECOMP_NO_COMPOSE, 3728}, /* compatibility mapping */
+ {0xFC21, 0, 2 | DECOMP_NO_COMPOSE, 3730}, /* compatibility mapping */
+ {0xFC22, 0, 2 | DECOMP_NO_COMPOSE, 3732}, /* compatibility mapping */
+ {0xFC23, 0, 2 | DECOMP_NO_COMPOSE, 3734}, /* compatibility mapping */
+ {0xFC24, 0, 2 | DECOMP_NO_COMPOSE, 3736}, /* compatibility mapping */
+ {0xFC25, 0, 2 | DECOMP_NO_COMPOSE, 3738}, /* compatibility mapping */
+ {0xFC26, 0, 2 | DECOMP_NO_COMPOSE, 3740}, /* compatibility mapping */
+ {0xFC27, 0, 2 | DECOMP_NO_COMPOSE, 3742}, /* compatibility mapping */
+ {0xFC28, 0, 2 | DECOMP_NO_COMPOSE, 3744}, /* compatibility mapping */
+ {0xFC29, 0, 2 | DECOMP_NO_COMPOSE, 3746}, /* compatibility mapping */
+ {0xFC2A, 0, 2 | DECOMP_NO_COMPOSE, 3748}, /* compatibility mapping */
+ {0xFC2B, 0, 2 | DECOMP_NO_COMPOSE, 3750}, /* compatibility mapping */
+ {0xFC2C, 0, 2 | DECOMP_NO_COMPOSE, 3752}, /* compatibility mapping */
+ {0xFC2D, 0, 2 | DECOMP_NO_COMPOSE, 3754}, /* compatibility mapping */
+ {0xFC2E, 0, 2 | DECOMP_NO_COMPOSE, 3756}, /* compatibility mapping */
+ {0xFC2F, 0, 2 | DECOMP_NO_COMPOSE, 3758}, /* compatibility mapping */
+ {0xFC30, 0, 2 | DECOMP_NO_COMPOSE, 3760}, /* compatibility mapping */
+ {0xFC31, 0, 2 | DECOMP_NO_COMPOSE, 3762}, /* compatibility mapping */
+ {0xFC32, 0, 2 | DECOMP_NO_COMPOSE, 3764}, /* compatibility mapping */
+ {0xFC33, 0, 2 | DECOMP_NO_COMPOSE, 3766}, /* compatibility mapping */
+ {0xFC34, 0, 2 | DECOMP_NO_COMPOSE, 3768}, /* compatibility mapping */
+ {0xFC35, 0, 2 | DECOMP_NO_COMPOSE, 3770}, /* compatibility mapping */
+ {0xFC36, 0, 2 | DECOMP_NO_COMPOSE, 3772}, /* compatibility mapping */
+ {0xFC37, 0, 2 | DECOMP_NO_COMPOSE, 3774}, /* compatibility mapping */
+ {0xFC38, 0, 2 | DECOMP_NO_COMPOSE, 3776}, /* compatibility mapping */
+ {0xFC39, 0, 2 | DECOMP_NO_COMPOSE, 3778}, /* compatibility mapping */
+ {0xFC3A, 0, 2 | DECOMP_NO_COMPOSE, 3780}, /* compatibility mapping */
+ {0xFC3B, 0, 2 | DECOMP_NO_COMPOSE, 3782}, /* compatibility mapping */
+ {0xFC3C, 0, 2 | DECOMP_NO_COMPOSE, 3784}, /* compatibility mapping */
+ {0xFC3D, 0, 2 | DECOMP_NO_COMPOSE, 3786}, /* compatibility mapping */
+ {0xFC3E, 0, 2 | DECOMP_NO_COMPOSE, 3788}, /* compatibility mapping */
+ {0xFC3F, 0, 2 | DECOMP_NO_COMPOSE, 3790}, /* compatibility mapping */
+ {0xFC40, 0, 2 | DECOMP_NO_COMPOSE, 3792}, /* compatibility mapping */
+ {0xFC41, 0, 2 | DECOMP_NO_COMPOSE, 3794}, /* compatibility mapping */
+ {0xFC42, 0, 2 | DECOMP_NO_COMPOSE, 3796}, /* compatibility mapping */
+ {0xFC43, 0, 2 | DECOMP_NO_COMPOSE, 3798}, /* compatibility mapping */
+ {0xFC44, 0, 2 | DECOMP_NO_COMPOSE, 3800}, /* compatibility mapping */
+ {0xFC45, 0, 2 | DECOMP_NO_COMPOSE, 3802}, /* compatibility mapping */
+ {0xFC46, 0, 2 | DECOMP_NO_COMPOSE, 3804}, /* compatibility mapping */
+ {0xFC47, 0, 2 | DECOMP_NO_COMPOSE, 3806}, /* compatibility mapping */
+ {0xFC48, 0, 2 | DECOMP_NO_COMPOSE, 3808}, /* compatibility mapping */
+ {0xFC49, 0, 2 | DECOMP_NO_COMPOSE, 3810}, /* compatibility mapping */
+ {0xFC4A, 0, 2 | DECOMP_NO_COMPOSE, 3812}, /* compatibility mapping */
+ {0xFC4B, 0, 2 | DECOMP_NO_COMPOSE, 3814}, /* compatibility mapping */
+ {0xFC4C, 0, 2 | DECOMP_NO_COMPOSE, 3816}, /* compatibility mapping */
+ {0xFC4D, 0, 2 | DECOMP_NO_COMPOSE, 3818}, /* compatibility mapping */
+ {0xFC4E, 0, 2 | DECOMP_NO_COMPOSE, 3820}, /* compatibility mapping */
+ {0xFC4F, 0, 2 | DECOMP_NO_COMPOSE, 3822}, /* compatibility mapping */
+ {0xFC50, 0, 2 | DECOMP_NO_COMPOSE, 3824}, /* compatibility mapping */
+ {0xFC51, 0, 2 | DECOMP_NO_COMPOSE, 3826}, /* compatibility mapping */
+ {0xFC52, 0, 2 | DECOMP_NO_COMPOSE, 3828}, /* compatibility mapping */
+ {0xFC53, 0, 2 | DECOMP_NO_COMPOSE, 3830}, /* compatibility mapping */
+ {0xFC54, 0, 2 | DECOMP_NO_COMPOSE, 3832}, /* compatibility mapping */
+ {0xFC55, 0, 2 | DECOMP_NO_COMPOSE, 3834}, /* compatibility mapping */
+ {0xFC56, 0, 2 | DECOMP_NO_COMPOSE, 3836}, /* compatibility mapping */
+ {0xFC57, 0, 2 | DECOMP_NO_COMPOSE, 3838}, /* compatibility mapping */
+ {0xFC58, 0, 2 | DECOMP_NO_COMPOSE, 3840}, /* compatibility mapping */
+ {0xFC59, 0, 2 | DECOMP_NO_COMPOSE, 3842}, /* compatibility mapping */
+ {0xFC5A, 0, 2 | DECOMP_NO_COMPOSE, 3844}, /* compatibility mapping */
+ {0xFC5B, 0, 2 | DECOMP_NO_COMPOSE, 3846}, /* compatibility mapping */
+ {0xFC5C, 0, 2 | DECOMP_NO_COMPOSE, 3848}, /* compatibility mapping */
+ {0xFC5D, 0, 2 | DECOMP_NO_COMPOSE, 3850}, /* compatibility mapping */
+ {0xFC5E, 0, 3, 3852},
+ {0xFC5F, 0, 3, 3855},
+ {0xFC60, 0, 3, 3858},
+ {0xFC61, 0, 3, 3861},
+ {0xFC62, 0, 3, 3864},
+ {0xFC63, 0, 3, 3867},
+ {0xFC64, 0, 2 | DECOMP_NO_COMPOSE, 3870}, /* compatibility mapping */
+ {0xFC65, 0, 2 | DECOMP_NO_COMPOSE, 3872}, /* compatibility mapping */
+ {0xFC66, 0, 2 | DECOMP_NO_COMPOSE, 3874}, /* compatibility mapping */
+ {0xFC67, 0, 2 | DECOMP_NO_COMPOSE, 3876}, /* compatibility mapping */
+ {0xFC68, 0, 2 | DECOMP_NO_COMPOSE, 3878}, /* compatibility mapping */
+ {0xFC69, 0, 2 | DECOMP_NO_COMPOSE, 3880}, /* compatibility mapping */
+ {0xFC6A, 0, 2 | DECOMP_NO_COMPOSE, 3882}, /* compatibility mapping */
+ {0xFC6B, 0, 2 | DECOMP_NO_COMPOSE, 3884}, /* compatibility mapping */
+ {0xFC6C, 0, 2 | DECOMP_NO_COMPOSE, 3886}, /* compatibility mapping */
+ {0xFC6D, 0, 2 | DECOMP_NO_COMPOSE, 3888}, /* compatibility mapping */
+ {0xFC6E, 0, 2 | DECOMP_NO_COMPOSE, 3890}, /* compatibility mapping */
+ {0xFC6F, 0, 2 | DECOMP_NO_COMPOSE, 3892}, /* compatibility mapping */
+ {0xFC70, 0, 2 | DECOMP_NO_COMPOSE, 3894}, /* compatibility mapping */
+ {0xFC71, 0, 2 | DECOMP_NO_COMPOSE, 3896}, /* compatibility mapping */
+ {0xFC72, 0, 2 | DECOMP_NO_COMPOSE, 3898}, /* compatibility mapping */
+ {0xFC73, 0, 2 | DECOMP_NO_COMPOSE, 3900}, /* compatibility mapping */
+ {0xFC74, 0, 2 | DECOMP_NO_COMPOSE, 3902}, /* compatibility mapping */
+ {0xFC75, 0, 2 | DECOMP_NO_COMPOSE, 3904}, /* compatibility mapping */
+ {0xFC76, 0, 2 | DECOMP_NO_COMPOSE, 3906}, /* compatibility mapping */
+ {0xFC77, 0, 2 | DECOMP_NO_COMPOSE, 3908}, /* compatibility mapping */
+ {0xFC78, 0, 2 | DECOMP_NO_COMPOSE, 3910}, /* compatibility mapping */
+ {0xFC79, 0, 2 | DECOMP_NO_COMPOSE, 3912}, /* compatibility mapping */
+ {0xFC7A, 0, 2 | DECOMP_NO_COMPOSE, 3914}, /* compatibility mapping */
+ {0xFC7B, 0, 2 | DECOMP_NO_COMPOSE, 3916}, /* compatibility mapping */
+ {0xFC7C, 0, 2 | DECOMP_NO_COMPOSE, 3918}, /* compatibility mapping */
+ {0xFC7D, 0, 2 | DECOMP_NO_COMPOSE, 3920}, /* compatibility mapping */
+ {0xFC7E, 0, 2 | DECOMP_NO_COMPOSE, 3922}, /* compatibility mapping */
+ {0xFC7F, 0, 2 | DECOMP_NO_COMPOSE, 3924}, /* compatibility mapping */
+ {0xFC80, 0, 2 | DECOMP_NO_COMPOSE, 3926}, /* compatibility mapping */
+ {0xFC81, 0, 2 | DECOMP_NO_COMPOSE, 3928}, /* compatibility mapping */
+ {0xFC82, 0, 2 | DECOMP_NO_COMPOSE, 3930}, /* compatibility mapping */
+ {0xFC83, 0, 2 | DECOMP_NO_COMPOSE, 3932}, /* compatibility mapping */
+ {0xFC84, 0, 2 | DECOMP_NO_COMPOSE, 3934}, /* compatibility mapping */
+ {0xFC85, 0, 2 | DECOMP_NO_COMPOSE, 3936}, /* compatibility mapping */
+ {0xFC86, 0, 2 | DECOMP_NO_COMPOSE, 3938}, /* compatibility mapping */
+ {0xFC87, 0, 2 | DECOMP_NO_COMPOSE, 3940}, /* compatibility mapping */
+ {0xFC88, 0, 2 | DECOMP_NO_COMPOSE, 3942}, /* compatibility mapping */
+ {0xFC89, 0, 2 | DECOMP_NO_COMPOSE, 3944}, /* compatibility mapping */
+ {0xFC8A, 0, 2 | DECOMP_NO_COMPOSE, 3946}, /* compatibility mapping */
+ {0xFC8B, 0, 2 | DECOMP_NO_COMPOSE, 3948}, /* compatibility mapping */
+ {0xFC8C, 0, 2 | DECOMP_NO_COMPOSE, 3950}, /* compatibility mapping */
+ {0xFC8D, 0, 2 | DECOMP_NO_COMPOSE, 3952}, /* compatibility mapping */
+ {0xFC8E, 0, 2 | DECOMP_NO_COMPOSE, 3954}, /* compatibility mapping */
+ {0xFC8F, 0, 2 | DECOMP_NO_COMPOSE, 3956}, /* compatibility mapping */
+ {0xFC90, 0, 2 | DECOMP_NO_COMPOSE, 3958}, /* compatibility mapping */
+ {0xFC91, 0, 2 | DECOMP_NO_COMPOSE, 3960}, /* compatibility mapping */
+ {0xFC92, 0, 2 | DECOMP_NO_COMPOSE, 3962}, /* compatibility mapping */
+ {0xFC93, 0, 2 | DECOMP_NO_COMPOSE, 3964}, /* compatibility mapping */
+ {0xFC94, 0, 2 | DECOMP_NO_COMPOSE, 3966}, /* compatibility mapping */
+ {0xFC95, 0, 2 | DECOMP_NO_COMPOSE, 3968}, /* compatibility mapping */
+ {0xFC96, 0, 2 | DECOMP_NO_COMPOSE, 3970}, /* compatibility mapping */
+ {0xFC97, 0, 2 | DECOMP_NO_COMPOSE, 3972}, /* compatibility mapping */
+ {0xFC98, 0, 2 | DECOMP_NO_COMPOSE, 3974}, /* compatibility mapping */
+ {0xFC99, 0, 2 | DECOMP_NO_COMPOSE, 3976}, /* compatibility mapping */
+ {0xFC9A, 0, 2 | DECOMP_NO_COMPOSE, 3978}, /* compatibility mapping */
+ {0xFC9B, 0, 2 | DECOMP_NO_COMPOSE, 3980}, /* compatibility mapping */
+ {0xFC9C, 0, 2 | DECOMP_NO_COMPOSE, 3982}, /* compatibility mapping */
+ {0xFC9D, 0, 2 | DECOMP_NO_COMPOSE, 3984}, /* compatibility mapping */
+ {0xFC9E, 0, 2 | DECOMP_NO_COMPOSE, 3986}, /* compatibility mapping */
+ {0xFC9F, 0, 2 | DECOMP_NO_COMPOSE, 3988}, /* compatibility mapping */
+ {0xFCA0, 0, 2 | DECOMP_NO_COMPOSE, 3990}, /* compatibility mapping */
+ {0xFCA1, 0, 2 | DECOMP_NO_COMPOSE, 3992}, /* compatibility mapping */
+ {0xFCA2, 0, 2 | DECOMP_NO_COMPOSE, 3994}, /* compatibility mapping */
+ {0xFCA3, 0, 2 | DECOMP_NO_COMPOSE, 3996}, /* compatibility mapping */
+ {0xFCA4, 0, 2 | DECOMP_NO_COMPOSE, 3998}, /* compatibility mapping */
+ {0xFCA5, 0, 2 | DECOMP_NO_COMPOSE, 4000}, /* compatibility mapping */
+ {0xFCA6, 0, 2 | DECOMP_NO_COMPOSE, 4002}, /* compatibility mapping */
+ {0xFCA7, 0, 2 | DECOMP_NO_COMPOSE, 4004}, /* compatibility mapping */
+ {0xFCA8, 0, 2 | DECOMP_NO_COMPOSE, 4006}, /* compatibility mapping */
+ {0xFCA9, 0, 2 | DECOMP_NO_COMPOSE, 4008}, /* compatibility mapping */
+ {0xFCAA, 0, 2 | DECOMP_NO_COMPOSE, 4010}, /* compatibility mapping */
+ {0xFCAB, 0, 2 | DECOMP_NO_COMPOSE, 4012}, /* compatibility mapping */
+ {0xFCAC, 0, 2 | DECOMP_NO_COMPOSE, 4014}, /* compatibility mapping */
+ {0xFCAD, 0, 2 | DECOMP_NO_COMPOSE, 4016}, /* compatibility mapping */
+ {0xFCAE, 0, 2 | DECOMP_NO_COMPOSE, 4018}, /* compatibility mapping */
+ {0xFCAF, 0, 2 | DECOMP_NO_COMPOSE, 4020}, /* compatibility mapping */
+ {0xFCB0, 0, 2 | DECOMP_NO_COMPOSE, 4022}, /* compatibility mapping */
+ {0xFCB1, 0, 2 | DECOMP_NO_COMPOSE, 4024}, /* compatibility mapping */
+ {0xFCB2, 0, 2 | DECOMP_NO_COMPOSE, 4026}, /* compatibility mapping */
+ {0xFCB3, 0, 2 | DECOMP_NO_COMPOSE, 4028}, /* compatibility mapping */
+ {0xFCB4, 0, 2 | DECOMP_NO_COMPOSE, 4030}, /* compatibility mapping */
+ {0xFCB5, 0, 2 | DECOMP_NO_COMPOSE, 4032}, /* compatibility mapping */
+ {0xFCB6, 0, 2 | DECOMP_NO_COMPOSE, 4034}, /* compatibility mapping */
+ {0xFCB7, 0, 2 | DECOMP_NO_COMPOSE, 4036}, /* compatibility mapping */
+ {0xFCB8, 0, 2 | DECOMP_NO_COMPOSE, 4038}, /* compatibility mapping */
+ {0xFCB9, 0, 2 | DECOMP_NO_COMPOSE, 4040}, /* compatibility mapping */
+ {0xFCBA, 0, 2 | DECOMP_NO_COMPOSE, 4042}, /* compatibility mapping */
+ {0xFCBB, 0, 2 | DECOMP_NO_COMPOSE, 4044}, /* compatibility mapping */
+ {0xFCBC, 0, 2 | DECOMP_NO_COMPOSE, 4046}, /* compatibility mapping */
+ {0xFCBD, 0, 2 | DECOMP_NO_COMPOSE, 4048}, /* compatibility mapping */
+ {0xFCBE, 0, 2 | DECOMP_NO_COMPOSE, 4050}, /* compatibility mapping */
+ {0xFCBF, 0, 2 | DECOMP_NO_COMPOSE, 4052}, /* compatibility mapping */
+ {0xFCC0, 0, 2 | DECOMP_NO_COMPOSE, 4054}, /* compatibility mapping */
+ {0xFCC1, 0, 2 | DECOMP_NO_COMPOSE, 4056}, /* compatibility mapping */
+ {0xFCC2, 0, 2 | DECOMP_NO_COMPOSE, 4058}, /* compatibility mapping */
+ {0xFCC3, 0, 2 | DECOMP_NO_COMPOSE, 4060}, /* compatibility mapping */
+ {0xFCC4, 0, 2 | DECOMP_NO_COMPOSE, 4062}, /* compatibility mapping */
+ {0xFCC5, 0, 2 | DECOMP_NO_COMPOSE, 4064}, /* compatibility mapping */
+ {0xFCC6, 0, 2 | DECOMP_NO_COMPOSE, 4066}, /* compatibility mapping */
+ {0xFCC7, 0, 2 | DECOMP_NO_COMPOSE, 4068}, /* compatibility mapping */
+ {0xFCC8, 0, 2 | DECOMP_NO_COMPOSE, 4070}, /* compatibility mapping */
+ {0xFCC9, 0, 2 | DECOMP_NO_COMPOSE, 4072}, /* compatibility mapping */
+ {0xFCCA, 0, 2 | DECOMP_NO_COMPOSE, 4074}, /* compatibility mapping */
+ {0xFCCB, 0, 2 | DECOMP_NO_COMPOSE, 4076}, /* compatibility mapping */
+ {0xFCCC, 0, 2 | DECOMP_NO_COMPOSE, 4078}, /* compatibility mapping */
+ {0xFCCD, 0, 2 | DECOMP_NO_COMPOSE, 4080}, /* compatibility mapping */
+ {0xFCCE, 0, 2 | DECOMP_NO_COMPOSE, 4082}, /* compatibility mapping */
+ {0xFCCF, 0, 2 | DECOMP_NO_COMPOSE, 4084}, /* compatibility mapping */
+ {0xFCD0, 0, 2 | DECOMP_NO_COMPOSE, 4086}, /* compatibility mapping */
+ {0xFCD1, 0, 2 | DECOMP_NO_COMPOSE, 4088}, /* compatibility mapping */
+ {0xFCD2, 0, 2 | DECOMP_NO_COMPOSE, 4090}, /* compatibility mapping */
+ {0xFCD3, 0, 2 | DECOMP_NO_COMPOSE, 4092}, /* compatibility mapping */
+ {0xFCD4, 0, 2 | DECOMP_NO_COMPOSE, 4094}, /* compatibility mapping */
+ {0xFCD5, 0, 2 | DECOMP_NO_COMPOSE, 4096}, /* compatibility mapping */
+ {0xFCD6, 0, 2 | DECOMP_NO_COMPOSE, 4098}, /* compatibility mapping */
+ {0xFCD7, 0, 2 | DECOMP_NO_COMPOSE, 4100}, /* compatibility mapping */
+ {0xFCD8, 0, 2 | DECOMP_NO_COMPOSE, 4102}, /* compatibility mapping */
+ {0xFCD9, 0, 2 | DECOMP_NO_COMPOSE, 4104}, /* compatibility mapping */
+ {0xFCDA, 0, 2 | DECOMP_NO_COMPOSE, 4106}, /* compatibility mapping */
+ {0xFCDB, 0, 2 | DECOMP_NO_COMPOSE, 4108}, /* compatibility mapping */
+ {0xFCDC, 0, 2 | DECOMP_NO_COMPOSE, 4110}, /* compatibility mapping */
+ {0xFCDD, 0, 2 | DECOMP_NO_COMPOSE, 4112}, /* compatibility mapping */
+ {0xFCDE, 0, 2 | DECOMP_NO_COMPOSE, 4114}, /* compatibility mapping */
+ {0xFCDF, 0, 2 | DECOMP_NO_COMPOSE, 4116}, /* compatibility mapping */
+ {0xFCE0, 0, 2 | DECOMP_NO_COMPOSE, 4118}, /* compatibility mapping */
+ {0xFCE1, 0, 2 | DECOMP_NO_COMPOSE, 4120}, /* compatibility mapping */
+ {0xFCE2, 0, 2 | DECOMP_NO_COMPOSE, 4122}, /* compatibility mapping */
+ {0xFCE3, 0, 2 | DECOMP_NO_COMPOSE, 4124}, /* compatibility mapping */
+ {0xFCE4, 0, 2 | DECOMP_NO_COMPOSE, 4126}, /* compatibility mapping */
+ {0xFCE5, 0, 2 | DECOMP_NO_COMPOSE, 4128}, /* compatibility mapping */
+ {0xFCE6, 0, 2 | DECOMP_NO_COMPOSE, 4130}, /* compatibility mapping */
+ {0xFCE7, 0, 2 | DECOMP_NO_COMPOSE, 4132}, /* compatibility mapping */
+ {0xFCE8, 0, 2 | DECOMP_NO_COMPOSE, 4134}, /* compatibility mapping */
+ {0xFCE9, 0, 2 | DECOMP_NO_COMPOSE, 4136}, /* compatibility mapping */
+ {0xFCEA, 0, 2 | DECOMP_NO_COMPOSE, 4138}, /* compatibility mapping */
+ {0xFCEB, 0, 2 | DECOMP_NO_COMPOSE, 4140}, /* compatibility mapping */
+ {0xFCEC, 0, 2 | DECOMP_NO_COMPOSE, 4142}, /* compatibility mapping */
+ {0xFCED, 0, 2 | DECOMP_NO_COMPOSE, 4144}, /* compatibility mapping */
+ {0xFCEE, 0, 2 | DECOMP_NO_COMPOSE, 4146}, /* compatibility mapping */
+ {0xFCEF, 0, 2 | DECOMP_NO_COMPOSE, 4148}, /* compatibility mapping */
+ {0xFCF0, 0, 2 | DECOMP_NO_COMPOSE, 4150}, /* compatibility mapping */
+ {0xFCF1, 0, 2 | DECOMP_NO_COMPOSE, 4152}, /* compatibility mapping */
+ {0xFCF2, 0, 3, 4154},
+ {0xFCF3, 0, 3, 4157},
+ {0xFCF4, 0, 3, 4160},
+ {0xFCF5, 0, 2 | DECOMP_NO_COMPOSE, 4163}, /* compatibility mapping */
+ {0xFCF6, 0, 2 | DECOMP_NO_COMPOSE, 4165}, /* compatibility mapping */
+ {0xFCF7, 0, 2 | DECOMP_NO_COMPOSE, 4167}, /* compatibility mapping */
+ {0xFCF8, 0, 2 | DECOMP_NO_COMPOSE, 4169}, /* compatibility mapping */
+ {0xFCF9, 0, 2 | DECOMP_NO_COMPOSE, 4171}, /* compatibility mapping */
+ {0xFCFA, 0, 2 | DECOMP_NO_COMPOSE, 4173}, /* compatibility mapping */
+ {0xFCFB, 0, 2 | DECOMP_NO_COMPOSE, 4175}, /* compatibility mapping */
+ {0xFCFC, 0, 2 | DECOMP_NO_COMPOSE, 4177}, /* compatibility mapping */
+ {0xFCFD, 0, 2 | DECOMP_NO_COMPOSE, 4179}, /* compatibility mapping */
+ {0xFCFE, 0, 2 | DECOMP_NO_COMPOSE, 4181}, /* compatibility mapping */
+ {0xFCFF, 0, 2 | DECOMP_NO_COMPOSE, 4183}, /* compatibility mapping */
+ {0xFD00, 0, 2 | DECOMP_NO_COMPOSE, 4185}, /* compatibility mapping */
+ {0xFD01, 0, 2 | DECOMP_NO_COMPOSE, 4187}, /* compatibility mapping */
+ {0xFD02, 0, 2 | DECOMP_NO_COMPOSE, 4189}, /* compatibility mapping */
+ {0xFD03, 0, 2 | DECOMP_NO_COMPOSE, 4191}, /* compatibility mapping */
+ {0xFD04, 0, 2 | DECOMP_NO_COMPOSE, 4193}, /* compatibility mapping */
+ {0xFD05, 0, 2 | DECOMP_NO_COMPOSE, 4195}, /* compatibility mapping */
+ {0xFD06, 0, 2 | DECOMP_NO_COMPOSE, 4197}, /* compatibility mapping */
+ {0xFD07, 0, 2 | DECOMP_NO_COMPOSE, 4199}, /* compatibility mapping */
+ {0xFD08, 0, 2 | DECOMP_NO_COMPOSE, 4201}, /* compatibility mapping */
+ {0xFD09, 0, 2 | DECOMP_NO_COMPOSE, 4203}, /* compatibility mapping */
+ {0xFD0A, 0, 2 | DECOMP_NO_COMPOSE, 4205}, /* compatibility mapping */
+ {0xFD0B, 0, 2 | DECOMP_NO_COMPOSE, 4207}, /* compatibility mapping */
+ {0xFD0C, 0, 2 | DECOMP_NO_COMPOSE, 4209}, /* compatibility mapping */
+ {0xFD0D, 0, 2 | DECOMP_NO_COMPOSE, 4211}, /* compatibility mapping */
+ {0xFD0E, 0, 2 | DECOMP_NO_COMPOSE, 4213}, /* compatibility mapping */
+ {0xFD0F, 0, 2 | DECOMP_NO_COMPOSE, 4215}, /* compatibility mapping */
+ {0xFD10, 0, 2 | DECOMP_NO_COMPOSE, 4217}, /* compatibility mapping */
+ {0xFD11, 0, 2 | DECOMP_NO_COMPOSE, 4219}, /* compatibility mapping */
+ {0xFD12, 0, 2 | DECOMP_NO_COMPOSE, 4221}, /* compatibility mapping */
+ {0xFD13, 0, 2 | DECOMP_NO_COMPOSE, 4223}, /* compatibility mapping */
+ {0xFD14, 0, 2 | DECOMP_NO_COMPOSE, 4225}, /* compatibility mapping */
+ {0xFD15, 0, 2 | DECOMP_NO_COMPOSE, 4227}, /* compatibility mapping */
+ {0xFD16, 0, 2 | DECOMP_NO_COMPOSE, 4229}, /* compatibility mapping */
+ {0xFD17, 0, 2 | DECOMP_NO_COMPOSE, 4231}, /* compatibility mapping */
+ {0xFD18, 0, 2 | DECOMP_NO_COMPOSE, 4233}, /* compatibility mapping */
+ {0xFD19, 0, 2 | DECOMP_NO_COMPOSE, 4235}, /* compatibility mapping */
+ {0xFD1A, 0, 2 | DECOMP_NO_COMPOSE, 4237}, /* compatibility mapping */
+ {0xFD1B, 0, 2 | DECOMP_NO_COMPOSE, 4239}, /* compatibility mapping */
+ {0xFD1C, 0, 2 | DECOMP_NO_COMPOSE, 4241}, /* compatibility mapping */
+ {0xFD1D, 0, 2 | DECOMP_NO_COMPOSE, 4243}, /* compatibility mapping */
+ {0xFD1E, 0, 2 | DECOMP_NO_COMPOSE, 4245}, /* compatibility mapping */
+ {0xFD1F, 0, 2 | DECOMP_NO_COMPOSE, 4247}, /* compatibility mapping */
+ {0xFD20, 0, 2 | DECOMP_NO_COMPOSE, 4249}, /* compatibility mapping */
+ {0xFD21, 0, 2 | DECOMP_NO_COMPOSE, 4251}, /* compatibility mapping */
+ {0xFD22, 0, 2 | DECOMP_NO_COMPOSE, 4253}, /* compatibility mapping */
+ {0xFD23, 0, 2 | DECOMP_NO_COMPOSE, 4255}, /* compatibility mapping */
+ {0xFD24, 0, 2 | DECOMP_NO_COMPOSE, 4257}, /* compatibility mapping */
+ {0xFD25, 0, 2 | DECOMP_NO_COMPOSE, 4259}, /* compatibility mapping */
+ {0xFD26, 0, 2 | DECOMP_NO_COMPOSE, 4261}, /* compatibility mapping */
+ {0xFD27, 0, 2 | DECOMP_NO_COMPOSE, 4263}, /* compatibility mapping */
+ {0xFD28, 0, 2 | DECOMP_NO_COMPOSE, 4265}, /* compatibility mapping */
+ {0xFD29, 0, 2 | DECOMP_NO_COMPOSE, 4267}, /* compatibility mapping */
+ {0xFD2A, 0, 2 | DECOMP_NO_COMPOSE, 4269}, /* compatibility mapping */
+ {0xFD2B, 0, 2 | DECOMP_NO_COMPOSE, 4271}, /* compatibility mapping */
+ {0xFD2C, 0, 2 | DECOMP_NO_COMPOSE, 4273}, /* compatibility mapping */
+ {0xFD2D, 0, 2 | DECOMP_NO_COMPOSE, 4275}, /* compatibility mapping */
+ {0xFD2E, 0, 2 | DECOMP_NO_COMPOSE, 4277}, /* compatibility mapping */
+ {0xFD2F, 0, 2 | DECOMP_NO_COMPOSE, 4279}, /* compatibility mapping */
+ {0xFD30, 0, 2 | DECOMP_NO_COMPOSE, 4281}, /* compatibility mapping */
+ {0xFD31, 0, 2 | DECOMP_NO_COMPOSE, 4283}, /* compatibility mapping */
+ {0xFD32, 0, 2 | DECOMP_NO_COMPOSE, 4285}, /* compatibility mapping */
+ {0xFD33, 0, 2 | DECOMP_NO_COMPOSE, 4287}, /* compatibility mapping */
+ {0xFD34, 0, 2 | DECOMP_NO_COMPOSE, 4289}, /* compatibility mapping */
+ {0xFD35, 0, 2 | DECOMP_NO_COMPOSE, 4291}, /* compatibility mapping */
+ {0xFD36, 0, 2 | DECOMP_NO_COMPOSE, 4293}, /* compatibility mapping */
+ {0xFD37, 0, 2 | DECOMP_NO_COMPOSE, 4295}, /* compatibility mapping */
+ {0xFD38, 0, 2 | DECOMP_NO_COMPOSE, 4297}, /* compatibility mapping */
+ {0xFD39, 0, 2 | DECOMP_NO_COMPOSE, 4299}, /* compatibility mapping */
+ {0xFD3A, 0, 2 | DECOMP_NO_COMPOSE, 4301}, /* compatibility mapping */
+ {0xFD3B, 0, 2 | DECOMP_NO_COMPOSE, 4303}, /* compatibility mapping */
+ {0xFD3C, 0, 2 | DECOMP_NO_COMPOSE, 4305}, /* compatibility mapping */
+ {0xFD3D, 0, 2 | DECOMP_NO_COMPOSE, 4307}, /* compatibility mapping */
+ {0xFD50, 0, 3, 4309},
+ {0xFD51, 0, 3, 4312},
+ {0xFD52, 0, 3, 4315},
+ {0xFD53, 0, 3, 4318},
+ {0xFD54, 0, 3, 4321},
+ {0xFD55, 0, 3, 4324},
+ {0xFD56, 0, 3, 4327},
+ {0xFD57, 0, 3, 4330},
+ {0xFD58, 0, 3, 4333},
+ {0xFD59, 0, 3, 4336},
+ {0xFD5A, 0, 3, 4339},
+ {0xFD5B, 0, 3, 4342},
+ {0xFD5C, 0, 3, 4345},
+ {0xFD5D, 0, 3, 4348},
+ {0xFD5E, 0, 3, 4351},
+ {0xFD5F, 0, 3, 4354},
+ {0xFD60, 0, 3, 4357},
+ {0xFD61, 0, 3, 4360},
+ {0xFD62, 0, 3, 4363},
+ {0xFD63, 0, 3, 4366},
+ {0xFD64, 0, 3, 4369},
+ {0xFD65, 0, 3, 4372},
+ {0xFD66, 0, 3, 4375},
+ {0xFD67, 0, 3, 4378},
+ {0xFD68, 0, 3, 4381},
+ {0xFD69, 0, 3, 4384},
+ {0xFD6A, 0, 3, 4387},
+ {0xFD6B, 0, 3, 4390},
+ {0xFD6C, 0, 3, 4393},
+ {0xFD6D, 0, 3, 4396},
+ {0xFD6E, 0, 3, 4399},
+ {0xFD6F, 0, 3, 4402},
+ {0xFD70, 0, 3, 4405},
+ {0xFD71, 0, 3, 4408},
+ {0xFD72, 0, 3, 4411},
+ {0xFD73, 0, 3, 4414},
+ {0xFD74, 0, 3, 4417},
+ {0xFD75, 0, 3, 4420},
+ {0xFD76, 0, 3, 4423},
+ {0xFD77, 0, 3, 4426},
+ {0xFD78, 0, 3, 4429},
+ {0xFD79, 0, 3, 4432},
+ {0xFD7A, 0, 3, 4435},
+ {0xFD7B, 0, 3, 4438},
+ {0xFD7C, 0, 3, 4441},
+ {0xFD7D, 0, 3, 4444},
+ {0xFD7E, 0, 3, 4447},
+ {0xFD7F, 0, 3, 4450},
+ {0xFD80, 0, 3, 4453},
+ {0xFD81, 0, 3, 4456},
+ {0xFD82, 0, 3, 4459},
+ {0xFD83, 0, 3, 4462},
+ {0xFD84, 0, 3, 4465},
+ {0xFD85, 0, 3, 4468},
+ {0xFD86, 0, 3, 4471},
+ {0xFD87, 0, 3, 4474},
+ {0xFD88, 0, 3, 4477},
+ {0xFD89, 0, 3, 4480},
+ {0xFD8A, 0, 3, 4483},
+ {0xFD8B, 0, 3, 4486},
+ {0xFD8C, 0, 3, 4489},
+ {0xFD8D, 0, 3, 4492},
+ {0xFD8E, 0, 3, 4495},
+ {0xFD8F, 0, 3, 4498},
+ {0xFD92, 0, 3, 4501},
+ {0xFD93, 0, 3, 4504},
+ {0xFD94, 0, 3, 4507},
+ {0xFD95, 0, 3, 4510},
+ {0xFD96, 0, 3, 4513},
+ {0xFD97, 0, 3, 4516},
+ {0xFD98, 0, 3, 4519},
+ {0xFD99, 0, 3, 4522},
+ {0xFD9A, 0, 3, 4525},
+ {0xFD9B, 0, 3, 4528},
+ {0xFD9C, 0, 3, 4531},
+ {0xFD9D, 0, 3, 4534},
+ {0xFD9E, 0, 3, 4537},
+ {0xFD9F, 0, 3, 4540},
+ {0xFDA0, 0, 3, 4543},
+ {0xFDA1, 0, 3, 4546},
+ {0xFDA2, 0, 3, 4549},
+ {0xFDA3, 0, 3, 4552},
+ {0xFDA4, 0, 3, 4555},
+ {0xFDA5, 0, 3, 4558},
+ {0xFDA6, 0, 3, 4561},
+ {0xFDA7, 0, 3, 4564},
+ {0xFDA8, 0, 3, 4567},
+ {0xFDA9, 0, 3, 4570},
+ {0xFDAA, 0, 3, 4573},
+ {0xFDAB, 0, 3, 4576},
+ {0xFDAC, 0, 3, 4579},
+ {0xFDAD, 0, 3, 4582},
+ {0xFDAE, 0, 3, 4585},
+ {0xFDAF, 0, 3, 4588},
+ {0xFDB0, 0, 3, 4591},
+ {0xFDB1, 0, 3, 4594},
+ {0xFDB2, 0, 3, 4597},
+ {0xFDB3, 0, 3, 4600},
+ {0xFDB4, 0, 3, 4603},
+ {0xFDB5, 0, 3, 4606},
+ {0xFDB6, 0, 3, 4609},
+ {0xFDB7, 0, 3, 4612},
+ {0xFDB8, 0, 3, 4615},
+ {0xFDB9, 0, 3, 4618},
+ {0xFDBA, 0, 3, 4621},
+ {0xFDBB, 0, 3, 4624},
+ {0xFDBC, 0, 3, 4627},
+ {0xFDBD, 0, 3, 4630},
+ {0xFDBE, 0, 3, 4633},
+ {0xFDBF, 0, 3, 4636},
+ {0xFDC0, 0, 3, 4639},
+ {0xFDC1, 0, 3, 4642},
+ {0xFDC2, 0, 3, 4645},
+ {0xFDC3, 0, 3, 4648},
+ {0xFDC4, 0, 3, 4651},
+ {0xFDC5, 0, 3, 4654},
+ {0xFDC6, 0, 3, 4657},
+ {0xFDC7, 0, 3, 4660},
+ {0xFDF0, 0, 3, 4663},
+ {0xFDF1, 0, 3, 4666},
+ {0xFDF2, 0, 4, 4669},
+ {0xFDF3, 0, 4, 4673},
+ {0xFDF4, 0, 4, 4677},
+ {0xFDF5, 0, 4, 4681},
+ {0xFDF6, 0, 4, 4685},
+ {0xFDF7, 0, 4, 4689},
+ {0xFDF8, 0, 4, 4693},
+ {0xFDF9, 0, 3, 4697},
+ {0xFDFA, 0, 18, 4700},
+ {0xFDFB, 0, 8, 4718},
+ {0xFDFC, 0, 4, 4726},
+ {0xFE10, 0, 1 | DECOMP_INLINE, 0x002C},
+ {0xFE11, 0, 1 | DECOMP_INLINE, 0x3001},
+ {0xFE12, 0, 1 | DECOMP_INLINE, 0x3002},
+ {0xFE13, 0, 1 | DECOMP_INLINE, 0x003A},
+ {0xFE14, 0, 1 | DECOMP_INLINE, 0x003B},
+ {0xFE15, 0, 1 | DECOMP_INLINE, 0x0021},
+ {0xFE16, 0, 1 | DECOMP_INLINE, 0x003F},
+ {0xFE17, 0, 1 | DECOMP_INLINE, 0x3016},
+ {0xFE18, 0, 1 | DECOMP_INLINE, 0x3017},
+ {0xFE19, 0, 1 | DECOMP_INLINE, 0x2026},
+ {0xFE20, 230, 0, 0},
+ {0xFE21, 230, 0, 0},
+ {0xFE22, 230, 0, 0},
+ {0xFE23, 230, 0, 0},
+ {0xFE24, 230, 0, 0},
+ {0xFE25, 230, 0, 0},
+ {0xFE26, 230, 0, 0},
+ {0xFE27, 220, 0, 0},
+ {0xFE28, 220, 0, 0},
+ {0xFE29, 220, 0, 0},
+ {0xFE2A, 220, 0, 0},
+ {0xFE2B, 220, 0, 0},
+ {0xFE2C, 220, 0, 0},
+ {0xFE2D, 220, 0, 0},
+ {0xFE2E, 230, 0, 0},
+ {0xFE2F, 230, 0, 0},
+ {0xFE30, 0, 1 | DECOMP_INLINE, 0x2025},
+ {0xFE31, 0, 1 | DECOMP_INLINE, 0x2014},
+ {0xFE32, 0, 1 | DECOMP_INLINE, 0x2013},
+ {0xFE33, 0, 1 | DECOMP_INLINE, 0x005F},
+ {0xFE34, 0, 1 | DECOMP_INLINE, 0x005F},
+ {0xFE35, 0, 1 | DECOMP_INLINE, 0x0028},
+ {0xFE36, 0, 1 | DECOMP_INLINE, 0x0029},
+ {0xFE37, 0, 1 | DECOMP_INLINE, 0x007B},
+ {0xFE38, 0, 1 | DECOMP_INLINE, 0x007D},
+ {0xFE39, 0, 1 | DECOMP_INLINE, 0x3014},
+ {0xFE3A, 0, 1 | DECOMP_INLINE, 0x3015},
+ {0xFE3B, 0, 1 | DECOMP_INLINE, 0x3010},
+ {0xFE3C, 0, 1 | DECOMP_INLINE, 0x3011},
+ {0xFE3D, 0, 1 | DECOMP_INLINE, 0x300A},
+ {0xFE3E, 0, 1 | DECOMP_INLINE, 0x300B},
+ {0xFE3F, 0, 1 | DECOMP_INLINE, 0x3008},
+ {0xFE40, 0, 1 | DECOMP_INLINE, 0x3009},
+ {0xFE41, 0, 1 | DECOMP_INLINE, 0x300C},
+ {0xFE42, 0, 1 | DECOMP_INLINE, 0x300D},
+ {0xFE43, 0, 1 | DECOMP_INLINE, 0x300E},
+ {0xFE44, 0, 1 | DECOMP_INLINE, 0x300F},
+ {0xFE47, 0, 1 | DECOMP_INLINE, 0x005B},
+ {0xFE48, 0, 1 | DECOMP_INLINE, 0x005D},
+ {0xFE49, 0, 1 | DECOMP_INLINE, 0x203E},
+ {0xFE4A, 0, 1 | DECOMP_INLINE, 0x203E},
+ {0xFE4B, 0, 1 | DECOMP_INLINE, 0x203E},
+ {0xFE4C, 0, 1 | DECOMP_INLINE, 0x203E},
+ {0xFE4D, 0, 1 | DECOMP_INLINE, 0x005F},
+ {0xFE4E, 0, 1 | DECOMP_INLINE, 0x005F},
+ {0xFE4F, 0, 1 | DECOMP_INLINE, 0x005F},
+ {0xFE50, 0, 1 | DECOMP_INLINE, 0x002C},
+ {0xFE51, 0, 1 | DECOMP_INLINE, 0x3001},
+ {0xFE52, 0, 1 | DECOMP_INLINE, 0x002E},
+ {0xFE54, 0, 1 | DECOMP_INLINE, 0x003B},
+ {0xFE55, 0, 1 | DECOMP_INLINE, 0x003A},
+ {0xFE56, 0, 1 | DECOMP_INLINE, 0x003F},
+ {0xFE57, 0, 1 | DECOMP_INLINE, 0x0021},
+ {0xFE58, 0, 1 | DECOMP_INLINE, 0x2014},
+ {0xFE59, 0, 1 | DECOMP_INLINE, 0x0028},
+ {0xFE5A, 0, 1 | DECOMP_INLINE, 0x0029},
+ {0xFE5B, 0, 1 | DECOMP_INLINE, 0x007B},
+ {0xFE5C, 0, 1 | DECOMP_INLINE, 0x007D},
+ {0xFE5D, 0, 1 | DECOMP_INLINE, 0x3014},
+ {0xFE5E, 0, 1 | DECOMP_INLINE, 0x3015},
+ {0xFE5F, 0, 1 | DECOMP_INLINE, 0x0023},
+ {0xFE60, 0, 1 | DECOMP_INLINE, 0x0026},
+ {0xFE61, 0, 1 | DECOMP_INLINE, 0x002A},
+ {0xFE62, 0, 1 | DECOMP_INLINE, 0x002B},
+ {0xFE63, 0, 1 | DECOMP_INLINE, 0x002D},
+ {0xFE64, 0, 1 | DECOMP_INLINE, 0x003C},
+ {0xFE65, 0, 1 | DECOMP_INLINE, 0x003E},
+ {0xFE66, 0, 1 | DECOMP_INLINE, 0x003D},
+ {0xFE68, 0, 1 | DECOMP_INLINE, 0x005C},
+ {0xFE69, 0, 1 | DECOMP_INLINE, 0x0024},
+ {0xFE6A, 0, 1 | DECOMP_INLINE, 0x0025},
+ {0xFE6B, 0, 1 | DECOMP_INLINE, 0x0040},
+ {0xFE70, 0, 2 | DECOMP_NO_COMPOSE, 4730}, /* compatibility mapping */
+ {0xFE71, 0, 2 | DECOMP_NO_COMPOSE, 4732}, /* compatibility mapping */
+ {0xFE72, 0, 2 | DECOMP_NO_COMPOSE, 4734}, /* compatibility mapping */
+ {0xFE74, 0, 2 | DECOMP_NO_COMPOSE, 4736}, /* compatibility mapping */
+ {0xFE76, 0, 2 | DECOMP_NO_COMPOSE, 4738}, /* compatibility mapping */
+ {0xFE77, 0, 2 | DECOMP_NO_COMPOSE, 4740}, /* compatibility mapping */
+ {0xFE78, 0, 2 | DECOMP_NO_COMPOSE, 4742}, /* compatibility mapping */
+ {0xFE79, 0, 2 | DECOMP_NO_COMPOSE, 4744}, /* compatibility mapping */
+ {0xFE7A, 0, 2 | DECOMP_NO_COMPOSE, 4746}, /* compatibility mapping */
+ {0xFE7B, 0, 2 | DECOMP_NO_COMPOSE, 4748}, /* compatibility mapping */
+ {0xFE7C, 0, 2 | DECOMP_NO_COMPOSE, 4750}, /* compatibility mapping */
+ {0xFE7D, 0, 2 | DECOMP_NO_COMPOSE, 4752}, /* compatibility mapping */
+ {0xFE7E, 0, 2 | DECOMP_NO_COMPOSE, 4754}, /* compatibility mapping */
+ {0xFE7F, 0, 2 | DECOMP_NO_COMPOSE, 4756}, /* compatibility mapping */
+ {0xFE80, 0, 1 | DECOMP_INLINE, 0x0621},
+ {0xFE81, 0, 1 | DECOMP_INLINE, 0x0622},
+ {0xFE82, 0, 1 | DECOMP_INLINE, 0x0622},
+ {0xFE83, 0, 1 | DECOMP_INLINE, 0x0623},
+ {0xFE84, 0, 1 | DECOMP_INLINE, 0x0623},
+ {0xFE85, 0, 1 | DECOMP_INLINE, 0x0624},
+ {0xFE86, 0, 1 | DECOMP_INLINE, 0x0624},
+ {0xFE87, 0, 1 | DECOMP_INLINE, 0x0625},
+ {0xFE88, 0, 1 | DECOMP_INLINE, 0x0625},
+ {0xFE89, 0, 1 | DECOMP_INLINE, 0x0626},
+ {0xFE8A, 0, 1 | DECOMP_INLINE, 0x0626},
+ {0xFE8B, 0, 1 | DECOMP_INLINE, 0x0626},
+ {0xFE8C, 0, 1 | DECOMP_INLINE, 0x0626},
+ {0xFE8D, 0, 1 | DECOMP_INLINE, 0x0627},
+ {0xFE8E, 0, 1 | DECOMP_INLINE, 0x0627},
+ {0xFE8F, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0xFE90, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0xFE91, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0xFE92, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0xFE93, 0, 1 | DECOMP_INLINE, 0x0629},
+ {0xFE94, 0, 1 | DECOMP_INLINE, 0x0629},
+ {0xFE95, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0xFE96, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0xFE97, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0xFE98, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0xFE99, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0xFE9A, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0xFE9B, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0xFE9C, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0xFE9D, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0xFE9E, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0xFE9F, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0xFEA0, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0xFEA1, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0xFEA2, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0xFEA3, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0xFEA4, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0xFEA5, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0xFEA6, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0xFEA7, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0xFEA8, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0xFEA9, 0, 1 | DECOMP_INLINE, 0x062F},
+ {0xFEAA, 0, 1 | DECOMP_INLINE, 0x062F},
+ {0xFEAB, 0, 1 | DECOMP_INLINE, 0x0630},
+ {0xFEAC, 0, 1 | DECOMP_INLINE, 0x0630},
+ {0xFEAD, 0, 1 | DECOMP_INLINE, 0x0631},
+ {0xFEAE, 0, 1 | DECOMP_INLINE, 0x0631},
+ {0xFEAF, 0, 1 | DECOMP_INLINE, 0x0632},
+ {0xFEB0, 0, 1 | DECOMP_INLINE, 0x0632},
+ {0xFEB1, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0xFEB2, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0xFEB3, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0xFEB4, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0xFEB5, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0xFEB6, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0xFEB7, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0xFEB8, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0xFEB9, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0xFEBA, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0xFEBB, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0xFEBC, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0xFEBD, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0xFEBE, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0xFEBF, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0xFEC0, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0xFEC1, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0xFEC2, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0xFEC3, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0xFEC4, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0xFEC5, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0xFEC6, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0xFEC7, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0xFEC8, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0xFEC9, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0xFECA, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0xFECB, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0xFECC, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0xFECD, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0xFECE, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0xFECF, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0xFED0, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0xFED1, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0xFED2, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0xFED3, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0xFED4, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0xFED5, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0xFED6, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0xFED7, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0xFED8, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0xFED9, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0xFEDA, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0xFEDB, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0xFEDC, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0xFEDD, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0xFEDE, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0xFEDF, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0xFEE0, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0xFEE1, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0xFEE2, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0xFEE3, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0xFEE4, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0xFEE5, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0xFEE6, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0xFEE7, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0xFEE8, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0xFEE9, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0xFEEA, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0xFEEB, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0xFEEC, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0xFEED, 0, 1 | DECOMP_INLINE, 0x0648},
+ {0xFEEE, 0, 1 | DECOMP_INLINE, 0x0648},
+ {0xFEEF, 0, 1 | DECOMP_INLINE, 0x0649},
+ {0xFEF0, 0, 1 | DECOMP_INLINE, 0x0649},
+ {0xFEF1, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0xFEF2, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0xFEF3, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0xFEF4, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0xFEF5, 0, 2 | DECOMP_NO_COMPOSE, 4758}, /* compatibility mapping */
+ {0xFEF6, 0, 2 | DECOMP_NO_COMPOSE, 4760}, /* compatibility mapping */
+ {0xFEF7, 0, 2 | DECOMP_NO_COMPOSE, 4762}, /* compatibility mapping */
+ {0xFEF8, 0, 2 | DECOMP_NO_COMPOSE, 4764}, /* compatibility mapping */
+ {0xFEF9, 0, 2 | DECOMP_NO_COMPOSE, 4766}, /* compatibility mapping */
+ {0xFEFA, 0, 2 | DECOMP_NO_COMPOSE, 4768}, /* compatibility mapping */
+ {0xFEFB, 0, 2 | DECOMP_NO_COMPOSE, 4770}, /* compatibility mapping */
+ {0xFEFC, 0, 2 | DECOMP_NO_COMPOSE, 4772}, /* compatibility mapping */
+ {0xFF01, 0, 1 | DECOMP_INLINE, 0x0021},
+ {0xFF02, 0, 1 | DECOMP_INLINE, 0x0022},
+ {0xFF03, 0, 1 | DECOMP_INLINE, 0x0023},
+ {0xFF04, 0, 1 | DECOMP_INLINE, 0x0024},
+ {0xFF05, 0, 1 | DECOMP_INLINE, 0x0025},
+ {0xFF06, 0, 1 | DECOMP_INLINE, 0x0026},
+ {0xFF07, 0, 1 | DECOMP_INLINE, 0x0027},
+ {0xFF08, 0, 1 | DECOMP_INLINE, 0x0028},
+ {0xFF09, 0, 1 | DECOMP_INLINE, 0x0029},
+ {0xFF0A, 0, 1 | DECOMP_INLINE, 0x002A},
+ {0xFF0B, 0, 1 | DECOMP_INLINE, 0x002B},
+ {0xFF0C, 0, 1 | DECOMP_INLINE, 0x002C},
+ {0xFF0D, 0, 1 | DECOMP_INLINE, 0x002D},
+ {0xFF0E, 0, 1 | DECOMP_INLINE, 0x002E},
+ {0xFF0F, 0, 1 | DECOMP_INLINE, 0x002F},
+ {0xFF10, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0xFF11, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0xFF12, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0xFF13, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0xFF14, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0xFF15, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0xFF16, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0xFF17, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0xFF18, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0xFF19, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0xFF1A, 0, 1 | DECOMP_INLINE, 0x003A},
+ {0xFF1B, 0, 1 | DECOMP_INLINE, 0x003B},
+ {0xFF1C, 0, 1 | DECOMP_INLINE, 0x003C},
+ {0xFF1D, 0, 1 | DECOMP_INLINE, 0x003D},
+ {0xFF1E, 0, 1 | DECOMP_INLINE, 0x003E},
+ {0xFF1F, 0, 1 | DECOMP_INLINE, 0x003F},
+ {0xFF20, 0, 1 | DECOMP_INLINE, 0x0040},
+ {0xFF21, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0xFF22, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0xFF23, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0xFF24, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0xFF25, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0xFF26, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0xFF27, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0xFF28, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0xFF29, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0xFF2A, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0xFF2B, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0xFF2C, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0xFF2D, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0xFF2E, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0xFF2F, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0xFF30, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0xFF31, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0xFF32, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0xFF33, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0xFF34, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0xFF35, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0xFF36, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0xFF37, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0xFF38, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0xFF39, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0xFF3A, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0xFF3B, 0, 1 | DECOMP_INLINE, 0x005B},
+ {0xFF3C, 0, 1 | DECOMP_INLINE, 0x005C},
+ {0xFF3D, 0, 1 | DECOMP_INLINE, 0x005D},
+ {0xFF3E, 0, 1 | DECOMP_INLINE, 0x005E},
+ {0xFF3F, 0, 1 | DECOMP_INLINE, 0x005F},
+ {0xFF40, 0, 1 | DECOMP_INLINE, 0x0060},
+ {0xFF41, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0xFF42, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0xFF43, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0xFF44, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0xFF45, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0xFF46, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0xFF47, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0xFF48, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0xFF49, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0xFF4A, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0xFF4B, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0xFF4C, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0xFF4D, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0xFF4E, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0xFF4F, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0xFF50, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0xFF51, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0xFF52, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0xFF53, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0xFF54, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0xFF55, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0xFF56, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0xFF57, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0xFF58, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0xFF59, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0xFF5A, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0xFF5B, 0, 1 | DECOMP_INLINE, 0x007B},
+ {0xFF5C, 0, 1 | DECOMP_INLINE, 0x007C},
+ {0xFF5D, 0, 1 | DECOMP_INLINE, 0x007D},
+ {0xFF5E, 0, 1 | DECOMP_INLINE, 0x007E},
+ {0xFF5F, 0, 1 | DECOMP_INLINE, 0x2985},
+ {0xFF60, 0, 1 | DECOMP_INLINE, 0x2986},
+ {0xFF61, 0, 1 | DECOMP_INLINE, 0x3002},
+ {0xFF62, 0, 1 | DECOMP_INLINE, 0x300C},
+ {0xFF63, 0, 1 | DECOMP_INLINE, 0x300D},
+ {0xFF64, 0, 1 | DECOMP_INLINE, 0x3001},
+ {0xFF65, 0, 1 | DECOMP_INLINE, 0x30FB},
+ {0xFF66, 0, 1 | DECOMP_INLINE, 0x30F2},
+ {0xFF67, 0, 1 | DECOMP_INLINE, 0x30A1},
+ {0xFF68, 0, 1 | DECOMP_INLINE, 0x30A3},
+ {0xFF69, 0, 1 | DECOMP_INLINE, 0x30A5},
+ {0xFF6A, 0, 1 | DECOMP_INLINE, 0x30A7},
+ {0xFF6B, 0, 1 | DECOMP_INLINE, 0x30A9},
+ {0xFF6C, 0, 1 | DECOMP_INLINE, 0x30E3},
+ {0xFF6D, 0, 1 | DECOMP_INLINE, 0x30E5},
+ {0xFF6E, 0, 1 | DECOMP_INLINE, 0x30E7},
+ {0xFF6F, 0, 1 | DECOMP_INLINE, 0x30C3},
+ {0xFF70, 0, 1 | DECOMP_INLINE, 0x30FC},
+ {0xFF71, 0, 1 | DECOMP_INLINE, 0x30A2},
+ {0xFF72, 0, 1 | DECOMP_INLINE, 0x30A4},
+ {0xFF73, 0, 1 | DECOMP_INLINE, 0x30A6},
+ {0xFF74, 0, 1 | DECOMP_INLINE, 0x30A8},
+ {0xFF75, 0, 1 | DECOMP_INLINE, 0x30AA},
+ {0xFF76, 0, 1 | DECOMP_INLINE, 0x30AB},
+ {0xFF77, 0, 1 | DECOMP_INLINE, 0x30AD},
+ {0xFF78, 0, 1 | DECOMP_INLINE, 0x30AF},
+ {0xFF79, 0, 1 | DECOMP_INLINE, 0x30B1},
+ {0xFF7A, 0, 1 | DECOMP_INLINE, 0x30B3},
+ {0xFF7B, 0, 1 | DECOMP_INLINE, 0x30B5},
+ {0xFF7C, 0, 1 | DECOMP_INLINE, 0x30B7},
+ {0xFF7D, 0, 1 | DECOMP_INLINE, 0x30B9},
+ {0xFF7E, 0, 1 | DECOMP_INLINE, 0x30BB},
+ {0xFF7F, 0, 1 | DECOMP_INLINE, 0x30BD},
+ {0xFF80, 0, 1 | DECOMP_INLINE, 0x30BF},
+ {0xFF81, 0, 1 | DECOMP_INLINE, 0x30C1},
+ {0xFF82, 0, 1 | DECOMP_INLINE, 0x30C4},
+ {0xFF83, 0, 1 | DECOMP_INLINE, 0x30C6},
+ {0xFF84, 0, 1 | DECOMP_INLINE, 0x30C8},
+ {0xFF85, 0, 1 | DECOMP_INLINE, 0x30CA},
+ {0xFF86, 0, 1 | DECOMP_INLINE, 0x30CB},
+ {0xFF87, 0, 1 | DECOMP_INLINE, 0x30CC},
+ {0xFF88, 0, 1 | DECOMP_INLINE, 0x30CD},
+ {0xFF89, 0, 1 | DECOMP_INLINE, 0x30CE},
+ {0xFF8A, 0, 1 | DECOMP_INLINE, 0x30CF},
+ {0xFF8B, 0, 1 | DECOMP_INLINE, 0x30D2},
+ {0xFF8C, 0, 1 | DECOMP_INLINE, 0x30D5},
+ {0xFF8D, 0, 1 | DECOMP_INLINE, 0x30D8},
+ {0xFF8E, 0, 1 | DECOMP_INLINE, 0x30DB},
+ {0xFF8F, 0, 1 | DECOMP_INLINE, 0x30DE},
+ {0xFF90, 0, 1 | DECOMP_INLINE, 0x30DF},
+ {0xFF91, 0, 1 | DECOMP_INLINE, 0x30E0},
+ {0xFF92, 0, 1 | DECOMP_INLINE, 0x30E1},
+ {0xFF93, 0, 1 | DECOMP_INLINE, 0x30E2},
+ {0xFF94, 0, 1 | DECOMP_INLINE, 0x30E4},
+ {0xFF95, 0, 1 | DECOMP_INLINE, 0x30E6},
+ {0xFF96, 0, 1 | DECOMP_INLINE, 0x30E8},
+ {0xFF97, 0, 1 | DECOMP_INLINE, 0x30E9},
+ {0xFF98, 0, 1 | DECOMP_INLINE, 0x30EA},
+ {0xFF99, 0, 1 | DECOMP_INLINE, 0x30EB},
+ {0xFF9A, 0, 1 | DECOMP_INLINE, 0x30EC},
+ {0xFF9B, 0, 1 | DECOMP_INLINE, 0x30ED},
+ {0xFF9C, 0, 1 | DECOMP_INLINE, 0x30EF},
+ {0xFF9D, 0, 1 | DECOMP_INLINE, 0x30F3},
+ {0xFF9E, 0, 1 | DECOMP_INLINE, 0x3099},
+ {0xFF9F, 0, 1 | DECOMP_INLINE, 0x309A},
+ {0xFFA0, 0, 1 | DECOMP_INLINE, 0x3164},
+ {0xFFA1, 0, 1 | DECOMP_INLINE, 0x3131},
+ {0xFFA2, 0, 1 | DECOMP_INLINE, 0x3132},
+ {0xFFA3, 0, 1 | DECOMP_INLINE, 0x3133},
+ {0xFFA4, 0, 1 | DECOMP_INLINE, 0x3134},
+ {0xFFA5, 0, 1 | DECOMP_INLINE, 0x3135},
+ {0xFFA6, 0, 1 | DECOMP_INLINE, 0x3136},
+ {0xFFA7, 0, 1 | DECOMP_INLINE, 0x3137},
+ {0xFFA8, 0, 1 | DECOMP_INLINE, 0x3138},
+ {0xFFA9, 0, 1 | DECOMP_INLINE, 0x3139},
+ {0xFFAA, 0, 1 | DECOMP_INLINE, 0x313A},
+ {0xFFAB, 0, 1 | DECOMP_INLINE, 0x313B},
+ {0xFFAC, 0, 1 | DECOMP_INLINE, 0x313C},
+ {0xFFAD, 0, 1 | DECOMP_INLINE, 0x313D},
+ {0xFFAE, 0, 1 | DECOMP_INLINE, 0x313E},
+ {0xFFAF, 0, 1 | DECOMP_INLINE, 0x313F},
+ {0xFFB0, 0, 1 | DECOMP_INLINE, 0x3140},
+ {0xFFB1, 0, 1 | DECOMP_INLINE, 0x3141},
+ {0xFFB2, 0, 1 | DECOMP_INLINE, 0x3142},
+ {0xFFB3, 0, 1 | DECOMP_INLINE, 0x3143},
+ {0xFFB4, 0, 1 | DECOMP_INLINE, 0x3144},
+ {0xFFB5, 0, 1 | DECOMP_INLINE, 0x3145},
+ {0xFFB6, 0, 1 | DECOMP_INLINE, 0x3146},
+ {0xFFB7, 0, 1 | DECOMP_INLINE, 0x3147},
+ {0xFFB8, 0, 1 | DECOMP_INLINE, 0x3148},
+ {0xFFB9, 0, 1 | DECOMP_INLINE, 0x3149},
+ {0xFFBA, 0, 1 | DECOMP_INLINE, 0x314A},
+ {0xFFBB, 0, 1 | DECOMP_INLINE, 0x314B},
+ {0xFFBC, 0, 1 | DECOMP_INLINE, 0x314C},
+ {0xFFBD, 0, 1 | DECOMP_INLINE, 0x314D},
+ {0xFFBE, 0, 1 | DECOMP_INLINE, 0x314E},
+ {0xFFC2, 0, 1 | DECOMP_INLINE, 0x314F},
+ {0xFFC3, 0, 1 | DECOMP_INLINE, 0x3150},
+ {0xFFC4, 0, 1 | DECOMP_INLINE, 0x3151},
+ {0xFFC5, 0, 1 | DECOMP_INLINE, 0x3152},
+ {0xFFC6, 0, 1 | DECOMP_INLINE, 0x3153},
+ {0xFFC7, 0, 1 | DECOMP_INLINE, 0x3154},
+ {0xFFCA, 0, 1 | DECOMP_INLINE, 0x3155},
+ {0xFFCB, 0, 1 | DECOMP_INLINE, 0x3156},
+ {0xFFCC, 0, 1 | DECOMP_INLINE, 0x3157},
+ {0xFFCD, 0, 1 | DECOMP_INLINE, 0x3158},
+ {0xFFCE, 0, 1 | DECOMP_INLINE, 0x3159},
+ {0xFFCF, 0, 1 | DECOMP_INLINE, 0x315A},
+ {0xFFD2, 0, 1 | DECOMP_INLINE, 0x315B},
+ {0xFFD3, 0, 1 | DECOMP_INLINE, 0x315C},
+ {0xFFD4, 0, 1 | DECOMP_INLINE, 0x315D},
+ {0xFFD5, 0, 1 | DECOMP_INLINE, 0x315E},
+ {0xFFD6, 0, 1 | DECOMP_INLINE, 0x315F},
+ {0xFFD7, 0, 1 | DECOMP_INLINE, 0x3160},
+ {0xFFDA, 0, 1 | DECOMP_INLINE, 0x3161},
+ {0xFFDB, 0, 1 | DECOMP_INLINE, 0x3162},
+ {0xFFDC, 0, 1 | DECOMP_INLINE, 0x3163},
+ {0xFFE0, 0, 1 | DECOMP_INLINE, 0x00A2},
+ {0xFFE1, 0, 1 | DECOMP_INLINE, 0x00A3},
+ {0xFFE2, 0, 1 | DECOMP_INLINE, 0x00AC},
+ {0xFFE3, 0, 1 | DECOMP_INLINE, 0x00AF},
+ {0xFFE4, 0, 1 | DECOMP_INLINE, 0x00A6},
+ {0xFFE5, 0, 1 | DECOMP_INLINE, 0x00A5},
+ {0xFFE6, 0, 1 | DECOMP_INLINE, 0x20A9},
+ {0xFFE8, 0, 1 | DECOMP_INLINE, 0x2502},
+ {0xFFE9, 0, 1 | DECOMP_INLINE, 0x2190},
+ {0xFFEA, 0, 1 | DECOMP_INLINE, 0x2191},
+ {0xFFEB, 0, 1 | DECOMP_INLINE, 0x2192},
+ {0xFFEC, 0, 1 | DECOMP_INLINE, 0x2193},
+ {0xFFED, 0, 1 | DECOMP_INLINE, 0x25A0},
+ {0xFFEE, 0, 1 | DECOMP_INLINE, 0x25CB},
+ {0x101FD, 220, 0, 0},
+ {0x102E0, 220, 0, 0},
+ {0x10376, 230, 0, 0},
+ {0x10377, 230, 0, 0},
+ {0x10378, 230, 0, 0},
+ {0x10379, 230, 0, 0},
+ {0x1037A, 230, 0, 0},
+ {0x10A0D, 220, 0, 0},
+ {0x10A0F, 230, 0, 0},
+ {0x10A38, 230, 0, 0},
+ {0x10A39, 1, 0, 0},
+ {0x10A3A, 220, 0, 0},
+ {0x10A3F, 9, 0, 0},
+ {0x10AE5, 230, 0, 0},
+ {0x10AE6, 220, 0, 0},
+ {0x11046, 9, 0, 0},
+ {0x1107F, 9, 0, 0},
+ {0x1109A, 0, 2, 4774},
+ {0x1109C, 0, 2, 4776},
+ {0x110AB, 0, 2, 4778},
+ {0x110B9, 9, 0, 0},
+ {0x110BA, 7, 0, 0},
+ {0x11100, 230, 0, 0},
+ {0x11101, 230, 0, 0},
+ {0x11102, 230, 0, 0},
+ {0x1112E, 0, 2, 4780},
+ {0x1112F, 0, 2, 4782},
+ {0x11133, 9, 0, 0},
+ {0x11134, 9, 0, 0},
+ {0x11173, 7, 0, 0},
+ {0x111C0, 9, 0, 0},
+ {0x111CA, 7, 0, 0},
+ {0x11235, 9, 0, 0},
+ {0x11236, 7, 0, 0},
+ {0x112E9, 7, 0, 0},
+ {0x112EA, 9, 0, 0},
+ {0x1133C, 7, 0, 0},
+ {0x1134B, 0, 2, 4784},
+ {0x1134C, 0, 2, 4786},
+ {0x1134D, 9, 0, 0},
+ {0x11366, 230, 0, 0},
+ {0x11367, 230, 0, 0},
+ {0x11368, 230, 0, 0},
+ {0x11369, 230, 0, 0},
+ {0x1136A, 230, 0, 0},
+ {0x1136B, 230, 0, 0},
+ {0x1136C, 230, 0, 0},
+ {0x11370, 230, 0, 0},
+ {0x11371, 230, 0, 0},
+ {0x11372, 230, 0, 0},
+ {0x11373, 230, 0, 0},
+ {0x11374, 230, 0, 0},
+ {0x11442, 9, 0, 0},
+ {0x11446, 7, 0, 0},
+ {0x114BB, 0, 2, 4788},
+ {0x114BC, 0, 2, 4790},
+ {0x114BE, 0, 2, 4792},
+ {0x114C2, 9, 0, 0},
+ {0x114C3, 7, 0, 0},
+ {0x115BA, 0, 2, 4794},
+ {0x115BB, 0, 2, 4796},
+ {0x115BF, 9, 0, 0},
+ {0x115C0, 7, 0, 0},
+ {0x1163F, 9, 0, 0},
+ {0x116B6, 9, 0, 0},
+ {0x116B7, 7, 0, 0},
+ {0x1172B, 9, 0, 0},
+ {0x11C3F, 9, 0, 0},
+ {0x16AF0, 1, 0, 0},
+ {0x16AF1, 1, 0, 0},
+ {0x16AF2, 1, 0, 0},
+ {0x16AF3, 1, 0, 0},
+ {0x16AF4, 1, 0, 0},
+ {0x16B30, 230, 0, 0},
+ {0x16B31, 230, 0, 0},
+ {0x16B32, 230, 0, 0},
+ {0x16B33, 230, 0, 0},
+ {0x16B34, 230, 0, 0},
+ {0x16B35, 230, 0, 0},
+ {0x16B36, 230, 0, 0},
+ {0x1BC9E, 1, 0, 0},
+ {0x1D15E, 0, 2 | DECOMP_NO_COMPOSE, 4798}, /* in exclusion list */
+ {0x1D15F, 0, 2 | DECOMP_NO_COMPOSE, 4800}, /* in exclusion list */
+ {0x1D160, 0, 2 | DECOMP_NO_COMPOSE, 4802}, /* in exclusion list */
+ {0x1D161, 0, 2 | DECOMP_NO_COMPOSE, 4804}, /* in exclusion list */
+ {0x1D162, 0, 2 | DECOMP_NO_COMPOSE, 4806}, /* in exclusion list */
+ {0x1D163, 0, 2 | DECOMP_NO_COMPOSE, 4808}, /* in exclusion list */
+ {0x1D164, 0, 2 | DECOMP_NO_COMPOSE, 4810}, /* in exclusion list */
+ {0x1D165, 216, 0, 0},
+ {0x1D166, 216, 0, 0},
+ {0x1D167, 1, 0, 0},
+ {0x1D168, 1, 0, 0},
+ {0x1D169, 1, 0, 0},
+ {0x1D16D, 226, 0, 0},
+ {0x1D16E, 216, 0, 0},
+ {0x1D16F, 216, 0, 0},
+ {0x1D170, 216, 0, 0},
+ {0x1D171, 216, 0, 0},
+ {0x1D172, 216, 0, 0},
+ {0x1D17B, 220, 0, 0},
+ {0x1D17C, 220, 0, 0},
+ {0x1D17D, 220, 0, 0},
+ {0x1D17E, 220, 0, 0},
+ {0x1D17F, 220, 0, 0},
+ {0x1D180, 220, 0, 0},
+ {0x1D181, 220, 0, 0},
+ {0x1D182, 220, 0, 0},
+ {0x1D185, 230, 0, 0},
+ {0x1D186, 230, 0, 0},
+ {0x1D187, 230, 0, 0},
+ {0x1D188, 230, 0, 0},
+ {0x1D189, 230, 0, 0},
+ {0x1D18A, 220, 0, 0},
+ {0x1D18B, 220, 0, 0},
+ {0x1D1AA, 230, 0, 0},
+ {0x1D1AB, 230, 0, 0},
+ {0x1D1AC, 230, 0, 0},
+ {0x1D1AD, 230, 0, 0},
+ {0x1D1BB, 0, 2 | DECOMP_NO_COMPOSE, 4812}, /* in exclusion list */
+ {0x1D1BC, 0, 2 | DECOMP_NO_COMPOSE, 4814}, /* in exclusion list */
+ {0x1D1BD, 0, 2 | DECOMP_NO_COMPOSE, 4816}, /* in exclusion list */
+ {0x1D1BE, 0, 2 | DECOMP_NO_COMPOSE, 4818}, /* in exclusion list */
+ {0x1D1BF, 0, 2 | DECOMP_NO_COMPOSE, 4820}, /* in exclusion list */
+ {0x1D1C0, 0, 2 | DECOMP_NO_COMPOSE, 4822}, /* in exclusion list */
+ {0x1D242, 230, 0, 0},
+ {0x1D243, 230, 0, 0},
+ {0x1D244, 230, 0, 0},
+ {0x1D400, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D401, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D402, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D403, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D404, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D405, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D406, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D407, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D408, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D409, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D40A, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D40B, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D40C, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D40D, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D40E, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D40F, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D410, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D411, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D412, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D413, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D414, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D415, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D416, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D417, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D418, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D419, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D41A, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D41B, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D41C, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D41D, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D41E, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D41F, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D420, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D421, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D422, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D423, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D424, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D425, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D426, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D427, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D428, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D429, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D42A, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D42B, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D42C, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D42D, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D42E, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D42F, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D430, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D431, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D432, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D433, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D434, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D435, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D436, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D437, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D438, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D439, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D43A, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D43B, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D43C, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D43D, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D43E, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D43F, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D440, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D441, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D442, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D443, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D444, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D445, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D446, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D447, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D448, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D449, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D44A, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D44B, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D44C, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D44D, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D44E, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D44F, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D450, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D451, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D452, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D453, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D454, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D456, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D457, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D458, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D459, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D45A, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D45B, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D45C, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D45D, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D45E, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D45F, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D460, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D461, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D462, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D463, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D464, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D465, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D466, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D467, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D468, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D469, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D46A, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D46B, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D46C, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D46D, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D46E, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D46F, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D470, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D471, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D472, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D473, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D474, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D475, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D476, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D477, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D478, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D479, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D47A, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D47B, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D47C, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D47D, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D47E, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D47F, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D480, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D481, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D482, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D483, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D484, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D485, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D486, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D487, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D488, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D489, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D48A, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D48B, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D48C, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D48D, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D48E, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D48F, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D490, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D491, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D492, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D493, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D494, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D495, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D496, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D497, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D498, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D499, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D49A, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D49B, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D49C, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D49E, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D49F, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D4A2, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D4A5, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D4A6, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D4A9, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D4AA, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D4AB, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D4AC, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D4AE, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D4AF, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D4B0, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D4B1, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D4B2, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D4B3, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D4B4, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D4B5, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D4B6, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D4B7, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D4B8, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D4B9, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D4BB, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D4BD, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D4BE, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D4BF, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D4C0, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D4C1, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D4C2, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D4C3, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D4C5, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D4C6, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D4C7, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D4C8, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D4C9, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D4CA, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D4CB, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D4CC, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D4CD, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D4CE, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D4CF, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D4D0, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D4D1, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D4D2, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D4D3, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D4D4, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D4D5, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D4D6, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D4D7, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D4D8, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D4D9, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D4DA, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D4DB, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D4DC, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D4DD, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D4DE, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D4DF, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D4E0, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D4E1, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D4E2, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D4E3, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D4E4, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D4E5, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D4E6, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D4E7, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D4E8, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D4E9, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D4EA, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D4EB, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D4EC, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D4ED, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D4EE, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D4EF, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D4F0, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D4F1, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D4F2, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D4F3, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D4F4, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D4F5, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D4F6, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D4F7, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D4F8, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D4F9, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D4FA, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D4FB, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D4FC, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D4FD, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D4FE, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D4FF, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D500, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D501, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D502, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D503, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D504, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D505, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D507, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D508, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D509, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D50A, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D50D, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D50E, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D50F, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D510, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D511, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D512, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D513, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D514, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D516, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D517, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D518, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D519, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D51A, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D51B, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D51C, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D51E, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D51F, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D520, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D521, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D522, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D523, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D524, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D525, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D526, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D527, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D528, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D529, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D52A, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D52B, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D52C, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D52D, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D52E, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D52F, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D530, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D531, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D532, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D533, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D534, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D535, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D536, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D537, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D538, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D539, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D53B, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D53C, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D53D, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D53E, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D540, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D541, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D542, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D543, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D544, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D546, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D54A, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D54B, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D54C, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D54D, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D54E, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D54F, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D550, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D552, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D553, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D554, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D555, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D556, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D557, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D558, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D559, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D55A, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D55B, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D55C, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D55D, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D55E, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D55F, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D560, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D561, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D562, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D563, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D564, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D565, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D566, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D567, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D568, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D569, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D56A, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D56B, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D56C, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D56D, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D56E, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D56F, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D570, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D571, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D572, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D573, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D574, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D575, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D576, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D577, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D578, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D579, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D57A, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D57B, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D57C, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D57D, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D57E, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D57F, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D580, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D581, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D582, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D583, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D584, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D585, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D586, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D587, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D588, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D589, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D58A, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D58B, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D58C, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D58D, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D58E, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D58F, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D590, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D591, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D592, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D593, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D594, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D595, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D596, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D597, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D598, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D599, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D59A, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D59B, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D59C, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D59D, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D59E, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D59F, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D5A0, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D5A1, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D5A2, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D5A3, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D5A4, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D5A5, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D5A6, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D5A7, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D5A8, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D5A9, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D5AA, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D5AB, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D5AC, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D5AD, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D5AE, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D5AF, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D5B0, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D5B1, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D5B2, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D5B3, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D5B4, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D5B5, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D5B6, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D5B7, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D5B8, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D5B9, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D5BA, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D5BB, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D5BC, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D5BD, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D5BE, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D5BF, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D5C0, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D5C1, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D5C2, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D5C3, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D5C4, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D5C5, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D5C6, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D5C7, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D5C8, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D5C9, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D5CA, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D5CB, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D5CC, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D5CD, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D5CE, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D5CF, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D5D0, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D5D1, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D5D2, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D5D3, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D5D4, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D5D5, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D5D6, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D5D7, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D5D8, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D5D9, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D5DA, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D5DB, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D5DC, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D5DD, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D5DE, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D5DF, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D5E0, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D5E1, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D5E2, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D5E3, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D5E4, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D5E5, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D5E6, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D5E7, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D5E8, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D5E9, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D5EA, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D5EB, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D5EC, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D5ED, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D5EE, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D5EF, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D5F0, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D5F1, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D5F2, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D5F3, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D5F4, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D5F5, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D5F6, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D5F7, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D5F8, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D5F9, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D5FA, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D5FB, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D5FC, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D5FD, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D5FE, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D5FF, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D600, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D601, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D602, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D603, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D604, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D605, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D606, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D607, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D608, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D609, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D60A, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D60B, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D60C, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D60D, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D60E, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D60F, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D610, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D611, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D612, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D613, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D614, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D615, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D616, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D617, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D618, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D619, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D61A, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D61B, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D61C, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D61D, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D61E, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D61F, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D620, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D621, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D622, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D623, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D624, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D625, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D626, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D627, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D628, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D629, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D62A, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D62B, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D62C, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D62D, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D62E, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D62F, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D630, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D631, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D632, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D633, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D634, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D635, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D636, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D637, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D638, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D639, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D63A, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D63B, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D63C, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D63D, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D63E, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D63F, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D640, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D641, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D642, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D643, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D644, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D645, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D646, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D647, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D648, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D649, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D64A, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D64B, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D64C, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D64D, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D64E, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D64F, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D650, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D651, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D652, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D653, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D654, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D655, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D656, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D657, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D658, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D659, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D65A, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D65B, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D65C, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D65D, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D65E, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D65F, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D660, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D661, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D662, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D663, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D664, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D665, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D666, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D667, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D668, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D669, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D66A, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D66B, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D66C, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D66D, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D66E, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D66F, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D670, 0, 1 | DECOMP_INLINE, 0x0041},
+ {0x1D671, 0, 1 | DECOMP_INLINE, 0x0042},
+ {0x1D672, 0, 1 | DECOMP_INLINE, 0x0043},
+ {0x1D673, 0, 1 | DECOMP_INLINE, 0x0044},
+ {0x1D674, 0, 1 | DECOMP_INLINE, 0x0045},
+ {0x1D675, 0, 1 | DECOMP_INLINE, 0x0046},
+ {0x1D676, 0, 1 | DECOMP_INLINE, 0x0047},
+ {0x1D677, 0, 1 | DECOMP_INLINE, 0x0048},
+ {0x1D678, 0, 1 | DECOMP_INLINE, 0x0049},
+ {0x1D679, 0, 1 | DECOMP_INLINE, 0x004A},
+ {0x1D67A, 0, 1 | DECOMP_INLINE, 0x004B},
+ {0x1D67B, 0, 1 | DECOMP_INLINE, 0x004C},
+ {0x1D67C, 0, 1 | DECOMP_INLINE, 0x004D},
+ {0x1D67D, 0, 1 | DECOMP_INLINE, 0x004E},
+ {0x1D67E, 0, 1 | DECOMP_INLINE, 0x004F},
+ {0x1D67F, 0, 1 | DECOMP_INLINE, 0x0050},
+ {0x1D680, 0, 1 | DECOMP_INLINE, 0x0051},
+ {0x1D681, 0, 1 | DECOMP_INLINE, 0x0052},
+ {0x1D682, 0, 1 | DECOMP_INLINE, 0x0053},
+ {0x1D683, 0, 1 | DECOMP_INLINE, 0x0054},
+ {0x1D684, 0, 1 | DECOMP_INLINE, 0x0055},
+ {0x1D685, 0, 1 | DECOMP_INLINE, 0x0056},
+ {0x1D686, 0, 1 | DECOMP_INLINE, 0x0057},
+ {0x1D687, 0, 1 | DECOMP_INLINE, 0x0058},
+ {0x1D688, 0, 1 | DECOMP_INLINE, 0x0059},
+ {0x1D689, 0, 1 | DECOMP_INLINE, 0x005A},
+ {0x1D68A, 0, 1 | DECOMP_INLINE, 0x0061},
+ {0x1D68B, 0, 1 | DECOMP_INLINE, 0x0062},
+ {0x1D68C, 0, 1 | DECOMP_INLINE, 0x0063},
+ {0x1D68D, 0, 1 | DECOMP_INLINE, 0x0064},
+ {0x1D68E, 0, 1 | DECOMP_INLINE, 0x0065},
+ {0x1D68F, 0, 1 | DECOMP_INLINE, 0x0066},
+ {0x1D690, 0, 1 | DECOMP_INLINE, 0x0067},
+ {0x1D691, 0, 1 | DECOMP_INLINE, 0x0068},
+ {0x1D692, 0, 1 | DECOMP_INLINE, 0x0069},
+ {0x1D693, 0, 1 | DECOMP_INLINE, 0x006A},
+ {0x1D694, 0, 1 | DECOMP_INLINE, 0x006B},
+ {0x1D695, 0, 1 | DECOMP_INLINE, 0x006C},
+ {0x1D696, 0, 1 | DECOMP_INLINE, 0x006D},
+ {0x1D697, 0, 1 | DECOMP_INLINE, 0x006E},
+ {0x1D698, 0, 1 | DECOMP_INLINE, 0x006F},
+ {0x1D699, 0, 1 | DECOMP_INLINE, 0x0070},
+ {0x1D69A, 0, 1 | DECOMP_INLINE, 0x0071},
+ {0x1D69B, 0, 1 | DECOMP_INLINE, 0x0072},
+ {0x1D69C, 0, 1 | DECOMP_INLINE, 0x0073},
+ {0x1D69D, 0, 1 | DECOMP_INLINE, 0x0074},
+ {0x1D69E, 0, 1 | DECOMP_INLINE, 0x0075},
+ {0x1D69F, 0, 1 | DECOMP_INLINE, 0x0076},
+ {0x1D6A0, 0, 1 | DECOMP_INLINE, 0x0077},
+ {0x1D6A1, 0, 1 | DECOMP_INLINE, 0x0078},
+ {0x1D6A2, 0, 1 | DECOMP_INLINE, 0x0079},
+ {0x1D6A3, 0, 1 | DECOMP_INLINE, 0x007A},
+ {0x1D6A4, 0, 1 | DECOMP_INLINE, 0x0131},
+ {0x1D6A5, 0, 1 | DECOMP_INLINE, 0x0237},
+ {0x1D6A8, 0, 1 | DECOMP_INLINE, 0x0391},
+ {0x1D6A9, 0, 1 | DECOMP_INLINE, 0x0392},
+ {0x1D6AA, 0, 1 | DECOMP_INLINE, 0x0393},
+ {0x1D6AB, 0, 1 | DECOMP_INLINE, 0x0394},
+ {0x1D6AC, 0, 1 | DECOMP_INLINE, 0x0395},
+ {0x1D6AD, 0, 1 | DECOMP_INLINE, 0x0396},
+ {0x1D6AE, 0, 1 | DECOMP_INLINE, 0x0397},
+ {0x1D6AF, 0, 1 | DECOMP_INLINE, 0x0398},
+ {0x1D6B0, 0, 1 | DECOMP_INLINE, 0x0399},
+ {0x1D6B1, 0, 1 | DECOMP_INLINE, 0x039A},
+ {0x1D6B2, 0, 1 | DECOMP_INLINE, 0x039B},
+ {0x1D6B3, 0, 1 | DECOMP_INLINE, 0x039C},
+ {0x1D6B4, 0, 1 | DECOMP_INLINE, 0x039D},
+ {0x1D6B5, 0, 1 | DECOMP_INLINE, 0x039E},
+ {0x1D6B6, 0, 1 | DECOMP_INLINE, 0x039F},
+ {0x1D6B7, 0, 1 | DECOMP_INLINE, 0x03A0},
+ {0x1D6B8, 0, 1 | DECOMP_INLINE, 0x03A1},
+ {0x1D6B9, 0, 1 | DECOMP_INLINE, 0x03F4},
+ {0x1D6BA, 0, 1 | DECOMP_INLINE, 0x03A3},
+ {0x1D6BB, 0, 1 | DECOMP_INLINE, 0x03A4},
+ {0x1D6BC, 0, 1 | DECOMP_INLINE, 0x03A5},
+ {0x1D6BD, 0, 1 | DECOMP_INLINE, 0x03A6},
+ {0x1D6BE, 0, 1 | DECOMP_INLINE, 0x03A7},
+ {0x1D6BF, 0, 1 | DECOMP_INLINE, 0x03A8},
+ {0x1D6C0, 0, 1 | DECOMP_INLINE, 0x03A9},
+ {0x1D6C1, 0, 1 | DECOMP_INLINE, 0x2207},
+ {0x1D6C2, 0, 1 | DECOMP_INLINE, 0x03B1},
+ {0x1D6C3, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D6C4, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D6C5, 0, 1 | DECOMP_INLINE, 0x03B4},
+ {0x1D6C6, 0, 1 | DECOMP_INLINE, 0x03B5},
+ {0x1D6C7, 0, 1 | DECOMP_INLINE, 0x03B6},
+ {0x1D6C8, 0, 1 | DECOMP_INLINE, 0x03B7},
+ {0x1D6C9, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x1D6CA, 0, 1 | DECOMP_INLINE, 0x03B9},
+ {0x1D6CB, 0, 1 | DECOMP_INLINE, 0x03BA},
+ {0x1D6CC, 0, 1 | DECOMP_INLINE, 0x03BB},
+ {0x1D6CD, 0, 1 | DECOMP_INLINE, 0x03BC},
+ {0x1D6CE, 0, 1 | DECOMP_INLINE, 0x03BD},
+ {0x1D6CF, 0, 1 | DECOMP_INLINE, 0x03BE},
+ {0x1D6D0, 0, 1 | DECOMP_INLINE, 0x03BF},
+ {0x1D6D1, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x1D6D2, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x1D6D3, 0, 1 | DECOMP_INLINE, 0x03C2},
+ {0x1D6D4, 0, 1 | DECOMP_INLINE, 0x03C3},
+ {0x1D6D5, 0, 1 | DECOMP_INLINE, 0x03C4},
+ {0x1D6D6, 0, 1 | DECOMP_INLINE, 0x03C5},
+ {0x1D6D7, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D6D8, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D6D9, 0, 1 | DECOMP_INLINE, 0x03C8},
+ {0x1D6DA, 0, 1 | DECOMP_INLINE, 0x03C9},
+ {0x1D6DB, 0, 1 | DECOMP_INLINE, 0x2202},
+ {0x1D6DC, 0, 1 | DECOMP_INLINE, 0x03F5},
+ {0x1D6DD, 0, 1 | DECOMP_INLINE, 0x03D1},
+ {0x1D6DE, 0, 1 | DECOMP_INLINE, 0x03F0},
+ {0x1D6DF, 0, 1 | DECOMP_INLINE, 0x03D5},
+ {0x1D6E0, 0, 1 | DECOMP_INLINE, 0x03F1},
+ {0x1D6E1, 0, 1 | DECOMP_INLINE, 0x03D6},
+ {0x1D6E2, 0, 1 | DECOMP_INLINE, 0x0391},
+ {0x1D6E3, 0, 1 | DECOMP_INLINE, 0x0392},
+ {0x1D6E4, 0, 1 | DECOMP_INLINE, 0x0393},
+ {0x1D6E5, 0, 1 | DECOMP_INLINE, 0x0394},
+ {0x1D6E6, 0, 1 | DECOMP_INLINE, 0x0395},
+ {0x1D6E7, 0, 1 | DECOMP_INLINE, 0x0396},
+ {0x1D6E8, 0, 1 | DECOMP_INLINE, 0x0397},
+ {0x1D6E9, 0, 1 | DECOMP_INLINE, 0x0398},
+ {0x1D6EA, 0, 1 | DECOMP_INLINE, 0x0399},
+ {0x1D6EB, 0, 1 | DECOMP_INLINE, 0x039A},
+ {0x1D6EC, 0, 1 | DECOMP_INLINE, 0x039B},
+ {0x1D6ED, 0, 1 | DECOMP_INLINE, 0x039C},
+ {0x1D6EE, 0, 1 | DECOMP_INLINE, 0x039D},
+ {0x1D6EF, 0, 1 | DECOMP_INLINE, 0x039E},
+ {0x1D6F0, 0, 1 | DECOMP_INLINE, 0x039F},
+ {0x1D6F1, 0, 1 | DECOMP_INLINE, 0x03A0},
+ {0x1D6F2, 0, 1 | DECOMP_INLINE, 0x03A1},
+ {0x1D6F3, 0, 1 | DECOMP_INLINE, 0x03F4},
+ {0x1D6F4, 0, 1 | DECOMP_INLINE, 0x03A3},
+ {0x1D6F5, 0, 1 | DECOMP_INLINE, 0x03A4},
+ {0x1D6F6, 0, 1 | DECOMP_INLINE, 0x03A5},
+ {0x1D6F7, 0, 1 | DECOMP_INLINE, 0x03A6},
+ {0x1D6F8, 0, 1 | DECOMP_INLINE, 0x03A7},
+ {0x1D6F9, 0, 1 | DECOMP_INLINE, 0x03A8},
+ {0x1D6FA, 0, 1 | DECOMP_INLINE, 0x03A9},
+ {0x1D6FB, 0, 1 | DECOMP_INLINE, 0x2207},
+ {0x1D6FC, 0, 1 | DECOMP_INLINE, 0x03B1},
+ {0x1D6FD, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D6FE, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D6FF, 0, 1 | DECOMP_INLINE, 0x03B4},
+ {0x1D700, 0, 1 | DECOMP_INLINE, 0x03B5},
+ {0x1D701, 0, 1 | DECOMP_INLINE, 0x03B6},
+ {0x1D702, 0, 1 | DECOMP_INLINE, 0x03B7},
+ {0x1D703, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x1D704, 0, 1 | DECOMP_INLINE, 0x03B9},
+ {0x1D705, 0, 1 | DECOMP_INLINE, 0x03BA},
+ {0x1D706, 0, 1 | DECOMP_INLINE, 0x03BB},
+ {0x1D707, 0, 1 | DECOMP_INLINE, 0x03BC},
+ {0x1D708, 0, 1 | DECOMP_INLINE, 0x03BD},
+ {0x1D709, 0, 1 | DECOMP_INLINE, 0x03BE},
+ {0x1D70A, 0, 1 | DECOMP_INLINE, 0x03BF},
+ {0x1D70B, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x1D70C, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x1D70D, 0, 1 | DECOMP_INLINE, 0x03C2},
+ {0x1D70E, 0, 1 | DECOMP_INLINE, 0x03C3},
+ {0x1D70F, 0, 1 | DECOMP_INLINE, 0x03C4},
+ {0x1D710, 0, 1 | DECOMP_INLINE, 0x03C5},
+ {0x1D711, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D712, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D713, 0, 1 | DECOMP_INLINE, 0x03C8},
+ {0x1D714, 0, 1 | DECOMP_INLINE, 0x03C9},
+ {0x1D715, 0, 1 | DECOMP_INLINE, 0x2202},
+ {0x1D716, 0, 1 | DECOMP_INLINE, 0x03F5},
+ {0x1D717, 0, 1 | DECOMP_INLINE, 0x03D1},
+ {0x1D718, 0, 1 | DECOMP_INLINE, 0x03F0},
+ {0x1D719, 0, 1 | DECOMP_INLINE, 0x03D5},
+ {0x1D71A, 0, 1 | DECOMP_INLINE, 0x03F1},
+ {0x1D71B, 0, 1 | DECOMP_INLINE, 0x03D6},
+ {0x1D71C, 0, 1 | DECOMP_INLINE, 0x0391},
+ {0x1D71D, 0, 1 | DECOMP_INLINE, 0x0392},
+ {0x1D71E, 0, 1 | DECOMP_INLINE, 0x0393},
+ {0x1D71F, 0, 1 | DECOMP_INLINE, 0x0394},
+ {0x1D720, 0, 1 | DECOMP_INLINE, 0x0395},
+ {0x1D721, 0, 1 | DECOMP_INLINE, 0x0396},
+ {0x1D722, 0, 1 | DECOMP_INLINE, 0x0397},
+ {0x1D723, 0, 1 | DECOMP_INLINE, 0x0398},
+ {0x1D724, 0, 1 | DECOMP_INLINE, 0x0399},
+ {0x1D725, 0, 1 | DECOMP_INLINE, 0x039A},
+ {0x1D726, 0, 1 | DECOMP_INLINE, 0x039B},
+ {0x1D727, 0, 1 | DECOMP_INLINE, 0x039C},
+ {0x1D728, 0, 1 | DECOMP_INLINE, 0x039D},
+ {0x1D729, 0, 1 | DECOMP_INLINE, 0x039E},
+ {0x1D72A, 0, 1 | DECOMP_INLINE, 0x039F},
+ {0x1D72B, 0, 1 | DECOMP_INLINE, 0x03A0},
+ {0x1D72C, 0, 1 | DECOMP_INLINE, 0x03A1},
+ {0x1D72D, 0, 1 | DECOMP_INLINE, 0x03F4},
+ {0x1D72E, 0, 1 | DECOMP_INLINE, 0x03A3},
+ {0x1D72F, 0, 1 | DECOMP_INLINE, 0x03A4},
+ {0x1D730, 0, 1 | DECOMP_INLINE, 0x03A5},
+ {0x1D731, 0, 1 | DECOMP_INLINE, 0x03A6},
+ {0x1D732, 0, 1 | DECOMP_INLINE, 0x03A7},
+ {0x1D733, 0, 1 | DECOMP_INLINE, 0x03A8},
+ {0x1D734, 0, 1 | DECOMP_INLINE, 0x03A9},
+ {0x1D735, 0, 1 | DECOMP_INLINE, 0x2207},
+ {0x1D736, 0, 1 | DECOMP_INLINE, 0x03B1},
+ {0x1D737, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D738, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D739, 0, 1 | DECOMP_INLINE, 0x03B4},
+ {0x1D73A, 0, 1 | DECOMP_INLINE, 0x03B5},
+ {0x1D73B, 0, 1 | DECOMP_INLINE, 0x03B6},
+ {0x1D73C, 0, 1 | DECOMP_INLINE, 0x03B7},
+ {0x1D73D, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x1D73E, 0, 1 | DECOMP_INLINE, 0x03B9},
+ {0x1D73F, 0, 1 | DECOMP_INLINE, 0x03BA},
+ {0x1D740, 0, 1 | DECOMP_INLINE, 0x03BB},
+ {0x1D741, 0, 1 | DECOMP_INLINE, 0x03BC},
+ {0x1D742, 0, 1 | DECOMP_INLINE, 0x03BD},
+ {0x1D743, 0, 1 | DECOMP_INLINE, 0x03BE},
+ {0x1D744, 0, 1 | DECOMP_INLINE, 0x03BF},
+ {0x1D745, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x1D746, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x1D747, 0, 1 | DECOMP_INLINE, 0x03C2},
+ {0x1D748, 0, 1 | DECOMP_INLINE, 0x03C3},
+ {0x1D749, 0, 1 | DECOMP_INLINE, 0x03C4},
+ {0x1D74A, 0, 1 | DECOMP_INLINE, 0x03C5},
+ {0x1D74B, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D74C, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D74D, 0, 1 | DECOMP_INLINE, 0x03C8},
+ {0x1D74E, 0, 1 | DECOMP_INLINE, 0x03C9},
+ {0x1D74F, 0, 1 | DECOMP_INLINE, 0x2202},
+ {0x1D750, 0, 1 | DECOMP_INLINE, 0x03F5},
+ {0x1D751, 0, 1 | DECOMP_INLINE, 0x03D1},
+ {0x1D752, 0, 1 | DECOMP_INLINE, 0x03F0},
+ {0x1D753, 0, 1 | DECOMP_INLINE, 0x03D5},
+ {0x1D754, 0, 1 | DECOMP_INLINE, 0x03F1},
+ {0x1D755, 0, 1 | DECOMP_INLINE, 0x03D6},
+ {0x1D756, 0, 1 | DECOMP_INLINE, 0x0391},
+ {0x1D757, 0, 1 | DECOMP_INLINE, 0x0392},
+ {0x1D758, 0, 1 | DECOMP_INLINE, 0x0393},
+ {0x1D759, 0, 1 | DECOMP_INLINE, 0x0394},
+ {0x1D75A, 0, 1 | DECOMP_INLINE, 0x0395},
+ {0x1D75B, 0, 1 | DECOMP_INLINE, 0x0396},
+ {0x1D75C, 0, 1 | DECOMP_INLINE, 0x0397},
+ {0x1D75D, 0, 1 | DECOMP_INLINE, 0x0398},
+ {0x1D75E, 0, 1 | DECOMP_INLINE, 0x0399},
+ {0x1D75F, 0, 1 | DECOMP_INLINE, 0x039A},
+ {0x1D760, 0, 1 | DECOMP_INLINE, 0x039B},
+ {0x1D761, 0, 1 | DECOMP_INLINE, 0x039C},
+ {0x1D762, 0, 1 | DECOMP_INLINE, 0x039D},
+ {0x1D763, 0, 1 | DECOMP_INLINE, 0x039E},
+ {0x1D764, 0, 1 | DECOMP_INLINE, 0x039F},
+ {0x1D765, 0, 1 | DECOMP_INLINE, 0x03A0},
+ {0x1D766, 0, 1 | DECOMP_INLINE, 0x03A1},
+ {0x1D767, 0, 1 | DECOMP_INLINE, 0x03F4},
+ {0x1D768, 0, 1 | DECOMP_INLINE, 0x03A3},
+ {0x1D769, 0, 1 | DECOMP_INLINE, 0x03A4},
+ {0x1D76A, 0, 1 | DECOMP_INLINE, 0x03A5},
+ {0x1D76B, 0, 1 | DECOMP_INLINE, 0x03A6},
+ {0x1D76C, 0, 1 | DECOMP_INLINE, 0x03A7},
+ {0x1D76D, 0, 1 | DECOMP_INLINE, 0x03A8},
+ {0x1D76E, 0, 1 | DECOMP_INLINE, 0x03A9},
+ {0x1D76F, 0, 1 | DECOMP_INLINE, 0x2207},
+ {0x1D770, 0, 1 | DECOMP_INLINE, 0x03B1},
+ {0x1D771, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D772, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D773, 0, 1 | DECOMP_INLINE, 0x03B4},
+ {0x1D774, 0, 1 | DECOMP_INLINE, 0x03B5},
+ {0x1D775, 0, 1 | DECOMP_INLINE, 0x03B6},
+ {0x1D776, 0, 1 | DECOMP_INLINE, 0x03B7},
+ {0x1D777, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x1D778, 0, 1 | DECOMP_INLINE, 0x03B9},
+ {0x1D779, 0, 1 | DECOMP_INLINE, 0x03BA},
+ {0x1D77A, 0, 1 | DECOMP_INLINE, 0x03BB},
+ {0x1D77B, 0, 1 | DECOMP_INLINE, 0x03BC},
+ {0x1D77C, 0, 1 | DECOMP_INLINE, 0x03BD},
+ {0x1D77D, 0, 1 | DECOMP_INLINE, 0x03BE},
+ {0x1D77E, 0, 1 | DECOMP_INLINE, 0x03BF},
+ {0x1D77F, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x1D780, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x1D781, 0, 1 | DECOMP_INLINE, 0x03C2},
+ {0x1D782, 0, 1 | DECOMP_INLINE, 0x03C3},
+ {0x1D783, 0, 1 | DECOMP_INLINE, 0x03C4},
+ {0x1D784, 0, 1 | DECOMP_INLINE, 0x03C5},
+ {0x1D785, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D786, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D787, 0, 1 | DECOMP_INLINE, 0x03C8},
+ {0x1D788, 0, 1 | DECOMP_INLINE, 0x03C9},
+ {0x1D789, 0, 1 | DECOMP_INLINE, 0x2202},
+ {0x1D78A, 0, 1 | DECOMP_INLINE, 0x03F5},
+ {0x1D78B, 0, 1 | DECOMP_INLINE, 0x03D1},
+ {0x1D78C, 0, 1 | DECOMP_INLINE, 0x03F0},
+ {0x1D78D, 0, 1 | DECOMP_INLINE, 0x03D5},
+ {0x1D78E, 0, 1 | DECOMP_INLINE, 0x03F1},
+ {0x1D78F, 0, 1 | DECOMP_INLINE, 0x03D6},
+ {0x1D790, 0, 1 | DECOMP_INLINE, 0x0391},
+ {0x1D791, 0, 1 | DECOMP_INLINE, 0x0392},
+ {0x1D792, 0, 1 | DECOMP_INLINE, 0x0393},
+ {0x1D793, 0, 1 | DECOMP_INLINE, 0x0394},
+ {0x1D794, 0, 1 | DECOMP_INLINE, 0x0395},
+ {0x1D795, 0, 1 | DECOMP_INLINE, 0x0396},
+ {0x1D796, 0, 1 | DECOMP_INLINE, 0x0397},
+ {0x1D797, 0, 1 | DECOMP_INLINE, 0x0398},
+ {0x1D798, 0, 1 | DECOMP_INLINE, 0x0399},
+ {0x1D799, 0, 1 | DECOMP_INLINE, 0x039A},
+ {0x1D79A, 0, 1 | DECOMP_INLINE, 0x039B},
+ {0x1D79B, 0, 1 | DECOMP_INLINE, 0x039C},
+ {0x1D79C, 0, 1 | DECOMP_INLINE, 0x039D},
+ {0x1D79D, 0, 1 | DECOMP_INLINE, 0x039E},
+ {0x1D79E, 0, 1 | DECOMP_INLINE, 0x039F},
+ {0x1D79F, 0, 1 | DECOMP_INLINE, 0x03A0},
+ {0x1D7A0, 0, 1 | DECOMP_INLINE, 0x03A1},
+ {0x1D7A1, 0, 1 | DECOMP_INLINE, 0x03F4},
+ {0x1D7A2, 0, 1 | DECOMP_INLINE, 0x03A3},
+ {0x1D7A3, 0, 1 | DECOMP_INLINE, 0x03A4},
+ {0x1D7A4, 0, 1 | DECOMP_INLINE, 0x03A5},
+ {0x1D7A5, 0, 1 | DECOMP_INLINE, 0x03A6},
+ {0x1D7A6, 0, 1 | DECOMP_INLINE, 0x03A7},
+ {0x1D7A7, 0, 1 | DECOMP_INLINE, 0x03A8},
+ {0x1D7A8, 0, 1 | DECOMP_INLINE, 0x03A9},
+ {0x1D7A9, 0, 1 | DECOMP_INLINE, 0x2207},
+ {0x1D7AA, 0, 1 | DECOMP_INLINE, 0x03B1},
+ {0x1D7AB, 0, 1 | DECOMP_INLINE, 0x03B2},
+ {0x1D7AC, 0, 1 | DECOMP_INLINE, 0x03B3},
+ {0x1D7AD, 0, 1 | DECOMP_INLINE, 0x03B4},
+ {0x1D7AE, 0, 1 | DECOMP_INLINE, 0x03B5},
+ {0x1D7AF, 0, 1 | DECOMP_INLINE, 0x03B6},
+ {0x1D7B0, 0, 1 | DECOMP_INLINE, 0x03B7},
+ {0x1D7B1, 0, 1 | DECOMP_INLINE, 0x03B8},
+ {0x1D7B2, 0, 1 | DECOMP_INLINE, 0x03B9},
+ {0x1D7B3, 0, 1 | DECOMP_INLINE, 0x03BA},
+ {0x1D7B4, 0, 1 | DECOMP_INLINE, 0x03BB},
+ {0x1D7B5, 0, 1 | DECOMP_INLINE, 0x03BC},
+ {0x1D7B6, 0, 1 | DECOMP_INLINE, 0x03BD},
+ {0x1D7B7, 0, 1 | DECOMP_INLINE, 0x03BE},
+ {0x1D7B8, 0, 1 | DECOMP_INLINE, 0x03BF},
+ {0x1D7B9, 0, 1 | DECOMP_INLINE, 0x03C0},
+ {0x1D7BA, 0, 1 | DECOMP_INLINE, 0x03C1},
+ {0x1D7BB, 0, 1 | DECOMP_INLINE, 0x03C2},
+ {0x1D7BC, 0, 1 | DECOMP_INLINE, 0x03C3},
+ {0x1D7BD, 0, 1 | DECOMP_INLINE, 0x03C4},
+ {0x1D7BE, 0, 1 | DECOMP_INLINE, 0x03C5},
+ {0x1D7BF, 0, 1 | DECOMP_INLINE, 0x03C6},
+ {0x1D7C0, 0, 1 | DECOMP_INLINE, 0x03C7},
+ {0x1D7C1, 0, 1 | DECOMP_INLINE, 0x03C8},
+ {0x1D7C2, 0, 1 | DECOMP_INLINE, 0x03C9},
+ {0x1D7C3, 0, 1 | DECOMP_INLINE, 0x2202},
+ {0x1D7C4, 0, 1 | DECOMP_INLINE, 0x03F5},
+ {0x1D7C5, 0, 1 | DECOMP_INLINE, 0x03D1},
+ {0x1D7C6, 0, 1 | DECOMP_INLINE, 0x03F0},
+ {0x1D7C7, 0, 1 | DECOMP_INLINE, 0x03D5},
+ {0x1D7C8, 0, 1 | DECOMP_INLINE, 0x03F1},
+ {0x1D7C9, 0, 1 | DECOMP_INLINE, 0x03D6},
+ {0x1D7CA, 0, 1 | DECOMP_INLINE, 0x03DC},
+ {0x1D7CB, 0, 1 | DECOMP_INLINE, 0x03DD},
+ {0x1D7CE, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x1D7CF, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x1D7D0, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x1D7D1, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x1D7D2, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x1D7D3, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x1D7D4, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x1D7D5, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x1D7D6, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x1D7D7, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x1D7D8, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x1D7D9, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x1D7DA, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x1D7DB, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x1D7DC, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x1D7DD, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x1D7DE, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x1D7DF, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x1D7E0, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x1D7E1, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x1D7E2, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x1D7E3, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x1D7E4, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x1D7E5, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x1D7E6, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x1D7E7, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x1D7E8, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x1D7E9, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x1D7EA, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x1D7EB, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x1D7EC, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x1D7ED, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x1D7EE, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x1D7EF, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x1D7F0, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x1D7F1, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x1D7F2, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x1D7F3, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x1D7F4, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x1D7F5, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x1D7F6, 0, 1 | DECOMP_INLINE, 0x0030},
+ {0x1D7F7, 0, 1 | DECOMP_INLINE, 0x0031},
+ {0x1D7F8, 0, 1 | DECOMP_INLINE, 0x0032},
+ {0x1D7F9, 0, 1 | DECOMP_INLINE, 0x0033},
+ {0x1D7FA, 0, 1 | DECOMP_INLINE, 0x0034},
+ {0x1D7FB, 0, 1 | DECOMP_INLINE, 0x0035},
+ {0x1D7FC, 0, 1 | DECOMP_INLINE, 0x0036},
+ {0x1D7FD, 0, 1 | DECOMP_INLINE, 0x0037},
+ {0x1D7FE, 0, 1 | DECOMP_INLINE, 0x0038},
+ {0x1D7FF, 0, 1 | DECOMP_INLINE, 0x0039},
+ {0x1E000, 230, 0, 0},
+ {0x1E001, 230, 0, 0},
+ {0x1E002, 230, 0, 0},
+ {0x1E003, 230, 0, 0},
+ {0x1E004, 230, 0, 0},
+ {0x1E005, 230, 0, 0},
+ {0x1E006, 230, 0, 0},
+ {0x1E008, 230, 0, 0},
+ {0x1E009, 230, 0, 0},
+ {0x1E00A, 230, 0, 0},
+ {0x1E00B, 230, 0, 0},
+ {0x1E00C, 230, 0, 0},
+ {0x1E00D, 230, 0, 0},
+ {0x1E00E, 230, 0, 0},
+ {0x1E00F, 230, 0, 0},
+ {0x1E010, 230, 0, 0},
+ {0x1E011, 230, 0, 0},
+ {0x1E012, 230, 0, 0},
+ {0x1E013, 230, 0, 0},
+ {0x1E014, 230, 0, 0},
+ {0x1E015, 230, 0, 0},
+ {0x1E016, 230, 0, 0},
+ {0x1E017, 230, 0, 0},
+ {0x1E018, 230, 0, 0},
+ {0x1E01B, 230, 0, 0},
+ {0x1E01C, 230, 0, 0},
+ {0x1E01D, 230, 0, 0},
+ {0x1E01E, 230, 0, 0},
+ {0x1E01F, 230, 0, 0},
+ {0x1E020, 230, 0, 0},
+ {0x1E021, 230, 0, 0},
+ {0x1E023, 230, 0, 0},
+ {0x1E024, 230, 0, 0},
+ {0x1E026, 230, 0, 0},
+ {0x1E027, 230, 0, 0},
+ {0x1E028, 230, 0, 0},
+ {0x1E029, 230, 0, 0},
+ {0x1E02A, 230, 0, 0},
+ {0x1E8D0, 220, 0, 0},
+ {0x1E8D1, 220, 0, 0},
+ {0x1E8D2, 220, 0, 0},
+ {0x1E8D3, 220, 0, 0},
+ {0x1E8D4, 220, 0, 0},
+ {0x1E8D5, 220, 0, 0},
+ {0x1E8D6, 220, 0, 0},
+ {0x1E944, 230, 0, 0},
+ {0x1E945, 230, 0, 0},
+ {0x1E946, 230, 0, 0},
+ {0x1E947, 230, 0, 0},
+ {0x1E948, 230, 0, 0},
+ {0x1E949, 230, 0, 0},
+ {0x1E94A, 7, 0, 0},
+ {0x1EE00, 0, 1 | DECOMP_INLINE, 0x0627},
+ {0x1EE01, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0x1EE02, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0x1EE03, 0, 1 | DECOMP_INLINE, 0x062F},
+ {0x1EE05, 0, 1 | DECOMP_INLINE, 0x0648},
+ {0x1EE06, 0, 1 | DECOMP_INLINE, 0x0632},
+ {0x1EE07, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0x1EE08, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0x1EE09, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0x1EE0A, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0x1EE0B, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0x1EE0C, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0x1EE0D, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0x1EE0E, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0x1EE0F, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0x1EE10, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0x1EE11, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0x1EE12, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0x1EE13, 0, 1 | DECOMP_INLINE, 0x0631},
+ {0x1EE14, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0x1EE15, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0x1EE16, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0x1EE17, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0x1EE18, 0, 1 | DECOMP_INLINE, 0x0630},
+ {0x1EE19, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0x1EE1A, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0x1EE1B, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0x1EE1C, 0, 1 | DECOMP_INLINE, 0x066E},
+ {0x1EE1D, 0, 1 | DECOMP_INLINE, 0x06BA},
+ {0x1EE1E, 0, 1 | DECOMP_INLINE, 0x06A1},
+ {0x1EE1F, 0, 1 | DECOMP_INLINE, 0x066F},
+ {0x1EE21, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0x1EE22, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0x1EE24, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0x1EE27, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0x1EE29, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0x1EE2A, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0x1EE2B, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0x1EE2C, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0x1EE2D, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0x1EE2E, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0x1EE2F, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0x1EE30, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0x1EE31, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0x1EE32, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0x1EE34, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0x1EE35, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0x1EE36, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0x1EE37, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0x1EE39, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0x1EE3B, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0x1EE42, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0x1EE47, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0x1EE49, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0x1EE4B, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0x1EE4D, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0x1EE4E, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0x1EE4F, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0x1EE51, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0x1EE52, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0x1EE54, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0x1EE57, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0x1EE59, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0x1EE5B, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0x1EE5D, 0, 1 | DECOMP_INLINE, 0x06BA},
+ {0x1EE5F, 0, 1 | DECOMP_INLINE, 0x066F},
+ {0x1EE61, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0x1EE62, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0x1EE64, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0x1EE67, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0x1EE68, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0x1EE69, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0x1EE6A, 0, 1 | DECOMP_INLINE, 0x0643},
+ {0x1EE6C, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0x1EE6D, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0x1EE6E, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0x1EE6F, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0x1EE70, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0x1EE71, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0x1EE72, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0x1EE74, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0x1EE75, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0x1EE76, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0x1EE77, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0x1EE79, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0x1EE7A, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0x1EE7B, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0x1EE7C, 0, 1 | DECOMP_INLINE, 0x066E},
+ {0x1EE7E, 0, 1 | DECOMP_INLINE, 0x06A1},
+ {0x1EE80, 0, 1 | DECOMP_INLINE, 0x0627},
+ {0x1EE81, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0x1EE82, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0x1EE83, 0, 1 | DECOMP_INLINE, 0x062F},
+ {0x1EE84, 0, 1 | DECOMP_INLINE, 0x0647},
+ {0x1EE85, 0, 1 | DECOMP_INLINE, 0x0648},
+ {0x1EE86, 0, 1 | DECOMP_INLINE, 0x0632},
+ {0x1EE87, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0x1EE88, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0x1EE89, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0x1EE8B, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0x1EE8C, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0x1EE8D, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0x1EE8E, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0x1EE8F, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0x1EE90, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0x1EE91, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0x1EE92, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0x1EE93, 0, 1 | DECOMP_INLINE, 0x0631},
+ {0x1EE94, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0x1EE95, 0, 1 | DECOMP_INLINE, 0x062A},
+ {0x1EE96, 0, 1 | DECOMP_INLINE, 0x062B},
+ {0x1EE97, 0, 1 | DECOMP_INLINE, 0x062E},
+ {0x1EE98, 0, 1 | DECOMP_INLINE, 0x0630},
+ {0x1EE99, 0, 1 | DECOMP_INLINE, 0x0636},
+ {0x1EE9A, 0, 1 | DECOMP_INLINE, 0x0638},
+ {0x1EE9B, 0, 1 | DECOMP_INLINE, 0x063A},
+ {0x1EEA1, 0, 1 | DECOMP_INLINE, 0x0628},
+ {0x1EEA2, 0, 1 | DECOMP_INLINE, 0x062C},
+ {0x1EEA3, 0, 1 | DECOMP_INLINE, 0x062F},
+ {0x1EEA5, 0, 1 | DECOMP_INLINE, 0x0648},
+ {0x1EEA6, 0, 1 | DECOMP_INLINE, 0x0632},
+ {0x1EEA7, 0, 1 | DECOMP_INLINE, 0x062D},
+ {0x1EEA8, 0, 1 | DECOMP_INLINE, 0x0637},
+ {0x1EEA9, 0, 1 | DECOMP_INLINE, 0x064A},
+ {0x1EEAB, 0, 1 | DECOMP_INLINE, 0x0644},
+ {0x1EEAC, 0, 1 | DECOMP_INLINE, 0x0645},
+ {0x1EEAD, 0, 1 | DECOMP_INLINE, 0x0646},
+ {0x1EEAE, 0, 1 | DECOMP_INLINE, 0x0633},
+ {0x1EEAF, 0, 1 | DECOMP_INLINE, 0x0639},
+ {0x1EEB0, 0, 1 | DECOMP_INLINE, 0x0641},
+ {0x1EEB1, 0, 1 | DECOMP_INLINE, 0x0635},
+ {0x1EEB2, 0, 1 | DECOMP_INLINE, 0x0642},
+ {0x1EEB3, 0, 1 | DECOMP_INLINE, 0x0631},
+ {0x1EEB4, 0, 1 | DECOMP_INLINE, 0x0634},
+ {0x1EEB5, 0, 1 | DECOMP_INLINE, 0