diff options
Diffstat (limited to 'src/include')
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 |