From 88e2a15ccc67459667d3d8e1c3cf65c30ca2ecb5 Mon Sep 17 00:00:00 2001 From: freyaqqianjin Date: Tue, 25 Apr 2023 15:32:08 +0800 Subject: [PATCH 1/7] =?UTF-8?q?5.0.0-=E4=BC=81=E4=B8=9A=E7=89=88-Releaseno?= =?UTF-8?q?tes=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/en/docs/ReleaseNotes/Releasenotes.md | 4 +- content/en/docs/ReleaseNotes/Terms of Use.md | 7 +- .../en/docs/ReleaseNotes/acknowledgement.md | 3 +- ...mon-vulnerabilities-and-exposures-cves.md} | 2 +- content/en/docs/ReleaseNotes/contribution.md | 11 +- content/en/docs/ReleaseNotes/features.md | 229 ++++++++++++++---- .../en/docs/ReleaseNotes/important-notes.md | 7 +- content/en/docs/ReleaseNotes/known-issues.md | 5 +- .../en/docs/ReleaseNotes/resolved-issues.md | 2 +- content/en/docs/ReleaseNotes/source-code.md | 30 +-- content/en/docs/ReleaseNotes/user-notice.md | 4 +- content/en/docs/ReleaseNotes/versions.md | 86 ++++--- content/en/menu/index.md | 2 +- 13 files changed, 268 insertions(+), 124 deletions(-) rename content/en/docs/ReleaseNotes/{common-vulnerabilities-and-exposures-(cves).md => common-vulnerabilities-and-exposures-cves.md} (43%) diff --git a/content/en/docs/ReleaseNotes/Releasenotes.md b/content/en/docs/ReleaseNotes/Releasenotes.md index ec7325803..88d5668af 100644 --- a/content/en/docs/ReleaseNotes/Releasenotes.md +++ b/content/en/docs/ReleaseNotes/Releasenotes.md @@ -1,3 +1,3 @@ -# Release Notes +# Release Notes -This document describes the release notes of openGauss 5.0.0. +This document is the release notes of openGauss 5.0.0. diff --git a/content/en/docs/ReleaseNotes/Terms of Use.md b/content/en/docs/ReleaseNotes/Terms of Use.md index b1098b023..4f2a181e6 100644 --- a/content/en/docs/ReleaseNotes/Terms of Use.md +++ b/content/en/docs/ReleaseNotes/Terms of Use.md @@ -1,8 +1,8 @@ # Terms of Use -**Copyright © Huawei Technologies Co., Ltd. 2022. All rights reserved.** +**Copyright © Huawei Technologies Co., Ltd. 2022.** -Your replication, use, modification, and distribution of this document are governed by the Creative Commons License Attribution-ShareAlike 4.0 International Public License \(CC BY-SA 4.0\). You can visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) to view a human-readable summary of \(and not a substitute for\) CC BY-SA 4.0. For the complete CC BY-SA 4.0, visit [https://creativecommons.org/licenses/by-sa/4.0/legalcode](https://creativecommons.org/licenses/by-sa/4.0/legalcode). +Your replication, use, modification, and distribution of this document are governed by the Creative Commons License Attribution-ShareAlike 4.0 International Public License \(CC BY-SA 4.0\). You can visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) to view a human-readable summary of \(and not a substitute for\) CC BY-SA 4.0. For the complete CC BY-SA 4.0, visit [https://creativecommons.org/licenses/by-sa/4.0/legalcode](https://creativecommons.org/licenses/by-sa/4.0/legalcode). Certain document contents (such as standard APIs and parameter descriptions) on this website are from the official PostgreSQL website (https://www.postgresql.org/docs/) and comply with the following protocols: @@ -13,7 +13,7 @@ Permission to use, copy, modify, and distribute this software and its documentat IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS-IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS-IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. **Trademarks and Permissions** @@ -22,4 +22,3 @@ openGauss is a trademark of Huawei Technologies Co., Ltd. All other trademarks a **Disclaimer** This document is used only as a guide. Unless otherwise specified by applicable laws or agreed by both parties in written form, all statements, information, and recommendations in this document are provided "AS IS" without warranties, guarantees or representations of any kind, including but not limited to non-infringement, timeliness, and specific purposes. - diff --git a/content/en/docs/ReleaseNotes/acknowledgement.md b/content/en/docs/ReleaseNotes/acknowledgement.md index 540d107bf..c38c95c23 100644 --- a/content/en/docs/ReleaseNotes/acknowledgement.md +++ b/content/en/docs/ReleaseNotes/acknowledgement.md @@ -1,4 +1,3 @@ # Acknowledgement -We sincerely thank all the members who participated in and assisted in the openGauss project. It is your hard work to make the version released successfully and provide the possibility for the better development of openGauss. - +We sincerely thank all the members who participated in and assisted in the openGauss project, including Huawei, ENMOTECH, VASTDATA, China Unicom, GBASE, Greater Bay Area National Center of Technology Innovation (GBA NCTI), iSoftStone, Beijing SuperMap Software Co., Ltd., China Minsheng Banking, SHENTONGDATA, School of Computer Science and Engineering of UESTC, School of Information Engineering of Ningxia University, School of Software Engineering of SCUT, School of Computer Science and Engineering of Sun Yat-sen University, School of Information Engineering of Minzu University of China, Xi'an Rita Network Technology Co., Ltd., SphereEx, and SANGFOR. It is your hard work to make the version released successfully and provide the possibility for the better development of openGauss. diff --git a/content/en/docs/ReleaseNotes/common-vulnerabilities-and-exposures-(cves).md b/content/en/docs/ReleaseNotes/common-vulnerabilities-and-exposures-cves.md similarity index 43% rename from content/en/docs/ReleaseNotes/common-vulnerabilities-and-exposures-(cves).md rename to content/en/docs/ReleaseNotes/common-vulnerabilities-and-exposures-cves.md index 6f493fd33..a2bab30b7 100644 --- a/content/en/docs/ReleaseNotes/common-vulnerabilities-and-exposures-(cves).md +++ b/content/en/docs/ReleaseNotes/common-vulnerabilities-and-exposures-cves.md @@ -1,3 +1,3 @@ # Common Vulnerabilities and Exposures \(CVEs\) -This is the tenth release of openGauss. It does not involve any common vulnerabilities and exposures \(CVEs\). +This is the tenth release of openGauss. The disclosed CVEs have been fixed. diff --git a/content/en/docs/ReleaseNotes/contribution.md b/content/en/docs/ReleaseNotes/contribution.md index f309307d3..321eccbd4 100644 --- a/content/en/docs/ReleaseNotes/contribution.md +++ b/content/en/docs/ReleaseNotes/contribution.md @@ -2,19 +2,18 @@ **Participating in Contribution** -As an openGauss user, you can contribute to the openGauss community in multiple ways. For details about how to contribute to the community, see [Contribution](https://opengauss.org/en/contribution.html). Here, some methods are listed for reference. +As an openGauss user, you can contribute to the openGauss community in multiple ways. For details about how to contribute to the community, see [Contribution](https://opengauss.org/en/contribution/). Here, some methods are listed for reference. **Special Interest Groups \(SIGs\)** -openGauss brings together people of common interest to form different SIGs. For details about existing SIGs, see the [SIG list](https://opengauss.org/en/contribution.html). +openGauss brings together people of common interest to form different SIGs. For details about existing SIGs, see the [SIG list](https://opengauss.org/en/contribution/). -You are welcome to join an existing SIG or create a SIG. For details about how to create a SIG, see [Special Interest Group \(SIG\)](https://gitee.com/opengauss/tc/blob/master/sigs/README.en.md). +You are welcome to join an existing SIG or create a SIG. For details about how to create a SIG, see [Special Interest Group \(SIG\)](https://gitee.com/opengauss/tc/blob/master/sigs/README.en.md/). **Mail List and Issues** -You are welcome to actively help users solve problems raised in the [mail list](https://opengauss.org/en/community/mails.html) and issues \(including [code repository issues](https://gitee.com/organizations/opengauss/issues)\). In addition, you can submit an issue. All these will help the openGauss community develop better. +You are welcome to actively help users solve problems raised in the [mail list](https://opengauss.org/en/community/onlineCommunication/) and issues \(including [code repository issues](https://gitee.com/organizations/opengauss/issues)\). In addition, you can commit an issue. All these will help the openGauss community develop better. **Documents** -You can contribute to the community by submitting code. We also welcome your feedback on problems and difficulties, or suggestions on improving the usability and integrity of documents, for example, problems encountered when obtaining software or documents and difficulties encountered when using the system. You are welcome to pay attention to and help us improve the documentation module of the openGauss community. - +You can contribute to the community by committing code. We also welcome your feedback on problems and difficulties, or suggestions on improving the usability and integrity of documents, for example, problems encountered when obtaining software or documents and difficulties encountered when using the system. You are welcome to pay attention to and help us improve the documentation module of the openGauss community. diff --git a/content/en/docs/ReleaseNotes/features.md b/content/en/docs/ReleaseNotes/features.md index 9ba7a4f2e..031de1f98 100644 --- a/content/en/docs/ReleaseNotes/features.md +++ b/content/en/docs/ReleaseNotes/features.md @@ -12,13 +12,17 @@ Supports the ACID feature of transactions, single-node recovery, HA data synchronization, and HA switchover. The enterprise edition provides the CM tool to support database instance status query, primary/standby switchover, log management, and cluster status query and push. -- Application programming interface \(API\) +- Resource pooling - Supports standard JDBC 4.0 and ODBC 3.5 features. + Supports the resource pooling architecture based on shared storage and shared memory to ensure real-time read consistency on standby nodes. + +- Application programming interface (API) + + Supports standard JDBC 4.0 and ODBC 3.5 features, and Python and Go connection drivers. - Management tools - Provides the installation and deployment tool, instance start and stop tool, backup and restoration tool, scale-out and scale-in tool, and upgrade tool. + Provides the installation and deployment tools, instance start and stop tools, backup and restoration tools, scaling tool, and upgrade tool, supports the full-lifecycle data production tool DataKit, MySQL full/incremental/reverse migration tools, and data check tool. - Security management @@ -26,51 +30,182 @@ - AI - Supports parameter self-tuning, slow SQL discovery, single query index recommendation, virtual index, workload index recommendation, database metric collection, forecast, and exception detection; The native AI engine in the library supports 10+ high-performance machine learning algorithms. + Supports parameter self-tuning, slow SQL discovery, single query index recommendation, virtual index, workload index recommendation, database metric collection, forecast, and exception detection. The native AI engine in the database supports more than 10 high-performance machine learning algorithms. ## New Features -This section describes openGauss 3.1.1. Compared with openGauss 3.1.0, it has the following new features: - -- Primary/Standby shared storage - This feature enables the primary and standby nodes to share the same storage, implementing HA deployment mode for the primary/standby shared storage based on disk arrays. OCK RDMA can be used to improve the real-time read consistency on standby nodes. This feature depends on two Huawei-developed components: - - Distributed storage service (DSS) - The DSS process is an independent process that directly manages raw devices of disk arrays and provides capabilities similar to distributed file systems for external systems. The shared memory and client API dynamic library provide the database with the capabilities of creating files, deleting files, expanding and shrinking files, and reading and writing files. - - Distributed memory service (DMS) - DMS is a dynamic library integrated in the database. It transmits page content through the TCP/RDMA network, integrates the primary and standby memories, and provides the memory pooling capability to implement real-time read consistency on standby nodes. That is, after a transaction is committed on the primary node, the transaction can be read on the standby node immediately. There is no delayed read (the transaction isolation level is read committed). - The shared storage uses OCK RDMA to reduce the latency of DMS primary/standby page exchange. Compared with the latency of read consistency on a standby node in TCP mode, when OCK RDMA is enabled, the latency is reduced by at least 20%. - -- CM deployment is decoupled from database deployment. CM supports incremental upgrade. - The CM installation can be decoupled when the database process already exists. In addition, the CM component can be upgraded independently, enhancing the reliability of the database cluster. - -- Enhanced MySQL compatibility - Version 3.1.1 supports the following syntax points: (Only some typical syntax points are listed. For details, see section "MySQL Compatibility" in the Developer Guide.) - - Operators: !, ->, and ->> - - System functions: 28 JSON class functions, such as JSON_ARRAY(), JSON_OBJECT(), JSON_QUOTE(), JSON_CONTAINS(), JSON_CONTAINS_PATH(), and JSON_EXTRACT(), support any\_value, database, and default functions. - - DDLs: - - Functions can be used as partition conditions for partitioned tables. - - The partition table syntax supports LESS THAN MAXVALUE. - - - DMLs: - - The Load DATA syntax can be used to import data. - - Views can be inserted, deleted, and updated. - - In an INSERT statement, the right value of an expression following SET can contain the column name. - - Multiple partitions can be specified to query data. - - - PLs/SQLs: - - The WHILE loops with labels are supported. - - The CASE WHEN condition control syntax is supported. - - The IF_THEN control syntax is supported. - - The CURSOR syntax is compatible with MySQL. - - The Declare...CONDITION FOR syntax is supported. - - The DO expr \[, expr\]... is supported. - - The REPEAT and Return clauses are supported. - - - DCLs: - - The CREATE USER with the IF NOT EXISTS option is supported. - - - Others: - - The sql\_mode options ansi\_quotes and no\_zero\_date are added, indicating that double quotation marks are used for reference and DATE can be all 0s. - - The SHOW WARNINGS and SHOW ERRORS are supported. - - The backquote can be used as identifiers. +This section describes openGauss 5.0.0. Compared with openGauss 3.1.0, it has the following new features: + +- High performance: The performance of basic operators is improved. + + The performance of the scan operators and aggregate operators is optimized, improving the end-to-end performance by 37% in the TPC-H 100 GB data scenario. + - Parser optimization: The method of searching for keywords in the parser is optimized. + - Expression and operator optimization: The expression framework is flattened and the operator performance is optimized. + - Inner Unique optimization. + - Predicate optimization: New pushdown predicates are obtained through predicate equivalence inference. + - Scan operator optimization: The index scanning and full table scanning operators are optimized. + - Aggregate operator optimization: The performance of the aggregate operators is optimized. + +- High security: user-level audit. + + - User-level audit is supported. The GUC parameter **full\_audit\_users** is added to set the list of audited users. Audit logs are recorded for all SQL statements executed by users in the list. Administrators' operations can be fully audited to audit administrators' access to user data. + - The audit operation can be configured based on client information. The GUC parameter **no\_audit\_client** is added to configure the list of clients that do not need to be audited. Audit logs are not recorded for specified client apps and IP addresses. + - Audit logs are recorded for high-risk system function calls. The list of system functions that support audit recording must be specified in documents. + +- High availability: CM supports VIP management. + + - The host can be directly found based on the virtual IP (VIP), and the reconnection is more accurate and faster (millisecond-level). + - When a host is faulty and a new primary CM is selected, the VIP is migrated to the new primary CM. + - When two primary nodes exist, only one host can be accessed through the VIP, reducing the risk of data loss. + +- High availability: CM can be deployed on two nodes. + + - The third-party gateway IP address is introduced to effectively solve the self-quorum problem in the two-node CM cluster deployment mode. The CMS and DN can be deployed on two nodes. + - In addition, the CM cluster failover policy and database cluster split-brain recovery policy can be dynamically configured to ensure cluster data integrity and consistency. + +- High availability: The read-only detection capability of CM disks is enhanced. + + - The read-only status is obtained from the database to ensure accuracy. + - Read-only quorum arbitrates only the instances that exceed the threshold. Other nodes are not affected. + - After the primary server is read-only, a primary/standby switchover is automatically performed. An available standby server is promoted to primary to ensure that the cluster can work properly. + +- High availability: CM usability is improved. + + - The CM cluster service can be stopped in one-click mode. + - Decoupling from kernel installation and deployment is supported. + - User-defined scripts can be invoked by event. + - The CM component can be upgraded independently to enhance the reliability of the database cluster. + - The CM supports monitoring and management of user-defined components based on the configuration information. + +- High intelligence: Exception detection supports self-configuration. + + - To adapt to actual scenarios and avoid resource occupation, DBMind supports self-configuration of exception detection at the system, database, and log layers. Users can add, pause, or delete exception detection items in real time before or during running. Exception detection items support different exception detection algorithms. The exception detection function obtains the intersection of the results of different exception detectors to adapt to specific application scenarios. + +- Enterprise-level feature: event trigger. + + - DDL operations in the current database and their target objects are captured and processed. + - The following DDL events can be captured: ddl\_command\_start, ddl\_command\_end, sql\_drop, and table\_rewrite. + +- Enterprise-level feature: openGauss resource pooling architecture is implemented based on storage pooling, memory pooling, and computing pooling (beta feature). + + - Storage pooling supports multiple storage forms, such as enterprise high-end storage and distributed storage. One data service can be used for multiple types of computing, improving storage utilization by more than 50%. + - Memory pooling implements memory interconnection between compute nodes. Transaction information and database cache are synchronized to implement consistent read of multi-version snapshots on multiple nodes. RDMA-accelerated RoCE hardware is used to achieve ultra-low latency and high throughput communication across nodes. + - Computing pooling supports diversified computing power. ShardingSphere is used to build the openGauss distributed computing capability, achieving 32-node networking performance > 21 million tpmC. + - In terms of cluster management, technologies such as dual heartbeat detection, shared disk quorum , and I/O fencing are used to automatically detect, rectify, and isolate cluster node faults, providing a highly reliable running environment for resource pooling. + +- Application development interface: enhanced JDBC capabilities. + + - Quick load balancing can be triggered when the cluster status changes. + - The heartbeat thread can be enabled to periodically maintain the heartbeat of the primary node. When the primary node is faulty, the old connection is quickly killed and the new connection is connected to the new primary node. + +- Middleware: ShardingSphere supports read/write isolation in multiple modes and cross-database query. + + - The read/write isolation of statements in a transaction is supported. + - The computing capability of the aggregate operator is supported to implement associated query across sharded tables in the database. + +- Middleware: 32-node networking performance of openGauss+ShardingSphere > 21 million tpmC + + - ShardingSphere uses asynchronous JDBC at the backend to reduce connection consumption. openGauss uses the resource pooling architecture to improve the single-sharding capability. When 32 Kunpeng 920 \(128 cores\) nodes are used for networking \(1 x shardingsphere-proxy ,11 x shardingsphere-jdbc, 20 x openGauss\), the perfect sharding performance is greater than 21 million tpmc. + +- Toolchain: full-lifecycle data production tool DataKit + + - DataKit is positioned as a full-lifecycle data productivity tool of openGauss. It supports full-lifecycle data management, covering openGauss deployment, migration, development, and O&M. + - DataKit is a tool kit of openGauss. It uses the browser/server (B/S) software architecture and provides basic software and hardware resource management capabilities such as servers and database instances. + - In addition, on-demand deployment of function extensions is supported. Currently, the community provides function extensions such as installation and deployment, data migration, data development, and intelligent O&M. + - The DataKit is also a tool development platform that allows users to implement their own functions based on extension interfaces and specifications. Function extensions can be dynamically loaded to and run on the DataKit or dynamically uninstalled from the DataKit. Extensions can invoke open interfaces of the platform and other extensions to obtain corresponding data and functions, implementing quick construction of featured functions. + +- Toolchain: MySQL migration tool gs\_rep\_portal + + - gs\_rep\_portal can connect to Debezium+kafka and gs\_mysync to integrate full migration, incremental migration, and data check capabilities, implementing full migration, incremental migration, reverse migration, and data check. + - Users are allowed to create parallel migration task flows and customize migration plans. Each migration step is automatically executed based on the preset execution sequence. + - The migration progress (including the total amount, remaining amount and time, and replication delay) and statements that fail to be migrated can be displayed. + +- Toolchain: MySQL full migration tool gs\_mysync + + - The gs\_mysync (original Chameleon) full migration tool supports progress display and enhanced debugging. The full migration performance is greater than 300 MB/s, that is, 1 TB/h. + +- Toolchain: MySQL incremental and reverse migration tool gs\_replicate + + - Incremental migration and reverse migration are incorporated into Debezium+kafka and integrated into gs\_replicate. The incremental migration performance is greater than 30,000 TPS. + +- Toolchain: gs\_datacheck based on the Merkle tree + + - The data check performance reaches 70 MB/s. + - The row-level, column-level, and table-level data checks are supported. + - Data exported from a full migration can be directly read and checked. + +- Compatibilities: Compatible with most common MySQL syntax, including data types, operators, system functions, DDL, DML, DCL, and PL/SQL, implementing application migration without modification. + + Version 5.0.0 supports the following syntax points: (Only some typical syntax points are listed. For details, see section "MySQL Compatibility" in the *Data Migration Guide*.) + + - Data types: + + (1) XML type + (2) Binary data types and operators + (3) Converting the output of the Boolean type to tinyint + (4) Signed and unsigned tinyint types + + - System functions: ADDDATE(), ADDTIME(), CONVERT\_TZ(), CURDATE(), DATE\_ADD(), DATE\_FORMAT(), DATE\_SUB(), DATEDIFF(), DAY(), DAYNAME(), EXTRACT(), FROM\_DAYS(), FROM\_UNIXTIME(), GET\_FORMAT(), LAST\_DAY, LOCALTIME(), LOCALTIME, LOCALTIMESTAMP, LOCALTIMESTAMP(), MAKEDATE(), MAKETIME(), MONTH(), MONTHNAME(), NOW(), JSON\_ARRAY(), JSON\_OBJECT(), JSON\_QUOTE(), JSON\_CONTAINS(), JSON\_CONTAINS\_PATH(), JSON\_EXTRACT(), JSON\_UNQUOTE(), JSON\_KEYS(), JSON\_SEARCH(), JSON\_APPEND(), JSON\_ARRAY\_APPEND(), JSON\_ARRAY\_INSERT(), JSON\_INSERT(), JSON\_MERGE(), JSON\_MERGE\_PATCH(), DATABASE(), ROW\_COUNT() and ANY\_VALUE() + + - DDLs: + + (1) The default character set and collation can be set and modified at the schema, table, and column levels. The character set of a table can be converted. + (2) Columns can be added before the first column of a table or after a specified column. + (3) The syntax for modifying column names and column definitions is compatible. + (4) The ALTER TABLE tablename ADD CONSTRAINT UNIQUE INDEX|KEY syntax is supported. + (5) The CREATE/ALTER/DROP DATABASE can be converted to the CREATE/ALTER/DROP SCHEMA when the character set is specified. + (6) Indexes can be hidden and index visibility can be set. + (7) Compatibility with uncommon options in table creation statements is supported, such as checksum and max_rows; + (8) Columns can be specified when a table is created in CREATE TABLE SELECT mode. + (9) Columns are case sensitive. + (10) The dual tables are supported. + (11) The authid can be used as the column name. + + - DMLs: + + (1) Column aliases can be specified when INSERT is used. + (2) The SELECT INTO syntax is compatible. OUTFILE, DUMPFILE, and variables are added after SELECT INTO. + (3) The LOAD DATA statement can be used to import table data. + (4) The union query can be associated with columns of different types. + (5) DISTINCT supports ORDER BY with expressions. + (6) Foreign keys can be associated with non-unique indexes. + (7) The SELECT statement supports the FORCE keyword to forcibly use the index. + (8) The SELECT statement supports user-defined variables. + (9) Views can be inserted, deleted, and updated. + (10) In an INSERT statement, the right value of an expression following SET can contain the column name. + (11) Multiple partitions can be specified to query data. + (12) The default function can be used for SQL statements. + + - DCLs: + + (1) The syntax tree of SET TRANSACTION can be used to set the session level, global isolation level, and read/write permission. + (2) The event scheduler can be used to periodically execute specified statements at intervals, create, modify, and delete events, and support SHOW EVENTS. + (3) LOCK TABLE and UNLOCK TABLE are supported. + (4) SHOW STATUS, SHOW TABLE STATUS, SHOW PRIVILEGES, SHOW WARNING, and SHOW ERRORS are supported. + (5) The IF NOT EXISTS option is supported when a user is created. + (6) Users can be specified in the 'user'@'host' format. + + - PLs/SQLs: + + (1) The WHILE loops with labels are supported. + (2) The CASE WHEN condition control syntax is supported. + (3) The IF_THEN control syntax is supported. + (4) The cursor-related syntax is supported. + (5) The stored procedure processes the condition. + (6) The DROP TRIGGER supports cascading deletion without specifying the table name. + (7) The DO statement is supported. + (8) The stored procedure supports REPEAT. + (9) The CREATE PROCEDURE SELECT syntax is supported. + (10) The stored procedure supports RETURN. + (11) The **as $$begin** and **end; $$language plpgsql** are not added to the beginning and end of CREATE FUNCTION. + (12) A slash (/) is not added at the end of CREATE TRIGGER. + (13) DECLARE HANDLER, CONTINUE HANDLER, and EXIT HANDLER are supported. + + - Other syntax compatibility: + + (1) Users are allowed to customize variables to save the result of the SELECT statement. + (2) Seven character sequences are supported: utf8_general_ci, utf8_bin, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_bin, and utf8mb4_unicode_ci and binary. + (3) The utf8mb4 character set is supported. + (4) The operator behavior is the same as that of MySQL. + (5) Character strings can be enclosed in double quotation marks. diff --git a/content/en/docs/ReleaseNotes/important-notes.md b/content/en/docs/ReleaseNotes/important-notes.md index 15ee2a402..79984450b 100644 --- a/content/en/docs/ReleaseNotes/important-notes.md +++ b/content/en/docs/ReleaseNotes/important-notes.md @@ -1,6 +1,5 @@ # Important Notes -- For details about technical specifications, see the *Technical White Paper*. -- You are advised to deploy one primary node and two standby nodes to ensure reliability and availability. -- If remote DR is required to ensure higher reliability, the Two-City Three-DC DR deployment solution is recommended. -- You are advised to perform scenario-based verification on the primary/standby shared storage feature. \ No newline at end of file +- For details about technical specifications, see the *Technical White Paper*. +- You can select a deployment architecture based on the database deployment solutions in the *Database Management Guide* to ensure the reliability and availability of the database cluster. +- The resource pooling primary/standby shared storage feature is a beta feature and is in the trial phase. diff --git a/content/en/docs/ReleaseNotes/known-issues.md b/content/en/docs/ReleaseNotes/known-issues.md index 3cc62dcc0..24e9f9033 100644 --- a/content/en/docs/ReleaseNotes/known-issues.md +++ b/content/en/docs/ReleaseNotes/known-issues.md @@ -4,7 +4,6 @@ - The read-only mode of the standby node and cascaded standby node is incompatible with the ultimate RTO feature. If the ultimate RTO feature is enabled, disable the read-only mode of the standby node and cascaded standby node. -- Memory Optimized Tables \(MOTs\) are incompatible with the incremental checkpoint feature. If MOTs are used, disable the incremental checkpoint function. - -- LLVM does not support the ARM architecture. When the MOT TPC-C is imported, an LLVM error is reported. To avoid this problem, disable the JIT function using the **enable\_mot\_codegen** parameter. You can configure **force\_mot\_pseudo\_codegen= true** to reduce the impact on TPC-C test performance when the JIT function is disabled. +- Memory Optimized Tables (MOTs) are incompatible with the incremental checkpoint feature. If MOTs are used, disable the incremental checkpoint function. +- LLVM does not support the Arm architecture. When the MOT TPC-C is imported, an LLVM error is reported. To avoid this problem, disable the JIT function using the **enable\_mot\_codegen** parameter. You can configure **force\_mot\_pseudo\_codegen= true** to reduce the impact on TPC-C test performance when the JIT function is disabled. diff --git a/content/en/docs/ReleaseNotes/resolved-issues.md b/content/en/docs/ReleaseNotes/resolved-issues.md index 29c0df051..e034fbcb5 100644 --- a/content/en/docs/ReleaseNotes/resolved-issues.md +++ b/content/en/docs/ReleaseNotes/resolved-issues.md @@ -1,3 +1,3 @@ # Resolved Issues -This is the tenth release of openGauss. It does not involve any CVEs. +This is the tenth release of openGauss. The disclosed CVEs have been fixed. diff --git a/content/en/docs/ReleaseNotes/source-code.md b/content/en/docs/ReleaseNotes/source-code.md index 8db496ce1..504ea113a 100644 --- a/content/en/docs/ReleaseNotes/source-code.md +++ b/content/en/docs/ReleaseNotes/source-code.md @@ -1,24 +1,24 @@ # Source Code -openGauss contains the following 18 code repositories: +openGauss contains the following 18 code repositories. -- Open-source software code repository: [https://gitee.com/opengauss/openGauss-third\_party](https://gitee.com/opengauss/openGauss-third_party) +- Open-source software code repository: [https://gitee.com/opengauss/openGauss-third\_party](https://gitee.com/opengauss/openGauss-third_party) -- JDBC driver code repository: [https://gitee.com/opengauss/openGauss-connector-jdbc](https://gitee.com/opengauss/openGauss-connector-jdbc) +- JDBC driver code repository: [https://gitee.com/opengauss/openGauss-connector-jdbc](https://gitee.com/opengauss/openGauss-connector-jdbc) -- ODBC driver code repository: [https://gitee.com/opengauss/openGauss-connector-odbc](https://gitee.com/opengauss/openGauss-connector-odbc) -- Database server code repository: [https://gitee.com/opengauss/openGauss-server](https://gitee.com/opengauss/openGauss-server) +- ODBC driver code repository: [https://gitee.com/opengauss/openGauss-connector-odbc](https://gitee.com/opengauss/openGauss-connector-odbc) +- Database server code repository: [https://gitee.com/opengauss/openGauss-server](https://gitee.com/opengauss/openGauss-server) - Autonomous O&M platform DBMind code repository: [https://gitee.com/opengauss/openGauss-DBMind](https://gitee.com/opengauss/openGauss-DBMind) -- OM tool code repository: [https://gitee.com/opengauss/openGauss-OM](https://gitee.com/opengauss/openGauss-OM) -- CM tool code repository: [https://gitee.com/opengauss/CM](https://gitee.com/opengauss/CM) -- DMS code repository: [https://gitee.com/opengauss/DMS](https://gitee.com/opengauss/DMS) -- DSS code repository: [https://gitee.com/opengauss/DSS](https://gitee.com/opengauss/DSS) -- DCF code repository: [https://gitee.com/opengauss/DCF](https://gitee.com/opengauss/DCF) -- DCC code repository: [https://gitee.com/opengauss/DCC](https://gitee.com/opengauss/DCC) -- Plug-in code repository: [https://gitee.com/opengauss/Plugin](https://gitee.com/opengauss/Plugin) +- OM tool code repository: [https://gitee.com/opengauss/openGauss-OM](https://gitee.com/opengauss/openGauss-OM) +- CM tool code repository: [https://gitee.com/opengauss/CM](https://gitee.com/opengauss/CM) +- Database distributed memory service \(DMS\) component code repository: [https://gitee.com/opengauss/DMS](https://gitee.com/opengauss/DMS) +- Database distributed storage service \(DSS\) component code repository: [https://gitee.com/opengauss/DSS](https://gitee.com/opengauss/DSS) +- DCF code repository: [https://gitee.com/opengauss/DCF](https://gitee.com/opengauss/DCF) +- DCC code repository: [https://gitee.com/opengauss/DCC](https://gitee.com/opengauss/DCC) +- Plug-in code repository: [https://gitee.com/opengauss/Plugin](https://gitee.com/opengauss/Plugin) - MySQL-to-openGauss full migration tool code repository: [https://gitee.com/opengauss/openGauss-tools-chameleon](https://gitee.com/opengauss/openGauss-tools-chameleon) -- MySQL incremental migration tool code repository (including reverse migration): [https://gitee.com/opengauss/openGauss-tools-onlineMigration-mysql](https://gitee.com/opengauss/openGauss-tools-onlineMigration-mysql) +- MySQL incremental/reverse migration tool code repository: [https://gitee.com/opengauss/debezium](https://gitee.com/opengauss/debezium) - Data verification tool code repository: [https://gitee.com/opengauss/openGauss-tools-datachecker-performance](https://gitee.com/opengauss/openGauss-tools-datachecker-performance) -- Prometheus-exporter code repository: [https://gitee.com/opengauss/openGauss-prometheus-exporter](https://gitee.com/opengauss/openGauss-prometheus-exporter) +- Prometheus-exporter code repository: [https://gitee.com/opengauss/openGauss-prometheus-exporter](https://gitee.com/opengauss/openGauss-prometheus-exporter) - Database monitoring plug-in generation tool code repository: [https://gitee.com/opengauss/openGauss-tools-monitor](https://gitee.com/opengauss/openGauss-tools-monitor) -- Document repository: [https://gitee.com/opengauss/docs](https://gitee.com/opengauss/docs) +- Document repository: [https://gitee.com/opengauss/docs](https://gitee.com/opengauss/docs) diff --git a/content/en/docs/ReleaseNotes/user-notice.md b/content/en/docs/ReleaseNotes/user-notice.md index 232c0c08f..5f62a99f8 100644 --- a/content/en/docs/ReleaseNotes/user-notice.md +++ b/content/en/docs/ReleaseNotes/user-notice.md @@ -2,9 +2,9 @@ openGauss is an open-source, secure, and reliable relational OLTP database with ultimate performance. It is released with the Mulan PSL v2 protocol, allowing users to copy, use, modify, and distribute the source code. -The version number of openGauss is named in *X.Y.Z* format. *X_ indicates the version for architecture changes, _Y* indicates the version released every year, and *Z_ indicates the patch version. Generally, a _Y* version is released every year. A new *X* version is released for major architecture or feature changes. +The version number of openGauss is named in *X.Y.Z* format. *X.0.0* indicates the LTS version, *X.Y.0* indicates the preview version, and *Z* indicates the patch version. Generally, a preview version and an LTS version are released every year. The preview version is for beta testing. The LTS version is a long-term support version and can be rolled out on a large scale. If major issues need to be resolved, patch versions will be released as required. The preliminary openGauss lifecycle plans are as follows: -+ The release version is released every one year, and the community provides three-year maintenance support. ++ The LTS version is released every one year, and the community provides three-year maintenance support. + The preview version is released every one year, and the community provides 0.5-year maintenance support. diff --git a/content/en/docs/ReleaseNotes/versions.md b/content/en/docs/ReleaseNotes/versions.md index 4b30d9517..ff24b60a1 100644 --- a/content/en/docs/ReleaseNotes/versions.md +++ b/content/en/docs/ReleaseNotes/versions.md @@ -1,43 +1,57 @@ # Versions -openGauss 3.1.1 is a preview of openGauss 5.0.0 LTS. We hope that community partners and developers can perform scenario-based verification based on this version, detect problems in advance, and report the problems to the community. The community will fix the problems before the LTS version is released. This document applies only to the enterprise edition. +openGauss 5.0.0 is the third LTS version of openGauss, and its lifecycle is three years. This document applies only to the enterprise edition. -3.1.1 is compatible with the earlier versions. Main functions are as follows: +5.0.0 is compatible with the earlier versions. Main functions are as follows: -- Inherited functions: - - Basic functions: standard SQL syntax, data types, tables \(including temporary tables, global temporary tables, and foreign tables\), views, materialized views, foreign keys, indexes \(including B-tree indexes, GIN indexes, and hash indexes\), sequences, functions, triggers, MEDIAN aggregate function, ROWNUM, UPSERT, JSONB data type, and GB18030 character set. - - Stored procedure, commit/rollback in a stored procedure, omission of parameter parentheses \(\) from the stored procedure or function calling, and stored procedure debugging - - Security functions: authentication, permission management, network communication security, database audit, fully encrypted database, dynamic masking, Chinese national cryptographic algorithm, tamper-proof ledger database, built-in role and permission management, transparent encryption, and ANY permission management. - - High availability: primary/standby two-node cluster, cascaded standby node, logical replication, ultimate RTO, standby node scale-out, Paxos-based distributed consensus framework \(DCF\), and two-city three-DC DR. - - Enhanced SQL engine: range partitioning, global partitioned index, list partitioning, hash partitioning, automatic extended partitioning based on range partitioning, row-store execution to vectorized execution, autonomous transaction, parallel query, Global Syscache, IPv6 protocol, and postgis plug-ins. - - Enhanced storage engine: delayed standby node replay, logical replication on standby nodes, parallel logical decoding, gray upgrade, rolling upgrade, hash index, unique primary key constraint for column-store tables, Ustore storage engine, segment-page storage, publication-subscription, row-store table compression, memory-optimized table (MOT), and NUMA-aware high-performance capability. - - Backup and restoration: Full physical backup, logical backup, standby node backup, incremental backup and restoration, and point-in-time recovery \(PITR\). - - AI capabilities: parameter self-tuning, slow SQL discovery, AI query time forecasting, database metric collection, forecast, and exception detection, DBMind autonomous O&M platform, intelligent optimizer, intelligent index recommendation, and DeepSQL in-database AI algorithms (supporting XGBoost, multiclass, and PCA). - - O&M capabilities: database running metrics in WDRs, diagnosis view for slow SQL statements on the standby node, and automatic eviction of unique SQL statements. - - JDBC client load is balanced and read and write are isolated. - - Cluster management (CM) supports customized resource management and control, and external status query and push. - - Tool chain: development tool DataStudio and data migration tool Chameleon. - - Middleware: shardingSphere and openLookeng. - - Peripheral ecosystem: dblink, supporting OpenEuler, CentOS, Ubuntu, and FusionOS. - - Others: CMake script compilation, container-based deployment, and Kubernetes. - +- Inherited functions: -- New functions: - - Primary/Standby shared storage - - Enhanced MySQL compatibility - - CM deployment is decoupled from database deployment. CM supports incremental upgrade. + - Basic functions: standard SQL syntax, data types, tables \(including temporary tables, global temporary tables, and foreign tables\), views, materialized views, foreign keys, indexes \(including B-tree indexes, GIN indexes, and hash indexes\), sequences, functions, triggers, MEDIAN aggregate function, ROWNUM, UPSERT, JSONB data type, and GB18030 character set. + - Enhanced SQL engine: range partitioning, global partitioned index, list partitioning, hash partitioning, automatic extended partitioning based on range partitioning, row-store execution to vectorized execution, autonomous transaction, parallel query, Global SysCache, IPv6 protocol, and PostGIS extensions. + - Enhanced storage engine: delayed standby node replay, logical replication on standby nodes, parallel logical decoding, gray upgrade, rolling upgrade, hash index, unique primary key constraint for column-store tables, Ustore storage engine, segment-page storage, publication-subscription, row-store table compression, memory-optimized table (MOT), and NUMA-aware high-performance capability. + - Stored procedure, commit/rollback in a stored procedure, omission of parameter parentheses \(\) from the stored procedure or function calling, and stored procedure debugging. + - Security functions: authentication, permission management, network communication security, database audit, fully encrypted database, dynamic masking, Chinese national cryptographic algorithm, tamper-proof ledger database, built-in role and permission management, transparent encryption, and ANY permission management. + - High availability: primary/standby two-node cluster, cascaded standby node, logical replication, ultimate RTO, standby node scale-out, Paxos-based distributed consensus framework \(DCF\), and two-city three-DC DR. + - Backup and restoration: Full physical backup, logical backup, standby node backup, incremental backup and restoration, and point-in-time recovery \(PITR\). + - AI capabilities: parameter self-tuning, slow SQL discovery, AI query time forecasting, database metric collection, forecast, and exception detection, DBMind autonomous O&M platform, intelligent optimizer, intelligent index recommendation, and DeepSQL in-database AI algorithms (supporting XGBoost, multiclass, and PCA). + - O&M capabilities: database running metrics in WDRs, diagnosis view for slow SQL statements on the standby node, and automatic eviction of unique SQL statements. + - JDBC client load is balanced and read and write are isolated. + - Cluster management (CM) supports customized resource management and control, and external status query and push. + - Toolchain: development tool DataStudio, MySQL full migration tool, incremental migration tool, reverse migration tool, and data check tool. + - Middleware: ShardingSphere and openLookeng. + - Peripheral ecosystem: dblink, supporting openEuler, CentOS, and FusionOS. + - Others: CMake script compilation, container-based deployment, and Kubernetes. + +- New functions: + - High performance: The performance of basic operators is improved. (For details, see the feature description.) + - High security: user-level audit. + - High availability: CM supports VIP management. + - High availability: CM can be deployed on two nodes. + - High availability: The read-only detection capability of CM disks is enhanced. + - High availability: CM usability is improved. + - High intelligence: Exception detection supports self-configuration. + - Enterprise-level feature: event trigger. + - Enterprise-level feature: openGauss resource pooling architecture is implemented based on storage pooling, memory pooling, and computing pooling (beta feature). + - Application development interface: enhanced JDBC capabilities. + - Middleware: ShardingSphere supports read/write isolation in multiple modes and cross-database query. + - Middleware: 32-node networking performance of openGauss+ShardingSphere > 21 million tpmC + - Toolchain: full-lifecycle data production tool DataKit + - Toolchain: MySQL migration tool gs\_rep\_portal + - Toolchain: MySQL incremental and reverse migration tool gs\_replicate + - Toolchain: gs\_datacheck based on the Merkle tree + - Compatibilities: Compatible with most common MySQL syntax, including data types, operators, system functions, DDL, DML, DCL, and PL/SQL, implementing application migration without modification. - Fixed defects: - - I674AZ: pg\_stat\_replication has race conditions and may cause system breakdown. - - I6736H: The execution results of the agg statement are inconsistent before and after query\_dop is enabled. - - I66TE2: When the Dolphin plug-in is loaded, a deadlock may occur when the database is restarted. - - I66FUD: When enable\_memory\_limit is enabled to perform a parallel test, memory is temporaily unavailable. If no extra operation is performed, the database cannot be stopped and the test cannot be ended. - - I64N8V: Failed to create a stored procedure with the REPLACE INTO statement. - - I648IQ: When **query\_dop** is set to **1**, an error is reported during FULL JOIN query. When **query\_dop** is set to **4**, no error is reported. - - I5MM6P: An error is reported when the database connection is configured through the CLI during parameter tuning and diagnosis. - - I66XL4: The bit\_xor results of the time type are inconsistent in x86 and ARM. - - I66UFT: MySQL is compatible with the partition syntax REORGANIZE. When the partition is reorganized into another type of partition, a core dump occurs in the database. - - I667VC: When a character string is inserted into some columns of the uint type, an error is expected to be reported, but the insertion is successful. - - I64A4T: In the environment with one primary node, one standby node, and one cascaded node, after the **switchover -A** command is executed, not all nodes are switched to standby nodes. - - I5YS5B: When CM is uninstalled using an XML file containing CM, the uninstallation is successful. When gs\_om is used to query the status, a message is displayed indicating that the cm\_ctl command is unavailable. - - I66CXK: When the data at the source and sink ends is inconsistent, the incremental verification result does not contain the repair statement. + - I6NVAB: An error is reported during rollback and forcible rollback after gray upgrade from 3.0.3 to 5.0.0. + - I6NK8U: When a publication/subscription name is changed to an existing name, the error message "ERROR: unsupported object class xxx" is displayed. + - I6N2QD: When ESCAPE is used in SIMILAR TO, if the escape character is Chinese, an error is reported. If the LIKE escape character is Chinese, the operation is successful. + - I6MOCS: In the B-compatible database, if the partition key of a level-2 partitioned table is the year function, an unknown error is reported when pg\_get\_tabledef is used after the ADD PARTITION operation is performed. + - I6LMTU: In B-compatible mode, objects in backquotes are not supported. + - I6KO5S: [Resource pooling] When the upgrade command is executed to upgrade shared storage, the upgrade fails. + - I6KRZ6: [Resource pooling] The **dsscmd du -p +data -f a** command calculates only directories but not files. + - I6IZH9: [Resource Pooling] The reform fails and does not enter the next round. The cluster is suspended. + - I6O0K6: The versions 2.0.1, 2.0.0, and 2.0.5 without the CM tool fail to be committed after being gray upgraded to version 5.0.0 with the CM tool. + - I61OX7: No error is reported when the value of the CM agent parameter **log\_dir** is changed to null. After the CM agent is restarted for the change to take effect, no new CM agent log is generated. + - I6K2BZ: Chameleon migration fails due to double quotation marks. + - I6KIWQ: During Debezium+kafka incremental migration, the timestamp after the migration is incorrect. + - I6I640: When the data check tool is used to check data in 150,000 tables, the check process is suspended. diff --git a/content/en/menu/index.md b/content/en/menu/index.md index 27871b408..c4c567222 100644 --- a/content/en/menu/index.md +++ b/content/en/menu/index.md @@ -10,7 +10,7 @@ headless: true - [Feature Introduction]({{< relref "./docs/ReleaseNotes/features.md" >}}) - [Important Notes]({{< relref "./docs/ReleaseNotes/important-notes.md" >}}) - [Known Issues]({{< relref "./docs/ReleaseNotes/known-issues.md" >}}) - - [Common Vulnerabilities and Exposures]({{< relref "./docs/ReleaseNotes/common-vulnerabilities-and-exposures-(cves).md" >}}) + - [Common Vulnerabilities and Exposures]({{< relref "./docs/ReleaseNotes/common-vulnerabilities-and-exposures-cves.md" >}}) - [Resolved Issues]({{< relref "./docs/ReleaseNotes/resolved-issues.md" >}}) - [Source Code]({{< relref "./docs/ReleaseNotes/source-code.md" >}}) - [Contribution]({{< relref "./docs/ReleaseNotes/contribution.md" >}}) -- Gitee From 262a427ed6b9a7785e8ab19c1d192e05ba123c3a Mon Sep 17 00:00:00 2001 From: freyaqqianjin Date: Tue, 25 Apr 2023 16:04:52 +0800 Subject: [PATCH 2/7] =?UTF-8?q?LITE-AboutopenGauss=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AboutopenGauss/built-in-stack-tool.md | 176 ++++++++++++++++++ .../figures/global-syscache-principle.png | Bin 102716 -> 86691 bytes ...ency-escape-at-the-infrastructure-layer.md | 31 +++ .../en/docs/AboutopenGauss/pl-java.md | 131 +++++++++++++ .../en/docs/AboutopenGauss/sql-patch.md | 117 ++++++++++++ .../AboutopenGauss/workload-management.md | 3 + content/docs-lite/en/menu/index.md | 5 + .../figures/global-syscache-principle.png | Bin 102716 -> 86691 bytes 8 files changed, 463 insertions(+) create mode 100644 content/docs-lite/en/docs/AboutopenGauss/built-in-stack-tool.md create mode 100644 content/docs-lite/en/docs/AboutopenGauss/high-latency-escape-at-the-infrastructure-layer.md create mode 100644 content/docs-lite/en/docs/AboutopenGauss/pl-java.md create mode 100644 content/docs-lite/en/docs/AboutopenGauss/sql-patch.md create mode 100644 content/docs-lite/en/docs/AboutopenGauss/workload-management.md diff --git a/content/docs-lite/en/docs/AboutopenGauss/built-in-stack-tool.md b/content/docs-lite/en/docs/AboutopenGauss/built-in-stack-tool.md new file mode 100644 index 000000000..143572d57 --- /dev/null +++ b/content/docs-lite/en/docs/AboutopenGauss/built-in-stack-tool.md @@ -0,0 +1,176 @@ +# Built-in Stack Tool + +## Availability + +This feature is available since 3.0.0. + +## Introduction + +The stack tool is used to obtain the call stack of each thread in the database. It helps database O&M personnel locate faults such as deadlock and hang. + +## Benefits + +Provides function-level call stack information to improve the efficiency of database kernel O&M personnel in analyzing and locating faults such as deadlock and hang. + +## Description + +You can use the gs\_stack\(\) function or the gs\_ctl stack tool to obtain the call stacks of threads in the database. + +1. gs\_stack\(\) function + - Run **select \* from gs\_stack\(pid\)** to obtain the call stack of a specified thread. + + ``` + openGauss=# select * from gs_stack(139663481165568); + gs_stack + -------------------------------------------------------------------- + __poll + 0x2d + + WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f + + WaitLatch(Latch volatile*, int, long) + 0x2e + + JobScheduleMain() + 0x90f + + int GaussDbThreadMain<(knl_thread_role)9>(knl_thread_arg*) + 0x456+ + InternalThreadFunc(void*) + 0x2d + + ThreadStarterFunc(void*) + 0xa4 + + start_thread + 0xc5 + + clone + 0x6d + + (1 row) + ``` + + - Run **select \* from gs\_stack\(\)** to obtain the call stacks of all threads. + + ``` + openGauss=# select * from gs_stack(); + -[ RECORD 1 ]------------------------------------------------------------------------------------------------------- + tid | 139670364324352 + lwtid | 308 + stack | __poll + 0x2d + | CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34 + | int comm_socket_call(CommWaitPollParam*, int (*)(pollfd*, unsigned long + , int)) + 0x28 + | comm_poll(pollfd*, unsigned long, int) + 0xb1 + | ServerLoop() + 0x72b + | PostmasterMain(int, char**) + 0x314e + | main + 0x617 + | __libc_start_main + 0xf5 + | 0x55d38f8db3a7 + [ RECORD 2 ]------------------------------------------------------------------------------------------------------- + tid | 139664851859200 + lwtid | 520 + stack | __poll + 0x2d + | WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f + | SysLoggerMain(int) + 0xc86 + | int GaussDbThreadMain<(knl_thread_role)17>(knl_thread_arg*) + 0x45d + | InternalThreadFunc(void*) + 0x2d + | ThreadStarterFunc(void*) + 0xa4 + | start_thread + 0xc5 + | clone + 0x6d + ``` + +2. gs\_ctl stack tool + - Run the following command to obtain the call stack of a specified thread: + + ``` + gs_ctl stack -D data_dir -I lwtid + ``` + + In the preceding command, **-D data\_dir** specifies the data directory of the GaussDB process whose call stack needs to be obtained, and **-I lwtid** specifies the lwtid of the target thread. You can run the **ls /proc/pid/task/** command to obtain the lwpid. The following specifies the procedure: + + 1. Obtain the GaussDB process ID and data directory. + + ``` + ps -ux | more + USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND + perfadm 308 9.3 10.1 8719348 1649108 ? Sl May20 58:58 /xxx/bin/gaussdb -u 92617 -D /xxx/openGauss/cluster/data1/dn1 -M pending + ``` + + 2. Obtain the lwtid based on the process ID. The directory name in the **task** directory is the lwtid. + + ``` + ls /proc/308/task/ + 1096 505 522 525 529 532 536 539 542 546 549 552 555 558 561 565 569 575 584 833 923 926 929 932 935 938 + ``` + + 3. Obtain the call stack based on the specified lwtid. + + ``` + gs_ctl stack -D /xxx/openGauss/cluster/data1/dn1 -I 1096 + [2022-05-21 10:52:51.354][24520][][gs_ctl]: gs_stack start: + tid<140409677575616> lwtid<1096> + __poll + 0x2d + CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34 + int comm_socket_call(CommWaitPollParam*, int (*)(pollfd*, unsigned long, int)) + 0x28 + comm_poll(pollfd*, unsigned long, int) + 0xb1 + ServerLoop() + 0x72b + PostmasterMain(int, char**) + 0x329a + main + 0x617 + __libc_start_main + 0xf5 + 0x55cf616e7647 + [2022-05-21 10:52:51.354][24520][][gs_ctl]: gs_stack finished! + ``` + + - Run the following command to obtain the call stacks of all threads: + + ``` + gs_ctl stack -D data_dir + ``` + + In the preceding command, **-D data\_dir** specifies the data directory of the GaussDB process whose call stack needs to be obtained. The following specifies the procedure: + + 1. Obtain the GaussDB process ID and data directory. + + ``` + ps -ux | more + USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND + perfadm 308 9.3 10.1 8719348 1649108 ? Sl May20 58:58 /xxx/bin/gaussdb -u 92617 -D /xxx/openGauss/cluster/data1/dn1 -M pending + ``` + + 2. Obtain the call stacks of all threads. + + ``` + [panhongchang@euler_phy_194 panhongchang]$ gs_ctl stack -D /xxx/openGauss/cluster/data1/dn1 + [2022-05-21 10:59:44.063][34511][][gs_ctl]: gs_stack start: + Thread 0 tid<140409677575616> lwtid<21045> + __poll + 0x2d + CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34 + int comm_socket_call(CommWaitPollParam*, int (*)(pollfd*, unsigned long, int)) + 0x28 + comm_poll(pollfd*, unsigned long, int) + 0xb1 + ServerLoop() + 0x72b + PostmasterMain(int, char**) + 0x329a + main + 0x617 + __libc_start_main + 0xf5 + 0x55cf616e7647 + + Thread 1 tid<140405343516416> lwtid<21060> + __poll + 0x2d + WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f + SysLoggerMain(int) + 0xc86 + int GaussDbThreadMain<(knl_thread_role)17>(knl_thread_arg*) + 0x45d + InternalThreadFunc(void*) + 0x2d + ThreadStarterFunc(void*) + 0xa4 + start_thread + 0xc5 + clone + 0x6d + ``` + + The remaining call stacks are omitted here. + + + + +## Enhancements + +None + +## Constraints + +1. This tool is used only for the GaussDB process. Other processes, such as CMS and GTM, are not supported. +2. If you run SQL statements to execute this tool, ensure that the CN and DN processes are running properly and can be connected to execute SQL statements. +3. If gs\_ctl is used, CN and DN processes must be responsive. +4. Concurrency is not supported. In the scenario where the call stacks of all threads are obtained, the call stacks of threads are not at the same time point. +5. A maximum of 128 call stack layers are supported. If there are more than 128 call stack layers, only the top 128 layers are retained. +6. The symbol table is not tripped. (In the current release, **strip –d** is used, and only the debug information is removed. The symbol table is not tripped. If **strip –s** is used, only the pointer can be displayed, and the symbol name cannot be displayed.) +7. Only the **monadmin** and **sysadmin** users can execute this tool using SQL statements. +8. The call stack can be obtained only after the thread has registered the SIGURG signal. +9. For the code segment that shields the operating system SIGUSR2, the call stack cannot be obtained. If no signal slot has been allocated to the thread, the call stack still cannot be obtained. + +## Dependencies + +None diff --git a/content/docs-lite/en/docs/AboutopenGauss/figures/global-syscache-principle.png b/content/docs-lite/en/docs/AboutopenGauss/figures/global-syscache-principle.png index 62239c90d9c6477b467f29177ac7c6039b05aade..ded222408e1f0d7ef50c09fb55933611a2e17767 100644 GIT binary patch literal 86691 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 z�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 literal 102716 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 + +## Availability + +This feature is available since openGauss 3.0.0. + +## Introduction + +If the infrastructure layer is abnormal, the database SQL execution latency increases. As a result, the memory or thread pool is overloaded. To deal with this scenario, openGauss provides the automatic escape capability. + +## Benefits + +When the SQL execution latency increases, sessions are stacked, and the memory or thread pool is overloaded, the database cannot provide services due to exceptions at the infrastructure layer. In this scenario, escape is possible to recover the database so as to provide services within a short period of time. + +## Description + +- When the database memory is overloaded, sessions are killed instantly and new connections are forbidden till the memory is recovered to provide services. The memory threshold is specified by the **resilience\_memory\_reject\_percent** GUC parameter. By default, this function is disabled. +- When the number of stacked sessions in the database reaches the upper limit of the thread pool, sessions are killed instantly and new connections are forbidden till the number of sessions decreases to the acceptable range of the thread pool. Then, services are recovered. The session threshold is specified by the **resilience\_thread\_reject\_cond** GUC parameter. By default, this function is disabled. + +## Enhancements + +None + +## Constraints + +- When the escape capability is triggered due to memory or thread pool overload, the sessions of users with the **sysadmin** or **monitoradmin** permission are not cleared. +- In upgrade mode, this feature is not triggered. + +## Dependencies + +None diff --git a/content/docs-lite/en/docs/AboutopenGauss/pl-java.md b/content/docs-lite/en/docs/AboutopenGauss/pl-java.md new file mode 100644 index 000000000..c638c9fae --- /dev/null +++ b/content/docs-lite/en/docs/AboutopenGauss/pl-java.md @@ -0,0 +1,131 @@ +# PL/Java + +## Availability + +This feature is available since openGauss 1.0.0. + +## Introduction + +The Java user-defined field \(UDF\) is supported. + +## Benefits + +A development environment is provided for multiple functions. + +## Description + +With the openGauss PL/Java function, you can choose your favorite Java IDE to write Java methods and install the JAR files containing these methods into openGauss before invoking them. openGauss PL/Java is developed based on open-source tada PL/Java 1.5.2. PL/Java uses Huawei JDK V100R001C00SPC190B003-b09. + +## Enhancements + +None + +## Constraints + +- Java UDFs can implement simple Java computing. It is strongly recommended that services not be encapsulated in Java UDFs. +- Do not connect to a database in any way \(for example, JDBC\) in Java functions. +- Use Huawei JDK V100R001C00SPC190B003-b09 to compile Java methods and JAR files. +- Currently, only data types listed in [Table 1](#table10200627143416) are supported. Other data types, such as user-defined data types and complex data types (for example, Java array and its derived types) are not supported. +- Currently, UDAF and UDTF are not supported. + + **Table 1** PL/Java mapping for default data types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

openGauss

+

Java

+

BOOLEAN

+

boolean

+

"char"

+

byte

+

bytea

+

byte[]

+

SMALLINT

+

short

+

INTEGER

+

int

+

BIGINT

+

long

+

FLOAT4

+

float

+

FLOAT8

+

double

+

CHAR

+

java.lang.String

+

VARCHAR

+

java.lang.String

+

TEXT

+

java.lang.String

+

name

+

java.lang.String

+

DATE

+

java.sql.Timestamp

+

TIME

+

java.sql.Time (stored value treated as local time)

+

TIMETZ

+

java.sql.Time

+

TIMESTAMP

+

java.sql.Timestamp

+

TIMESTAMPTZ

+

java.sql.Timestamp

+
+ + +## Dependencies + +PL/Java depends on the Java Development Kit (JDK) environment. Currently, JDK is included in openGauss and installation is not required. If you have installed the same or different versions of JDK, no conflict will occur. openGauss uses Huawei JDK V100R001C00SPC190B003-b09 to run PL/Java. diff --git a/content/docs-lite/en/docs/AboutopenGauss/sql-patch.md b/content/docs-lite/en/docs/AboutopenGauss/sql-patch.md new file mode 100644 index 000000000..532adcb6c --- /dev/null +++ b/content/docs-lite/en/docs/AboutopenGauss/sql-patch.md @@ -0,0 +1,117 @@ +# SQL PATCH + +## Availability + +This feature is available since openGauss 3.0.0. + +## Introduction + +SQL PATCH adjusts the query execution plan without directly modifying users' service statements. If the execution plan or execution mode of a query statement does not meet the expectation, you can create a query patch and use hints to optimize the query plan or handle errors for specific statements by short-circuiting. + +## Benefits + +If performance problems occur due to poor query plans or services are unavailable due to internal system errors, you can invoke O&M functions in the database to optimize specific scenarios or report errors in advance to avoid more serious problems and greatly reduce O&M costs. + +## Description + +SQL PATCH is designed for database administrators (DBAs), O&M personnel, and other roles who need to optimize SQL statements. If performance problems caused by poor plans of service statements are identified through other O&M views or fault locating methods, you can create an SQL patch to optimize service statements based on hints. Currently, the following hints are supported: number of rows, scanning mode, join mode, join sequence, PBE custom/generic plan selection, statement-level parameter setting, and parameterized path. In addition, in case that services are unavailable due to internal system errors that are triggered by specific statements, you can create SQL patches to rectify single-point failures without changing service statements. In this way, errors can be reported in advance to avoid greater loss. + +SQL PATCH is implemented based on the unique SQL ID. Therefore, to use SQL PATCH, related O&M parameters (for details, see [Feature Constraints](#section865112655119)) must be enabled for the SQL patch to take effect. The unique SQL ID can be obtained from both the WDR and slow SQL view. You must specify the unique SQL ID when creating an SQL patch. The following provides a simple example. + +Scenario 1: Use SQL PATCH to optimize specific statements based on hints. + +``` +openGauss=# set track_stmt_stat_level = 'L1,L1'; -- Enable full SQL statistics. +SET +openGauss=# select * from hint_t1 t1 where t1.a = 1; -- Execute the SQL statement. + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) +openGauss=# select unique_query_id, query, query_plan from dbe_perf.statement_history where query like '%hint_t1%'; -- Obtain the query plan and unique SQL ID. +-[ RECORD 1 ]---+---------------------------------------------------------------------------------------------- +unique_query_id | 2578396627 +query | select * from hint_t1 t1 where t1.a = ?; +query_plan | Datanode Name: sgnode + | Bitmap Heap Scan on hint_t1 t1 (cost=4.33..15.70 rows=10 p-time=0 p-rows=0 width=12) + | Recheck Cond: (a = '***') + | -> Bitmap Index Scan on hint_t1_a_idx (cost=0.00..4.33 rows=10 p-time=0 p-rows=0 width=0) + | Index Cond: (a = '***') + | + | +openGauss=# select * from dbe_sql_util.create_hint_sql_patch('patch1', 2578396627, 'indexscan(t1)'); -- Specify a hint patch for the specified unique SQL ID. +-[ RECORD 1 ]---------+-- +create_hint_sql_patch | t +openGauss=# explain select * from hint_t1 t1 where t1.a = 1; -- Check whether the hint takes effect. +NOTICE: Plan influenced by SQL hint patch + QUERY PLAN +----------------------------------------------------------------------------------- + [Bypass] + Index Scan using hint_t1_a_idx on hint_t1 t1 (cost=0.00..32.43 rows=10 width=12) + Index Cond: (a = 1) +(3 rows) +openGauss=# select * from hint_t1 t1 where t1.a = 1; -- Execute the statement again. + a | b | c +---+---+--- + 1 | 1 | 1 +(1 row) +openGauss=# select unique_query_id, query, query_plan from dbe_perf.statement_history where query like '%hint_t1%'; -- The query plan has been changed. +-[ RECORD 1 ]---+-------------------------------------------------------------------------------------------------- +unique_query_id | 2578396627 +query | select * from hint_t1 t1 where t1.a = ?; +query_plan | Datanode Name: sgnode + | Bitmap Heap Scan on hint_t1 t1 (cost=4.33..15.70 rows=10 p-time=0 p-rows=0 width=12) + | Recheck Cond: (a = '***') + | -> Bitmap Index Scan on hint_t1_a_idx (cost=0.00..4.33 rows=10 p-time=0 p-rows=0 width=0) + | Index Cond: (a = '***') + | + | +-[ RECORD 2 ]---+-------------------------------------------------------------------------------------------------- +unique_query_id | 2578396627 +query | select * from hint_t1 t1 where t1.a = ?; +query_plan | Datanode Name: sgnode + | Index Scan using hint_t1_a_idx on hint_t1 t1 (cost=0.00..8.27 rows=1 p-time=0 p-rows=0 width=12) + | Index Cond: (a = '***') + | + | +``` + +Scenario 2: Run the SQL PATCH command to report an error for a specific statement in advance. + +``` +openGauss=# select * from dbe_sql_util.drop_sql_patch('patch1'); -- Delete patch 1. + drop_sql_patch +---------------- + t +(1 row) +openGauss=# select * from dbe_sql_util.create_abort_sql_patch('patch2', 2578396627); -- Create an abort patch for the statement of the unique SQL ID. + create_abort_sql_patch +------------------------ + t +(1 row) + +openGauss=# select * from hint_t1 t1 where t1.a = 1; -- An error is reported in advance when the statement is executed again. +ERROR: Statement 2578396627 canceled by abort patch patch2 +``` + +## Enhancements + +None + +## Constraints + +1. Patches can be created only by unique SQL ID. If unique SQL IDs conflict, SQL patches that are used for hint-based optimization may affect performance but do not affect semantic correctness. +2. Only hints that do not change SQL semantics can be used as patches. SQL rewriting is not supported. +3. This tool is not applicable to logical backup and restoration. +4. The patch validity cannot be verified during patch creation. If the patch hint has syntax or semantic errors, the query execution is not affected. +5. Only the initial user, O&M administrator, monitoring administrator, and system administrator have the permission to perform this operation. +6. Patches are not shared between databases. When creating SQL patches, you need to connect to the target database. +7. In the centralized deployment scenario where the standby node is readable, you must specify the primary node to run the SQL PATCH command to create, modify, or delete functions and the standby node to report errors. +8. There is a delay in synchronizing an SQL patch to the standby node. The patch takes effect after the standby node replays related logs. +9. This function does not take effect for SQL statements in stored procedures because no unique SQL ID is generated for statements in stored procedures. +10. It is not recommended that the abort patch be used in the database for a long time. It should be used only as a workaround. If the database service is unavailable due to a kernel fault triggered by a specific statement, you must rectify the service fault or upgrade the kernel as soon as possible. After the upgrade, the method of generating unique SQL IDs may change. Therefore, the workaround may become invalid. +11. Currently, except DML statements, unique SQL IDs of SQL statements (such as CREATE TABLE) are generated by hashing the statement text. Therefore, SQL PATCH is sensitive to uppercase and lowercase letters, spaces, and line breaks. That is, even statements of different texts are semantically relative, you still need to create different SQL patches for them. For DML operations, SQL PATCH can take effect for the same statement with different input parameters, regardless of uppercase letters, lowercase letters, and spaces. + +## Dependencies + +This feature depends on the real-time resource monitoring function. To use this feature, set the **enable\_resource\_track** parameter to **on** and set **instr\_unique\_sql\_count** to a value greater than 0. For different statements, if the generated unique SQL IDs conflict, the SQL PATCH statement incorrectly hits other statements that are not expected. Compared with hint patches that are used for optimization, abort patches have more side effects and should be used with caution. diff --git a/content/docs-lite/en/docs/AboutopenGauss/workload-management.md b/content/docs-lite/en/docs/AboutopenGauss/workload-management.md new file mode 100644 index 000000000..afb09d748 --- /dev/null +++ b/content/docs-lite/en/docs/AboutopenGauss/workload-management.md @@ -0,0 +1,3 @@ +# Workload Management + +- **[High-Latency Escape at the Infrastructure Layer](high-latency-escape-at-the-infrastructure-layer.md)** diff --git a/content/docs-lite/en/menu/index.md b/content/docs-lite/en/menu/index.md index f875db7c3..752ee646f 100644 --- a/content/docs-lite/en/menu/index.md +++ b/content/docs-lite/en/menu/index.md @@ -55,6 +55,8 @@ headless: true - [Slow SQL Diagnosis]({{< relref "./docs/AboutopenGauss/slow-sql-diagnosis.md" >}}) - [Session Performance Diagnosis]({{< relref "./docs/AboutopenGauss/session-performance-diagnosis.md" >}}) - [System KPI-aided Diagnosis]({{< relref "./docs/AboutopenGauss/system-kpi-aided-diagnosis.md" >}}) + - [Built-in Stack Tool]({{< relref "./docs/AboutopenGauss/built-in-stack-tool.md" >}}) + - [SQL PATCH]({{< relref "./docs/AboutopenGauss/sql-patch.md" >}}) - [Database Security]({{< relref "./docs/AboutopenGauss/database-security.md" >}}) - [Access Control Model]({{< relref "./docs/AboutopenGauss/access-control-model.md" >}}) - [Separation of Control and Access Permissions]({{< relref "./docs/AboutopenGauss/separation-of-control-and-access-permissions.md" >}}) @@ -93,6 +95,7 @@ headless: true - [Standard SQL]({{< relref "./docs/AboutopenGauss/standard-sql.md" >}}) - [Standard Development APIs]({{< relref "./docs/AboutopenGauss/standard-development-apis.md" >}}) - [PostgreSQL API Compatibility]({{< relref "./docs/AboutopenGauss/postgresql-api-compatibility.md" >}}) + - [PL/Java]({{< relref "./docs/AboutopenGauss/pl-java.md" >}}) - [AI Capabilities]({{< relref "./docs/AboutopenGauss/ai-capabilities.md" >}}) - [AI4DB: Autonomous Database O&M]({{< relref "./docs/AboutopenGauss/ai4db-autonomous-database-o-m.md" >}}) - [Database Metric Collection, Forecast, and Exception Detection]({{< relref "./docs/AboutopenGauss/database-metric-collection-forecast-and-exception-detection.md" >}}) @@ -109,6 +112,8 @@ headless: true - [Middleware]({{< relref "./docs/AboutopenGauss/middleware.md" >}}) - [Distributed Database Capability]({{< relref "./docs/AboutopenGauss/distributed-database-capability.md" >}}) - [Deploying a Distributed Database Using Kubernetes]({{< relref "./docs/AboutopenGauss/deploying-a-distributed-database-using-kubernetes.md" >}}) + - [Workload Management]({{< relref "./docs/AboutopenGauss/workload-management.md" >}}) + - [High-Latency Escape at the Infrastructure Layer]({{< relref "./docs/AboutopenGauss/high-latency-escape-at-the-infrastructure-layer.md" >}}) - [Technical White Paper]({{< relref "./docs/TechnicalWhitePaper/Technicalwhitepaper.md" >}}) - [Product Positioning]({{< relref "./docs/TechnicalWhitePaper/product-positioning.md" >}}) diff --git a/content/en/docs/AboutopenGauss/figures/global-syscache-principle.png b/content/en/docs/AboutopenGauss/figures/global-syscache-principle.png index 62239c90d9c6477b467f29177ac7c6039b05aade..ded222408e1f0d7ef50c09fb55933611a2e17767 100644 GIT binary patch literal 86691 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 z�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 literal 102716 zcmZ^~WmsHG(=MC@_uvj8NN|@VcyMecHL>Rtxm z!D|O)i7&4zMoIR7AFyV^a>B1(RYjvb7{UR+k?bTj9bUb{$9(zsdXVNq@YSp50x3~p zRad>kM+6Ygz{*YJ>dC#%$%RkmL7T$dvcu?cX7$ct<}!bpT(jjUA>}rSFf5!{L`Xn#!J0 z0@S{cS{5kwYtgAMS4l*X_?DMj2O2YhociTcScRq3_)As$w_Ci!iklTq|NN2Vbh+%U zf4&o=s}d+x@985InK*(8iE0d>9>UKSd+e0#aBbH!axjxpJ$}U%fKJx(~I-J`}w_5rZzvADVHwuA!z;V+!KN+ zjr?nDOru=jIodOGp>hHLmk9FH!wDY2WPyMpVoS`q0y9y-X=`}Zvw&Sy!>fwNg|#MC z_|5F{A@7IN9Tq#+RXhm4qk6;BPtFQ|gqf`HZq>yB$@m!>Epc)+*s^0#VV9pL4i27_ zc}ahmYvq}zBx&m4j`8^g%HNulA{nAspD2ai1N=}G9a=^XQQXcyQ6ob`lxlJGZ=4`- zCGQEAsu~*`^QD!=ewTs0JUtT<98+TBFVut1A8sA;Dxz~VXMdUuC6H|7=xP+oXMCok z?i2BN#1*cLnigLbWPH!fJyU!D{yI}@(D{bC-}UQkVu?&Lvvla$Z#^F|)&_8Ob@l3? zBB-Cp!3%YyNp`$y!O4VOtly%t{e21qtiVF_tB6_G>l+PYY*DSI<6&qVeNIc%RjIbW z!p^;5QW2BI`e0X5L*jc61%zg6Pc5R6CQyGx=CF;IR4fV(o{kC@*1b!x(Q}2O3Hrx+ z#V7P%GQHy-VtkD?F1i9HfHYFg;CqFIXlm`+p8qUi^nG1^gYM^*JJW8CHjEGssua30Wy&N-qI zRU^V6D0E*hf3REkejS8v==5r);$v9t5XRZ%cB0{&3%T7@diM@jfNj!DynAL*?ZIIF za#b`si_qNQNJG3{#H7@xk3?rNJBw(f0i?k&G4>`rbrrndA2sw0=3-vY)osx}j0y&? z`qH+g!yjGY<5yQ(Ewj4!6ZsW`(Zs5mRSv^|DUHK)tFG@DYQY>F9REN2QY={qqswa1 z?=30#cp1;Cudi07E|+2(vOiPKFw9e!qW=>SCo!=|`e-g9BBGuhe&OIgrmL$f;5Mi@ z*Qr<*7jJO3+(}rCbjZ2)IIvW_oW4qFlm;;TP)>{q6AtIt5<`F%7 zC6-VLU$tuN)SJtDy*F9ZeL3R?e55-hCu|0RjqW)W|mv(;>c?vPp**uzKYz<(S!@09jlgjfRXNO!*FI+M*W?)WKrMAXi=U#l5 zv7oWt?m5n!Ppj29Qa|Rvl$8$VsK+1&yT687S1vDJ zuiFIO7>7xpoz}HWUtYfP@Nv7;0Goim*A@1{r9*-;l6_EUaZQx&b{n2I1C5k~%b9eP zVZgBYYre$~1vNIltTD53Gb?eEg+?oLCJlAYtnwfBovk15oUV1UkMj!$>pL~H`WNIe zd@qcB^7AEw_r=%Od&8x}es?f0urj)9=)|smC=YEh`V;AR7q5N#bW*cP{V$aSTp60_E4@#^j0^3eN~Y(&fV&cef)1d%f&}19nH^cBS(GRa8As9BaWRp5v@@vDLHSwU1WF`q9^` zit+S*otWBp7#{E~J)_IbP~#nW)RP7L)$8-^v3l#(7T@F#d2g%C&*AK@Tb9!hBx3H* z*|RFY_OrKRZE2U$`;GIe_cUysPnwf=#e{Gr5&Wa(yVF%XHcN`iCsD$Nv=DGDuuN4U zxLd^Uoj2(QHT>!Q^hnDh+k8NxV!TOW5ZcwZY@)XoiZ3RbYlCt(H;nn2!hG~7g6^6s zomL;M6ftq3%4vTJbNir-!)z4s0!>M*UB#sIJwYuPE$}ETvQZ$&RJYLeRI|B4_T>-Y z69CsT?Q)8O2?786bQg5g#GaZ9$fA!47$G5`tNL`+f=e0492_#*>v;I?x;(T|^GIyv zqD7jT>R1W$68(PCaios!by;uC2q&w(t7)P!8xYK2e$z_l>;_i9F-yA@7kr1Y_VqnB zxu*4}yyVjb7xLJ_--SP%%w4R?$cDb@mu?rRkrD9O!~d9L>>#SQnPbl({xN+Lsnq^V z%plIw6DMOu5)n68on!aOt>{)15NgW_vb=C%aHBFvX$g%r-1KN)*X(;FlN(j53|O9YZ~2|`p$82sR4-Ny<2LKUOL8z1HR5tJ+ad>(is`pF zR|t#&BgK)${2d4!(dk{Klppfr-oP@fN(5Zrp{W%(TkTbah_b`yUa9vu41V$O3JpDp z4zQtJIN(vmZR9Uh{+uM`$eLXydN3(j(^A2HeJ33*mbz=ZTPA%38g~_?nk;@_-wz|^PNJ6uHq{| zPDM%m5TwyTduq&gcd}J8caFG}g8FUaI;s_wj$(5qhk;p>mOPyk$B|nR?1+enu4a-v zapnaK@M82%7F*I9sK=_#{lq2q`3%oo-Vd(87d$*ZuA(E>+HXlyYxvY4r0oCB@sBGL zTsYw1KI}9+x=LHOWxdpF7v3pZ$Y}aH{{E#`yHJsQMuN`cxL#J3l$4a4*<;~fVpOjg zTg4(WLGOnnA;rF3)g#}6i1Ct_c_1pav$kRFoxjZ<#gC@cj_Z_de(DrM|3<~RhPU+c zhs})^(Xrj%CgeQAfr_s8=imYfixQMmdq?1DOO*LO=2J-r-2<=UHcLWXS4n2B{@rrL znQ6m$%eWtfv18sh_wE+w{faF~R?@bA#t-)(1$d9a=r000&oJ5u80yOGE6yW{ICi3} zHfpH{EC~L*Y8>*4Qu&48-zmKWA6<#+P6T|<{Ew>KtTa&1K!Y+T7tg+v6Zj2h;`{6P z)Rj$BWG<3XQ?fWaOPwjyMQeQC7~FTqLVw~$Kqus|2s_yeVAW z%rQt11~e|>@}ggljjjbbGJl#MjoLA%wS3$%^pl?^KVmV6SgyRjix>(1JPrCoRVN@1->8@DxLm04o`2Wlb$o0v7^QibeM5Pk%b4kZL7u`Hh$iLm zbBtqeafSu$f_}%3-oB4GTmQ-ppTP>qfnj9G{J#Vtm?{azAospUxW74xuF!2xqPtGX zrq$Pe8Gf}nfNkjQHaINXKV7Dgn1q1ruyrw$06RZe!&a<9SgF_QzN4H}5U%?XANVpL z;KSZdE{dtXf7@a$z)S`T6(Qa+$n(Npc`7P=>?>LzSSk_iE%_A-5dgm4mr1*hmTpog z!vdb(9y?V4WL#uw@=LJh12y$o3EMAkg4g|Z4r{E;ui_U8ys7l@>gQ~W<`4V-x_;`0 zRh2GklTzsRojz`Gvnr1R6HJoKP(DUFUb@U{46voIckvk)6dK)Z;z3D=nSZ22@s!XZ z>ai)Oa*+KXZeu7=nN(4R+HS$}A+wbygOHot_bYU%yQei^&s90H54z=Z5yjOrOG}v#2 z$!pbF5k6PXWt-HdClC%AYyzxx*pEVs=PE#u4P(to~67JS;X)~Z&k z?pNODNxkGg39o$W)sJ|-HOm55_bc{D5w{gav_3Jc24rYzp(+7e=<4{I>9b=;VcLZF z+WPlG-8)H3DG?BeRzHioOTK)q#!n&3``vnN78TEnvZ^Uf->;)&(<1A8O`zi6+`Yd# zCwWSl;S8oJ)-NK{liB0Oo&k$}MSkYZ@|wlEfFWC-v{*hp%zgN-ey`+k+XRA1(rd4( zHSC5rd^rf>#AHIvD)TDTmE<}>GB>xL-tKRkT{EJ}d0hj~|XHz97M zT}?5Hr5}7*ooxAOvJ2n*<~g@g+Gml8MCpSm@5ei&i)k7>OkgoB9`CNY9x$XdB4$eZ z<{mA4UW54@A*}-7?#$?Ey>_}Mc#*6t;;9nO&oTpda%VgQcaW^lY6_4h6)u;U_M@q# z4Sd|}Tv2k701UvXY4L=ri5xzMx$7T z=^tB|M1~h+{CQ8hz|lfd67d>!r=w1Ov{--AdPPjH z3z&`C;3Yblrj-UAG7K_4SKC(H+c=Z8jg5=Z&ykVA!Tr1dL~1fRm!A%F*7cyHW3vi? zP8{Gm?b{wnbezfXXU3^Ef0`XZI{S1B<{L8wY@#r zPp9rr#HVXj>U##bENt5eHO|kgIz3qNbjNzqX2*X?47m0dRQ&?cR>L6zY_Ii}wbO zK^TOH1Hl^%K*CN)*fa3=c)RcGH~l5Ypxj*%szuubYgsOU{mnX$_@{DQ3~4Kh95IjY z{Tl4tTunF2>a2M4Hd-QeuOhS*1z8;>FuitPxYHsBiuuL;=2(~F>S$3TML!9Z&^d`! z00#nVNC8aA#Y2soqoS>`X5;Wd#JLKb*F`0%$>-I^{VZ0z|ON#N=5 zgqD6#V)a_?^j4$xyPu0-_tY~Bd7e;=EixOY3Yt}$kR>5k2^6YWQgD`SP^)-Vc0+C3 z-R@=N|AI^Je4a4E^s;&;*JbJ6ZJcEZK8FcSNt@$6wIy+EBUM4Xy*3^Tcknm zr0LLU7gUnxi`tqMDxD#p&=3-XvvUJO-N>A8qLSnCgHad2K+89R)h zZzs{QT0$+_=R-t)(xmz!!!eNGoL?(vdP6O-l3Xf=CYyl$FO_D8Gj*AnupN3I3lT2- z?w2Ua?koEmV`lKrmdvfS;6lRHwh*|*zFW}<3=VVxv-dIZMfeumpx`koN>8JB^oA54 zFYHegg#WB*!ko?+z){tLhGiRYp(-uYf*A0XmQ!VYHT@Hp-{w3{e2JXGg5)-_l~9Ak zoT?KHaHn;(lU`alQs1Z{SdK|aKn)k(8NWlxz!dydBmhX*pw$4>Z*M{*-)@O9kyo8gSlurgZH z2@|$<9;pxLQENlYh7~7#Ix(ePqmG;+zwVf_5Q?Ugw-`<*Zp@6Sta@79&QTNzbDPZl zYWoAa=YB0R6YI5Z)`e?vr6ix#SyI>PCTkW?_J*2`WN={YxFUb$rAExqZp_=tkB3_G zlF})!?9z;|U3jwH)#|+3@n^|T*9lNK`A)cTztM;MVQGGSP;e-P*M)|RG^J-U+h2NfvQ4DCP*pTX+RNOwx+u)Y!@_|qC<)&f>@@>uV$Y5Yz-(uMmQ zaz$5@*eN}SZ$0DaA~d5NeF%-e_}Jg1VvOYuRid%|w)tdJLGIV4_xijEnSqWW?S^nK2;->UEkAkDTh~w?f2#5nc+^4D5tBbx>#$50WG6F zHoV4^uEZDcNXRqnfEtjhQG+5QHT`QL8jTB!i(r8JbGO_X&3K>=&t=!`btVARp$Zd6 zG;3T9;thaCyrjKSQeJ1o15-1z4?24Kx3{-vcVUB<(@jnX0Zy~(06q-J;u1ZK1W=5Z znmRcv;Rdx;fszT7h`!DY95OidPQCr~)Xp$#4}b;=xWLJUp6VjWmK`I#H9P!dlB&@b^pC zCHY@He<~_MS{`BPqHRuBsVeDMTE@Hy`-`l;LwC*G8me5-6*%U!DsJy(o|ARNqY-0# zw0WK0e}5h&diyRqmYC#QsDd0RBqt}Q3wWXKw6Qz|eKjYW8SYlv7j=AyNh_Sbz8NX> zE+~#(uGjXt$>+HZYSV{>@=8fyz|ko9BG*&p7f$p*DnCf<s;RlV7_wAYVj0XPj=7H@_=#97a6dYXOdGDz6W6Ny~ z>k%9Js0oHE&e>4*GGEl`!#SWy*#BX1O{z?W@Tg5v6`?%3 z8tl?y$}_!}*zKVPLW85tfUT;KIzfz=_~7)C5LgqW27OX*Cu@q-34$qG{^qH!@u0VX zKUJn7L&qh!`pGK(sXcW6sL1GRavxtM?EzO7R^iUw)q(WjM_4#GI=abkdvTr;r2gsC zvMKwxD5CQO9u2tHvSlSw($dPxI1p3+3V02HzBVF=CA5i5D(Oi<VlOg3w<|l?NP(=Ewvb zJVrXjRI=qZzigEcXQ!Icig1Ed-~vQh;zp)#6)C4 z4dh4G3zD@`-9JhyT*+LNrQ7>bt7AWUeI{u_MbZPd{3YDr!ta=`lxX_Wc~>Dis&x|X zb8gOt#R^uSZF{t)`r&iS6S1d5EUePJetx_~+kv)n-2QasFpSaaJ6$mWA7hVx8{+?b zMa#&S7&2p17Q>Q(beZn_iYu+we*;P(Ir#d}GwR|B9}g!_tWxanX1FQzevJe2?Zj^m z+o6j0BUUTFLay7aTk&lryr*VR0i2a)DW_RtdW*I`xp7-l-(uwsiJ(q|U<4umBG}cE zoJ2+MYmKeA_MzOHFqM<+XbhBf{0;T`e<_D?V!lOt=NRB zvUeuVN39`vo6KOiCyW(uJrDkZNjFBn#F`+!Iuj{L(^GkYu=86!6xAn921Om6bkSCXe=I93$|OHt7PR()$D*7~=Jnm@R$=H3kh zX7@FQIzB!=ppl+Hic}Se5mc*xR1vF%?l0!Vku;Y<_hM?{N@-WIoB%Ls*hXiJ>Wu0cP<)mA(+4&0B{28{pjxB zq^|1u(@I_#WD>ClE!>1Fm|BFNLz(?cJkN(jZEM)+v@C(0Lh zV6}k_2t6kcN&qb78#Qrm%7mRUVq{hukq$QITMD-0g$X zQ0x!L2c};a6Y(sA2jV}V3|%G$2M0rs7mOBzcB_LzTC+71Dk}%~VQ5qgW(-Vh1mFBpj@D}29#NyhD>vG`aPKxeh6v>-VIxH9iz0njqKpoa1ZNB)%~ zD#;Rg|9cs--zE)_F1;yAlZlO3&QT7%JxDf#I=8z-5dBX_Kn7#uOvWREcorX<#zxIv z+NQ%GSW!b++UED}R4dEzp?3HgxS#eDbvnz&0JG9^jeo7&eWCQe*BAVTuIX(RM~iud zf!M~kP=pUfHyvB?9&g#x(7rq}xA6<~eJt^k`Q<;>rD8|$8)HRAgWipu5Xo11UzeT| z#PFF)>&)R1z5@FN9j5Su<~^ikWOzZAH_rW4mZ2%!-Qi;%vR7T9solSiX31Ie%P~yl z&brcJc&Z@xJ33FvkYGE zQfy04uIFL5L#r+tSOphy`mBjDFK`}&pZ13m_*|m<&B(4frA(LeTlida&|F#tbA152 zL8J7Y$h;(6g?VknoF>s{D$oRi`_tvVE}P>x>$(RXx8ALv`NJ|^5c*z(>#T9-!|7MJ z9XbCkpXP)#bodbfz=lKLtuE&adEb^V)d{E0f*vj)6N5$N!7*HV#$fgugD1)?sZPG%D=WZfx% zCXEDEbXv%Z0{Yf%ptM|TLKoZ#fW0aM6R=2iR$BxdoFyUPZ=*`FAbow1PWQt(wkN;E zi5GXkRszR0dn6L_kCL_mv4Cu0aXY<#qUcXYO%v$PH3}&z%lPS5*;KzoZs+_A;B)Uk z&L>Gv#3I~tan(~=_%yKX@7DBQ5vu+ksFo3ScW>&PNH&!tqNm%i+ZiP_e3TA%DkL)K zq%S3pZ>!m#$WoZq=N_?3Ux2@N{|7H=?2d{{EpvRYTnVCG+So>V&eyeGmVy9Rh zoR%|+${gtv-X7RF?zEut1hb;qKiF-1qaV4O6T(m22_5RZgX3#Qa~~jea=Zh)JJ;Ge^gU`__Y`A^jR0 zRNjt2!I)WJHxf{p@9F6|&43LxmSe{?ZQHutYQn`VjhO_y<{s4Xaj z96#UbYYj=!zkwgV41O-f{Ch9xBNXeLnk%2>8KfZaL{J7po_nA#(ElOJ^G*MrWlZup z3Axt;CJp1qyA`wVjEsEx4|;7<1wF52@Fgemr;E$A>(B29v8#btNhVH!kqU18sLZ{( z;yv0t0lN>+lbXY;&kqL-f6Iv@jm<+JDGcov?O>uVV5)50c_L1Kz#EHFirvjAuCj8T zoJ0wFE#fT;JSJ4ucNeYZt!n6Zd;LUcl3fUD%6g=E<_{HqzC%SJ<)yq@!TgJG*xNYF z_h7++_xyCt^Kt441HIf%)G)`~xh*g-@K?;f;=?7hrkbv!bP^+mc|>7vomoc@O{>9< z!j=d8rPIQfK2FDaBC3qGp%La&14H0G2Z;x==Y=4b;YIXV{`Zy;1dK1Pit>V|-w_UG zpRY=${_K2fe*1NzhSc_%DL6CxPQOj8zWp(B%tx&m#oe3POE33$wY_`4Q}EQW7M}lX zo~M1IBSPHO(HV2>qB%1FH#zL=vA$O6MsPY7&xHgo@hv2#4R=wgHEHvsL6DsrSBPKY zr8?1h!G_KVg<&iXBT-GV;U@mzEOi)i=EhK#bU;g0qpDw$!w}_pFv((cg3pGw;w}g%!sOn2ec^H@sGFuV&0b3+F^R62H z;IOXt)^PyWErx0Jk1N$h!c#~aRj4sqZnpu}z!zhu&L3%MGVe7DXhBj`D472-7EJ~t z0|Raf78Lyax*$P^WeMFMTSLk18ay%-0s>F1O_oCmH?u_XhTTC(2V=%R4X)14);J1{ zuJ)$^r!K0m%#?r&5fc*|#M(BQE>$}LH~<5M!i0+Ex;Z(xr0?>yCxX+Q{h$MlQBeCFo$$zie7y^iTCI!0CwzRn6BEt;1%O$hN~brxEWvn zQNiO`cpC%m;Az(?9XVma<~K4m!pE-6RF5G`V|@^VT-L8@BIP+&-idn2=(s}LtRG%7 z*Zy__8Mw?CWTOqtCGwGN6VFYgZTrL!a~_`4y^Nh(*HM)S?Lk#j>zgNn>R;qei_Ns3 zl(l8F+HRsQpHWEKZ=R+fHg3+}Vq%sK4~W{*-Fj*&LM?tFZp7<9DHDT9>Mw#3;A>n0 zeCSzCf4>_}<;UPjkU-XQ{u+KMV+r+CW{H4W4_xSI$%z~Gi9{UE5IJ8pQ{LV=b6W66 zC*yAM1!_M#f1NX?$;!e?iuNAClg>B{x3Szha}vaX(D~{K38OzsCbN^G3!eBL7E<9Ri!>4~rJD_7eGwLGP>vcwR6Zu0tj z9^qCk-cj%kBa>{ijm+V5w0P@^&EJBu76*DB5Xa{C((Bn(Hq*b{1xF-yIt$~CXe1qr z$Dfg7@oQm3baryzap9qpYIT%X)^NxeXUVyjic*dOXfFEXa&Q3(WeX*>>O+QDy*dFO7-ohvJ@}I7odBrEN7d~&c z5o@RQ1h*ltN0OzN=xlf4nGP+`@Nu-7dBaoiDBk@90OB!CK9GKfok->Q%A5~=3X|8f z=r50+-Tv)Ojz zW}X=E5V)1F&3%hFLY-i9@Zj{z$FR{O3K7ebI5#0EDJki?Gk=EP{oM6hVk7L^XJ+iY zp!tiI-guhRy;Dp|YM(gWaO?ie(QCw(TdbiX8DVC&C8hnZneG8wISNplCv*Wb!6m7? zb^-=;lC=vF8tdM+?GD{sN0a+$@`^xx?#+i;@{Z2QhlnlI zyW9@v@I&$zxn&#z=Lj&niw?TxaR~Mg19{Hy^QVY$iavCFOKEAl%@aS}6M1@8iEzFV z{~Pvgj?)L<=sIF2?-R5gKVAh^!sC`B;)6nFi-wDJRT}c3QOcB!mEfs(oPVDGr4N?Q zk!F^Rweu+fvsK)}!ITxgJK#Ayrxs))!$%t^9jyVV#wm+u2(oWn@xaIq~%T|kZlF#(+Q=h83GFm!(w9fKmQ zJ1}6XhKD^BEY_|LX1nf6wh-=LQZj&zTszz7KLNPw!@@T*9pmFlAfG~dY)G^75xXP+ z`Y^XOL=P>X#omk{m*XY6hlq;Lc7MKi9?Z440bw+U_+sKr6}bPUc5}H?wF!s@J1xH6 zC(N{Y-AA;Ie%t5+EUqfG-?U@8&!>xr zl37qLnB)%4h?Uw(R15sLOv}pR-Z107e){kxUlo~|OmOt#;SuI-)dUPW>E;d*SOq!e z?>nLoQKVZJzNr(RD^|XocN6e6IAO0P+k&lb#9Jcx8*rV^;1x0&38HUf30;#YnaJ(K zcGz}VL3pI_2Or8%)SbU7YY{m&4`S%Kq|Kr4n>2Lms&^o7o)v&B4Y=Y6n$y!us1&aQm*=mTNm{#s zlEVxJ4Qi>X@&GEg#8c@%i|m|2HK>tiv(!K_T+dmxS||3O_4fE#P&3s9tXkm9#6grm zpE*P5%i`*JydUIA1hOyy*3|@jZ>V1_7MlrFD{hXWnKnzcZf-Z?@G^&!Mei3r%T@2; z4y2%+_8zm%a<&4#1juji0!baHtVWfguJr5(2+Pa1mY#+Npo+~)hcia=(q_M1?W;+h zhx}OR5g1YxuZ8`ojFp&R15kb^OO4(BT`5L_;hg3ZuoM&&UG`id%Qyg^k_S+uA6}#{ z3I??0_aS%u3t@cRy=C}Kh8C8X#} zWDx^Oi^(gC^-{>1u9jeHZWMAJN$1S84iq<^9=0LH*4u6vNAZE&2z;(}ZH$g_2v(Ka_ZsQvN1+;nAt|>kHo1y!NQQZ% zB8s$)Wg0sI6M9s_qYtmt2_Zm40-TE+0(YeV+Rofc__Q#UB1c}xJAvVBVgCdiLs}e2 zfE2*AlHow!?6S_e7MmzKSbq0Ydj(f^W}xvAX+x-!{@uIp{P)stfmmd^%ix4zWO$(e zBA<#%YLHp6Vyi5K+~I;ZqDSoH!Q2&VIfiK`@H*|y3B62lu#bjqprPEs znfB$Tffv0LKc&L{;Fc5kbaUR^N+3A|vh;>=*#&_Cqt~b{)$eLB@y1pVf~bxQF*hHO zmiCr3@bM&~S*TF8AC`$yt=Fpvw>v7~Tj-^r1KsF&hN6Agst+#{WT=p z+ayERfZv$dZnhFfJ1m9JOu8m#K|d;!)|XN-4Px%I3ESKXvfmyi^d`{1DBV?JcOsp8YEx_hDFK19Hf!V`2Q?hL+!-7;-oOC*yEg{D8%&($!}%Av7wTfI|E#f;LSmo+iiR=2$#A zI2a*Q(5K=7mk@|fi>Y=?h+iY1lPCge_uCM9#wrcP!@)U4sGFzc>r)pMg#}`ivFDT! zfX}>GggF69!A*J=03u%;fax;8Idwn%LC&=__GjVb_c&WVnfk)QkFWk4sW5u~FL$)gxeZ_dKz@JE-~O8}H+hQ{CmH zzk6w)?G~|vd0Fi3%n6l0uwDs|husrW^G9 zkNwZHB#k!;eCK2M_hCl>qXx-myltXRv=r?=s zY#ysn2wHF1;hRtTB%Y6ff`h$~rA>#g<8|1TJHs$MXYr!iKM+!o5i5?bm zbfm>fB=r>|g-@mgoHfp%hduIP)QY#4MBd*mCfL939j3!tEkex7HiKX-TYHkoVusg< zsJ!7Dn4NqlBB~!jgkvyfVDL%PVEPkO2~k>x3F^`pwr_@7RraUg0tBU@Z_l27dN6B= zTK<0d5Zn-h)&N28y~G~>TeI?&4#aCPf=Jw!ez0J7`S2*ABTFY#`Pu<$q3n{bKj4SE zt98JTuFK5=cLiGRTZ zAC*uACCbc%Q?2L=I(d7bKmPm6zyNig?Y_SzhQFA;YT9KPZ(;%>cOld7!a&k23sqJ!~gh7IefrQS%o3@j!A;Eao^F-fvO#w>%REyu6J5obV zHd-R=!!7kEk5i}w$~vIa(cd{g#-KSLFOWA|zvRUA3yc{Iwd>Y%nlw4?O)S<>hm$UZ zpUV{lqTru9Pxa;cG+}y4S?gt__Z5wLS+PNv-!UGnl33P}ch-?M#{|me>&NxiXH4Y) z7hi6=LdeiVWaHC|M{ruA+JmJYn>w%K$yp2Z8K!I*Fm6+y9*|ms=ekyh@U&+j!W+lf zh8x(S$MR+0r5OB>SXqh>`OxzBGI$}6t-lTC$LwxMfAl8ip{TUEv}(oz;3&YG9`beJEHt}RvSz7%OZ}NeuQESB z-{q+i>Zc}A0%S1$1K$9y901P=i)oTLkk28@RIB+?*oX7g5}*or0J62o*0v@V&|^ZZ zM4Vk*cqIS1^r0d8Qtz-TDK?}bY9$L&@)qlX*JaS<0oUl7KR(@`yj;*?UP*i*Qa+Ir zM{8VadTs6P(E+!e82^f1nU!Jz@O;h^Mf3{nLSEtvTp(+Gp=>B9)&R;TT=#o5EO6y6 z;L7Z0lYz;H$ASX9IpTJ)E3ja5u`h6IsO`V$op91t&>H}jUzxoi@_$oGiqNFj{|{l4 zvv1(_&9Nm8D>mXVxQK1xcG+ZtEM54DW&ckgdu8NC!x>_vhA9r;;pJ=$W>|)RNMJFmldM798NA@Vi@bc`ld`!S2XjmA4?IQ7e;2yC#G8<{_xE_75=~M6ZoBFA=J`Dh-%l&n40ImKM79+@TWWn zjJ-xm#?SFU@%T7n8>p|%+#M~qg~q`G0JQnqpqJ66*WUk{B zGWpypfxuI6Sv5guj9WQRH&(fEZr>9RKs@rA^i1|Y{x>q`ql$}YN|lwiw|LW!^h?jgrB}JXApD1$4EMkjdCN};S`2% zll@Amb8+pHCxO1Rlp}n4zig+NIl`y>V*+CVq^{f&%2V3k#F-VN6IgI50^P)B>njGG zhi9~stuSMIdO&g)&*tPu7@EJf;e6?ar!MNU9~Ul1tJ$9^KSKg8W7=HjkSH<`(znbL2P0e(wPIc^IQlJjyjI?0kWJf$6CK$pb0FeJvh=ex z_&LkT7r)Kl+VYlN*nZ|vrJ>p5O`(EbUose=4}ffxsL>|3YlOY%-LjCYt6R34zx>3g z?Q0ixd7C#$!}h{P-&?>WO?D_zGQ2GmDBSOb*c&>WrblFg9FXyl^hs&n(yE^@)U+}E5w#5Zk zW@W`@d=Ae^vW^~IIP$yC`E8S1Mi*-|_1rh=P?qQQb3Iqt3n38?a!$gZWbLz%24WTH zekU0@_xr4ro%*dDa)vPZP785ICv`5PFoWs9{)eJnoCqSWurXq3x6aQV*H)^))l*I7 z?U{0IX=y>odyw4A!DrQg5~ZE{Iqgjp0QVJwf98M724E7h`lJ%BpPD0q6%gV4Lz2*f zuDXG+OixKk>%X{>w(0+y8(Go%FKz^|fryG+?@H6eExtD@?75c|90|ZWWKKA-Fv)x; zH3{7xeKF0VKLN8DCyDnSS^Yn}_26igB$ee z31l-ryI&Un6u)3|+E+DP7B%v9&l5L1?rj-DsUs((C2oV9yJT83|q({OGI zn1HFb!0O>F-|V#3p*FXkq1SX~n3FPZ~2p|W?d2i0HAC6tHZf6@tAJTRMU1=M&*zz|W$?NAnAY-JZkJaxkyal@de>DASdW*RBmUG<#@KnH%aiE(uTd5neLGp( zoq@2R!^2*Tc_At-r(7b<R+c04ja!WM^CH5_$ILO%M^Jc;YGRL-cf?6<@Go})7LzA- z%6^o-lo;CsB})LOU?{kD4~ZJAnTqA?EA_9AR3*cvrU5hz(g6*Y$6j2cA;xU@eqWDX zwiOc8EL;rGOn}LJyV%|4NUpXwmM4$Oy~NsK!Xn z(Ef7_MS)DRX2}0Y9ck4;HmQyJUU-?lXcNKFc*&VU293Fc50T-T{?lV)(IDUhE%x2#o8dB?OPMUny-swz#RqQNb&>e$?LBZZa6HH_<&@z#Q%tg z+J=)J?`Jt{yRJ9P6hW|pKWn?vmjf3y=i^9hMRU8h-M!-qbzxY+S^hqhqv86BODY}XX6Y+-^Q^bH&Q)1nI| zvsK>qk*s&#rJ!o;T(hoIYzf3T6j;2PC^}@NKmCI?8|lS1Kw!BvTrT#0`XOjvnJMHy z#+O3ectI!sw9l7vk}c${M(_eR8`<#e%aseht$Et{-$Vjv*pN3~Oa}y7pP^7Ja|;Vv zetyj^#)lbv|NV@Jy3=JNe+qd7iys}LkO|tO{61OFPRiYw{=o{!`%U43MS8&^^?#ek z&RAf~4_nH>Ed+gz#dpVidR5t0m~b{UW}O`S*p5m9*8oNJt<9e5m-w{~9P;KP997aN zd2w0XAlCoBoDKr%q5i)QHW@ctg;=4(5?p_rK2QH*WrPqf38} zES+ZP5}vjNf#}#88u1Z;F&4{4EhQx-**7r29K)tPO+cjJi6$#jB>UaLuRYHUu%WZA^W_Un@UjOnQ7Ne(Q-)C z%pb-9pUCPo2#@6@U6wgtt52AY-wk;Mm3T03X1&v?Hu@vR(mqdu&>=`i>xW&o;_S$a zCqc{C&spO_UP$>tCC>c6HEEwWx(3s14jcCx`r*pTUUYhR;}v}nJY0?MOALhY#;Q0x@%-l3*EBHQ(&uw;pW0na@EksnSx)A%mgy%Zhv6$(Ql?nQx^)#A% zwk8?WsC@m-ntSq_3y?%YdZyfIBFPe7sp7c&O?dx<>62KI09GjWS-i#x!MpzBpd} zZsOA2`vT^;RJVbpY6I04xr(UuCJINKv`hIGuZlUsxb9kNW(J1tOcv-waTL4=!bBH* zf*179+6(MstCf^ouZ}gh6R?sd%FogCeJ)YCh=_meN!_6hVBZRVJSI7{heiI*KY1SJ zLh^d=h^&f5gyYT^?J&vJ)S0%3+W7NsMa03GpI^9YU?t7R{HLN=vn;7Y-91i_n^W6@ zT3W_Z*wU4w?XtccO5Vgd8ti5ja=kj@w|F(J5^eHMZ><~ZYKVbju3!>QZab_#c}nuo zYJG@gOM?1$X*lnc8{csDd&>gNnyRA)qQYfB8BjsSo*YD?2epgSvQh23@chH_+xwL;ux{WO*Tyopz^S)Vy?RRiDd^%e@Vu|m6 zpdS6j^6p%0E!CSTm6C{tS%k>`uXlvh%~I6Ha<$H-*sqQAuH0C-Pf%1=jn7OS<;z`u zB~{spMsLKC6wnS`Z$`l~t^!i8-#a-Qb6JYa{E70reJXjELn?T=5OeFxWO-~8D&>9c z?xF1ZV$Mx7yD=3T7E^ezE_I8?iT+Wk;(PdQtUuQmj(F$^tK?0O``fOnhbCHgD+A}( zJ@Hj3i3W&l=aanGHeLy9f=*--Wc~E=e>}JE7YO@Mw`=H~W^!(9G!T>G47?p2yic+^ zi)s)+tq5bSE>OKJCNVFteEtT4{qW)Qe;6SrY@JHY>8WDQr@k5Ah`6Qc^a4ncP~_NoA~=1lHp%cL|n1)NfK0{+n0%WG!VuZ z1%@qx%x*H^ zq!0<84t}Uii7M}gkPiQAJctGAt7ruV{4TyW8i)X@c>x1{sClYcH2nMh|D4FttqbPg z-(WEZ)(z~x4u5@tmtZtbEnbi0sN^3Wo}Lm_sC$|Xz$nE%aE*P*JwJY=8#e(#%yQEP`d#>QWdsc16|H8kZ0nPz2W z(a_SqnC!0!qoi@$9G2CiH)T;(Rc&$OQo{=8)4^ufDOmh%dUSHK`a4Rq*0S$=yGcwt zl$%q93QLu^Q}-kgI_A`=%TCRwbE2LNEzf(7$fGtd2$n|ZUqr+6aQJlCgP__{ox0c| z(DFlCh&DK=(+N=MnAFt5ub^Y__3BPBx~q%DF`mvyklJFhzbPU>-e0F~1SxZDRwRsUd;}07z5=B}co4QYtlknr=<1!Mzi*cHwhFdfoOJX#K z^dF5**{AIv>$WVI=n*-l8Mc&>O6u0x;pM36{itiyl)jHrL9H>&*cMXQ47E;s=$&Q$ z?S*Q$gyCr2hf)ftbwT)gf1AtR)U|-k=V}~h6`r@pQOPl!_=V5d*>-y5B0IJe8 z#6x|GfaaXSYhojWcT|`Dv~$Mj9kgWb!sP4YGKDHSd-v@di)1_Dhwz4k`ay$X%MZ zEyUJe(s_Q*k8&<;>_be(7|jH#8(k#f#`8&4livNq=NvNy-Ak*5i|;Eq=V&42FR}Q> z3-~t#(&}3^lC4N2%n1*vWPf}JNh{tPB~0#@XulwA9a?bZ+P)GB+3J61&LG=7)qkH- z6ziMYw&UWkD^+ZOW#$|dwfp0z^oYMl#EQ8xMNNa8yon-J%)vFv&#|HuHu(#gN+0kU zOMJ=?q^~L8W7s)796Hl6{a~&SIfK%X(3wa2 z(L?#FYR;zQD#*rPaq`F;(e%Aw43=KsfPNKpvv-c<;?c>UAXpF|Nc-?OBSXzs~R z9&`vguJm$2WIYAaFL$zj43lChhM3R3xX)Qy@ z171;@7|m><<}RTQ0&D?SKPBWKRo}EK@aZWd0mQn}gvaMlxa@qDTOlSsVtN^c8N=(C z(p_d+@)b`A+%117p)ylYY5FwAj(}t+lb%8z+Vn|rJA2oCC?lJaNksUEsiWgBzfXi| zTqN^5?%R#YVJCA}M{gcQ>aB3!m_RKlSI=RS`L$&}~{7C@u;0evhq}Vm64^2Vg8fdpgoyldB?i=;RJ6nIvP%5315eno@h^M z;KRZj1ru+S+gp2lK=WMm>6^MJAGttYXgP}%rb?~y>$OjR7sTkrm`QB=rKGR8XZGvr zW*T(exJXBA-k^%ba5XeO;LjRKwUO$El@^Zc+Z^@mk=t&VZ!daHCM9|w)5cfieKsh- zG^u@0qBV-sC|AHP$@RIW%zmkVu0mH|V9zn9x89yAS1hJni*q}nBx;nM6g?Yi@|pHEOa*9Gf#)<@u{oOOB=B8x)^uj`%0fRUvjiynSfA(;m+bWG|k+z)8{O zA}!uwx2dM5%eFSQc}8|JM1i|T%eTwgP}G<*AaG;Pqv2rRUd-w2eXDB58-G&R<9^LO zz$Kq(K3JF>v1Ebfp4sP6;9h~#I+^Oel2lcmNObzJ$NrLTxn0pEk-5DhNcyYJ@R=VJ zVYIrpVOaWP*s;iefYJJ~^5ngcxP;>D1iJ#R((A0d(!r`B9_uSn)CAX|YyK`)Zn%B4 zU4b-{>Us}W-ocxK+QhJq+7QSc{SQB*YVO>MUl9zO*OktxL*Bl=>*#MM%;Zkq1sZhg zZB%zYggTC;<`TQ)N62e53flhdUDq^bP*~_e!+1J1t0EjJ=1=)`=e!x^(Ijp1ZZuq< zwpX{bq{Ib3lg|%=J-_m#Ry{dR#I+eJARwSUscP}-$B$3Gkg)*L{GX|>!e2DP$uKMn z01|*#0U{$*0^JVBg3ygg&zx96>Rw&h9mBM+@bE6(G3fUQ?Y?L@*%MORRcS1kg*q7d^)6jI<2&jLhnx9v5<7D0%C6Cm8j=&?EvTe zriJ`;ATm_>uee6j}!9Xe?~7XSFfZIw)ae}hvGzD!rsnTffTm)cHnm08m- z82z@KjN?!zPhjTLiPOY`2vklkvn?Yc0s%imXdKi59w*R;w!8fVY_2u?4&&*?-QA)$ zufNWZ0scIX->tXH_GFABY}=V&=zUiA2q5+qJIskzRacvCPr|(yX!ZLwWD$Aq6X7NN zC`z#~YOhG_7QW$-cCJ-GcE{{dxC|X?^z&;Nc^dbX%>;_nAop+>Z9ji80bA|V?Rzc@ zjcev=Em?Tb%L=4(w{-66dKT7ApYD5qdZ;e;%cxg3Fd!hvg5jp^ZKGH$JWn3$luboF zDLWjhy{a{;ySc_l3If4eJeg5dWT^cr2A)U3r*l(m4#`$(Mi2*bq2()K)etBnY=|PM zB*K8LM-MJae~eGO`@ynrnj z1gji#x>Jq?8GNz6W-dF^aZqhpv*HC^S&Mis(5Rp87RQ z?UvIQxLJ`Ww}hyC`C(-y4AU-EH3DYOO;MSdAoU)B% z$I(k)?1OsjqN>-gzx?8C_$tY~+7Ytc*SdUOeuQOR9yM6JN5o(<7pA8^>|O__Qp#94 zqv4xW5Ci&n{EDyB?dV}3&S#_FWIk<@yo!k1IhI+?>L!NteHQ@CP-5~RkWRFdm=$b) zUTGBCi2SjL`(WoJ_@+cjSfCwKh~Y!&MSb8m>Y$}oImI4}KNC{dVPAe|k~oZ@qE&@h zR(y4~JX0Rsg;NkGM7C$oCM0gd@tSFyopwg!8V7}ib_s4L)Jm+4#p`gJo0~}l%s60; zH4w7v)j$pC)-bOBi`=2RT1SR_bkUo_?`3v0IWAjm*!+^_w04LBx#Huqgg(kZTU*52 zLM^KS)jLG`v$vazZjDlD$ zR}tD;a>Hud&~iYi0zDBw@CLL)sSC1~w?fBU%n|76UD4LvhO(Wl%C(`drd@PP;IRq} zJw&AW-Rk-9JW9~@hly$ldVL|;{5mIJnh^*h(62jnwV&|o2tI>xfz-5{2jX*am|dJY z$|d;ag@VGDVrUj@67_0ZNT=doqjvjH9C;^}n`Vx|bRg3*2g-*{1Q`hl3kP^6Ziwkj zd63i*hBnV%u!Fnfg;+Rh4SzmbpR$LorFWC%H#RmFFUy#57*s&j@Soqp~ zZHgK43gE!^Gg)ea<*!VPZpU{`JMVeG6ozaJrhE4q4DrP=s$b~_Op>zKw(9@W7#dCs z4L+O55ttD0&zMxwzK_rIYx$MMULh?8zu}XE(OWd>3zvFZ3B&r2gb76pe~vbJ@e+Oh zu)RDj=+I%k`#Z*7bt6p3y<9{$>?bB?R~I0Lv&@?jj+2q$u&A2hj8)f7#vWKtAS@sd z=T4EF2h1EoLqom0-QI2&sFzXv@`k^_N`!}XgSkzjc)-C}!wXBB5#DnIRvL@=yqDtb zD_rDGwgWQH-c4hb=ida6d`3&;=OvlxxQ;}qBxmX^BYxhtzIn%?k}PQRWhvHL&L|3$ z{Dqus&QP`^8=6Oi9NOPjL#*1Y?s=+l|EO1Ce@6Z{WDpHiUF*<1{e_k_WUQ&bWl}+T z8{-ZzMImdwNqM8irmZ{x3NE=*;Ow85R z9mgJ*96ihkF$(#)ycNSi*-Ln+zWbiX{+PFo$|USVQd8kZvasKKPW@w-*WIL34|RD- znT=84rsPh7!PtYXEQmGPQzu&o`a;I15PO>+df{EM{^S^ZI*dVHpMBez{H2lIbeW=}w$X+&IiLjglG=@T|3f%UC#tZU%E-#&GA{^H zEw*yRZ2ba-YH0+)H%4-!V(CU(Km)~TjeUm34Pt^mjr$;-9C;>kDNluy!LF~p8D)Q> zoq9WKhae%9u@6_}p#Q3fYj=eY`HOBmCW) zH97%ibiwlc%<12*ygn(|X~k#dQZpet>F&|7hbW-~#tI|21yZhWZfVrH&iXHDxj3J0 z{_4_|fa7o>+Gy5%GqhsA0LO-GYcg*+>i8T|Cr4?B?Hlx&`uJs61bLlr+Nb_h^ks)$ z$~MNFds9ogHG7d|G8}H(k?}dsiH$TtemS73@~W=2OIA9IzW3vGXJg}xWSYCn2$m$a z{v@?)c8O@?UD(3k5({71Gt(JQQrfRyYbu z%e!vgW4aJoJJw_O`@+MTTsQtlTOU1RTx>aEVQcx!q@j89!7myy6mnFmrL+a%>&#n) zI%U70v3&X!oL^r+6$kt^wYQ_Cin$Bs0h%E<-~|D*l(sCzujk?SCUJjRyg=l={Bvyu z85<+;)hTz#vHOmpQ+xDlAuQB;c5zEy2eLsl_VNSmrAoGgcGo&}UHl7yEAcO#UvR}5zrtWTq|k_sjXtJJ8Xz=pkhA;+ zI}SVIdtPXx|EP3iUp&qzW&MK(>q%GX3YKI7*N)h$yYBB7auTRh%*@P3v=*GHK=OD* z%b)~Sf147X@&TK)VUn%e)#Zz4tY*Y0Q`su!kXP%3;!!lc&7bb0ej`XH5_Fs|$QliW z!C1dhuZ) z{8gGW80sj%`8_-9p-=jPZUj#KoSctV_JZyQn9QFo8&~zcGkvES55jH1Z*^_#=Q;Y6 ztb1>&3ToSq4q>v(J=A`(fgj6AjIyD@^8$DL-VNf_PjnE6BfnA&kb>io z&1g6IBWn~17V6?1ljk3RV`CxHAWeAm2%juA8;_9ia{)&m4J9K;Bamx0@Tn%gj2Jr~ zyodK!dIwd82L%OXe}75ZqW|zM1_mak-F4>~xFpR#mke?!E>-;S0%7w4%q{%@R|8aQ z4lrYY-&KyZU0~F9O|P86m0@%~$Z&>1=t13Apu}}c2fVNT8NRl<`s)^B52v}vbD`E< zE$ND9XlTgMy{x^xorQ(vb@`-YLHujA^04N9uvGjL)WV5~h#vJQ#&M(9vg-n~hv7Pr z;5nKys{yLCaYAhpcCU^UfyJ$@{H$&(kXU%L{Z%fv0W=Y!H&&qT%omR&O)s!yKF;IO zImLft`xd#AK%RGhnnXC562oH=;4)b_;i)??NgsV(5K2I)BtGsVV_fr3kHXJlm2N{RxEv!sZbn%6vVOf4y;9 zA3f)T@W|Oe_P2CSY!xy&O_g^Hb!Mx>C6Cd&tkKDX?&?qUs&udUWCkL_-oki^%>fk= z4t!-L3;(tu5Oe^dom90U2I*4!+eUaS{QL7*z5b2O{sCo?P1^lAKkVqkR^lh0Ok5rn z{dR6U-TI|r%2$JxLa(yAz)(1(8*_uZd?wM>v+=lUpwR-8IO?~KM$^1VcSFshNDYob zz_%G@Jodi%Cx$(x1NPs0a-qlax#?F%A~pX>_CSzdqcr_Nk>FtuTb}!bHsGqPcI#|T zOcE1!!8kRHKmLwb;|I<^3vsL;lkaE=+5D8XnHS0fyy@-=Xg`O}>2j*VXJzPR@60dUWf{#aq>P|ZEiYCZUxbz_3{MN-Jc zvV4>825w4}8af~MpAa=sI$5?*Ly<>~V%_q6^?tVtlONV44ee|HIFQw{Q|gKq@%JN$ zmo1y9u*#{!evwO`mzee#4Y>taZck8DRooF#88|LoUt+!!u>2g0)4O>@KU*okd{G^7 z{$_-BFlcO)w$PdFyU}Zomi{D2Rt+|yxd*3eig=yLEJf=MZ#h>vMuJ8}s#I$W#alY*-)naA>1_W{ekt4?HYb@Q_dX z>Pf&yUBphkf1KK?nn=OncvG8GA-fiM@7c~U2C%#QI*MU$&_m_S$?@=hM-=@t1`_!w z%64l2#(wUCmIrGpHWBB}OAkz|49*LE84&ul^q~4GBB}_{9Xw(dMY8$tOdrq)kO}4X zxX-B={HL-38KfS@B^8V~+Pzu|Z#;X$)sx+_R@?aJ^mFF54r+s!$-vS#0UL`FYi9!n@aLl$B~6%Kfnyk=h60@y<5SlJ(RT z%0X*5uMoV%qKw=c@E^1&dbd-dpmR-_JJ;Tc~VWHsA))?dJPkJl3=QZPW}1 zGqpv2FFXIW+YGPxEKK0>#964H<>IcV@P3He`J5M6R#7h-Asja580g49rji5FQ=^` zvK>*kmY;g;2Xem0-7ElQi_bGH82Wj#Neuk^)ebguVSl*&ZmCn0?)6jaMNr>e;N2c- zJ`O_E#r6+}IV~mPG+b|RpI2K8$tVqZxrT5z+@8}<_N7JG+!>*=iU{qu-#PRV^I zH@kJ%C1lcSYrt~k6r^O;bfVO$Gc^5OzgWWTf^8${4~S4P?*#OJFs`Me_*Ki;&_Sl=g?S^t3c$1%csH- z!A*t>Lc~cyXq4n7M%_3}HpXo7y#YuORj_RNbs|WBlz4dr$FyHaPkRciqNWAERaFD6 znv^Vx=(3u!uU^XhrpA$4U3P|VqX!+5&h#57T7QjbF0W;^PKu!F!=<8!$!AN}_2yc{ zc-!KvB{X)5fh03eby#nubt7EZ^D@Jw%#g)6Sca~i5WwZJFw&kts!CouOa5`M8QyoF z#W#+2cDN?JxbSy6DAtak6O~cvrS?LjcMa$c8PEB2E`H_j>Zl0U|HX2J;BT zu2^Z;+qGR1;vMzY-#lQJ=-BI9XJ;&dU+(X46W-`^$ZZ_Q7jKTBrp}DY?)62T^G$4%|shL3s%T0O)KZx*tsDI(Ci3;65{!DN!o&sxJvD6gIci zRtIQ=@R9``5udL%JJqVAKq9w1JXWh9&6`2D_v$gh+dV{|#x0(wXXt8X%>lU)2{DdC z%UY{xx1nT4f9F6kp(T@9PY!1l!ObTVvpQ!{3i%3$mx~v!-pc= z#rCCT*M-93eWuwLlMSwqueq6M_f$}J52O-99xoNBKL4`tWLt7&U?lt3ql5s(n(!A1 z0b`880{<#R67r7E&Kjn+{aDboNQ5_d9?2mWPx66yP&7sU=53MxB=}gCptPk#+?oM( z1s+k}9gxl56cJ6uI2_V^-~Ut;z`?kK<4w(5szwlYGIsF2l{U0rXsCaQt%xjt`69Y~ zLCq}Y_-Q8C*~bNuN5>1SLs&ULIe?>IHy2Z3#zDt8wAysXG5{&|peDQZ&|Rdx&!mOO@dMK$RJNg#v9<`3E=JkYayKu z(fzja_tPe@eMwAO8kb#eNt>KF(iy)5-R$CUwFOjokvy*RZ#-CT?aY#r#z-VRf@|!T zCbLCEP&yX5pfVDtN8THoO~G+h1eVvV95p1HQUlYD;thbki6G4ZXx^_#&4DZa_jq24N!($`;er;s8n4#sbgwzbfIKx`nu)a0*xp6nx{|Ay91}WDy?u)DSkp z<^{;Ea0x>Emr&D!y}AuUy1fIDDzzl2G;vxF>1V~n4N1&elszSW>qLopO7O3sf~5y0k&Nl8Hgw_$LGtjku*j8&IQ_ugtj`aC1_msf|f%nx~cZ27#`Fj$Y8hNm=n?Q^ah^c&Gi7ez)Aa(&27 zDY*1=9Rysl83Bt&&|l+`a+*zV|gjer{ zJu6Z7nkIWfdHaiCpxk0tsqUo5_Me`({RbmVRgeLT)zr%0+)6%Mk%L}c4^QkuAooLf zhepV)+Y5?u!CRVAEOdkrc!W4lonr?C-3bN=9EUqO|-@X+6v~Fdg~9gy=Ph8ueN~ z;5ne37AnA;sNRYu^16RuN0U+zlDNI;e{!|Af08QYitDeGwd0N9g(g*O<{~X=kzyiw zFCqI8q2+u`MZ01ZQ}!Me>@#;`W%G2gF4THPMo&ZfzK)m5=K&2Btmo5`Id6AkdCVmq zcl1U-Q2zRd^DxPf=-C3s$a?5rMg;@J2e;(0|BT?$O8ta~llfz&YPI__z>A6uxO9^_ zuhS8!k%cH}>^r0iQPuWKt--`9tpsM7)s~!{x6ZkOs3bpO?oxR-Jo7iOQk>}^Tgfp& z46z?d+KrsH3O}o-By)$$pZi$Io4!PLQP7F#ADgn_Xw716y=brzf2@l zg%7ER`-xW+`?$?ZjBeIoo<*rNGg(mY&K3xyQJf)a zp_GP=GIhgFh6cx+`AW$oAC#i(n zy@e^v8TsR7vA3$G;`+DqSP*6``H&av&KBin1x58M@8#zC%ksuZ9F|iDb22%MZX3g&)?rFE&>=v?YhlqaisrN#t~~Nh}NUb85!|rIAUyvE6D|l z?!Ll|zIcW;Z@N9m^4N#`oaUpCACy8!M}JRvyIS{salSw4)>mdVK3BMLg^AuKBTXr@{mzNFrztE~){Wl(*eEU{3EOZfep+izBG zRMkQeQjl??Enq)im!u}Uqoog}l@6|}e4^3bUWCuU#Pn!J?+q^mEX!vzk_?;NDWbZ|}#hm4(vmQq#Bw|~x4Afo*T zUwZ{8$nlK-^Cb{PSzr&7W(v} zi8aHGDUQ?a5V^pQS{7ivdGiL;FL<6pLqqW@zBZU`Z38{hA@M^iD=V;M=lWcgnY>aX zX#qvT^Gy1GKKn0B(YRAr1uVOsw2(11&|DptP=TjUPUP9GliI4@$)KGt|D6-^_&7$L z%gvr}@W`ZPK?)ZKCjL#5k<w!>9a@xY)aY-_1M7@Nt1t@z z=vEESEEn4V> z@(TOTQXgJ9Km)%=oLuzTPoC)7gr=CwFk0@{L9@gZ`n-cXew+NsDvMxb!*-Vvf9Ssy zBVO;)!DEtBzpWb>TG9^faVs(W6aPma7 zff0fPw;_F21(9Q0OV)Ti^^RhajZ?MUu=z<|%v<-p^xgeHFblnBHcZGVy?VBO6s6kV zd?}o!)!ETmBbA{tGk#t;uP{6FCv0T+qX5TWBkEqRv|vtIk5~A&MuqqNFyT8*OP$>D z2}2l4B9NW=eyRi=Yy|1l9nVj7KL_869m*A`)fJDoG{N|pZIrHvJd+e=q0J5ON>Lef zROQJj+rze4;8K4u0WbBiS&bg@I61^^xGooQoM)urdzAEfCnsk|_+?k9dAYV(eZ`r7I>^cpH7a-tByxgbeaz07xB4A=0uJsTEEV z_kp$QUeuozq1*zhSprt^Y_3Gi`RWhyld6|tXpBaWxcreEi|!FHcL6O9-IV*FOABk7 za&;r=i1dO4bGa5k{>h1Cca+%-JUu?WzZ59wPXs+Cv-YVs{%x&k<-w)q%HvVT&UY=htwa%)hio~ zssQM|_gpdCWGg7k*5*GdD<68*6IOjv;umZhLrD*3bSXR4wFk{0l@PglSURl1lG zD44$vW-Af9?9I>p1#AYPTOYvT=*6JHEf0sc^&2KNm#ja;z$RlTh!U`wEH+K#g`i7) zdRnd|d%Qix-}_zQv4ev{OQY;Z6Qf$UcCekq`6BnWo{f4fFcSp5EmP+os&T9?aw;Qb z7ZU?>6ho}V7i=_;5SanWIFb*5Z0i5pmy=$2dh*#|QwwCCgVIKo02#Q-Pi3<$NZ>X> z0Jo2zRC(lgyM|)_Tv}hx-EJOJ0hE4hgGz^XK;MW-N$HIW)?Ei@;CI!TL4r%I-k8*R z_=7`7{)!x**&Kl%Chh}MWuX1}e=SA=>LeaIAUr{Sfz1COUyy;nIh2V33^zIT0e!h8 zM+J*O@;oRikgfaE~UGCxbd)_)Nfa`QCYBTQe z3Dm}yDyjXROIUXg8_5sENd08~A72=r`gaM(@9v3Up}~*c-(&FAW1}=Ft4oFy$%^~c z9-%`;2L4t{`(ML(O5Z@r92ck}{H_Q&v#qZxIC-v`B&uJlA%Ew;Ra*$hf~WR2rnk*X zEHYFG;l70TVYu#VSPsnVrW*NC>W$iuHw(%^QLsTmg9`RMaBXK$m2VVX!1jmi)sxt+ z3h5oHqQmZEq~xsoUkxc8A#iYuJsVja5^dp@=zdM+un>tb-z#@=c!T<;$naZ%&Lw$x zq}dogHEUeNy52QplE(|nSi0HVq(yBwk z`CJjbZd;#j5fAr+3)gn;Zp*D6#QD|xKF^~%1`~y5K-1 zM5g}4P&XMMkpFM@2o;bz!Ax7fN2*3mb7+PY7I&Q$ngxm~Qckml}|3~*w( z-;K$xfxo*rl#gQ357_7b-D);SHPyd=^Z!}ri2;^q?5sV=M)}uSF#umnci)?5(gaik z-nUKnOq1ZFrB-Ua-x+aW3b<`oNF1 zkV6SrecZyCzdv*Mq-5Q+T(6PlqQ~3#d02bs{A5VXfNQ~I=LLrb(j~bCYRR#H@L9E4B+7eVm{=N zx__Gf1vs*{Dggm;I5V)=2?1uG0Q!4z@*Q~NA?2E2%k5QitrWncIoPYW9$`X~QDjPV zIZYZU00Qtd9>kX!j7srM0|Pj~fdbT+)K5p_Tg4FFSbqV|+nur+{r!6wn2V7@jIN;w zfUY^@92^|5u(4^pM^38(O~$i+JJSN&z>BC0j#UNc(*%c?NaK6K(iM}G^s6^c4G3KT z39Wl%+b#h_x(a_aO-*S_N=lqI25B1_D;`wAOELpSa@CHol$dyV)z|mnK*k|S=*obM zi$}AAf*#1o%OBlTOfMn2xw3PziiJe;BTm4WAi9{zdw6QF74mjsYibou9V{_98gO&Xa5-1RIt-|eq;By!YpUq< zrm2LW)~M?Oc)ixIe9#|$-}`i_s+5)eDk1LSh5P>RyFAQOx2lW;p}~rIob!!ksZ8S$ zXN8e2L;o#|+$HL}OB9&*A*STzF@G7AIN`Qi)69Lz^NxhOl?#~nHE+W&P3m=+qM!Wx z>u5r%pQoz{!|oRZEjr`P?MDK87|Fj?%cCQAvLPbSv6_rtr$&-dXh-Ck#Qa)RSZU#7&K z-WlbSU!z9;kY4sPb8eDOiGiNL#`GcUynZf@C)g=(WEL-(te)-hQ(Ik+|4}okkQV&2 zKxS*)?Rw3X`l6zEGkDch-TMZ^$8M=^nqu=GDzVGPXn{Q3>=QHt zWz+6>SoGS^5341Lx=E_BC@`0$t&C~m#{ia;UE(~(n4RU~#ZKY*?fP_L2yvSRd)MgR@H8v*~Bdc8A1<;}bqJ`Q7*(MEUtf z@+KFV3h|Fq3KhTCVppDXmYwDa$E$CBTprBTHs)Hiu~TZoS7$aG53Ni(;#^vRun;pY>rOs1m{UHS))e*x-JM8jr)Afcadsa?u=1-6IpM8MpxhMsI86f&Iaz zl&$HHBN@YQsvk4UBg*epRScjChQY@jCNOS0qFNU2SSY-1!Im=#PIHbFqSKsK?so@! z9sOD1j~Mv9j~=9HQXFWOJMJ(0ku5qbJ-$BIHkys?7HI4&;U5PjqhEhPXuQj)#>7iYjSB~TXFpmKP5}RM&KTC4owU1iD%;&$n!5u}| z>LBrV5y$TwmF$cP=hs93Bg)sgA565aI__{x1h>N{ztPQ#mf$a3Z{ob;Z^0J0JFEOM zpymw-Y$dQ(&!*q!N7T1L)H7IZnL_Q?Ip0f@5zDm|t&ER3{5HNJ-7drSFDeD_ ze5J4_a6Fdwz)Vf;bIf~tK4s;U!oCpF*JiQ)v#?|+}b_9DDq%BN_{DpZ3G~RBJ7f2jF44s(xBj$D# zTjqUS5iKP{BGNTX=Iti0A;9p$w@7~qN_BQf3{*1bEDCbx_@OQ{uY`!dQ zBW0Y*YGb;J?+d&P)XL@}B~+*(;l=488~+>Z?cUe6I_cXT_Va0qVN{i@am<|8s>aSs zwNW$g#s`KObvNcpvKvIDM|7}G=gMb}>Ic3`vheBfs{;jSCU=a24(F!w->!&}NzW$g zsaVg)3ACWFmB3~6=gQ%qxd7y9;jiNa$CC}}7e#xB0b(Y5N7$^P%7l(Z3H=^UZG0@o|krwb%QGgig_;s3iW7#$(x@1GRufk=--I_pe_wzvd_>wIncqilh|F`0)cM zA}uz7jFpAU_lz<_o3O8f0g1xpydnW^tD--C{!{=!AR9eBsv1mEdt8A8MQqR%h&9B) z6-xM{k-nE8@Z;c6&P5FhBV!l)!)OlD0f0zYOwwU zMyy;Q|GmaiMB;m-w#v%T61f&!x4rqk+zg=AC9)`h{`f&NizK3zicjjDfpTbEH4xm6 z0cCD0K>Bb%DLJE?gq>bknB>D+Z!<7Z;#jWK0U)3>!iL1W zV9g(@ZKTBtK{8?gg36>RU|ay!uPcBEKmUJw=N(i)Ow52e1|Hu8jgv@Yv;kOZ8iWxN zH$?J}ut!2cjRXl{Uf8MwrOfHdeW08fL>}rH0WzHP^-)kle?kZ0^oNe|fU%BBnqPwi zDS-w#cH7mG?T3Ql7r8-(!x1yE}{xjv3dAhnd*-#Rqs|*c$?w$Uv^COm;HFM3# zU6J8ybPQrov&g-dy+=urC%$jK876(JdMLxl&hOaOdc4WMSi0SsX=5aOxx^b!ir^cs zo4N9wTib#DIl`NXO8=Dmily5xDB8ffd-lq3(g%werwHM)SFJ1TNK{vU_Cta7t7oug z0t_%L?0c-taw>&%LYP=Y_DbF7ID(`UmaH4cN_imDT3IVcQ+%H9ckiXGvhlCJErt_` zt5?*fdY=w?4!I?SL%gKF9bbvpQ{5NjSxB1u!24kh%MQDWme~7Kn{Bg4)(Iud7^hvD zvf;yMOuNQ{!cK!sq!=D|kzIR+_WOb?!&&I&NSzZ)Fq-_-iWOpcdl|&J<_1| z7)Xo^;uu#PaNZsNQ2jjoXW&e<#>ZtpB|bW?4*Jbu-uYnu@dxY|(^+)ld{6Y?>61SC zUeU0L$ujPjihiH2F}!QPS8kQXstcz3o4$JGhlK7xF=l@gt!!6BIw`z$m)%-;Qvy9< zVJ=^(P7XHi0EEZ=g=qoov4k$xqp$&H#@V%zLywh4l9*Te$s~Si1rgeoB&2HlwuPqM z%6zKgTCo;9xo`LxwIzY>yTg=!v0^(#{3-RP(K-~5@y&2Mk#$ZqJ%5t=ay!&x>rn$y z7t`6c!{W0@HU=)!^9DxTKRCxaE_7zQ=Y=@`v@j*qbu1C_iVbaU2IuROvsYik(N9+PT)P~3 zyxr!OHrHd4l_**2mBve*lySz>QSjGz#$)PdmeT6{&AR+chwmnMAwAk6(&2Hbz8w(8 zoBzexTZUB`ecR$HD&5T{L{dPyJCsI1rJGGicb7^^gLJpjY`U9Gr$|b7Nq60a=XdV8 z|M+x2_{c-Nd++tGcdj|d9Aivj7gl3s-XYiOICt&fRf%kv;Bv0^N!)e9rWdK=ZOVa! zgG-~by`o!P#!?JdpY}8!^+k5`ptjq3mxeaJe>6eKyOr3OyN4cs0Ljjuc_Aftm*LRZ zz4rKs9fUya@XgU*2wgp*-P;O_#x|Icca? zM7h_tNjMJ;8=78*nomEGnLKMX*~A){Cm-rB-A@erKrHxe#OXV$=g-#xr47D_VjQEt z-Iz%OoW;^}39(@#kK<*@4$^1Y@x#xAMtoq7aS8D#8yLk)`Wv5d$7JRPFn+T-1apx5 zzKBi+oToEedm_KgUkgGj+<(*^MotLnVuT3|;7N=c77J%&i<_KJ-i7$)a7-xmO4I7^ z+9Gn2H-AeXy$W@J2Mx6>*}G$y$iVw-(bU}YDP^5nMf8G`&B8;v%spA053KoUFY;5Ijcz=S$i{o{LqP$@BoGUj(P&T5!nvO7f4l5xY6 z5%U%cZAc8~4?{j_YgtpEyJ_SnaP~d(o#9#c!gn!z%pXcbx%cM><<4(6N9UBsgxAfR zWuoT(hP}1PXWa+h#aO9VB{XXFuz4+CKC#@rqXMI%$%Eya=O;TNc)m%_otLH>>a$gk zCF|b#OH3wBxt~5u)0?HUG4&#pN&n{6tq$eE=)UTIX1F?OFMvG=; zWw+b`=S8X?#%=u4_RK5ZY|>^H$PB82N4e;eMp6$M3=b5q36Zwj4-O*}X8hK#JWQ>i zO|_=P0Imv-1EkEg^*qNbPRmO9Pp7$FP_~)1{0h~lc8|W!kAyZArmL?O5i$gwnfQcOqD4`$G2GFks<-@k;y0f}sFQX2yk|py zZGW`@#4*7Y#~>Ou?@km-?vSYRWK>Ji@LbNUVTV3lMNs%}SE-So)rabaW;r{nCQD$^ za}S|P4KU~@t_vI9(`KsjMVxUyYzrB=RQF6Zg?@7|wNAk9m!edk(N$}3Uf%Qe9whP; z2^G_6K=7p`Oh|bRGN3VnPzr2VW+i@ zk$;R^jT-rcaS(H;up17)Umi(K40JTsm28Tf55w9e6%& zk~2}&&H_VWT+9OGzh?(lry)85FRE*aUVHBjZn)G}wl$fmjaa^Hc|VMEcV|0C z|H@KMC2zKpKJsjXhNE$hhtP>%;Dt_~T}}Vl%WOwmT9}8U)*mlte1+}`xv2Az^2zcVIREcl4!wZy-WXMZ zu21j`|(eTsJ$l8$TfHp5I1{|xP|T~kLj?`dKCQ=*hX>DZY+X)G?@9ZD&2 zB-0J0=;;wN>*&s#Fip?{=0(=gtp1KuI$BhG6Kc&p+l&%z1dZk09DOcO+AkG_sc0j4 z65UqIlDoov-c>@!N2J+Q?U@k|3E@#xglb}GaYMXz23rdmQDJ&+g<7)tAw97^uXrJ3 z0_f{|ou7_B_*fTl)JQ?!gsmSrpN?VTa?f?bOPp-ebXpVyo?frTkCx0}siJh(pXS6x zhn)_LbJx=DVOcXl{AdV2u)%)Z9AoQJXJSPxknCXR!?NPg+9+oGfDS4V);#s(I(013 zRP~X&^sM4y4#t#|9{=apwV^{D+>~p};#2Q1SNo~%(3bbfq-x%dJvLj?aCDpxDm1s7M<_2TnzApbs|8{NI`u8#wFO?#dv4 z{S2I)U0;$}&GXqkipUM}aWfVPK(Fa&F0|xH^GDd3Xq&Ts!Tq%JaM&t+`_X=EVHs48 zXnB~t!)uEpqMb*-)^WY;D5IRt1J}P^g6Gf(p6yUp0|_RZT$32+wD=OF?5)brY4KDr zr=p^`Fnmd6KxS9K8A~ESe$kXLrKrKy*70ld`Fmjx!#jHUl%=rOa%abvjLE5N<7PN5 z+Jv<-y6atGFT8tS-J2ni=CnYRwv%``RL|zMK>15EIw+?$Q6~rJUR2$^`*cFh`lu~} zq?;VX9i&oU$;|QA=DL=$pOxp6{ zXzZStSt8e&s2$UOSz;2}qvTz_P?W zj^TjWbPXv5GA6({%1Vy6-;bU7`>trmMI5DHD z;l?@^^&4`;!lgs6G2(gx4^v*lnXIm<>c3CN_McI`Hw#$3ZX@C}5RM+AcoXUvb8w|h z^gJTj*OU-*C9YCqy-5%?aOq6l^Wz=medoH0XOivK(-uz%%uLYcIO==s!XdSN+EdvD z1EeR@FnwkIb!KJfU7So*?Zp?Tfi0DL_#3pX#tA~zsk~t!EE*I9(3or?+T!NVUqca* zYWtZ)D6|NA5J@d)>kM;d8{)qcg9NaZHp_WJ1+bIwo85Xlrr%xt4WF`)x@9Jbz$H`{ zZEAaye;=SA&=b#BVU4XioJw=LV=jD8?fN=k3cX`Jw;}hnFn+iA{z}_nth7@2h-V(` zOaV@0c6}t&j^U}dc<@b2x}gza^k!p{Q=6AXFJRtHx;a9B`l$!g9~k61Vxe^uM#g4w zX^uwvevCq6H1NWi%j=q0xMj$TXx)0|NsHG}6P9;Hp#I2am!OwEra%TF^PWg6CKkD$ z6&MPJU|V>ifU}mt_Ky~Kys^f}VGiiSh~Gkge_U;+bgYu%D$xf9w5ab7VP?4K+j;0EZ7JEZ{Q+ygUGuK@R*r{Mo#rLXOhS-wK%A&*Rd2 zSP>tTXrWb4{}14V-CFl0wAkqXi!}gj2=x2D_o&P1111bF696?%Hb<%0RiA|c_H}-x zAB)e6ldr^#kf}ESxM6tx8r@|-?mi1moQLzDn^{gBqdKrrV+8&qx0FyW;6!o^9MqUW z4IK$^Aqa;H5CTqBS;SATZfpbsx}O0U9MFE$hjl$GM#c{SV12F37^pxw`SuIUHnViqwZz0!gXzxhE(1{}eRxZ~Dq~UmX=vC4csr&zY z{|V~qdTnlTs{WDq*zmbj2_n}YOtyb&)s(QC3I_)V`vD@(lns@61`vM!Sshf6lnf|K zm6b!EoeKo>mQdqZ^hyTu;{jFD0HXFWP81l2UL2>HOHJ~Q0FqsB{!dsEm^v1+;C+o= zW&Zo?gC7aQs691oYH=<+JpAHxQV&?eO3bHatx4C1Sowm9DL++SVD}f`u=Lq*V<7Lk{u+f0lN|+4imJildTR!MSWUo&7o-E=J6mO;EI1A zhz^kyU=ivX()2iu*2|@3pi|Md)G}(>fTbgTYWNtaE)q)qx`ls~4^)? z0BcA%>Ves*%8t)90VHk5{bjq)i5$KqGF;!j`KYR4=u}owu@ax~W-rGCur5b35%ztQ z`D8?ZX<(!t3PEht02Lx4V&UA-f6+OA|N8aelDh4Akba9=@Qlo!;q!y_LC8PT6G+ET zh2J#J(8Q`UKqw7<00-r`0nlqS{U4_XXfK=u8(R$VnIr+EBzoqfj-jta86)z8UgW=j zpG&pgt(Oyo=W)7vH<^IYs_6g17^4BB>o*|g5wlOo1`rpnOA_e30qO(}RcEy_pb}*w zh}nJi1b@qAEYJx&AT>Pwk>ix$5$R*n0XuqSLE(QM0va>G?DBdEjRifmhbOK(IxJSG zyN~%oJSy@gwg+@51DyRb~R4MAzJLe)o@{ z_3tVG`+ne^0dnmfP`Z?FTyJKy)*7;eo4RNN-O2hWXoD9!3(x`S39uwK=tJN=v&KlC z7-Y5A_#AWmUlaVtQ#Wv>(h>Bb8!mDLyxnuRPLMlLJSy z6f8WC&-X_w4Oj$~kNQ{OUlcx#m!n(OpLh6vq^Uq_Y#9IWehu2&0`vi++2XgrB6D+{ z=G1Kbr?Q~xfBDSdLla;onIHBuWi>k-Ldnace^>{Qbsw(SZv+lfe6~_svHc_RC{d7( zkh1#*+ifQ*=3Ri?xI13 zu*pgSCVP*5=AYB75S0M}8;m@7KfYIZjk$ZohYBEzdn^ zd|Zs>@|U`uMY7+&s}%di>*NHwVe<#)orbSrEWrEm+h3Hphx-Kxf~k+MzvvMv05a`m zPUkUnlb(;Snr^2T(UEk-JC?nVOIHHj_ZEHr(y|B$c46>PuLx935O3(_W@8AVDJCUUumrukEkM{}F*I}_Fv<+T6Q zlJs2WI1wr0*`J*|1nj!^b8s$k!K0-=s@}K*i|%t59}&RT-BKKXXHI}B3s7kc)ql?% zpZ)5df&sOYw8KAhmQ*2+I3FHRK@}T;&@CwHa=j)?aN%Vuvc7OIm@3SkH za;fp)FT7{6X%ypTFaBOCh&9Do9n98n*`huxhcR>pvWOB!KwB$pPxQQjHP-dv&Ck6R z;0{FB*kj;819v}Odkds z6DO_um817k+RCy-4(>b~zdQohm)@HQ-W@tnRhs>JUM;cu;x{mp7y~i+>J6L$*mU+1 znG}g`jz!rf0mV6d#TNy814o-Z&e3`OQ5)WMW3P)QiK1+V=`+ahiVKbvCL}bdE0w3 z#fxHi8>Dn3W8OC9aKVql+d=&AFQm$?jW4Yk61=a7PfmuaF5RJLL#=LjP|Y1U5;8{n z(A#9!=I3(U6QEObB-fT@AMFjsSc>`^elv16OZ(^b1cE?lCfwXS?_~GIv~^d|;dy6L zLtiK|>?73J5K0-@TpE>Urp97(yED+mPopVR8`=*8c3YJkJ_oSUchYYai4 z00^RifTmixCD33JRi(oUh`|g0{7KK>!CnsJTt5|5@_+-Z)?ORSe+SUJhiE3t!$Pd) zcpQBN#`&~EAMAD>A~1x|P5-ivtLlc~OqtGQj?NI&)%zHAyk7Ur1a_%+8NM3(0;yPo1Oq_2wS z@Z>35B(*7<)PRN(nsnp~q@O{n^bBHe?1zZ|R;cdH1fNah*`az=w50FUXO6uqESPBe zTcDznnx#=;f}FlkW23ip5Kv^yFMjhr8F-K|ScP1G=3R{DTG8&VB_L7#0=(jS^_3dZ z-?`I4;lbh`ExKs4Wr}|B4LYgNFGp;fzg2K+K4{_9YBXzzS$7wF9n)A}*NoET)SmH2 zNd~%x&(sp6c_w?)bg{&&>*g4DVGs!j&>4WW+y0KqA~8I=ocwBKA(=<^=W(>B6Byje z-(8>|t=r9Dk!D|j62*-8!tHL-BF#@%{4qrja^P8*_{Sg54UeCh)J9>uM)#-ZBa>=# zNw6BM)Fu1fV=LSJv?;<5D2{WKc;hIT)~)9!^@ejfk);PUmQ!`;@_6G}2go#4Tmj8^ z`N0N%3I_FeNV$2AULHr)q~(dY*7UUwxhF}{JiQh+F)`7XBDGC=sN44X^=tNxSJ|?% z4A^da)F6B6_WSmo)ohG9lvo%~V5nX$w2G5F*+wmMZB2;u(^_*EP*AXw7cr5*eCm9a zXth%c{+RwOVU#csDsy>DL7*j<*}PuPs!0B`2zK<;;rh%fmo@+9=0>f!1`za?T8h@B z_X&u1y0M81m-7pWEzHdDvr0%M`5D-DXUU1U%z5F1+}#zdYK=_6-K~@ztR{cd(a5F{ z=dLij50GBj<#fFeX2!6yTTcoJt^~?z$2^KaprdbS~XSwGu+e!OIoj z(X3`wcz7H37ny?(ni)Desh_TOy+?Es^jQ}!E67?Cf@2gR@pE9#t=}oLg>b&t(a8xO zc^91pdA+Giw~?Qj3AG&elZtPbMKphb9D?$*5`iJz2(!h(5{vx@AuV@uMqX zM`F2QDkviJ-Y1*NyR$Wzs;a6eue7wZu(8iaDPOZQ=p5Y;yVpKqI;Z>RT}0L7#&GqPjKsw29MpyjZU=x z9IEmyQujguxG>2I9=eF_bSumjoW31K4pC=P>~8&X3;RR)D9lDD+QGU*^kTKjyW9!& ziOW#HQljYYK@UzI9<5$$8*4AS%Xw*s9J$5XBjQ3F;4(sD7X%ovt`ttEsV;kr;Co{5 zD}#e~`hK2E8zsnHS)hSV`rc|&x9v^x3+OGYYpK3?^Tp-mHwnM2jKV@jjC?@jev_P` z#pq3hO2C8_h~&1kzt4h!9o!BO_Abib5By&KM?i57>^xi}VX}Z+5QG6f3y6>m8Xb*e7Zgbt6OM;jU#F=_ z0Hm|!U)R-rl_DH?o zB9uSQwT3#;U05xAC)X9DyuR<;$0N1~Jb3bBSTd`=oHS9aTD{?(I~pe~qy7t|Fm)tS z&~$HLg4EWmn3&iC5fF(T`DBBwJ9v)x#=FnEBFX32Tx~_rApB2(96htiv!*O`r2s*^ ztHLzvF|h@NHT6Vjyk@>L_4{l_wKareiXkRm<+I3pP4l9q$@7e_w{*}wBy%>O#mT8H zf-oJ6-y)lN90>2Dv_a1D{c4Fer5)Gv<2DN_Z$%|&)-kUMQ>@`DGZQ-WSnKo{Ao|Ez_Jxw*Lrh7T>5MgkA3Cu7>fnrX(yL5_S8)ZFtY z0}v@!o5(SG`GsTY1k);UwF{s7cJG4Dc~Qfn$#b(MO(T*CipJM59~7u+l=X|@@0RY> zi*>|jX1JUg!E*m(kO`P3V6iKTiZy$MK|E|+1;s`A)z0R)juOLDHahcuGlD2I5Z`IJ zyt6y2l9ecaj%IK>ub#vpHQ}#Fn^dIB0`afv^d~Ko>P{LMCXUH|yP92fXn}fp#^&b1 zGnz6KNXFTXjihmLam!Qtz=57uv&?Eqa7j=g2waT@|RZd{4h`$qqu{LqNHSW_eV8HFVYfK!!cq@BsI)-_GJuuq*4_b_6gI`Ffbjp))n4?c|^+En;cs9H>Afdk5u6k8hIQH-GwmMTQsd^ZuF+n(Zi~vXnRNX#l!y- zY7a{KbfZRo{lX25Np_hV3=36xY*tW8@Ylj)z$n}Hu5>G(4uhs#b~opBj!Q$8R@Jjp z6=Njf7D7vc(dV3;oSl^7x+BNx_?X775nYc3V8i@cLK$Rp|K);wq}6^nP_H8X$yAe z+q$lIH+*Tr_5NmZ5vae;O1CKGJqX+&9|*|_^7vlgzrA1q;+=*^5N=B>@a9Gm&oTB2 zluGrxB!0U;+n*$7#&`@fbz1s>Oghc^Cgq8s^YoM9_xcM-y32T%K+Nz{(5UDL;HZa6 z#!xSE!$2QX@xpF5H$e_B1p*g?bp@yKHW zogi;7w^O#KeMHH=h9=8vAXPw(^yTU^o$dlx`i|82RkI>Qf_q%wK(w|D8FSY}x~(Ed z$LV+?!32e5R@}t8XfwLFdx-B;rLY7om0rRT&?!4V{&_qW7?sXaI`=K|{fFbT!TE1P z0V0m#qftL#&a_5FI^b;m`l9~Hzh!S9x4Smfp|-gW>iE02UCi`iK=^X zaS`-zZs+EL4gX;J*k0zmr}=R5jx(y?{aYqt_h&nsn?VwNK--de1cc6@^5~Kv4s`QMqdB+b_c6;GBGlXk5V>9%W+dMwhz5(HJV0pDc1pDW<@ zynM(8K*a&Fl*Wu5b^Him^cgHs06xxIt_g&?8qVnfUN$&^n;3>{r#($m>9nhLYDT43Dp~X9}GP`J>bZ^1T>n` zii+KUEQqHHNQSX|sVCjb#@#k%2}wx|4j_f)2Nbc`{IB2A+25ZzMW>{M#>C+LY4(DE zy3#^z-@%_%)w%#gpXG$3wo*oWTU)H|8TeX%yt1w?Ga3&M59(YCzRC?aY*ba*H=^#; zJ#S@8p|M=)M^D5nYT_TU2RAgLGAjjZw13 zS9as?$phrthDQdvlQnI7RWTjb2RjryRbto;GBt?tc~+kRuu(Z(y4BBaV1h=x!pexd~o*0CC>&$!7IH z@9)iO{LF!+@!E-Buvm2UMyIBdiHnQ-$=UONxLIu~+9G=eOw}_pDGO8ZG{7S&1^y}8 zKne$+Abdp0MIX>AiCE7=WPlbm4lN1!UD|5BVr0Y(;w8d)$o&#l7o<#cz-F$T| z4qm8~vH=nXMnLza4)3wHcYZ=>75Yo4R~S3QLW`zuGQ`t6TU72l>z^rVH`8}3TK!F0 z(fxFqRBn6wKX`bWO62u?a7Mp+kFYgBTJ@ zbk9n=uD1KAd+8-$+5XqURlw|x6l{utpET)YLeTU(m&A@nA-%@Dl2cCMJ5_$HxTRl7 zpKlAh^=H?l&vak&8s!9(irkYfcrPGyBYg08Fbyk~m*>CPKD8w3f%hm11G(4D6TPy@ zyK$QrL-Rhpc^igI$#?rcUSE95-O_!IUvu-L1il;sxmV!;fO8EWO_FvN(P;<(Ho`oKm7OxjA_yj`C$AKJ;(_ zH!RB4iADb10`@=|>lK6Q)X}j}F6;PMn>{+2VE$@)q_17Ncd#u?;M2QBG0(Fmk^<#` zZTV?{<0@){tt=jI_a(ee!j~ zu(f_JJDS~B5JvwiQ@z$xF`PK2->qxcz2a0))}Boj1C%hV2)#I^I8WLztidqbovfiq9a$4YUOjvSPtkZbj zdM@obAi8)q+U~?*QoDr3V^Vaf@6TdLJ=9YB2D8(6b_vQ?kNU&?f~i27bh?r?0H2A| zZDR*%9I?yZ#Nsd5j4KhrXExvFw!{O=r_)T`EXOV{m{y{Shrr zVG|W`-!UbUgmIQE+(MztMdb7|yt>#@Mp6c;`NlrHOoC!G70scB&X((A;LHR;dnik50s`5*hDC#M_$i5<{?f3=#l6B1@1N^OJ8Q-!r9&Jc^#;ji8BA?d# zi@$$_o`tY<=d^gEmP(D5jSz*bRl7tjwP5OnC4`ifX6%*eu$$cB z6uvj-MbYrpAM^1JxbASRonnE%{2;`=CUZEB@A1rmbewK+Ok)0#Wv4O3iZqOX z+gh75J*;&TX|qT$@bwC9d-tv2c#YeOIR}yUsk{~&|M0RD(NQYxAg@s4xSAzi7rp}a z_Jhs0uLVi>YzN#?%hw!}st`i)kAJ$_kJCfPylXc9lw#bi_<2+P7-ZTML zEzkS$smf;Wzp;jOuv3OlZyR=&rCl7xr|a7ZeIwrCOwbLJMCCAj=Pr+z;%Kt6(87#g zA~Q~YPt&MtV$d$){_^{8TpC5ek&SB>HvJnxqSO-;xmA58j)@G?-g8MP%9YO*^=4%@2c#`tV-T4lW*qMiRHdGpBY(z_h9zhdSgS>vZx0cf zIF7&66!UW`2u_{*csa`K9S__32F{gtUo3}EN*Bs^p10ft`*^FdA``-7m7HBjySGktR*`v zpM7D}8=MZ6U*4@Sk2+pj62^j;hjaJ0EKlRgE7Lvj@9%c#8!aCjvXJO^Zn7m9*~a;x zG4IcP{jNLxliBBU`uzr-Nrnp1_0|t0T+GYoq|;ya;nr_(<;roVPCS-#pV2FH4EtOo zD;F8Esoj&4OhnH*3-eli)06y^#VzvG=hm92e2TN1Yc9h>kRU1^jm>h)*?EttdvAev=ai4-@G&CIk3edbVLHKET7C>b##r2f`62l6lsH;L#por;p0qS zy4OI8;3YlWeK?CHAT0e0h@_M^mme&31TlY29ZcYUY3IvW#Uhl4h+zE6lMh(Hy%Yvs z@E|atz}-E!sN;t2{D+0FL$@e4tIwz{2nh@;G;KVuwiZ~WY`OVjV z@(iHV^L!q^iNZO~lR+zjP37U`+rswi&+cw-vlWJ<*VVJTuIN=$rn)ng$v1|SHGfG% zmwruKT%O-t(=CYi(*!l?AtV(t8dNyHyw>&UaA`7Ka&{z7g7h1(dlB6Yw|IXE8|9bR zcJaf1!za%bxbjQ!F4#@$9eV|H_v-y^i`^2k$9446n@OM3r~8ki@ILwe-Q~HPvcP6% znAbl4x0s)b-ro{eqzHLb^Nt^S;z9T1`N!0)$cno%MWnL2HK>oWZKg95c%2yJF-0N= zToDE0-+jLNbD6;5!EmzY*_n^S-Z8v%HY+uug~DpQjW(eBT83(WCD=ELcbq%sw|d=$ zm*k}ZjmEL29D&U{o4ecc!RT`@+{2#=AvujCBzoukmgYrL4uc;y&4;?<5xA5)@_N08 zC&_qnIFb5qz4<+UsqG(LeXpHtzHA zyz~P<)ra<3cY`Zl-TGY81QH42C^w z{(kkU-y6XatvILXyv>G>H8(~OASPl~L)7xRc2AcA(d`rkqX|8iu%4g931SS%dr(HY zk?s7ERU&dB7QrAwER{EyfWX~NjCB_cqUM3fLHi@E^ z?QeN$MkMGAX?HF*G`r+dJ*NJ~_1lZ*r8)cIbPJ-mf&!V4_oYU{9e1B+xYJCfS-VZ- zLk$TyOCfz9+o-)7bBf&hnAs=ZWl@DWon=i9UpG{{5e(&WBIJrG&2E25$hOeO?rE?! zeM!TQ1g#Dzt0W4Il1q684J%;mgcaT-F)fZ4AO}HN22c1xeK2&9{?;Kcx%jy;!WHrE zTG%HFq)&7mQ_*t_THl}=T_j5!^X|V(`z9t4I{GmxXhG6)k>zpl_r=u6aJ{^=72xnL zPVp=vTz`r3u58g=P#R&kQ=+Zc+BwJ~A71(8W=7^t$F)0g;n!~gmZ-ZF(9B!TXLJG7 zFtFZZ>e>6Xi#M0YylygMnLYcv#3_#GSOI*n<{#67y_tV(BaRQyP{cmEqR5WnD2=rD z39XS2rHc4QK0SQ%X%r!JVlA(?SxcE=C`H)6N4wWwBR8?PhmeIQ^t{dwBHSEQ8z0p7 zr#na{s4f53q~Gi#q)NQy-MVAj(?-TnVUvYlgB`d_VzBm${=j(K?HjJl6wsFEN@Z*eA}i!S2s5E{+AL zg7D#vdcHiq9N7PA{LnR0VNasRk4rtO7*K&7%T%3%X)@%wQPG}M;xOzekjmj-Isf-> zbn(QJYXA&)44J5KDVorSD;O4yVU+nyU|s7X>D!IA9VB&XKT>GD@vrsOBcUQ zjmJ|2Y1vnCFwp_bh64^oGR2_p?h05-52NBhcme>{dy6O-LmGf|0G`I`Goc<97UsW( ztPe$FvWy(Il>p zQ!2pLfF!hl&bnx9NUnVS`wX2o8DDI^A!vyz=s5rTai2-iO&NxiyA-}gf8;z1`$Pm_ zKX%~~7d~a5z>u5{Jq3++z;Z$iz#t0-MlHxS)-hG2TXO&e;Qc?AAZAegGHeJP4ebCB zHo=SwMD}>fCg36XfKUVjS{dMLk`1JDJq&~e#^4I9HAB(W)z$h%0?xaUd@WR!Uf0fG z#0U~CO<~G>Zg4OP5eZ43=WsaA{SCm$IyyVwtlxx>fiWC@7HGz?zh-5nr8iIZ{zg=~ z9xlIQ`BnYkIo5tUS>AU!EKTgqC{mESx$tXdrhf2R?BOQXmdtqWcCz;xov7hI|uYd69VQ`<@{0C|KAjo9Lv5;R)D`3F?KU0*}1 zP{sf4YY{Z|i6Ni`hP{C9ef_tuCop|Os~i9?mkB`LFTf)OGB2Po-XjG&5fwn_NdLE& zI%1zV{2=*F!YBNZ6qz6AW4hOq&|m9=Q8|ct?1Xcx1jgaBJ*Y2M^t5= zTR4`Zvrm(=O}p~TUj>U`9wRPGLn42`>do#Er}2I6R09XmUG&$;F+%p-iLR#4N2bg1 zGu>jBwUO7GTHqni?fkG!IIuz{Y&r;T2d7Lt#ZsJ*VO>Jl#O$Ys)TGQnY&hStYn zyJgJ}=@H#eSF1=*`iA=0%<_iD-Md9zebs9`?^)(-W!O}?2H{Rs_3|JWbtd)Fb2u|s zy92l9uklBP!0fHM`07BxB97?*WB136pK9Sbrm{Cwp`BLF#_nQeX~|iK^r{xb6|q(0 zqHR=@U zW%hhe&E;BK%6P4Xn*I99Hl!3Q?`^|WYfCUDSL^Kwm%&U$LyZ#r?pn9$D{4T%l-u@m zNFh8}=DYu8X?};U1eBLoj@!gUft8E9a~{`#UZx(UJCbS1yN507e6F0`|FrpgbW{zv z5%cVuA%FTN;a4X!2r8C zD?LxKxF*%Nv_@6!v?cw8sD?onkXgrdT_x)GOT7~xCFF60OGjHoOEbyYz-CEjT*g*D zqW6V6R&^Ri+iBR!fuEO=#ov@^Oa$nMGZbXCaP{(2win6}lfy7E(5jb~dfrW3s}P?~>`%B&r^+LH}Id z9xuRJbNBP!JCz*DMWrx!u-ChVapPa=tTQGDX% zSXrAo`!={w(B&!fDa#FpCYI_v@-1u8ybUs^TC5;L&vTI+7Bbe6t6_T`RC!2hm}$o7 zGGOLylWoTi?bXRP=515s-Q~Y+m;=|;(V3$?r0eU+s)EgPss}+luWiCRF5Chm9nEo> zye|CS=aiu|)i%bV$LsGlLR}q4u+BBCDAo;wl(XZgf+hn8FB2+06T2Rx%BR*~)}YgI z92=|XslL3Pol!5$WcyUYIyh(hsvqZd!eLD_6AxQg7in42_A5q;D#KkA{K=DK{b`s1NgJx8}6)c+<>RCY%CaPW86trOeZ2RHkYVy#RigB9)3yCErR;-q;R!OYr^AD| zwx@i0%X}#2J8ZSHyapw3>1ryT9MO(mHKO#2B_}Gm;Bobbqsja`Y{J-Z@x-cqQ8`Rm z+GN4hB>h{vtDP=N!BL3c(riG|?kqPFT$9j?0Ltm2-*D!h;vN~&ck|vLG4RZyb+R>j z!Cmx|TFe`RBn4hbPgf|icGulwf+@uta%{`oPBN{~pn7vA@;(UC=eDxUpRw3rgzk}+T_3|nbwOieBSL5u z>1{m=VL*}TJA!J78Wr5b%DZPA6AiAPILJ(+3zY43Aluhd^{<)&@IAgNMKZYYeqO`l zGO5fZI?2vs{o80rZRq;@I9O1gsPYYwdt&cdK9e31pI!&M0;<6boJP+7o&u5&121>J zwItDeTLm&UjCCkc;e5)a;oSV!w;Vi+CrSR|{hAqUxX|l}_Vr>5R)u4vc1+029F@T) zvjgdzioV6NDBAW?ih$%r%CHe#0nB3s>Od1+hy_09b6IX8isRU?FlGutDWYNISR2o)NLnyi4g|Sjb_V!ly(tXsc~Pa!z?Bgy6MlHUCx1 zj?A=Z>qq>GcW!4hhT=6ku?wjk^X)0y)Tu#ZW&Kyxv6rEntfhuziZvrVZD=u#!p5eg7tEqYo%z!xVffrxQZsSmUE%tW}uqx91 zqLo6^g$cDzxXKP)@g^{m?-}ZjPBWpe`6?}iRZ!Q=hKTC)g-%XR$~O3Ua(SW}V0m?h zqq@Bt)M>iIV@A|@W;)n#K4A<<*+(f%a|x-k^*7nnFk!)9p~l~|IQB}Ia#QTb-Jv)G zgP*ou_J$6K%5yjLKQCv6X0aVldJx%o28L}It{b6hkA3iPs?`4#giRmD7v_8D$%KhY z``4>q-GNPeh3O`dZPRA5+vN83foy@;$z9c=it%4xU)!KKrdOFH+d_z9YKn*wSEXVF z{R9`su~g+YZ7BmRRZM?0uyQ&bQCm(<`hKZ< zc0`f}K%rqvoR`zq8o2ra4%n6%+)pib5$rtId~(`uUSXy579z>XLe7XBRpgKm@; zKJK!bp-YpN2Il4gPLkI&E2d#fG-)~Z>RcqWc^CZ$`!08)F7r*il>ck|C8^zm zNKl24Adg!*>hLFz8_AASacPE)B{HgsrH0cmYuUMWf`+E(HPOBJ+DHmNcHX+GZOE&R z0?KRy11n#>d$yov;M1`<+j{T;M66*pD*TImv{CeNo{MsWFG5*#NVwXpQ5PQ4Rxh!>7YUXJLQ66cJgqSDHl&I(0~UFk zSmse*6;!>E{;(4n6mfmnt9T|Qq490vseWc63kFl-H!DjrjO+7Z;8_}u-DF}&SLiWL zm~{JhGb9&|mQc30Ql|DKh44I(#Uk5Ehx3Wp@Q$tRmVA-ODlPNn;X|(9)33g!u$O&1 z(scNq)PnK1I=`qrQ4tl$=?Y#Rv8pZ)XA8m^Fm?5pNT$80@t(O6?EuHjPRi+rVmJ6x zQ56fhSpQ)b@0sbR*0rYSrxVzq6AyfaQhm*dEnYEeyIF~jmLS4(wIDN)$#$wUvZe<9 zgfkKgFk(*sC%95Tc6JWOp9Uqh{o2+;K=!m!lA=*H{`{X(<72-%e)<^+qYwE`5H{5a zuxn+~D1S;zOUvF>YLA5CeynXT1?rdQQLyHK|EW$w!1X_U`gu?fm zav(tL!=CD;%gE24R!9EBx~4F6;5Dt~Zy%mGJTgLC9=pKgZy)NZY-aYgA9yg%p`u>U z6vp1cP%nN?+TqYQY)h+c(~ZvmB03?QXL*0wY5dysB3F8 zmFp|m-S^^4WM{8(MRheuKtMoVMTNNO`(|@MT}%wd?p)1LOY&VEP|FihQPG^`&(`~k zyW87rX;2?lj|JxCt=~W#j({ryB8**yYIiI25F0@-#C+L@S|nhQA_F?YB7 zk(dK#WMmjsP!LJhkGxV)z-!9cY$X>%Mn;zEpexLrVf_dn%o1htkG5W2T6&tRs? z!7m`t3ZypkMOl%KjEa&pHO=jJW^6FRp%TMYR4)a9Ot=TquAxsTDJhp7zrviYOR7tO ztrea9X~xsb3k?f&U&p~s2ar|mz6vyK>=d2BfAvS)|GN5oCz6!c{8MA2p}BB{w%Fr{ zu&^kgw0u$>V2(%?D%2{%za^lKud1qgX!v283yq~aFP&&ic7O=o*@wjf7#)E9cmKS2 z4pYPhTD0-}kZv)*(f*-)&W1VWtd{hM;|kSoO8cGhG)& zo#iK4@LK7XlLDAM7$pz@q(?K(-8u29?2wFYjL?_3+=YYYDHZ~5D>5HD`w$^bfrt%P zX)7joTqYB{`$d{oYzaFMWLuu>-Pr7NdHXgSk#i5imxE_$xWH`rzF+aUDbDBY3m(xK zew=1lH*;@G!!Q$9hM-zmGiy5DrVIIF9NG@2rT7HF-33)S%?U~{N^UbNd*@j|D|%*T`e}c+}tk_&MpfFlwI?i+YB!$H0ktzn_&-#R&C3#_zVtwuyp` zgTtIGxXr$ZrW;)@Z$bOOMTZDCvNLq^vxHg+o5N|;k%p`8Up8w*74`F{Sr7MTzZtaJ ze0`Iu#ie1s=Vm8*y_LQsv?C{GzIq}Y^sTocg31K^+J>W}`2&htvNNLWnROru2fWUR zt-i5=xh)5hKb@4=OZE)gMVmHTwYwJ6AXP@I%>r7vKm+}teh2ED+Y-^rj>PT!YAVBo zdN+_aBu82}oPRBlGL42yo*nzkg&b~qCeGKj+agKqiwHNs2S2T?j)EYzDyG~7cC|qlznUjXF+M`+?CZi)D%KH@n=}a z${a#5R0p}BA$BEn{g%9O%=%h*8`9q{Z2KqG147i!TK0^M!aO1pv7Fn#mtHB2>+!_L zJ&CysIRJ7wA-5AM?Z`L*+DlcEmq6J$Qn$pe2>W{G0v)M!QXCF`!#1<~ELQP=%P2Z$ zmGSdc)77VHE>y)VsdnLJx)kuuIl6Ux;74g@%&{wDWQlrVD+Gk>yB?D-doOfiiTI~M zc|M2{DG5ZfZr)htYdvLV(5G6ISX}|$*c|}R3b)H2kzaDzfhICr8UzDepizQVCb;vh z8`WXG$CCH5&8m1~E_LsRAT6fM_PAIv*FAC6q$wZe>?%|Rl)ZMAJ+b* zDr{Mf+j)TM{Ni#6KHx3ZU>n+SdkfdwCm1w)oG&=ot`lJ7xgZpGNYcoKA1|(L-02|u zjiWI{VTNgW2*+t+Twwv8#Voh+)%%;r9qV9MWQ2=`s__YnKQm9Z=J1x|Y!}AjO^IZy z@WfV1I+yS-WC?1Asq8xJ2rn1Mq@u!u#cK>w+uISRq~+Dsn3yU$aBw;zr+<8fFs2Qb zJ>Bkmfl7*#w(*88ni3x>mfF(dJGWAyeoV`wgfw6Jk68RBCsh)wy3Lf^2G6q?CK-iP zNW*9S{e||Jr#)QFRho-tZK?O`!wGU~K#Mld5q7EAYV+jfU%~3tn*$4d>$q3Q)c1av`zs&FRK7>AVQ5&)CE~uFcE0nRLvyV) zNO3*lEvRuol?Mg^jMIXViJB@qL`{ZbDW zuCRRC1ksYM7HJyPy0c)H1KvKC>V8cz{+a5Ndc8jS*=5MS!Vj+=DJgD**< zOa`XDmPX&~kp1JRiKQjm0b452>#U6#9^{wnH~AY}KN&X%NSOn? zuQpVXMkY5VxA3W70m%>?i`BG*lK=;Z7LqJp96uA&#yE|LW_T)6K(}as%-F2iG0nr`bS^y1(rszA_ z^)P+FM1Dm@#oTDYo9ho%DA*J)tgJ-$l)nDj&uu3ssi!ba9-@wtu(k)_(%pSm-Bsb6 zpZ7=cu63%fz1qrpQ;)muH8ns{s;RC4>*}H>sAvF#fHsgNN}^Y3D+z&oN{ls4jseKJ z1p%TW5Gg5i0;Y4XB@x_Zb#`{Pe(8OFEdR*ic&^qBW46*x} zU(epFf6Qg2&I%>dE6JY<;wOO(DM2L|5I2z2vCLZbUqUWJ# zPkXjWAtnHtt*xy^7i?coz`1v!y;}jY!2wcq=<1iM0|A~x(!KzRR)6vXIZFpYKyGeK zObj@NRp6NwEE51{qYtgWuRs7qiOL19;B4Zcq2bv$cF3B=RpjOZFtpp&a(uHQ8K7^p zZjI+O5dY2ivp99)HxpoC->;Ms{uCD%7p=XkjD0wQi2$|BcbATVAK$*A0=VvupI_uU zboGSQtW4H^{P?j1{3+yn&IQm?Ap+3$hYCOU_xCStZ^zn97Uuw&X<QM}MG;_`hxJv*O6eNN{bf2%vf=629;?;1d*#v5B~EW(N5| zoX?8J5Xd87ndau_ClS5?o=h##M6B%<()X>~g*-^|lVQ5njTML$XNs1>nE^nL+$V^HM>Y zrGG2=f%4EfnN%4T1RF&HvW)bfbF}do@V6<%w`cqg39K~#)_|)$#7?qc(%v#|E9_QU z&iGg4GDyIb3mJzrI;SlhIu*F^yEqTgW)daR>zblw4eMPhKhtVi1Gj*lS5Ba^wY{|r z0mcukwH%?GFY&^Ks`dR3skXpx?r|Rpz~7f6O`aMU@}!?zW|q#z5Ck2?u-;FbeJKb|8NJ z)aorhkVYs_N&C}@KB^d|*jCfFLitxJQoi~W#wI4X*@yTHM4HS4-ocUG%mBSb40^jl z2s=36K1Q!3?B-B^z`{pjr0kb+rE4u=l)aPv|RVI5WZ?mTR=vR=hjM5dt|qqWx%cj%fqGV z>W5aYf@nLIboA2W-cLEo$V4skG2-T9RzZq%3!BM^!n&uJlwp7$*ddwdnQ&n+e4 z6A!8zeTE4V!)!x7YsriwuKtLN!I?iWtlNmCEj|S8%S%ox7X@+q%R%fcLg;Xu_gA=a z3b`YrpwYGHa&2~Lf=(R$6oM@)WH@l{>VOGUUfH|oD0j(j=HevZ7VPlOZdq zu01kLB0{Ph1u8hY@l{mTtIy~uC*!w6DtwUDl4CMcrmeQXC)mZ*x+3#ExNB_3Yb9oVMdTv67r{TEXa=WVv?%1sccBQ!%9@p19maxj& zaK2@!3Ger&?W^@CBHQqJ1ec?}sgeNH+Z^u5GjX&SuhmkSGd?PFLdj|d4HE%`c>B(3 z2k#t*y*;j1qo8~`qo=D1v?DPYL3yUtAf@K~MdhH0-7Qp~_km*w3QfxZRdu_VZ)8NN z>VAFX;KNDP`_EnZ8Ds%QWBIrJ_WyrF8yQjGM|5;W4t7pX-sg8G>bgJaKHL3s8v)l^ zWK4`S7!0Bk_s(@i$HD0WE`Dz3U-I`cp%FOL#CbisTBL-OlyShD+G*$hbo%GvgNu%e zlMkRRq^s=bpTtp$5yYboq`5Ul z@h$4>m;QL8T9kM$L9x}2`6#M5samj99X#v6(u#I?#G-R@3;|skjA{UtAP^x%u8ruh zoZjZ$Pa%q4tNk&!f&E@IX7Rrl#b@bnl7_#~Y>mXw7f&cK-P%@B*Ap0uFoN5zYtkw^ z5HH>#Eq;2siN4L(3Ed9uNfR?8yu98JR5EmXa&6ecSxgEUjdrVkPoqOD-@&ed2-EkX zvRWa07&7y}Lnb4a=tt6mvr7ll<+=QI{+jJW3D(dEqnKzpm5H}XSd>SKDdX$?Z5{lN zvdAq~w-m9n{@OgkizvhdjV+FGU*t`{kWN;b97R_+dJ%!MmulYv0RGy@jelzdMLpvV zQ{7*1Y1f}%_l)4JI?dqH*v6{WH&OfAy4B8|2>EUpKBHiY87=n|fuKVz9X$`3LJz6D ziZ6{TTJeBtM|oFIcOen6*_$sFV*+q3-UDB^lKz5U-TwH4B0q6VB?S%$%fS&24 zyL)9du%ZDoSGD^N84x$N1f)3wve3xL$UNoY!9UxbZ@alVyH~5m(7gAT9!p6}BOO2i zpwYdOWI{+q6%Qb@a*8N$aUTH+t$u?yk%EGPabfy7=$ZpAz|W5+nH(_&U}~J6{d_w% zIoSqq_X4Cxl7PA{q}ez&KE8aqGb<&pte_z2;!@7l@b&A9DwvGp`=y(I)5*OkPeO zTx`k0-eJC$!PRPMPub%2zht?HtSYJj?op?;UZOYJ+A&3rE7G2H@RaxOA)900?*riS zakB=}`E5e&>kb2r5_;<%r>3N!8w8S*k=+kh->XkNr2c|1s3i;oK=%LM(rLD>BEL>j zRBtN@g}6ao?8t&Sc0+faZ89-@gI_;a?!0PXsZ?^o!>?Cub6$G|&OUf)%$?0>GcBP; za97VJGbi@wW-ZUrJ>g}}Ib~?0%88Dr>o{88jQ8;PWKij{|J?qNB`L2(0VE4xe?-zkG6vYdTJgxdny)5~ zV%mkv+_`{R+C;ZDl`IzK#k~@UZ>|csA@kd?@9@`FJ-@tMS@%+eWzC>0-VIrtLmP>T zB?=$wt~d>6}0LgAZeo1WR>k`CHI#0A)~x=*|A?wCT|8x(GP*_r`hN5SyiF?Na5C8^v5T zF5>N>1E!%lMuMw?;16xS1|94YTm%T6>FsCjru-*pRPJdu zSFLcH>onK(`PtsohVH5sSwOxskiVlfI3OVGR)e_p_`RtYC#M5|r&|SBBG}G%sL!p_ zL@Ip%>^1DsW=x`Q8!}zME#Bf;2G%@XYS_t&-w}_k0LP1xp}Qyt{|tnkBz0yRE2vlI zO+2FxQdjxq*5b_YRQuwM$36t>4V~yM--PcS^>H>A2?`y!ygj` zF%3=J@N)N5+;cXZao7Q;j)bovL3#|GQ;!vjt5#8GdWB6Xa2~*P%E@ddMd^eJgNwcs zS1LW>5HSojdM!}U9wHHE8)3;2*UBI;&$P?%Y}OSLEn}T61kkXxnx(WyNC#=QytROc zyKjT)8ydo(I-(@N{$pwI^e;?k)A4h2z1#C27NJCM`Pt6vE_KSHEaz;@_s*q2eW=Uk z%OWbQ^)Oj=$*1#Cx!heab>lh4?IB5Cz)dKXv_#Wj1GncjeJr&w z?xNqVk?nNJzVg{J$i|tXap>8!1tJlPhokqFEd5Sb!)qPuBzwuPYd%`8ZuQQnm-KJrNtu?J0>;Qa-GbUaN9Q06q_A>rEl;f)A4*^z;c)^E@Nsb`a!=j{y^^5A64t`F?}xw2{jdg79O&`XW0(ia0M(6y_x z0RJ%mQSG)%Yg*PQ-Cy*XEtf|AFSA?PxJ;H2lzt!ZKfhr0DGBh4@h_ifULSN>J|ZiO z-v9kWASHe)=FYcwV$|q)heYG=sHpV3YFvZflJOkga%xTE)ZYHB;cV;B(dD5QAc;0w z3TzvAZoTs(n9cjJ;+yGc`G*J#?J7rDlBA2eQAYYJwURm6ise3U<@mt>SZx389@44~ zvXCni=`{zHZ|(M;B&}bX&~YW7}fN6S&q0(Wd3mfPgsa@VL&`5i!-AY~ZkJo0PPZ@g{DsRev#qjT;kLZ`PlmeI102lu$;`O<9p9D;B4g`3YM{h+bcA;EKFKFOJdx7cOCg>!d@QNK5`-OnkfPI_YU?DM*I|)2iNVz1s}*D)?|4NjYAP} z>q2Nuuzjh0z32RlNdw|c^V)Li)jLN9T2-<#$Td;rTiudHbCZ)Z*v{4roOzd5vIq_Q@`nQ=3DtJ_wzj zaxUGtL)g87>qzWMor@?37gZ$1vpc^Hp|zCm@c!Hx{irr65hrvzU$Ejh;EddO{R*q| zinHbB*xC0en{>*Rhq%Jl{mYLHM?dtHo08?$=c2YibbuscQ`g2KPK&coz$upX+wGJ1 z=3b-OV+5Rdj;^YJt+)?1Dl{LIm3`d8-7xI0cm3mPP@8IqR&Q@HIyn~NB0IfJ!znt; zcJE}HbY_G;FvHjsCJp`HuCOX6AtE&USPQMi$M zaMpZPLL#AgyQnI0Q9qKN#NhbC{AnJWa0de0Rj)GJaby=Z{aE8PgHZiTp~#?g3i>RA zi0sC_goC3jJi|*04_n5ie1K-mJBppd%L`TT*>UYoLi3A&C-Y4ST{XVsCN1Aj1mxa* znZXCoL%CdpfAqVrwufO@+)04a4V)DLDsk7v&xur*>O2HwulGqCsq?}$FFU#T`NRIW z+rd7HV*B~ulH86e5_Dac{S2ko_Z(+9$2+$RI}FLn;oT*i=j-IxTXm)2u7!v?FJ7BpUpR2i z5{l%SRBywnk=fg4D2d^f0-=MgKhJLqThgl9Fv7&(-ZRhz?Zr=L-&nu}b%>(wptjKD zi~}tLHjwBeBmYx!Mu+EdAR5y5Xp?Y`%XNw0{Km8?zvWW|1L`Y;GjoK03HsjjarJ|%kn%*8pvG`gvQfF^h^BxjqX^69TMpK$Xp8;w z577a)!<5ove4iZ5;@NeNxIZtZvccoqx3P-lO_~}Qc|j4x$L-opr_J3ATcvIhcmkZ+ z@rFkJKyU2Z*GL$;RYk5AnnhH09)1298U5o$n(8gOgzHuiOW{drn# z!UMP(y2O|1wDM)H-6roC{7_x?mS6mGOW9f-ogEIb$F9Z5hagA3SD;Mz)`qz94ovFgUu2IK;YJ=)HI8)8H6)f`!RC}v$vi7f0uf?Zq z=I0#8Ss&%7qN{ar{jZXMxn#h8e@3)cMv`Iia?3_PnLjyLs8yB%hqGXqdg$wM7__ByZF z9(^>l-@Y;m$;cP=rOnPsJaaQu921n!&M*v0>q7<|0chBUUaBgW=`-7uaMqr<&`ld> zJiK3Fh1-6`H3nfD-KBx3QuA>Fw=q^&jfE(063Z;Zv$WLOMeG;GR1z9phT29^pYzY0PNGHYZwL}6yMadx?^Q8T zw;z7squYi#`=u0Zp^xTAf}aCN@$l_y-yBdZ-wHbYIkw6qcH10Ns1D1^Nh`XOzeA

g)2NUld@+2<9*$gcNFnKr#)${|21;WlI7ssB8lfN6T`gT3sA{4Vx_6bhw0wKfGh z?C?QN*=v5*@CQGD@xklzUSCX(pK&$sD_P@Z(`~@{V)k9&@+|h#rzIbe_=(NU8p7|N zs??ek{-X>)1wnwGBOP?_qmkd6+@o$AVRjLIa5#ht5rWquMvx{_+FiKD4WbwnQ=u2m z%9iOhbPcb5;~YnSet`nA*AMMbIYWXiMDZRCyyn^Xkd^c?JIhV zeIj)9dnD1r3;Eq)B%rqYGb=;}yN3>T`@s2sK5KiN%gSr-F=B9De$vf+miPmQ z&R;h?3s1)q7T?@M=aJZ&&BMNS;jeTzBm?sLidxdw*nnldnr9q8dZRTT9@P5Cr}_!Q z)7080N&oD2u6y*upw26&I)@Cd!jssyDJYhIFFlGdK*3EMq|V@Ap!B!EZu{AZeQMjd zYEPXjUzs7u?7M`pVITmn@Ca-3g$O`1R6$is1kKK3Yq5z*@(i{EycK{5G zxH77s;2EEQK<}LUFB&R&XBU?+M0-GpR*Sw%75Z`fk{I)W^ssyHpxb+xUB39r_IzFH zrs%uY$VspI-3(!uJT;O-5%r16S-cfDKV@YsVh(*&X=&+#1O;>&L+uj%n%7f|!ex~P zUJsK9Na^*(`Ra6M|Llz9ndoO11yxm&i7voE*10fwkU z4wdiUzX#(<_+7rqeC3KvL`2joJBXN9Un}w&!XQG14wJC}juSN^z7^-NX-UB&Pf6Ga)3*do)7-ZkDVJy>+=^tdvX;3?3J4L z9=CdGbXaenC}QDz0K)g=$&;nlFbp7}s3YL*o0^?X`t=k@pqeS>^_p4FKk+FGivpY1 z1){&3k{v9w7VSVFd8G2%x$DZ!!Ywl?Et62^9HU4hZlK9S~sU2Kd;J z8D4-(2#$&eyf8nff#PqF0FKj19nBm`@s0{xY{Z_ySgUVs32);uK$!O0}(uxC$j zU>`qzY~>30RwdQ})L9?L2Tw^(MoX}GS8+d0PAPBSN(LpLQ;NY4MN3>v?L>F*y88QL z5mv}TNi#}#!R}j9F5B2o_{;W^NyB4K zMZmQ(ST++SUFpd)!=*xqdvabYhXL_Cr=qIlMV%r=ZeT8_r?q}R$$2O2nrAeT9UU7Z z^qp!JHA33Sz18mg`P@5Vl1$Z%2qSDnD@_JQkieCa803>hL6z|Wuy{k6ZbhdYceVGP zc%qDF!8(yb%ZTc*X5El3dmp%_3ss8kR3H|)fN`5_9+qC|fH)cvma^ruv%rM}jb%?k zobi>yg_kDDOveE2IBTYc+Hu6}X2uUbq}J*yLh!urlkCw-t`VIGEZt4edBPoJ{|y#w zVk9_af;-ey`;&t2z#dxI%f*t?VManytd-m<)GEr@ptcA}zZ!ub6%{!ZQ1OXP%a*A_ zbYsP-@I_)Wo+XD$)KT-n&bc+8rR2;6^D&x^RSH`zww4us)>7|zS<525m;t~xO_Ui7 zlXzC|@fvH{1+tdmq57cN%9uE?pa)rAtR8~m-Vcen zU9;C0`09@Zm)s=~-zgs;`LeHnKEq*k{1P3fWkDyfk6ausW}%18gc0P9@pG&0YxQe- zrSqrO*^6z(H31!}1lsbIM<+I=l0JwNf6|*TUQ?WFpPOu|r);BL)kt&sex!;m5>M>S z6PV0fs>~7=utilR})o`U&{3~*K7Jm@@2x7qySRV0VEfPBiZ%WA> z;kI_9yfAU6pF7KFYwbi|UuRk(`oQ_2Wr5dnk_VPnf@RTkCFEd_&5MDNxsNHmPS+n_F^+b7I&*vO9@f5iIO%(PN#As%ad5Ai$OQ6sE-9@3GunBR@f5uDtTgW~#;( zfkN8ZX)lx=Hob+D*${s|VLqOSy=ZU>H#gh)<@=bsC}3BQSr%d^>!-qOYknLyb0FiC z&ZeuTv5uJZ7{h7F|1o`)lBHDohWd78d1!J4WhVBVnX(<4vZg;5^$5nLwv9hb?FzyV*J)^B}&WM2HIcmGa9)Ra1N#wET=j|Kn|aYrx|(& zre6HnpW>q;sLYam_p4*?DFzKk7sR2n(n-r*(Aar;VmA5^?3p=@=F%9KVI(F0iaTQ} zu+Chg)NIep^K!AXCd-_wYCdXfnN#hy0G#ob)Rj_h`qtjwJ_?9#wdM2?%pw5C;59lh zRsgpsV!fB4llsf#0`h_mt*yvV;MvoaAhd6H!jdi+TTE%?mRxI>Jc!t7)o$;xlz z0Jo-Ss}4SSGJl|V_LgDHqXSjk8lgx>z_T0ROQLMUE+U0vzH66j%wnqh1GQ?J7P^j2 z(54aX#JHNSUEOmT+rj2(UnMsqRgd&tib8Q(u7-F&>Po0>U2P}p2Q8q8ciFT$E(%w7 znSK^yN2h7&@qBxPaF$Tq3VYk|({Gyxv@IUDrOv7LmMX69R=xY3f7p!DoTwF|4Y|$f zhbyOvo1Vg_+R3S*-F1eMz1>p7>Ze(39xLtRaBY-Z>ycn5um!4sVXAk?``4knMzOa^ zS-1@LzU*RwyFbE+SnKAyIO#sBIy{q(UgWSGqKJ0z{}Aq0hqLM`Pu7cHY|{5D2fTW5 zianMtJGLg)PU<5HF1MTRxe)ujXg#OhUT0h-UKqnpQF_)bPBS(33uX0Fry3Z^bhX8c zX-ZEID(GW(PA)-%LKETM7GH$uL!2nRc*YNUh6lD8b(D4CVoa-{J8I~f`&{a=f&k8p zGA;tVw>bJs+ufTAm2o<=^DzXI)6>5ZW~NV_gA`NDdP7GMt8Bvp!77@>^OJ%hn@N zZ6}#;O|Yd)W(~1VhnN;A>}>*ys;2PL?HE@0;7{Dz@(q*1Y3|U9=bP_*&=@n^p>dZ& zmbw`$odixI=(syx*ztMWS9-e3BRBb28%R3I@{*w zdTAnRUw;PjL!&~eZdUNUEB7!~XCB0}?3J2|^W(Buv#|H3*u~)qLoANU{{ewOf-%la z99RG+qReyqL+sdx1tF=wX`E2m3M%IG^w?7X{uO=BS;e3 ztA*v73-2s9l0g?2AdtQvqri&dl7%o1!8+N~#I>5}Z3IGMMVm`}PjXA+V+so~i)=!# z_b6I=bF2K;0~lh}a3l>T)%LUl8|bDl;#qD{&bru~+YD-jSDt5cfc25$`R-z%)n?uP zj{;2pyiqR5Z+97m6xq=}A(t0Ai=~CfBPO@>>v8w#`L_!TSmqB8ow0P9bTn$X|wdW_;WIQmCgKiK!2Z z962G(OMbdAag3}36{g8t|2bmu64cfpqqL*!=DAr;qH?MQcb`gF%@0mAoD7_KC9w^v z2FX#ae_6R;hmrG991XTB7`AY+D8kZeH`BU}NwHcM@w?Ivp=1+OSkjt`kA16DJAdQp zR-Y@Sdyek&vEz8zUSZA(qlEZVA!+Q{_Q05~a=5KI-1VUf1>9J2{N|9-hRMS4cU22) z{RRQJIVI?a$|4N#b+1;-PK5rl;{bz2@qoaLlFhoK{g`g!3N^Id{pJEMOjR8}63fyj zA$h-BG|8MZRvcwa2s^)1ck)&~H;FGYKAE?)_3(T4(Tg*z>BLtltsLvItwnJ+i%d)5 zWijS+**@-9JIo_G-=alMMc@-JvqKJojkx?Ph_-FnAeAps`X)1$NdS;z&)Z=mPi1HKT;8 z>;y1KbKXtc?u1eO>^OFkMg3kNvzbf@5_QD3{hYf8j>XLv2F=+J?83dvuMf^hWql4dp}nGNy_ecXhczvxf>(?v9>`IcbnJ@$ls5@yq1$IDVa(WY20vQtH0{ z1T1&RUV}`U?>g*r{Jhe`F&ekZf#08WH*IUOhg)AMQmylt0^3B^H zh4G7j2aNrB3HefmQ{*cX)C?M^?6ccJKmFp;?3$WF`*bb6(H_*F%A($3@>%)EXZ@) zBxw9lpQ2ZB1tRE1-*gcN z?Zyxiwu*J}wIXDemSNI@aI7x6X|1HFQ5Qp$2^1~fPXZ=X0_ihwHCvp*BH1ao11g^C zlQ;B`pZWsS$9Eq<9vgI788~z?H#^q{y~cF8<@ub8}WM8wLrlr^|m74EnQ* zLs)h8riLXR0dMd7hva9MA^7@AN{jwC_KL2XD!rNkoKl;g#!9@$X5)rL2s)5)10Sk` zAz#Q32o>>OoF^S7L)LU)N0RoEuRVh?HhafAE4`(Q0zDmGDx-7kr zLtOnvRgcNt__+Osxs-IgBl+vWh=U(cw8)?I{Z7z4ises4j&II&+t|+}fANQof`6hN z!Nozwha&8Dgx^si)xQwg6osv7Nvae1S z&+`LN$5?u8(7!_ zANj;6jP-k%d{Y@#$Q60>-Hu(LdKP)89|m$OPa={S^c5ERE_L%~8ZA_|{+F#$FVCUf zwy=?rR@r5IWOmThZp+26FW)z3NRc;c2AVYdP`;gfHs(b-Z(dnh6_!`aX>6B}kQEJ# zlaZFL8Q-MSuG6YAp*{~)P#dQmHjw%joDs~sc~d$gg8RMXHA_a5KePE(rks>40=5nO z(zch4ZR6y_1On!b|C1l_FX6S941@hPZsFsmVy+%OrKtU$-l$~K$R-`TSFL7r%5PQF zEDXh*cddUP)TT@t&0;Ni^5b)EX)M<|U+4vmQwVz9EzO{C8P*cc!f;w`kGyRcJuq}& z@4DR#LX!2skTn#3>+I#R&Ki)oF#_L|$JmHYFn1Gn3qFPejhgqL(m#D?%Pob78z-LC zE>vS1WXtaE#MfA3pBkM7TlJ>r$;ZC7j6+yDG0EaO>J6uIgQ6P3A%m4$-5d!m3t>lG zUBgG?)7um6Sre`6akGv`$x!;GYesRH;J%!s*(2N3gicO^6iK6qR5Vs2195QXar>84 zz|=T-Z;ceWBb(r%pPPyk)-X42DJX)MdV~Uy-)&4{DZ9&8wjK)RnwH%4VK(5ir|%kQ z&l-8P;xa-NHuWGD4v303Sl|M?kn)^4&tANhAGjgU|3ppe;jF;p7}x}h+k>sPAR8?< z7pePPMqxkO#^B?<$Z|V^QVl~mAR!kLV;zX!4^@)%RW@8*qhL@|IoF~!5)-T5l;}*0 z_b9TZk{%jHYMSMH(MbTqmUrzy1?m&33!!zdkdoALGD*Kf-8P>H!K?kP`s^C{BjaM z1ZvkcQBFs(T?DByrjX@qitX;z9n9tYi?8GYW65l@@hYg5q^wf*oM@u*5)%2oJEWvJwZ%MzGv${3(O7hQ&1 zQTX3nJq2Agn8uw(aBV#&O%Z%;7%`giG!1S=Y_DpRmE3l;1?IJ-Shwd1WY-(2t5oWA z2-u1lnAFgL#D%mq?+yEPKeMfvPB5qx;ChpdcH$<7o5nspMQe);{ryX4%93_^l43g! zu4O`_RV)^LCH(FtMR1dP*DxH-Bn9&2@m1EgpRMwgPi~CC_(~?%C5oG^yQ=m0*E1wv z9NVtygU#UuV|2Yr&e@|KXcscYVVurKKZ&RZb4jFl9a0Lw0R!jMDwlTks%wS!31!k1s8DxR5Qu#;m9wv#D-zB4Nh3Nqll?M8C*7ZrJ$nJ4|(hNW2vK6-z*%*mRPxCiJKhaFjR@+?{{l$Fy$%l zP4X*@vgMQ|1bVi~tj9qcPYUUMp_gN!DBUT(ZMctftn)*OZt#D(u7TFdtPh+~*X)7bd(Wx!&{uB&O9}S+tGy)eJ1gi6DwY0Q6 zKDE7bgmXuHaEv0Br<8O$XPV^s9_90H0*kC1Hl;>3X zl8C+jFsZ%J7XMv?%kKkm;n23DV}!_Mz$pgbsko`nJ_beB@g>uw55lDshx_?~%)`NA)JzrL`x*DnLZb$r_8>xAH^}&6#<@NrKBZ zZ{x8UjYxtF>hBiB&;@Tw{a<}=N{6dsE6~g>TSKcnU@699f{P}b6B#h`Z=IB1ra=dN z^e`^rNW}VGa4E=TtZLcPF?>oRydtD{w|%>Zx72b+Ag8gcyb|J8OYB~^&{|Hy>8Rj= z*BNW{MEdqtfR+1VV~^W=4J~KmrPnpql;vQnew-$}4C8 zm23m|OfFP2pKkGiJ6%6fGJtmUwj)e1);a#aUIW-%yZ|qq)DLXf`1rUpkp&Q3 z8sIs~V3zlMhBSjwHGCo&(>z>8FA;fSWaRZ&X?P0EPL66Nu3Vz=4}MNGP^_#n>ooGH z3ve%q5L-d~T3TO9ONaE^RnfI?T^=4DCU}oBtPCZ_+0+uiAqR$`4ZD-DcMru3yZ~kz zBpmAJxy{d*{<_&_<#uAY^yj!qSlLx*_vfq57)$}b)xVr;QUYd?HQtYyR4-OPPJ!^lA(Y3`nIy{sKkN z0e|KH=3Bj&=6ot>e0X?Yvn}zdP)$uunt+{d#FL5RV^<(qDiJVDEBORZAhx#Gn|UM; zE5^jsG!$@ZW3)ZVLETrR^Q7#?SzwWZtSt+(vMN6KpXaKb5Lva03IF<^0bIvJGigD| zsnNR*KRpw6+rs8l{DQxqksbbdE)gRZ)I&_iRhlb5bB@5 zW>K5+R(Ez}4GaE1y50gR%dYDdR!QmZkdjX6lm;m!Z@Npm8>AZqNu@(nkZ$P~ke2T5 z?)>+y&-;Au`Tlbp%3uih6??C}_S$RBHRso_m}2Y;U03FXMjmpVeQ7*eSInmf=wwVO zCtcCRYUT3ox*a843i9$e+jN>Uie4QHjDmtX`8z+*<0^|mQJfDRh2WjO?-kq&vwjTF z)0F|0Wa=e%aX4O;UCMaepqNm#=Ngpf(pXqnSgKfu-*XM+O({{C_kFFQAq_gbhJLu& zfolC1>rcz#ojcn=FcR7_!`pLr?#gHfFcr|ka#$=OL^fW^T2C)y=;iu)8?m9&dOxTL z{TjUf>4_Rnt#oAb{?pOw&kw;c&u>%h8a@f5pO6|3Q7dbA)Qp1uvL*lPTZ(IM?X_ey zLHEO##RzyZ)TVgof&e=YX>cza%2>R4+T5`ONM|cE>HI-4`A^9jZakLOmMoTB1aF`i zsFuS3dK`Q*v|odjF=RqS6D9hzffPQfM*>b6!aiEOg;2reC6NWRtMf0pxhLBL+2wk2 zlr9PGLQrw4G?x$KiQxX`T32ibal@%|nzGcA7$QA;dwbD{;nwpxUK&5U6x1xCh*MQ)m}@~lve%5VgRI@vN&`4S@`f?I z`uxlFnvsnIzoTWzC4Oo(+-4j8W^B^t^C0v-Eh${*tq~fXI!CzS;o&xJvFPC#OgQ!U zasaGKl<;f@t{_nfK)0Zon`Lk*G{25^e;9-y!+^y@^TVT!(qn|_6RUB6H=w?X;JNnD zoB@uIXMK@JE53>(d~9lYV&iD1C_ODrZ_Yw?+>tt-A@YD$u;};`+n=5+od3Btf;u)f zcHKcrkmJej)QcqtT!5AS1MT@5@vlMs0d!1zEZ^`Q5cMC_18FF5i}-oX^o6vbY85Qm z>dU6qcJzbbmp9?ZVgHQgKOhZK)-A50(E_DzpyeEN_6&^L*NV=iiL1h|U!P_tLg7!% z_@N@t4*-#LTWOK0Oa$$}=JUr(xi;kaC)(CaC_6jU(he&m%jCI5iu33y3;(mk5Xm5* z1MBSDP2#`!3_M)ir-Kl%e&4S$+9upCw#?Q!VGT10Gcdx*7UpHR* zmis;Ug62Eq_VOeO`i%cQ@;O~1vYHYz4B@A~!@@b<|6}@4NQ>1*_(JykWDgIIy8bI_ zW%Ee8PYpNxc9X-duPA@wE%3N2rGn1;X{7|2e+){D{fQO*NY3rj{t}!WD|+pXBxO~W zUYbVi^2Xrdt^*!}R)_3C9%g>3tW1PYhz6_O3skzkSM8&hC<)w=A3jcAc&_?uXJpj6 zyuiSez1qc|mbQ_FH`<>KD44Lhyhd2GwSRVN>($miM}9%2|I+b;r^ir0d4kvB@u^XL z@QfQdWt~LYZ$+YS$nWC_qVd<3gV2MXSanB|hi_0AbVU(@ak_E|00P)?{Msbxj_;{E-rrcY0|+q-|*^Tm1jDmElzXs(ebA8dsLC6wpu3^GrIe_X}coxKlytfh{{R zeMoHQa|>31FhtAu-n2A`({+f*T{~@!GHGLG5e^4g6x;)jFJX~=2q)y(oGz_XLS$65 zXt1#NSJtCB9U2Y^ATq7filw-Hs5!}7( zEdxz^B^tiNi=R-(K@}<&Tc&vOCW58>I%1!lf?W+BMDZipelvigjx#a8ji~R zdv_B;r-c;#J~;=VN0!Ee_~X=kA0pu<^VC>5YWS#NA$i{@1mUzMFx!`Ncj>Bne*YwD zjMnHr+daV?Ze{ZG)TK?20ZK+4$qcIm<-u>l1;>v1X)&t?OmF>k_3xq$pUBoP(qhDA zM`Xim>r5Ye$~#E$BM*I@7brd45QZ2vAoJ%+8?Tnm6Y#lmRL}NHm>RQ?kxhp=?Cz{f;YE*pedJI8>p5Ztcj52Y zx*#tP;HFATG1S!5IBH1ay*s1h$w}S=Z_Nb(juI>%a`~l<4w%Bzbpxmks%nzh*w~N= zd8+>7D1!V{G2f0_M$r# zlX>n#)m>8hz$%zbv@T1|7sqjFBnPEexjL;qs<3={`fKi83>q<|LL7j_qvibYjz* zz>lv}vVUX6@tl=6%-zyJtwP#Dm-+a`$kD0fj!I!F)60SGl%L#)xKAvE$;i06BA(`g z61ka$ZLPnKa9uI1sienZdMck1Yf)DM1(WKlz%L-<8*1W4)qfy>E3ncb`}+-Vqc;Qm zw@j=jRv%;O*B>|@Cy9=H(F>eJCT45g5YsUt*Gb<->&~ajGTVy{;;9#(cqT&gB=yP? zkyATLpO#EKgslS?F_pKH*!hIHAO}8dXq`!Gk_x`Wd&GYQxI-o0mV!Z`TV<|q!U8& zO%{ZrzQ2GszDzkH5b+h1LM07KtWL(DGN~{MN}mrE8lO0X@ak#=u6|O4ys)5?iYAN^ zRpBv=y>Jo^eB*C{FTlHH7x+sNfr&sE0|tSmHD)FD^>daud|ymFr%!IC=}QBS|27rr&dBs8?Am?`&Y47EquG`mMZO9^ha<1t4ewXt^Qi zt^K&y_ABN|gld`>OAT*Hq|nI2Js6YP_lF2mtS18vwiHqsI2H}L@rv;mFUD7fh85P?tz#=n7qC^T?t`}Hdt?IlCpKWia~5?0+bw~P{f zkZi8y@dp|R{{)He_mfTOY&_Y0ZT5$Wqe({Duve&X;{(`S_p-f|)9SL|@Nz%}P6^5X zJG59f``On}R3yLd4UNod6q=%ySs!6-%`M+NJ@9WixK})@`~SyuzBn2B?fhQn)=OQG zvEZn@FUu39#~>)}!q;tw1|8<$5Lc4X&hX#i^}hk3r9nQ}4smpyM``{T;3pRP|E%&3 zD7jSEV>^OFTN)@@nem8Quyi1W9R>~#?n_ZoLfwC2x<}|mw zOaDZ4>T+^@!~kQzC8T>t9(_`#DrSC2tpC_6%86}`i|y*;<1B5uThYS(rJBR zh&4ySK`Xw}f!2yFTp~W~9J>?$LTA3|x$xiLcTFV!wJu$5x@S#J8B5qOYnt5 zXyasbCA~$K1`XDdJzx72*M6fbd8tw{MDkqt3G^JhxM%?QL@8KV4|3Cd-kedro0W0D z=nD%&q{u@h6C?oXCY39eROinn#+?_U^QEaT%+Y`$C|exuM>k9i=14|v5&>sJ3asR< zrR7pj9F>^1;y6d%fI2QwTqrfGK>uC$#pVldUa2So3hnmmT(5_tl*V7gooz&>oa0#y zbjWwJoY2u;z5d^!TT21LO4MO5icyFw93O@6e43lxOd($rLe&K33; zpeKfCYd7$NZ0sZAdICAN}PB|NSG@Oj{)VnuAA+Ofa$^9u{ zZgMx2=7#hM%!#-WVM3HbLwpb&SGrJ_mha-@v5=Gk-J(8R6M|Ih9r>92Nl#!y;M7O)i69%g4LrXb6m z(b-MO&#$E_m?1nUZK^_uMPA#YH38#+s@9_vDH`$PJ!~?+K`o6Xa#D%r z!Hc`qxV*b}h>yF~jU{RfA>J&+77Q)MH8upMU2c0Xx@=n&FIGuwqqjK?_;5MHl!KC&cRh^BJI-wc-6jeAFbZBO|Q^I z|N0_x-u)G@cQZB+{%W%vz~fY3U6ynZ+CGk7EO%i8B1<8L?bPNP(lG=Pz9J9E50|?F zr-Xb&R2>yX;s|HmhnA5BxUXZ9%AIFLz9W1ey@*Tu_^t=rY;rfXZ@&4lG9Q8-iJ^$M1U|cS2pb*#mK4Y6UgH8W8K9SHia zC{0NpaT$09GI|V7P+!{vwA*X@Wq|xv_cs^f)S6WNcCl|W6q`!3kpvFC#GIGIVgN@mWIo?nKEn*ni>*tK@V3_KFY}=fn(n<9Zijrlr|a~Q;xlb zRoc}t@vk5ohX}gE&+JGpT0@96}*$*oy#JHZ-@JothLUNbEAQL~~uAe8yb9E1To zoNxHJT5=@x;-Zo>_iHxU*%_*Zg-NRh2j(vY)V6$qGt}t#ib5OzMh$UoJX>2pgrbk< z`RNmpX&Rqt=3rCbfu$6cm!IS|o;;`sK(~OWQ0ky(h#qaM`Mh4|MZBM(O*r7T&{mrz zo^p@V%{X2ujEJYr>?xl=e+J(MF#+kfoOp`hOCdu;!xSF7jDJ7V9Fj<6C}G}4Ue*yE z{S1fD&(DuZw_cTm3Q-L27SjVz|6z6`s)gKK1BJd$_TSJBB5&9{9&O670g!gdMuFa0 z1a$IH1pnn!GX=>OIv8lLPb}!rkpcfOf@Z&b{VFOe8xEd?6!go85kgyt{7}GmNKoRu z)h<8~6ueQ2C1GCXup+g@R|K2ga|i+$b9ijnBU>hBW{0zFHHWCzrl2DTmV#%KrS&g` zQ;^`_%R?{s=YM*zq2x_HsL+CVXsy7i#!j1u_Z?Et@HZdnFk zq?#lt@mon1n76$SRcARzq|RDbEtprN&gp zv#R%hG1r&nz`LL>Bj%Qsli())elKry^I8+rvBG4RJg3|-;2}kCu>MpWdR1_+G(yDnKIm`f6H+9k>Q)WQcb(5gV`z|Oa$r1|vag68MR1_y5IK|L{(I0BJE7{jkN@G~E>>9Ect#a2yBC>a@* zNMZv{;`d5tJP{t)v-b}YX>!wm zYZwgjS8^&s-}+QA+*f#+YHk)aJu%RV_n|b81|379nmN|dA8g3 zPN;VC9!0hZ5AxzW!Zj*kc(#vM_Kcm+kl$;+Q*vGc@eq`kC9*U2*M<}`tzw3S=Ak|s z*j(N1Ls)@mAJbpo|vv%6DH)tzJ5sXxC;*A3Mh3Iiy?0_UJ;Im@-{d!T;E!u zxgvbd`u2@vu*9}IXLw<;klZu-pe37t-3a6QTqnG-N$E|yzLpRExEuXK5kmGXY)n@tb6XNSl0b44PIr3%8 zV`FL>VR0!vz8SR6mU?fV+1&hJ$uhg+jv)`Z)<;AIbi1h*;6dIa|3c-WWAzLWAWJr^ zXoHt_wd>&M_L4yo2-W3RF(8D5feLH_TcXDAoTcBvuB;9Z zdrVin&Sg!ie5+{Cx0yahlk(b8Yp7-WU^xI|ms>axIq6fGSt0%TjfnKvPnw~!Nz_={ z&Ng3VE%lh*di9B1b%YkN8KNJ$AE-x128{EY*!zp~bJQ)uOcqBNuqOpBBZaWTL~@#% z$bje}9U~)lZ$oM6>!r1ol|T@+_ofwCFfcG+^(Gb8*Apoy?AdLBQ%RUe0Ngmg8Ji@H zAhnEZLwPx+gbshCkTx2Xs7}$=SK4B-*@(cS<)9Hno#`654{k!*Otu^F}~U77_^=#W!Wz1ZVN`Az%Md|2LjW;Fm|5b4bu zJr-+~{7&32HaO_HtFkawO(qSC@Rj2v?=-BlO+Y!6!i@ow+?mkzT8|F5ppx^rxNVJ& zHF?advuwY1v6LtVv*hD4)82SCrwB1CrI0~^0B&TgRCetq`>h+ZRBYMyq%S?DrskTn zLF^`F-eST}%-VVp+;0D_>9?xKJ`zQJ`Z{y4qv9Kw@2OZ?EQ(pgMQyp4S#7#z&!+9s zeu^7jGp8_-#$?D9+4E5ocjA7xwUxR>^A#8KO&S52epw$|@?s92<}2hSijn z+qOp>Q%`UdIy*btE}|nM+Q9BpW$#j#;kex|LIZj{a`HJWE zbJa$a(C+!Y*A=JI;k=2@65{01v5SZ8PF#R zBfoGWMGhan$o4x$bmlWj))SsX0iudn^lW zERHzT8Z+nmQv6K}*A6azpx$@}UO)orMj1HnJ|p{KUGjC`*r1ZHVp4|`yhZH6cG;Ug zWR%xqz7QvWwNs7&_w@ZFEy2QKF$E{u$^5UZTT+Z7TJ|(R$V^ptfr6K4aMMa!*M=*j zDvS^70ZG@w!dlde$EBKDDkCL@ph&-2k5>{Sh}YWM+W!95V+rR-SVB^=wY@!XUx|fg zY<&E9?OJ!R9O{lPa!BI5tjiobw-&ar1mAVPF<-QO8>+2vJ1VGTG}u1Z0>6~Q^2wq* zaEI2QKz^bWD?Zqz?(3H?7>bxd&TT|-{QUfF^a0O0prId7URURpY(NLB@_^I_R}nK8 zRlqVgC#Ow6_J#!-X}aZ*2FK|^ZrYVn*w%QW9t^R@PA{m+@7JaZo0esC1h&FPcSqtP zAUYdl`m{EgXDN?J@9knA~3hVMP+v1y|XiC4xA4cT(Xfu6ypG(foDLx2E6PD zl!@CNAYMdBL_|bVQd6H6gbjzlse{S{2x-_qz7EAUs?_}9$}G|XD=PD%tgLKkbQD_= z6P5xEbj(8)kD*VF1IdRHh*H1-%6n2E{sMh9Xsm8jnbpFe3tj<{ez7-^aR?CJf{*?o zmd%BOQ{RF{n=&9=2p{g6oJ=9_%6yiW3eHMa7FJFfhR?9XHRu`&a#- zL@q#S?pDJ7Y|uOQHAQdOh)5o}#n#NeIgU;6 zawgY;q)G=V_&d*G+NV*C)TgX>`fM{ox}{+We{UEQgT~2O$`JBQ3N+kzK%j)t4Wvj# zJ_P_wLp)8Du+1#NTAI2R*b|K@l;s04KvabtZVtphA^^(g1ylFL8qnEZppcC zOeAc72pT{Bm$T79{nG0 z`zE=)C|7^GQZy;plUkX}0%EvZ_(nNX)}%rocNoPJ-@vpS{F*mQGy8>s-% zXf<0jIjrmvYP|%8T`0WnwLQdu>z}2JTm+&S@DxUzmNqt$3JTHSYEoqXhXE)`NWcPW zS=uy8sZW3l_arbJY#vWHPymZWz_YMeaJcv{Yf%J*4rys=_MiZ`L}FCAxwp5*nr^H+ z_oKc($SL#>$9IP`NHrQUL1WT+G`Ml}&^dAuditjzssGZ!q0F9zedP4)jDmwB9=#9% zs@m%8K$cq+1qL8hAQfhRo-YHJQ5_6M9vL1)qeKt7F2qRG)zx{O)}!nrE-@wvh44~H zNJ+1Dv_?lpF89B}z`z(wh16b+&>?@>ee_s+1Mp5yR$1Zq_V!*jFU3NiB;+v>P0Amy zAm(WZbDxl$oD0MbV#$QWY;9QpzAsNpUtgb&jxNkc@uSI3yi2p$PIYBv0{KLKMTJW3 z`U8MIJT)Tt_s}bYHSQE~mKDzhrlNxl+U#cg7r!Ui6)y7h^aMX7@UR%70izVig4r-%?9aBPMWs9@Pom74;1#rhA4 zz4^vZ&1DW&R)zL^u_WN(~ zW>TX$NdTuZ5S^!>rIoJjI0Um07_2-V97VcS^!+>T0F4xk>jI@~%i>7B+$}tXY(zu^ z1_?!fckTE(vKaai%wPUEIwc)K+EiEmN zVyAqSW*w>N`#Ac4{kpANpIZ_J&}sL2x9u(?;ZGP5b|QM~-{#1$Q0NWB)Mt>M7MsygAqo#iy zRJ$Rw6~E`EsniKd82~pZe%U9BhEzln9UXler|9bW={*{R2g5ZIN4Dj93IQHICnqN$ z6R##aj+_PPL-0+HOffhX$(SZmhbGxjRi;OgYFhZ*-|{W^D#^>Q&IH7R4NqEJ97a`5 z?P`ba=~hcmPZ)Y?{5uy`Gjk0|b6sGVJ%;buc}pX-L#RXL#=jWO1pu7em6he>Ig2eH zum{a4c?E^FZtJW&EWXdXdoVkpyhDS*JqsR+B&^8~jT6m$nKs0LE~eJ^j{oiJ3zX=!=Wqw^Jb( z6}@S9waBr8bTR`zL*~Hfa=uGXKZm}!Jk_ag-0^Gs$wG*cTaWIT(+8NqOslAXlX6rx z2jOu0Vl>5=*p2OFYMn}b)Uz{J#M+4-+;fRq=Bl8RDb7Qxt}wkBqR8|<<|TWEwN7vN zA36tPUsY~bc$(1Z6FDX!?7K0<@j-CvuF061pqD#=>Sv25z(Y1UfJb%k2`lpNkD=b$ z*)hI4Ub{uiFK5_MZ#HOsBL9&y+>gnYQ1d<9b5~*}S8XQlk7UTo%e`pyn)Idd#*zS7 z>)8J@z*L-ChqJn6Wm<^S{zD1u_-BIMq1gZ*ofOkS2RPzJYo>-`)!m8d0Ns1O&6oV= zC97mNW{Z5H&mxb>a>Pu zn3{xF$qATCzWP^H-vBa+h-)<4)N0t>?3U|cdZPTy_kv)TN-M*GOu5LAk&)dR2N;xk z-LdF3q&(R{1PCq?Mh;L?G#+U6Kl5ZEf(zELH;Z0N{7g{$y);l`Qyg*s?Lzd&l)EAQ zY=qE04{v;<)46t8U6opo?%cG@b-lj(l3FC<+`UPUHQ|S8-~AH;97uNv4kQ#EsYn^1 z%8Z!A{asdZ;nb_=C3CSO{;p19#MjP3pnT~l-}A)E2WOU3jep)ZavzY|~bk=mql)7GIht9oCOFF5Pg2&@u2D`DM6Ni-b zALXOQ@M3GntdnsgrY@ck07W5QK+ODb8GRuBDmtpV4F`6gqkAbdz_#@_JgEO1^ z%;Lv{a`Mi7s|;fsbSMkRYBP~vHcd))7KK+h`&AQ5Eta12DBV2Ge8?|CSyiMNN^o`fbBd6h9rBj^;VyZ{YSxTh}s2@)P{F_=! zFzJ@huJTTMe9z98=`Q)`TW4wE<9OOJ$;d)ZbW$qE*!D0xkxa{h6Qq zMD@3dvm7^dObhFE>CFh5wap*ah- zR0UQKy{YQlx|Ft9ZbKLN)Jo(pbf#I`us{Sq%|E310}0Peua-zZ5^vmCPCoGPZdKTB zk*{1F&9E;b5mI3Y!yTsc1CM|GbE&|7?95uUL6wO}v$v3=9f|+mP9L&v8iamEFhgnsDrdVKNiYjQzp%6V{uNc-Yh%) zqHK>;kv>1M(>iNV+Y|GkM6P3jt5#=o_jc<9u}_FOu$WdAxaM z9tn7_yw4yD3ADm9zJ0jU@1J)@`iUF3;QZ(=uxVnkge7I6o1D)t-M8uSPck)%{r7Nq z-p6kJT2`^xJfn4ka-v$E{8;TV28CTF-ggrv>@#f$N4JlU%w>ej2qSCP%!{U@s0;(v zRFp?99|DDVjE-vj+C=a^E*W4Ey9VE!j#JK_a<-sn`UL7HC@eWJCuwt&%3`*HBtd|K z-yN*JJUAONq7VJNo8K*pnang;ta>55YY=q!75}iW6d}5nyqdW0{{HD_D{ZRF-@=x5 zP53(zEZ*C2cj7$dno}lz-9QQTs(Xx%_9u_&4EztSR}jb~!o;b zD;}{cIa0CqHV4KbVq$!6eLa4oW<~0+m&RdYurMtv->Qb2&c;ZZ1UMv%QrTJV-s$Yy>I7fLC-a!*<*<)h{xf+bMV2E%^HT`L-q9;OO76kvW|;*zY{XAFDNes}kGluvT(8xbe`jPAMQL|+|EG!wNry8j{Oz?8* z8wnG6T#eQ)A6oT)r(vXZKZvHC$(*rwrit9aReWcqEU1FHqVUS*alvZ3kGFERU)uYi z)YLK|q7WGFMn}e3F^CO2?%{WZysmxqEc@dx>|*ru(iJimKBiV4ziUFq^x_+sx?lsK+NE5Swi8Aq9 zBQuz)u(@00KGRS9H~*8wTOF1Xp|E$c_itgx9H-6m zBTc(%r-x#@XpeZSj-F9QMqs-2qSyV>r9+wy%D0j)z3T1T?~JCWHEiIqeVq}HCLG@~ z9n>%MHig^t`RXj?n^ER8=H(20oUZS!^Bs;$VK&BpQY0Zyc6tQf`X`F4q( zX|(y`nG(7?#$+N=8(F(5H(BN(v`YKX0k=eB-;g%Acj@Ht_O*d2Oj;=`M+;p2dbt3i zP&G($D0T4ot%%KN=&#%m9z!-9P~EI11EOV4*}DV$?ysOdz@N;`WZQH~ts=H(=6uM;l&0Ws2t%Z(4Qnue_p zcVtA0$#2@8?0o(8`fgd|^8AP0VW;`5+s%(2zr~8d=9Z0z)WF}xakUFwjSbBhOJr6@ zD-S)Qc5ZoDtsL%+ClSTQdn>*ru45X4Vv5So_tzK1x9478?yd+c`BFCB%A@h08-7_I zzuZ$XOF1sc%zEpBHr0lws_pVvnbOGNX5ZL$uX0iJ(w6C=dx2f_7p$}`@cgc817{ISuF)br7W(F5;h`>m%@4`zd$Pf>r+_=G1eHlB|EUlw z)pz+)XFq9Ntk~%`2?b2E42K>Zsq&C02iC65 z|IQ$Dojw&FK!PbeZ-vFV(=+&9>%Ygic66XrWzUu!7HKvcQ}Su=hyn9$N#NAOH6vbq z$jTd0%JZ$k&SXFBn8rBtRwI28{Cd49p7D;Q_rV-Z_uahxuh~Oy%H(9u7T}D}zFs=d zdXj{(h>Pqm*Vb|1LlPG;5||N-5`XemOd$0o3ABoweO+XtmG;u)ojt=}oOwt^)Gg5t zC{{x~;x*xjMGh}?xNNf|aem#p(7m;6FowPF0<+kJg@Es;9T`XNh3!v!Znz@lBLDFc zSNO(^tSDwd3iacA@5v`lS1sGo?oB&tu?BNxq0Fhg=7Ws~nV%i~Uj#&!e3ua^BSgNx zHSezw3`)?bzh!&n&?k+qazA(hss2sgxhdwGMU~`z^7Q$4hxSCQ>Ll11WpuAet+1$< zb|e?EQq1_5L)VDxp=XDE_zO!LmW8FJ3w+e@S1qGDkNqCZFr(1(ol3j{ECzpHo|n8R z?Yf7*oY$WdDsgGHeQCRC%d{47%4uT-D~L5<+uyC==Hh+5#c5$z=ie4$t;3cXG}yF3 z^!Ae?B|kG<_|tG1Sp{h`DWd(=_1uQI#5kTlJY#zU)3wbrQyJxP)6$mSY5PB!2D^iu zt%Ub<#!RIHElSU64>!-oH1T2FYA|MfxaoT4=ltRHzqYY|!?EVv2&vQ^N=gpB9epY$}pJ+!aHYEw~+PG`h~OlenPEsnRSG> z%H}xnx?Op=BeaUi%Q|i%=l=Q-qSX8eRxD-_#m^6dHqk;N`p)d`lR&S%Pr-BFyBU$gJ0{d3_NsS@!7QBXN-Y};bcUl_ z0-FZrZ_zbhE>#S&`^Io^@*s{!mz6z58UNl9u;ANLpx+~UU{HBD{^Yj|e-mNE>~V7s zqfxNEM>ScrLX=^xC)~QyEuLR$DGK*SMeD_*{cqB?VfdVWH)Q&^ObAt6){P%qUb}JO zm@9T9`&~UzNfu~n{sQMSsN!I@LUOxTnE9+m9yw(FGvqrvdh^|J^X2kR@Q{;nb{+Zm z3$ev-=cE@rN-ev%R)!Wiv55?$hrjiOyEzq<^0=xO-vFn0vx+V6LsiPszVIN7%gA(h zl%gFuILd0cvfI2=m`N)x+x`BAS;Kg#zvQsyp{M=Og5`qeG*?=F$_T{bKeItZPAU+A zw#?z^=%_avBcp6$ZhkWLa-0A(*v%;66;RM0Gl+?aVPKI&8JL-{e7h9=@HP&cH01re zm#_{e;>Gils8;5UQhn_bv-KqJTCxma;ovC07v22My;cSZjepPN>d8R7@8pl`(H&>5 zeH>e1N5#%S#9mew<};UKLA{ZfU0kJY-`qOzTorFt%2BY!TOK7xAkJ~)F~di%y0u!iscxYKoyd`Xoc$|0iRTNg9{`*IXPuHy z5MHx$aA^FePl=ah7@Cr#uLtS0X0q~3MZt1(-5xBCpv ztB>K#iN7@&E8GdWn*&`vy00VZ70)%9D$87^LdHN-mu3Kw5di>_JNVimYO0&P|F^Y3__POu#_#8@1%*>D*T&^!A z9#Q>=GI^^wOPbOpi=Hd~ih`^^#W=JdhKFTje!etxL9U;)o1BRW=?$&@1=kzYuam&@ z)XrgaIP6=S^K5|VM6d{ve{4M0irzH?-{*L{M4o^6IYNzNjz!^HZ_5EE;I>PPk-ICi8ieSuD>x0x+`zsMCuRW?f z-3>i*ceEeBl8xuxzLhp(ypwC1s10!pUt|i0OvkxRA#FdT$HH6$SIlRTqXs9J`79YR z4Lh}j1LM2Ap*ZY+Oma3K_{hOHznNC0h{KAQ` zP!BA6mk#05$Be{dXmKC(SS>9ascZS@-h=nKPtXA$Mn>cdLi&|9CM}7z3ELpY?V`0Y za^{$5yW9B2axbQa^#!8|cF)tv7|D}$!+Cyf_YU-X;*W8A%`l&lcQHHtio>4cNRqaN z1iyN%Q;D&&CluFlp}*S_xHDtOrVm$4VQ8<0CD=S}#=3kJYbUm3%2Sk57%VOs5R&e$ z^(NI7OX?NF>*ewAm_$a(t5*FW6wZ~55;#1k9TkUc?x<=#1Y+!B3K0yi2?hgc2{M+H zucDH&nEZG#h(46=gt;dkl!CwU#e=={6~u{k?qJ%}ftln_OtA10xqEPbpq7oN7LoYR z2*%a5On;0V4IxUYn?|-|EmmXcqq0{ zZJ3@!(?(qTGb0pn+A>V?+V{(WRm*pqNH)ulaIhK(j+`23_3&EW277OJ#I%2GMxHHa z#1fhfI*P&bs1YqaI%8ce<*JQp{v7iLZ#zKk8zW}g4bE_k)nVZ@I}TzdwzQixy4FX1 zy)a#}QrzPY+!WPS*h;yAWp9@Sd36~5_>6RwxEN|*&Z-gwe6MH@jWC9VZI(bD@j=PT zvd0L%i*{daMs+g(NTr&P$XIOnVOG`pHXR1F1e&Nconx4)cXe}v(%o+{G16C+m!~Es zb{_Cd8gFCC$J_N*M`P0}KBJ@z*gj#W26^UHP^ez((J^3dj{3gMSZbuiAp%KyXKQj* z6j&WWQ@nxSGN?-YHU$6h+GlszgS_d}_)EQ346yQ+$ej_n`x3J2r-?n7O0N;0SmmTt zeESmHt>;3+q~k$Q$MoA}eJLQ9tWqAG@-PKK-h~8HWb?D?UaX4!)~)cQ&Fgo|(>`G< zb{|?XupvJ(p1Ec|HB%gIB|C3?65Fn3M~H*R??309$2&{5^O>prD^}}r5wg8zjsVJM z=78=-Jk{>K_G^z``({S(YnSW7_a6O3FKFKyhAzpGT;7wQFEs_@$t7ar|Fu7P-hWBMH*ngGw)CL)RDkF1C?R-LVfe znFcO9OEUd-7G0eCmMmIFLE5e17u&4(BKSbXaC+y9)O@tikZuDaLodU7mC<+i^M&sH zA-HRnV(V9X5D^V!YU!$BwTU*x1Ip-c|*tuv;-szUS>+a)q2v`DMS| zMuFj?p&L*S>ZP*5a&Imy-|UWxgSwNt z$-nW27xV-MN><7P-9(V?CtR2;lWbn}Iv?QEwP@~v0D-g~Qqd{|Di{E2RHFVayFY>D z^Fiwt;Aa^b^+vNzo;VwAwz)ygrdUUyOPJK-KLwO{5-oVR@iJQIasdhs4D|G%0iF_+ zk})wbo~2#0!6S?p7qf)-UQPmd0eK8vDX8BbUfAPkxXS$Obxqh^d{o%Cvb=n`APS0k zeA66&8zh8AF6l54!6TgV%gCvPb1M;;=Tf z#?nv|J$hweDi8zewJjYTu%x78_>PrRHFo6W95d5;b=ezUAS5HO1V>n?qouck4q}YP zlfp0{*+C-c{@Q3l5z8+M^da1nMSzN=Ht9#AhD2*qS% zWCV;CZL_mLLCIQof4T}8)P{l1#`%lDq9U(j zplf^b*8;%hBa?<`nd5 zt3&@i=it>s4Ez(}=-~@bdzRu_ZJ*{B7WRqY)u4b$27j*{djA@KFLYr@0W)!|G?8}I zoam*Jj>*c(TI|$Rk5Ay%oa+DivlVcSTy+=iLQ7w!n$Ws6;uuevRR>MjDw^F(IHn^S@}La9aKVXAP4a3 z(&3Ce2UNe^;sa5s+xLIV%b;04y$@QQthB^t(W!lwMkx&IiYz6&kM8^LNDvIP^coNY zbP%J%;i4#sus6iaG`9jkE@Bqy{=eS7J1B~+-&V;vXBdJgh-6VRl9U`pV2}X@kR)ly zIp-jVN>FkV1cV_EAZf^HBuUOuat2`#UUQD;yWg$)s@|0}*K3~7H>*+Jn(Lwu?czr>9rQ0euTd|vU?act# zTv)h8N=kYqC@TPjw_^bsphqGiq_$8CtA-mXOv}{ZAnT=T@U8iq>{(##&n>aX9s-KJ znTf7bSo4A|F1(vad@qhS3UT$^-#Q;GbzFX}#*=%AaNVFFA|^iXTIwym3v4SBnW(@P zKxRz4(#^bO4~*T4o6HyhN+>Z040s-55td|UXJ49+1(>`8<^YN^c7hT>>H|PnG={+Y zvQ3lnIt&F$TXA^c-hU0Z#PqX-*1w{6^6<5xy!`y@xW<(F?uv4H)z+9IX*BYb? znM}+hqTvI`Pn?@Z{+f60FUEO!F% zlUvW6RIG%_2Q>fE#c>hyojw(Zuy z^S=En6KD_^2Mzx=0TSl!o4g$}AhjpX2q-cJI($?Da4o?p;99S4@^%D)%XjhJ zygM6$lAR8GJOX?fh;{=E1se&fhy~9OsmK~+!t`tf%{1+hYhMk^dwN0Z4pcDJMi%va zuKoEsd|~(L#g%%>hO^z^qnfWkod~Y4uaFiuWVdZYPC1XZ#-Tc7Cuv}!W>3^12`|%I zQ~dQ&0+TcImqa8z#nacAwvLFsT()n3f8mHkiJrZx2kZ@sTX&7cxv>}!DN zx^T+zO18Q-30?@uhw^rl(|vNZM9q?o9@ZuQ(_An{vx|u;^}}HI)&U#F?VY+qRAPty zt|F{b4bjr@a4@WBlybshIZ_HY_u#2$s&=X`(RAI;uzNA_wud*{{bv1N{pg{QL#z$9 zf&{H8p?2Y`8?_zI=39_2cDYTyH3f<-4f)h~u*cSGnab64h^LYFXjj8OGeBG!dv?ZZh(q$!>ZXzOYRe#j%$w7-|l4A*n*uwSftYR&bmaNI2RdVp?@ zJfzuNDkBev^)-xpi}ZOWOJq7jWx0r|sC=-JJ#@#e<>V`+fWHn|ks)rVP(<=o1{Oly zB*+gEb7A50n^|&2e^E=W5q4oe6OP_C$=Y*Ewxx;UbeV@(?-4$m%%XAH+F^(5Yqvzt z>L=)5lh|ZGxy8+C-OAf!AR59Q?1c+gG3BFSJYV)NhH>Psh~E)n$=Pm64XqdOOp9^~mQLNdF)@NI;}|^d%`Ws9oqeK{XqFhZMtPgo;LWNMlhjGhoO=88*>X7ym6E@J z<@zGIrR6N18T%cOi1qg<1q3rSG#${)N#{a7V{9Q+mlPf&k`oI<*qs9atoVM^fafw6 z6y8fw@<=GG=cSR|5rHht_?qLFZz09TsZfhoI3p)9Svgejuww+eeNGVUR|Q2atR# zYYRe;d0=BHYBL;bcMTFSg2orp9!^(6bFW!BMo-M@E)23JFcB)h1y=-f*bfOQL}GK*j}pa5K}8jRuUWb^O`#3z0vI@ z%&O*BC9|vFayq-D`N<23w3rcpEc7V+&4B;RN`<4#!D9r^tY>}A zSzedq<7t=|Q>x^Cp2RQKej<@-q&VD(a7)9x%=mh!x3L2)Q^A+q8d~}i*} zy!GmlTTTEgy~MAUixlpA7&sU2;O1)th=`64$yt`=Z=L?uR4)D+n^IcxwO%8Se?W!4Df||z_K_e47Y4f&tOP`HAifG#DzA?c(wEW z)VRP=!I4;m{vRMc{!*JpF9m-0_&t%upW;Ca7Namc7?-NCydLl8p3~?a5DRGgMPfEhjH};-86qeHJMS z|5V(3Z0b;R+xulNc#q=EyD^*<6Sq)QFd$@N6tkY#Z3&7bTFI;3+o;MICdb**G|^QE~1qd_2bQfs%3XYE_HAU9EKByr4_ z6loJo9GbX^oCcP0!Y%DYZ#u@hnw}zENcyXiTaS4;A>WMJ>^)1jPz zcYwPT|@PS)D!g;!KvUek; z@s&iJ75t$weslGRz(GV9*s6|FgM&lBSd7^Dfx-mH0O=^ytoVHd>zCmd^PUQ7aN8y+ z$Or*Zl9%;j&?rgja-Efmv_QvX_=uW)4z;m8ZM$}6#jsyrDsXBxE6Ncja!*%$vDh$* z82)GBWCnxUJ31y8#_mkl26#ew>#(>TIJ0&V#0vXfNIPpXLVuVEL7H4>t&a6%CLcxa zt(}Ue|CmI$jV7Y`;$W^1Bi8!qwT2HA_{Kkc-#5L1_;5foyZ57!+LR!k=LV4mF=q=e z;}+0WubA3|<<&)J7dbK_+RWeM=w+B@PK3Wx@<`$R7$RnC2S0jo-`V&}TL<=-`-)Lb z>n4!4aG4F$>+*wC{%Fn1FE|J#EpZ2n*o&cv#C0w%cf~}V7GWl?(qgl}mNgiP`NKM|KH7&WXjZOJ@P5nOc zN$9B^>C6U?;=5FeC+L^hof7GF3iXtB19~$4Gx}inoa3)=?rTEOVccgk76#LGBv$-ADqWne$D8VFn}l7}d7JOhA$plWWkEVwJ@Fk-#P{Io^IM~q~RAZgXBH_XmlmuH4%;CFB= z!CmG@VMW1GW?&KYr&pe-#b$G3c%~n}C~T4w7V^3($n{|UGT?2cYAh~uRW8+#CL%na zg!ODc)j`ou*uthsB#_-lOkVyC*;0VBiw4t9twv?)tqXK7O*VW@Y1%A>Mvgj zs{0<~V~n|2^hKddr|pEHLkLYl$30M0qrBrQVDH4uEw8B=KT#n;QBmJiS9i{iUowEG z^CB5TTr6koTWzV#-tNdOfQHwIF`ZwyNQ`NqCH%n~Q6G{N@kR~WfPEj2WRL7^J+%B= z&XQl=?;zO~{)}O6x~d>B zxY%P3D-EYn`#wvHqDK>vl-%qxL3DI7FJCfX>*3$*ZQmBPc#qsxMc@p^t&E=`Nf9zd z!A?g;WL!l?J}yq9FUX4+QAO9n+_4R-(1t zrogsxd8u-+qRmV&X&!em_y+vMkNMkED~%4EF=oEE4qe0eM+>Z*oDi0X#%LWu-DM^g zu&Se&%nqR#7$@da9-!C(2N^8CA@9vk-L>iwH5bFxsRNm5wPv}E>4bbM6jI{nll$-$ zr%CseGCZ3(Z&#}&)?h5sdPBkD@=4*f047Z`Zn}m8myAF4nJzPyS@N14qFJf(#FMUq zkQ>qRX?i|1Cp9ibXq;pygaNj5RvA#Mx(UsbfNQjuoz~9%6rM=+z$3U$3pruqAJNiB zY1~(bgtOOf4e8NFeAV#}|KxJnXZs#am~f4tCT`XHwdY|-_JHU;CVpzx<+3lrDX97c zgt;Y?N9=zYfA8|C&_jg1MVjQcBU~stxJ6ub9b-2pT6R^rSd#KVhd@*9uyHQtsAF`{q z#Ww5f$@i-8KJ%?7aCw&s(P*fAhDrLw`}i`(eVQ7SPB}lkrR;|N+Ln8Mk1|MVUBe`Do0^ zZ7zgv+pr1iQ1}b-oD}wY;BNnrWd9HU#%=%$k#JyX6CUZ9NMPkqe$3fsbwZ&g97}_` zFaNgZQTLbKHBx8YXL~_AuX)p`bbVvjdqmBusGJ$uu`R-FGdP*Zu*R%UA2W_Pb^3By zri2|yJ#Mk*<$6M+^|2YmwWHpBD%hfVZGf9;rmf~ElXLc<|D#pJi&Cahi}c{iu{%tj zP6`Md50tpPPAeggh)1PRiEr|P?1`y~*c~Pj8JijcCLyrtYndwxiGJgSz))F6@8ZI% z&9Ck0m;el`sHwwTI>8Oye9oCxC-lqu6)y8L7FjcG?AkXQ3-co+%|8#%eGjq=fnPbZ#x3X zBZTF2QW3fP&CX%qr14~d6~KI9gRw9^_@~{vU`cH!Pi6w4$M)bfFV?hHZR2RGH{a__ zim(cj2vP9EpdU_bYDWBbRKXh_?V@r+qu5sGhdo0d@kDeV|J+lRbBW@A#912J;kKBO zk760C#rcky`W-&$tCm`W-KrTnt!5>ewx$tO??y%t;K37KfVVa!EVMq&8oGzk zQYgDR;@p~YySit>J_o~Rk5IJILg*2(#~ovY3(I{;LUw9(JJH_AGPpjms- z@3T7~l#XNr2BM~QSUPUs@$0?uZT!-rRY@)cgdc_m9cg2&kvyd~HF-PdxsYyI;-c)g zQ!P{DVG*W2<+c*FPx|W)txR!*j^0eH(1$rU-7^RQd*IqFjV0oX1jJ}=GAb6>nw_=` zP2qKZPJ$mswvIR?kxA^cPJl>e_UtTe!j81@5ew9T?G(FvEcfM0zCXJwX-6i!P=_NM zz-5N;aw6R{>0e$FWHver?o*)Lt>lFX-yxwT!D6k+iu3u*pxo6+#^6QS<&Hp3rEoWo zH6bK^@;E&k=JFIXfCZ4E8xYs(>g5vOLb-#=bixf4-I1TT`8hZgL_fWVq8XZgQLymn z>|+9{t;sBh=xeh$^MY!&*t&<-ukCK_f%#&Oz7u8Lxgt89rfX~I#_B4KXgjmUL+V7E zgdSuBvwBJ}w7f;Dh3xn%c_D|7Zbdt$wU!Pa3C?<#@+rT}r*7=ZBZz4FAAabj38nZI#DNrM(Ps8ch_s{V*as zhcziHCk)}1Gw3#M) z%NeVeli~}TEOam8Z>FiJ;K5u3g$K)z5EAeG)#VvuJK;xbQy3SbRJx%!SFDRdGfgmj z5z6TE4D9>_$Sh6z?;M9MuITnJ+}hndw5XrF&yGI|;l**SkiHtT`n3%IDtJsByGZFw z?9W-Yq|h(F+xVLNm1w3dqg~f-n8a#*==_G<}->sU%ZTz`#V{AEcX2JxKS{ zMp1o4sv-~E@&`q!>CXts)=ZJuDt7*M4Ath3gz>cO0lrKC%6RV;jtxElPtO3w*C}4X zl`ogGOT2F3mx21slEWks8!;iLB(S-1Oo^1zxQUuGiY4Zztw8^ZRwdjqfRtnsg#})J z0}QqSeVFOaR5ehdzg#fW}in|5fA-3)9xx3cN2i-AD{>3D5D_S>BrM zxKMxydi{C{a|?(s2%C>%RbZh36B7~r`iq6x+1p!pw3QFiefWPNA=*G-;66+q5#a}G z8yOK>Sgexcm*nT?YdwFynn+&Z?&Yz; zEA}A<23$ath2RCG(VLo4*lqz}jvC&5z$kuo^M;75pcdm~6=?PHN)o_)K|n-=(*mNS zqXRZDU<2x@`PsKW#f|s9$=m+`OK-e3Ic4V4a80XV4}s_4%VCgVS!`hR&S^gf(~h$ySN zI`M|qz4^uO+l}eRD2|ATfKzMu;{DB*{W&T2?Kw1&=l{#0J+ zZyJ0)d2)I>28GfnUp3{K8X5`$stSPl-5{w8|*$~xy3Zr1wxv_G=j;cdN1){Ib# zxI`%@i+6V;3;{a)ZwBpT)*kRMl~)Byi5=#?;q&wJ+f7zrPuJMD0X72V4zuEbEx|jM zD4?eV0{zH+d*U`DBcrIO=t6rGrIM=ZGNTmFeiS$7FyFN46VLrywEV`QKraAlw$Gb~ z`uk&h_Z2zNQX=+KSU{%5#N=e_^faTBlT%??*?J!waVVHpA^rjM(-!a?dhvpa1SF0H zSb3}5pR?cF1?){1x3@2I(#q`tFPtR)cst-34o{p_0O1h8l>SZhT{u*L49(5i zQ5jN%9v&Wmw+g{HE1T^KkWex=#|)T6`dR}x7_FgYp1NK*%M)KbKz9%L+Ktfj(&rZz z;`y9z-*DK!#O?D)zQHRScnWc_u=a6P9&mGq%}25-BynnH?6W1=WAecL)ugPHHj@5~ z6?lvH?+dr42BKmFpur^eb61E?*S4_2#tRN>)G5$7z!jKiC8T-TkqEL$a0?xxTy#bV?19JnwLf%ldj>%z^?stK<#esF(3rE&&8Fn*-0W%)Q9nSs|i&f zLV*?HHUQ-9NCvPvAhrTduYhC@-()pmb+X}GTc&WYBg?y-oJX=tC(f$x-u?4TT2Q}+ z*yXPHqw!zlp?EY{02i*UrPU&Gb@LQ&{WRUPEH;MoFHdT**p`4C3W0|Ymu{Hnckh5i zif$84C9>hrni^pw5?M(6G%k_~eD7}tcWc@L-s(Ov`6!sIH5f2O+f2bP+1%Vj_@Qg| zrzx?136%ho&84}Mh2ryv!NI}5WMO!6K)uCl>Hu}=>Y(m~w|`#w&Fujig7z(dgzXf+ zp^5>!39)zoH3l7%*+4?nvB0b$obq;>nfPWB5uIyuJ~IW?sGD1I`d#zoOCER!BZnnQ!~ ziztZ}sR@;Cmoedfa3rJ+nGQ3iXA%Xh!v6cS3f2czlTt@TWC^(m6P1nQt)DE|croyu zQ{xpV2F~fN%uivRm#xWrm{3fGRt^ndhiyqXt<9lp-Ct%Zm^XJ)iFWyEy`$3xxV69{ zD4m)iQ6=R@Aq&LUd)KTvTGG{yKNp^v${g7-hTR8sm&CPu&ht2EFnK)m>R{S>l>?W7 zqTF!@5}R2??=PkvY(ZDIPEO`cNdG--Bp}5e#GpwOL;pbMal9hBAkIpuP%QLP)-ytFWNjfdh z-Dqc4=E}Zu+%{%tHcQ{aM{E|EWzW32JpA39y@jUQ+0MuO>X}wW$=%gw9(2jmpD6(f zpF7if{IVeBhUN_4gc0`Zh_np-vLa(D{nlBY^ilhOaCUAkI#(c zvQ#89oQjC+1$&kn#?~#b3fS&4(OGjZB?pvsDm0^IObF7b>zo_73FK#YD)Yt3IcrPW zb2bj&rXEwTjBhJw$-ZZ$s+CkgeHj4fOJcrXsr#OSpfil)Ts9C%_KM#`!gj>%rgm}q z@<$G)MFKjph#9e{-46Gre@lYag>B8|;wuGQ#^S;7UXt};+d5A+z@5p@q+UDSheYqa z>mnK~P*BW4?vs2OyBF&qwKK__FgYAbGC(w+peQ*Ee z_$25en@Mt6q}zCO4HVv5RhJ_2{zr4O*$94;)07dqSD z^Gn%*WbM<%qH)~)EpFa7Z=3cGb>rK{Y+G0{Ca(tfW8HuSH&v%*l6Y&0Em{t30lHC#yXQ9>{t)qXmS$ z87loqcw$*=SZMKxDV|@(s#7J!sGo+ZrTeUvzzbw|-2A=qrBaym@p?&U>qp5fcA_Mg zN7?J?(b*cor=!Vt_{9jw6SO0v_k()U&cSuOMBl}C%`z_@mN?@*3xiE2AG2@mGn7oh zv0L+z28fv4Egon&JN^zRVWP(R$>%bsu2s5SzuX+BQC|{EzLzoVlfysS3tBFk0PL7w z)875Xy~Upw^a9NtiM?~;E9u}jJ(i}0%e`tk8}uo^A5!z-^C$25CIz<@e{S79WM5&P z4ZOaBul*2rSPRJVXQl7BZ7ArLLtIKaiQC9{55tw`MIa~Z)B+9n3kmpPV;k8<(pBSfHUdFqini-$I2 z%A&Ts$lFQ6^p6chmrL-m%j_0o#b+82*hS8%WJZP&b}aI0mjgKDIXH^zQjlTYwqITu zh%R+uYAnl1pacsm{_(!dp=J4&!R<3edw~pEaL=A<9)cE4`2J^xlOwEKc zHd^or*{>?l4=!BzQb8Cj8brl*k&zqT*Uq~-v=0%aMwO={Z7HX<=-06aY#fvvirYq% zIQzAni}9sP)?;Cl-WqfmdQ zhZ2~UB&+-vPi#}_tz1HC{>_ql2_N{S^wFYQ15Lc6nEB^k5{WyI z5_Ut&uxVUfu7pk&(~lckSwHdjNMGMBqYZrzav% zYmhXE6uBXvepb}Aj`vW82SqXGXcEx_Y&=cEk)i5SWp3* zo_|}`#17p!u6JoO4`y)1*Bz}0x=cN%n`o9q>m&z&3YbdB!FSWNugOdcK!A<<{j{Ob zB|Mf1Ixp4)X`88tPM?Bo2@e{}eh3bGNTcXhZoCOKX;6Bey&px)(X{#^x45}PWYdL& zXufnjn)yh;&;jQ|^|8}c&_dnrMT4kgJ)XDlg3!cXx&DmDl!VFF z$aU0Dcjerc2d1xc7GIa(U}j={Xw29yazOs*#%Hc&CaFj5vSAnzXN%esd{&!}jPX}o zKn#G;WvhfJBmq}b1!X5dzqp`$yEQY3LNLkiugvGMbO2YsWDmJ|&Vh(gbw%aa&xn@ahLN1F0dChlk+8&q4AV zNZI6iRi_{B^i=EJrfmBBJEDHKYiy02^5MF4JU$5NhE}ksDT9S<5N2=d2 zb6PGIS}|SS+@g3ThFPbTYietc0Gl$uK`s}$HF_p6u;^D76A%b&X=#anJ(xdE|I4~ZoTJ%ryx^hH(a?cZ5x@^FbkCW) zbXzHe2VPTM-HJkyh>7LIqyamIux&;@1)%HC|0l+atT^$>c1d3S0Ggt=<&tV=OiWV040&sMIo5ca5_1tWw zy^rrp$FojUkC$k~L`BJ3S*6c5tpInNU!P2LexMYj zTk$vU)07G*+kL?nR(KN{aj2?ZKAy|-iwk65A0d!~ds&5e$gUn;k6p=^6+r?*0+A?T z0mN*!a2(1lj2@C2V82V^1E%i5kTo`DcHfx_GpuzuKr;o?5l>vD*<%7uX$q#MfE@zn zUFCl@cqKR)$M?5~swiyX77GNt+7>rxX=!iQmPe`R=phNgeOQOej!T-EN5p8V5U|rg+u|6iuofT4Dj+A2yceh)<#rUpA=?j zn-SLlD(|a)n&~7!tQ{B{isjFoDE)l6;$g=o%suPl4{8K<6P2w1-Y831^Oi|r9WdPgT6K>fpD0)X}EIUgZUd-U{#(x3O@ zD`NQa<*&+OptJ+IF;Z|YEW$<)2(9k}u7>+(XX_0Q0B5@cM!M<2r+#}K_K| Date: Tue, 25 Apr 2023 16:35:00 +0800 Subject: [PATCH 3/7] =?UTF-8?q?GS+TWP=E8=8A=82=E7=82=B9=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../en/docs/GettingStarted/installation.md | 148 +++- .../GettingStarted/installing-opengauss.md | 10 + ...ons-oriented-to-application-development.md | 81 -- .../core-database-technologies.md | 744 +++++++++++++++++- .../Technicalwhitepaper/database-security.md | 199 ----- .../Technicalwhitepaper/high-availability.md | 43 - .../Technicalwhitepaper/high-performance.md | 204 ----- .../Technicalwhitepaper/maintainability.md | 139 ---- content/docs-lite/en/menu/index.md | 7 +- 9 files changed, 893 insertions(+), 682 deletions(-) create mode 100644 content/docs-lite/en/docs/GettingStarted/installing-opengauss.md delete mode 100644 content/docs-lite/en/docs/Technicalwhitepaper/basic-functions-oriented-to-application-development.md delete mode 100644 content/docs-lite/en/docs/Technicalwhitepaper/database-security.md delete mode 100644 content/docs-lite/en/docs/Technicalwhitepaper/high-availability.md delete mode 100644 content/docs-lite/en/docs/Technicalwhitepaper/high-performance.md delete mode 100644 content/docs-lite/en/docs/Technicalwhitepaper/maintainability.md diff --git a/content/docs-lite/en/docs/GettingStarted/installation.md b/content/docs-lite/en/docs/GettingStarted/installation.md index 40c566096..4348ca77f 100644 --- a/content/docs-lite/en/docs/GettingStarted/installation.md +++ b/content/docs-lite/en/docs/GettingStarted/installation.md @@ -1,12 +1,148 @@ -# Installation +# Installation -openGauss supports simplified installation using scripts. +## Prerequisites -- **[Preparing Installation](preparing-for-installation.md)** +- A user group and a common user have been created. +- All the server OSs and networks are functioning properly. +- You must have the read, write, and execute permissions on the decompression directory, installation directory, and data directory of the database installation package. The installation directory and data directory must be empty, and the installation directory, data directory, and log directory cannot overlap. +- You have the execute permission on the downloaded openGauss Lite package. +- Before the installation, check whether the specified port is occupied. If the port is occupied, change the port or stop the process that uses the port. +- Environment variables: Ensure that *GAUSSHOME*, *GAUSSDATA*, *GAUSSLOG*, and *GAUSSENV* do not exist during new installation. If subsequent operations such as configuration and startup are performed, ensure that these environment variables are properly configured. -- **[Container-based Installation on a Single Node ](Container-based-Installation-on-a-Single-Node.md)** +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>If the **history** command is not disabled before the installation, manually clear sensitive information in the **HISTORY** records after the installation to prevent information leakage. +>If the **history** command has been disabled before the installation, ignore this note. -- **[Installation on a Single Node](installation-on-a-single-node.md)** +## Procedure - +1. Log in to the host where the openGauss Lite is installed as a common user and decompress the Lite package to the installation directory. + ``` + tar -zxf openGauss-Lite-3.0.0-openEuler-aarch64.tar.gz -C ~/openGauss + ``` + +2. Assume that the decompressed package is stored in the **/opt/software/openGauss** directory. Go to the directory generated after the decompression. + + ``` + cd ~/openGauss + ``` + +3. Run the **install.sh** script to install the openGauss Lite installation package. + + ``` + For standalone installation: echo password | sh ./install.sh --mode single -D ~/openGauss/data -R ~/openGauss/install --start + For primary/standby installation: + 1. On the primary node: echo password | sh ./install.sh --mode primary -D ~/openGauss/data -R ~/openGauss/install -C "replconninfo1='localhost=ip1 localport=port1 remotehost=ip2 remoteport=port2'" --start + 2. On the standby node: echo password | sh ./install.sh --mode standby -D ~/openGauss/data -R ~/openGauss/install -C "replconninfo1='localhost=ip1 localport=port1 remotehost=ip2 remoteport=port2'" --start + ``` + + >![](public_sys-resources/icon-note.gif) **NOTE:** + > + > + > + >- -**-D|--data-path**: data directory, which cannot overlap with the installation directory and must be empty. + >- -**-R|--app-path**: installation directory, which cannot overlap with the data directory. + >- -**-l|--log-path**: log directory. + >- -**-f|--guc-file**: GUC configuration file, which is used to set GUC parameters in batches. By default, it is **opengauss\_lite.conf** in the same directory as the installation script and can be specified. + >- -**-m|--mode**: node type. The value can be **primary**, **standby**, or **single** (standalone). The default value is **single**. + >- -**-n|--nodename**: instance name. The default value is **master** for the primary node, **slave** for the standby node, or **single** for a standalone system. + >- -**-P|--gsinit-parameter**: initialization parameter. For details, see "Tools Used in the System \> gs\_initdb" in *Tool Reference*. For security purposes, you are not advised to use this API to transmit passwords. You are advised to use the echo and pipe modes to transmit passwords. If the passwords set on the primary and standby nodes are different, the password set on the primary node is used. The password contains 8 to 32 characters. + >- -**C|--dn\_guc**: database configuration parameter. For details, see "Server Tools \> gs\_guc" in *Tool Reference*. + >- --**--env-sep-file**: separates the environment variable file. The environment variables required are written to this file. By default, the user's bashrc file is used. Do not transfer the directory. + >- --**--start**: indicates whether to start the cluster after the installation is complete. The cluster is not started by default. + >- --**--ulimit**: indicates whether to configure the maximum number of files. The value can be **1000000**. By default, the maximum number of files is not configured. + >- --**--cert-path**: specifies the SSL certificate path. If this parameter is transferred, the SSL parameter is set to **on** and the certificate in this path is copied to the data directory. + >- --**--ssl-client-ip**: client IP address. This parameter takes effect only when **--cert-path** is enabled. The client IP address is added to the whitelist. + >- -**-h|--help**: displays usage instructions. + > + > + > + >![](./public_sys-resources/icon-caution.gif) **Caution:** + > + > + > + >- Each step is reentrant. Therefore, if environment variables are separated, you need to specify the environment variable path for each step. + > + >- Ensure that the IP address types of the primary and standby nodes are the same. If the primary node uses an IPv6 address, the standby node must also use an IPv6 address. + > + >- If there are multiple standby nodes, you need to transfer the information about all nodes during the installation on each node. Pay attention to the information about the local node and the remote node. + > + >- If the error message "ulimit: open files: cannot modify limit: Operation not permitted" is displayed when you set **ulimit**, change the maximum number of files that can be configured by the user in **/etc/security/limits.conf** as the **root** user. + > + >- If the installation stops abnormally, check whether the installation directory and data directory meet the expected requirements. If necessary, manually clear the environment variables. + > + >- During primary/standby environment installation, if **sslmode=verify-ca** is used in **replconninfo**, the standby node cannot connect to the primary node. To solve this problem, perform the following operations: + > *${GAUSSDATA}* indicates the DN data directory. + > Example: sh install.sh -R \~/app -m primary -D \~/data -l \~/log --start -C "replconninfo1='localhost=xxx.xx.xx.x localport=xxxx remotehost=xxx.xx.xx.x remoteport=xxxx sslmode=verify-ca'" + > + > Procedure + > + > - Prepare certificates and private keys. For details about how to generate a certificate, see "Database Security Management \> Managing SSL Certificates \> Generating Certificates" in *Developer Guide*. + > Conventions for configuration file names on the server: + > - Certificate name: server.crt + > - Private key name: server.key + > - Private key password and encrypted file: server.key.cipher and server.key.rand + > Conventions for configuration file names on the client: + > - Certificate name: client.crt + > - Private key name: client.key + > - Private key password and encrypted file: client.key.cipher and client.key.rand + > - Root certificate name: cacert.pem + > - Names of files on in the revoked certificate list: sslcrl-file.crl + > - Copy the certificates to the data directory of each node. + > 1. Copy the configuration files **server.crt**, **server.key**, **server.key.cipher**, and **server.key.rand** on the server to the corresponding directories. + > 2. Copy the configuration files **client.crt**, **client.key**, **client.key.cipher**, **client.key.rand**, and **cacert.pem** (if a CRL needs to be configured, the CRL must contain **sslcrl-file.crl**) on the client to the corresponding directories. + > - (Optional) Encrypt the user password (skip this step if private keys have been generated for the certificates). + > - On the primary node: gs\_guc encrypt -M server -K *Database password* -D $\{GAUSSDATA\}/ + > - On the standby node: gs\_guc encrypt -M client -K Database password -D $\{GAUSSDATA\}/ + > *${GAUSSDATA}* indicates the data directory. + > - Configure SSL. + > ``` + > gs_guc set -D ${GAUSSDATA} -c "ssl=on" + > gs_guc set -D ${GAUSSDATA} -c "ssl_ciphers = 'ALL'" + > gs_guc set -D ${GAUSSDATA} -c "ssl_cert_file = 'server.crt'" + > gs_guc set -D ${GAUSSDATA} -c "ssl_key_file = 'server.key'" + > gs_guc set -D ${GAUSSDATA} -c "ssl_ca_file = 'cacert.pem'" + > ``` + > - Export the following environment variables from the standby node (the file permission cannot be greater than **600**): + > ``` + > export PGSSLCERT="${GAUSSDATA}/client.crt" + > export PGSSLKEY="${GAUSSDATA}/client.key" + > export PGSSLROOTCERT="${GAUSSDATA}/cacert.pem" + > ``` + > - Restart the openGauss primary and standby nodes in sequence. + > ``` + > gs_ctl restart -D ${GAUSSDATA} + > ``` + + + +4. After the installation is complete, check whether the process is normal by using **ps** and **gs\_ctl**. + + ``` + ps ux | grep gaussdb + gs_ctl query -D /opt/data + ``` + + Run the **ps** command to display information similar to the following: + + ``` + omm 24209 11.9 1.0 1852000 355816 pts/0 Sl 01:54 0:33 /opt/install/bin/gaussdb -D /opt/data + omm 20377 0.0 0.0 119880 1216 pts/0 S+ 15:37 0:00 grep --color=auto gaussdb + ``` + + Run the **gs\_ctl** command to display information similar to the following: + + ``` + gs_ctl query ,datadir is /opt/data + HA state: + local_role : Normal + static_connections : 0 + db_state : Normal + detail_information : Normal + + Senders info: + No information + + Receiver info: + No information + ``` diff --git a/content/docs-lite/en/docs/GettingStarted/installing-opengauss.md b/content/docs-lite/en/docs/GettingStarted/installing-opengauss.md new file mode 100644 index 000000000..bc10e6f89 --- /dev/null +++ b/content/docs-lite/en/docs/GettingStarted/installing-opengauss.md @@ -0,0 +1,10 @@ +# Installation + +openGauss supports simplified installation using scripts. + +- **[Preparing for Installation](preparing-for-installation.md)** + +- **[Installation](installation.md)** + + + diff --git a/content/docs-lite/en/docs/Technicalwhitepaper/basic-functions-oriented-to-application-development.md b/content/docs-lite/en/docs/Technicalwhitepaper/basic-functions-oriented-to-application-development.md deleted file mode 100644 index 896391db7..000000000 --- a/content/docs-lite/en/docs/Technicalwhitepaper/basic-functions-oriented-to-application-development.md +++ /dev/null @@ -1,81 +0,0 @@ -# Basic Functions Oriented to Application Development - -- Standard SQL - - openGauss supports standard SQL statements. The SQL standard is an international standard and is updated periodically. SQL standards are classified into core features and optional features. Most databases do not fully support SQL standards. SQL features are built by database vendors to maintain customers and push up application migration costs. New SQL features are increasingly different among vendors. Currently, there is no authoritative SQL standard test. - - openGauss supports most of the SQL:2011 core features and some optional features. For details about the feature list, see [SQL Syntax](../SQLReference/sql-syntax.md). - - The introduction of standard SQL provides a unified SQL interface for all database vendors, reducing the learning costs of users and openGauss application migration costs. - -- Standard Development API - - Standard JDBC API is provided to ensure quick migration of user services to openGauss. - - Currently, the standard JDBC 4.0 API is supported. The JDBC API supports all platforms. - -- Multiple Storage Engines - - openGauss is based on the unified transaction mechanism, log system, concurrency control system, metadata information, and cache management, provides Table Access Method API, and supports different storage engines. Currently, the Astore and Ustore storage engines are supported. - -- Transaction Support - - Transaction support refers to the system capability to ensure the atomicity, consistency, isolation, and durability \(ACID\) features of global transactions. - - Transaction support and data consistency assurance are the basic functions of most databases and the prerequisites for a database to satisfy transaction-based application requirements. - - - Atomicity - - A transaction is comprised of an indivisible unit of work. Operations performed in a transaction must be all finished or have not been performed. - - - Consistency - - Transactions must be consistent within a system no matter when or how many concurrent transactions are ongoing. - - - Isolation - - Transactions are isolated for execution, as if each of them is the only operation performed during the specified period planned by the system. If there are two transactions that are executed within the same period of time and performing the same function, the transaction isolation makes each of them regard itself as the only transaction using the system. - - - Durability - - After a transaction is complete, the changes made by the transaction to the database are permanently stored in the database and will not be rolled back. - - The default transaction isolation level is READ COMMITTED, ensuring no dirty data will be read. - - Transactions are categorized into single-statement transactions and transaction blocks. Their basic interfaces are as follows: - - - Start transaction; - - Commit; - - Rollback; - - Set transaction \(used for setting the isolation level, read/write mode, and delay mode\). For details about the syntax, see the _Developer Guide_. - -- Support for Functions and Stored Procedures - - Functions are important database objects. They encapsulate SQL statement sets used for certain functions so that the statements can be easily invoked. - - A stored procedure is a combination of SQL and PL/SQL. Stored procedures can move the code that executes business rules from the application to the database. Therefore, the code storage can be used by multiple programs at a time. - - 1. Allows customers to modularize program design and encapsulate SQL statement sets, easy to invoke. - 2. Caches the compilation results of stored procedures to accelerate SQL statement set execution. - 3. Allows system administrators to restrict the permission for executing a specific stored procedure and controls access to the corresponding type of data. This prevents access from unauthorized users and ensures data security. - 4. To process SQL statements, the stored procedure process assigns a memory fragment to store context association. Cursors are handles or pointers to context areas. With cursors, stored procedures can control alterations in context areas. - 5. Six levels of exception information are supported to facilitate the debugging of stored procedures. Stored procedure debugging is a debugging method. During the development of a stored procedure, you can trace the process executed by the stored procedure step by step and find the error cause or program bug based on the variable value to improve the fault locating efficiency. You can set breakpoints and perform independent debugging. - - openGauss supports functions and stored procedures in the SQL standard, which enhances the usability of stored procedures. For details about how to use the stored procedures, see the _Developer Guide_. - -- PG Interface Compatibility - - Compatible with PostgreSQL clients and interfaces. - -- SQL Hints - - SQL hints are supported, which can override any execution plan and thus improve SQL query performance. - - In plan hints, you can specify a join order; join, stream, and scan operations; and the number of rows in a result to tune an execution plan, improving query performance. - -- Copy Interface for Error Tolerance - - openGauss provides the encapsulated copy error tables for creating functions and allows users to specify error tolerance options when using the **Copy From** statement. In this way, errors related to parsing, data format, and character set during the execution of the **Copy From** statement are recorded in the error table instead of being reported and interrupted. Even if a small amount of data in the target file of **Copy From** is incorrect, the data can be imported to the database. You can locate and rectify the fault in the error table later. - - diff --git a/content/docs-lite/en/docs/Technicalwhitepaper/core-database-technologies.md b/content/docs-lite/en/docs/Technicalwhitepaper/core-database-technologies.md index d94dceca1..859a871c0 100644 --- a/content/docs-lite/en/docs/Technicalwhitepaper/core-database-technologies.md +++ b/content/docs-lite/en/docs/Technicalwhitepaper/core-database-technologies.md @@ -1,11 +1,745 @@ # Core Database Technologies -- **[Basic Functions Oriented to Application Development](basic-functions-oriented-to-application-development.md)** +- **[Basic Functions Oriented to Application Development](#basic-functions-oriented-to-application-development)** -- **[High Performance](high-performance.md)** +- **[High Performance](#high-performance)** -- **[High Availability](high-availability.md)** +- **[High Availability](#high-availability)** -- **[Maintainability](maintainability.md)** +- **[Maintainability](#maintainability)** -- **[Database Security](database-security.md)** +- **[Database Security](#database-security)** + +## Basic Functions Oriented to Application Development + +- Standard SQL + + openGauss supports standard SQL statements. The SQL standard is an international standard and is updated periodically. SQL standards are classified into core features and optional features. Most databases do not fully support SQL standards. SQL features are built by database vendors to maintain customers and push up application migration costs. New SQL features are increasingly different among vendors. Currently, there is no authoritative SQL standard test. + + openGauss supports most of the SQL:2011 core features and some optional features. For details about the feature list, see [SQL Syntax](../SQLReference/sql-syntax.md). + + The introduction of standard SQL provides a unified SQL interface for all database vendors, reducing the learning costs of users and openGauss application migration costs. + +- Standard Development Interfaces + + Standard ODBC and JDBC interfaces are provided to ensure quick migration of user services to openGauss. + + Currently, the standard ODBC 3.5 and JDBC 4.0 interfaces are supported. The ODBC interface supports SUSE Linux, Windows 32-bit, and Windows 64-bit platforms. The JDBC interface supports all platforms. + +- Multiple Storage Engines + + openGauss is based on the unified transaction mechanism, log system, concurrency control system, metadata information, and cache management, provides Table Access Method API, and supports different storage engines. + + Currently, the Astore and Ustore storage engines are supported. + +- Transaction Support + + Transaction support refers to the system capability to ensure the atomicity, consistency, isolation, and durability \(ACID\) features of global transactions. + + Transaction support and data consistency assurance are the basic functions of most databases and the prerequisites for a database to satisfy transaction-based application requirements. + + - Atomicity + + A transaction is comprised of an indivisible unit of work. Operations performed in a transaction must be all finished or have not been performed. + + - Consistency + + Transactions must be consistent within a system no matter when or how many concurrent transactions are ongoing. + + - Isolation + + Transactions are isolated for execution, as if each of them is the only operation performed during the specified period planned by the system. If there are two transactions that are executed within the same period of time and performing the same function, the transaction isolation makes each of them regard itself as the only transaction using the system. + + - Durability + + After a transaction is complete, the changes made by the transaction to the database are permanently stored in the database and will not be rolled back. + + The default transaction isolation level is READ COMMITTED, ensuring no dirty data will be read. + + Transactions are categorized into single-statement transactions and transaction blocks. Their basic interfaces are as follows: + + - Start transaction; + - Commit; + - Rollback; + + Set transaction \(used for setting the isolation level, read/write mode, and delay mode\). For details about the syntax, see the *SQLReference*. + +- Support for Functions and Stored Procedures + + Functions are important database objects. They encapsulate SQL statement sets used for certain functions so that the statements can be easily invoked. + + A stored procedure is a combination of SQL and PL/SQL. Stored procedures can move the code that executes business rules from the application to the database. Therefore, the code storage can be used by multiple programs at a time. + + 1. Allows customers to modularize program design and encapsulate SQL statement sets, easy to invoke. + 2. Caches the compilation results of stored procedures to accelerate SQL statement set execution. + 3. Allows system administrators to restrict the permission for executing a specific stored procedure and controls access to the corresponding type of data. This prevents access from unauthorized users and ensures data security. + 4. To process SQL statements, the stored procedure process assigns a memory fragment to store context association. Cursors are handles or pointers to context areas. With cursors, stored procedures can control alterations in context areas. + 5. Six levels of exception information are supported to facilitate the debugging of stored procedures. Stored procedure debugging is a debugging method. During the development of a stored procedure, you can trace the process executed by the stored procedure step by step and find the error cause or program bug based on the variable value to improve the fault locating efficiency. You can set breakpoints and perform independent debugging. + + openGauss supports functions and stored procedures in the SQL standard, which enhances the usability of stored procedures. For details about how to use the stored procedures, see the *SQLReference*. + +- PG Interface Compatibility + + Compatible with PostgreSQL clients and interfaces. + +- SQL Hints + + SQL hints are supported, which can override any execution plan and thus improve SQL query performance. + + In plan hints, you can specify a join order; join, stream, and scan operations; and the number of rows in a result to tune an execution plan, improving query performance. + +- Copy Interface for Error Tolerance + + openGauss provides the encapsulated copy error tables for creating functions and allows users to specify error tolerance options when using the **Copy From** statement. In this way, errors related to parsing, data format, and character set during the execution of the **Copy From** statement are recorded in the error table instead of being reported and interrupted. Even if a small amount of data in the target file of **Copy From** is incorrect, the data can be imported to the database. You can locate and rectify the fault in the error table later. + +## High Performance + +### CBO Optimizer + +The openGauss optimizer is a typical Cost-based Optimization \(CBO\). By using CBO, the database calculates the number of tuples and the execution cost for each execution step under each execution plan based on the number of table tuples, column width, NULL record ratio, and characteristic values, such as distinct, MCV, and HB values, and certain cost calculation methods. The database then selects the execution plan that takes the lowest cost for the overall execution or for the return of the first tuple. + +The CBO optimizer can select the most efficient execution plan among multiple plans based on the cost to meet customer service requirements to the maximum extent. + +### Hybrid Row-Column Storage + +openGauss supports both row-store and column-store models. Users can choose a row-store or column-store table based on their needs. + +Column-store is recommended if a table contains many columns \(called a wide table\) but its query involves only a few columns. Row-store is recommended if a table contains only a few columns and a query involves most of the columns. + +[Figure 1](#en-us_topic_0242724708_fig4487133722819) shows the column-store model. + +**Figure 1** Column-store + + +In a wide table containing a huge amount of data, a query usually only includes certain columns. In this case, the query performance of the row-store engine is poor. For example, a single table containing the data of a meteorological agency has 200 to 800 columns. Among these columns, only 10 are frequently accessed. In this case, a vectorized execution and column-store engine can significantly improve performance by saving storage space. + +Row-store tables and column-store tables have their own advantages and disadvantages. You are advised to select a table based on the site requirements. + +- Row-store table + + Row-store tables are created by default. Data is stored by row. Row-store supports adding, deleting, modifying, and querying data of a complete row. Therefore, this storage model applies to scenarios where data needs to be updated frequently. + +- Column-store table + + Data is stored by column. The I/O of data query in a single column is small, and column-store tables occupy less storage space than row-store tables. This storage model applies to scenarios where data is inserted in batches, less updated, and queried for statistical analysis. The performance of single point query and single record insertion in a column-store table is poor. + + +The principles for selecting row-store and column-store tables are as follows: + +- Update frequency + + If data is frequently updated, use a row-store table. + +- Insert frequency + + If a small amount of data is frequently inserted each time, use a row-store table. If a large amount of data is inserted at a time, use column storage. + +- Number of columns + + If a table is to contain many columns, use a column-store table. + +- Number of columns to be queried + + If only a small number of columns \(less than 50% of the total\) is queried each time, use a column-store table. + +- Compression ratio + + The compression ratio of a column-store table is higher than that of a row-store table. The higher the compression ratio is, the more CPU resources will be consumed. + +### In-place Upate Storage + +The in-place update storage engine solves the problems of space expansion and large tuples of the Append update storage engine. The design of efficient rollback segments is the basis of the in-place update storage engine. + +### Xlog Lockless Update and Parallel Page Playback + +**Figure 2** Xlog lock less Design +![](figures/xlog-lock-less-design.png "xlog-lock-less-design") + +This feature optimizes the WalInsertLock mechanism by using log sequence numbers \(LSNs\) and log record counts \(LRCs\) to record the copy progress of each backend and canceling the WalInsertLock mechanism. The backend can directly copy logs to the WalBuffer without contending for the WalInsertLock. In addition, a dedicated WALWriter thread is used to write logs, and the backend thread does not need to ensure the Xlog flushing. After the preceding optimization, the WalInsertLock contention and WalWriter dedicated disk write threads are canceled. The system performance can be further improved while the original XLog function remains unchanged. This feature optimizes the Ustore in-place update WALs and Ustore DML operation parallel playback and distribution. Prefixes and suffixes are used to reduce the update WALs. The playback thread is divided into multiple types to solve the problem that most Ustore DML WALs are replayed on multiple pages. In addition, the Ustore data page playback is distributed based on blkno to improve the degree of parallel playback. + +### Adaptive Compression + +Currently, mainstream databases usually use the data compression technology. Various compression algorithms are used for different data types. If pieces of data of the same type have different characteristics, their compression algorithms and results will also be different. Adaptive compression chooses the suitable compression algorithm for data based on the data type and characteristics, achieving high performance in compression ratio, import, and query. + +Importing and frequently querying a huge amount of data are the main application scenarios. When you import data, adaptive compression greatly reduces the data volume, increases I/O operation efficiency several times, and clusters data before storage, achieving fast data import. In this way, only a small number of I/O operations is required and data is quickly decompressed in a query. Data can be quickly retrieved and the query result is quickly returned. + +Currently, the database has implemented various compression algorithms, including RLE, DELTA, BYTEPACK/BITPACK, LZ4, ZLIB, and LOCAL DICTIONARY. The following table lists data types and the compression algorithms suitable for them. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

-

+

RLE

+

DELTA

+

BITPACK/BYTEPACK

+

LZ4

+

ZLIB

+

LOCAL DICTIONARY

+

Smallint/int/bigint/Oid

+

Decimal/real/double

+

Money/time/date/

+

timestamp

+

+

+

+

+

+

-

+

Tinterval/interval/Time with time zone/

+

-

+

-

+

-

+

-

+

+

-

+

Numeric/char/varchar/text/nvarchar2

+

and other supported data types

+

+

+

+

+

+

+
+ +For example, large integer compression of mobile number-like character strings, large integer compression of the numeric type, and adjustment of the compression algorithm compression level are supported. + +### Partition + +In the openGauss system, data is partitioned horizontally on an instance using a specified policy. This operation splits a table into multiple partitions that are not overlapped. + +In common scenarios, a partitioned table has the following advantages over a common table: + +- High query performance: You can specify partitions when querying partitioned tables, improving query efficiency. +- High availability: If a certain partition in a partitioned table is faulty, data in the other partitions is still available. +- Easy maintenance: If a partition in a partitioned table is faulty, only this partition needs to be repaired. +- Balanced I/O: Partitions can be mapped to different disks to balance I/O and improve the overall system performance. + +Currently, openGauss supports range partitioned tables, list partitioned tables, and hash partitioned tables. + +- In a range partitioned table, data within a certain range is mapped to each partition. The range is determined by the partition key specified when the partitioned table is created. This partitioning mode is most commonly used. + + With the range partitioning function, the database divides a record, which is to be inserted into a table, into multiple ranges using one or multiple columns and creates a partition for each range to store data. Partition ranges do no overlap. + +- In a list partitioned table, data is mapped to each partition based on the key values contained in each partition. The key values contained in a partition are specified when the partition is created. + + The list partitioning function divides the key values in the records to be inserted into a table into multiple lists \(the lists do not overlap in different partitions\) based on a column of the table, and then creates a partition for each list to store the corresponding data. + +- In a hash partitioned table, data is mapped to each partition using the hash algorithm, and each partition stores records with the same hash value. + + The hash partitioning function uses the internal hash algorithm to divide records to be inserted into a table into partitions based on a column of the table. + + +If you specify the **PARTITION** parameter when running the **CREATE TABLE** statement, data in the table will be partitioned. + +Users can modify partition keys as needed during table creation to make the query result stored in the same or least partitions \(called partition pruning\), so as to obtain consecutive I/O to improve the query performance. + +In actual services, time is often used as a filter criterion for query objects. Therefore, you can select the time column as the partition key. The key value range can be adjusted based on the total data volume and the data volume queried at a time. + +### SQL Bypass + +In a typical OLTP scenario, simple queries account for a large proportion. This type of queries involves only single tables and simple expressions. To accelerate such query, the SQL bypass framework is proposed. After simple mode judgment is performed on such query at the parse layer, the query enters a special execution path and skips the classic execution framework, including operator initialization and execution, expression, and projection. Instead, it directly rewrites a set of simple execution paths and directly invokes storage interfaces, greatly accelerating the execution of simple queries. + +### Kunpeng NUMA Architecture Optimization + +**Figure 2** Kunpeng NUMA architecture optimization +![](figures/kunpeng-numa-architecture-optimization.png "kunpeng-numa-architecture-optimization") + +1. Based on the multi-core NUMA architecture of the Kunpeng processor, openGauss optimizes the NUMA architecture to reduce the cross-core memory access latency and maximize the multi-core Kunpeng computing capability. The key technologies include redo log batch insertion, NUMA distribution of hotspot data, and Clog partitions, greatly improving the processing performance of the TP system. +2. Based on the ARMv8.1 architecture used by the Kunpeng chip, openGauss uses the LSE instruction set to implement efficient atomic operations, effectively improving the CPU usage, multi-thread synchronization performance, and XLog write performance. +3. Based on the wider L3 cacheline provided by the Kunpeng chip, openGauss optimizes hotspot data access, effectively improving the cache access hit ratio, reducing the cache consistency maintenance overhead, and greatly improving the overall data access performance of the system. + +### High Concurrency of the Thread Pool + +In the OLTP field, a database needs to process a large quantity of client connections. Therefore, the processing capability in high-concurrency scenarios is one of the important capabilities of the database. + +The simplest processing mode for external connections is the per-thread-per-connection mode, in which a user connection generates a thread. This mode features simple processing thanks to its architecture. However, in high-concurrency scenarios, there are too many threads, causing heavy workload in thread switchover and large conflict between the lightweight lock areas of the database. As a result, the performance \(throughput\) deteriorates sharply and the SLA of user performance cannot be met. + +Therefore, a thread resource pooling and reuse technology needs to be used to resolve this problem. The overall design idea of the thread pool technology is to pool thread resources and reuse them among different connections. After the system is started, a fixed number of working threads are started based on the current number of cores or user configuration. A working thread serves one or more connection sessions. In this way, the session and thread are decoupled. The number of worker threads is fixed. Therefore, frequent thread switchover does not occur in case of high concurrency. The database layer schedules and manages sessions. + +### Parallel Query + +The Symmetric Multi-Processing \(SMP\) parallel technology of openGauss uses the multi-core CPU architecture of a computer to implement multi-thread parallel computing, fully using CPU resources to improve query performance. In complex query scenarios, a single query execution takes long time and the system concurrency is low. Therefore, the SMP parallel execution technology is used to implement operator-level parallel execution, which effectively reduces the query execution time and improves the query performance and resource utilization. The overall implementation of the SMP parallel technology is as follows: For query operators that can be executed in parallel, data is sliced, multiple working threads are started for computation, and then the results are summarized and returned to the frontend. The data interaction operator **Stream** is added to SMP parallel execution to implement data interaction between multiple working threads, ensuring the correctness of the query and completing the overall query. + +### Dynamic Build and Execution + +Based on the query execution plan tree, with the library functions provided by the LLVM, openGauss moves the process of determining the actual execution path from the executor phase to the execution initialization phase. In this way, problems such as function calling, logic condition branch determination, and a large amount of data reading that are related to the original query execution are avoided, to improve the query performance. + + + +## High Scalability + +### High Concurrency of the Thread Pool + +In the OLTP field, a database needs to process a large quantity of client connections. Therefore, the processing capability in high-concurrency scenarios is one of the important capabilities of the database. + +The simplest processing mode for external connections is the per-thread-per-connection mode, in which a user connection generates a thread. This mode features simple processing thanks to its architecture. However, in high-concurrency scenarios, there are too many threads, causing heavy workload in thread switchover and large conflict between the lightweight lock areas of the database. As a result, the performance \(throughput\) deteriorates sharply and the SLA of user performance cannot be met. + +Therefore, a thread resource pooling and reuse technology needs to be used to resolve this problem. The overall design idea of the thread pool technology is to pool thread resources and reuse them among different connections. After the system is started, a fixed number of working threads are started based on the current number of cores or user configuration. A working thread serves one or more connection sessions. In this way, the session and thread are decoupled. The number of worker threads is fixed. Therefore, frequent thread switchover does not occur in case of high concurrency. The database layer schedules and manages sessions. + +## HA + +### Primary/Standby + +To ensure that a fault can be rectified, data needs to be written into multiple copies. Multiple copies are configured for the primary and standby nodes, and logs are used for data synchronization. In this way, openGauss has no data lost when a node is faulty or the system restarts after a stop, meeting the ACID feature requirements. The primary/standby environment supports two modes: primary/standby, and one primary and multiple standbys. In primary/standby mode, if the standby node needs to redo logs, it can be promoted to primary. In the one primary and multiple standbys mode, all standby nodes need to redo logs and can be promoted to primary. The primary/standby mode is mainly used for OLTP systems with general reliability to save storage resources. The one primary and multiple standbys mode provides higher DR capabilities and is suitable for the OLTP system with higher availability transaction processing. + +The **switchover** command can be used to trigger a switchover between the primary and standby nodes. If the primary node is faulty, the **failover** command can be used to promote the standby node to the primary. + +To ensure that the failover time is controllable, you can enable the log flow control function to control the rate of sending logs to the standby node. This ensures that the logs accumulated on the standby node will be replayed within the time configured for flow control. After flow control is enabled, the rate of sending logs to the standby node is dynamically adjusted. As a result, the overall transaction performance deteriorates. + +In scenarios such as initial installation or backup and restoration, data on the standby node needs to be rebuilt based on the primary node. In this case, the build function is required to send the data and WALs of the primary node to the standby node. When the primary node is faulty and joins again as a standby node, the build function needs to be used to synchronize data and WALs with those of the new primary node. Build includes full build and incremental build. Full build depends on primary node data for rebuild. The amount of data to be copied is large and the time required is long. Incremental build copies only differential files. The amount of data to be copied is small and the time required is short. Generally, the incremental build is preferred for fault recovery. If the incremental build fails, the full build continues until the fault is rectified. + +In addition to streaming replication in primary/standby mode, openGauss also supports logical replication. In logical replication, the primary database is called the source database, and the standby database is called the target database. The source database parses the WAL file based on the specified logical parsing rule and parses the DML operation into certain logical change information \(standard SQL statements\). The source database sends standard SQL statements to the target database. After receiving the SQL statements, the target database applies them to implement data synchronization. Logical replication involves only DML operations. Logical replication can implement cross-version replication, heterogeneous database replication, dual-write database replication, and table-level replication. + +### Logical Backup + +openGauss provides the logical backup capability to back up data in user tables to local disk files in text or CSV format and restore the data in homogeneous or heterogeneous databases. + +### Physical Backup + +openGauss provides the physical backup capability to back up data of the entire instance to local disk files in the internal database format, and restore data of the entire instance in a homogeneous database. + +Physical backup is classified into full backup and incremental backup. The difference is as follows: Full backup includes the full data of the database at the backup time point. The time required for full backup is long \(in direct proportion to the total data volume of the database\), and a complete database can be restored. Incremental backup involves only incremental data modified after a specified time point. It takes a short period of time \(in direct proportion to the incremental data volume and irrelevant to the total data volume\). However, a complete database can be restored only after the incremental backup and full backup are performed. openGauss supports both full and incremental backup modes. + +### Flashback Restoration + +The flashback function is used to restore dropped tables from the recycle bin. Like in a Window OS, dropped table information is stored in the recycle bin of databases. The MVCC mechanism is used to restore data to a specified point in time or system change number \(SCN\). + +### Ultimate RTO + +After the ultimate RTO function is enabled, multi-level pipelines are established for Xlog log playback to improve the concurrency and log playback speed. + +When the service load is heavy, the playback speed of the standby node cannot catch up with that of the primary node. After the system runs for a long time, logs are accumulated on the standby node. If a host is faulty, data restoration takes a long time and the database is unavailable, which severely affects system availability. The ultimate recovery time object \(RTO\) is enabled to reduce the data recovery time after a host fault occurs and improve availability. + +### Logical Replication + +openGauss provides the logical decoding function to reversely parse physical logs into logical logs. Logical replication tools such as DRS convert logical logs to SQL statements and replay the SQL statements in the peer database. In this way, data can be synchronized between heterogeneous databases. Currently, unidirectional and bidirectional logical replication between the openGauss database and the MySQL or Oracle database is supported. DNs reversely parse physical logs to logical logs. Logical replication tools such as DRS extract logical logs from DNs, convert the logs to SQL statements, and replay the SQL statements in MySQL. Logical replication tools also extract logical logs from a MySQL database, reversely parse the logs to SQL statements, and replay the SQL statements in openGauss. In this way, data can be synchronized between heterogeneous databases. + +### Point-In-Time Recovery \(PITR\) + +PITR uses basic hot backup, WALs, and WAL archive logs for backup and recovery. When replaying a WAL record, you can stop at any point in time, so that there is a snapshot of the consistent database at any point in time. That is, you can restore the database to the state at any time since the backup starts. During recovery, openGauss supports specifying the recovery stop point as TID, time, and LSN. + +### High Availability Based on the Paxos Protocol \(DCF\) + +After DCF is enabled, DNs support Paxos-based replication and quorum, achieving high availability and disaster recovery. DNs support automatic primary node selection and log replication. The replication process supports compression and stream control to prevent high bandwidth usage. Node types based on Paxos roles are provided and can be adjusted. + +### Two-City Three-DC DR + +Two-city three-DC indicates that the three DCs (production center, intra-city DR center, and remote DR center) are deployed in two cities. In recent years, natural disasters have occurred frequently at home and abroad. The two-city three-DC DR solution comes into being with the combination of two intra-city DCs and remote DR DCs. This solution features high availability and disaster backup capabilities. The two intra-city DCs are two data centers that can carry critical applications independently. They have similar data processing capabilities and can synchronize data in real time through high-speed links. Under normal circumstances, the two DCs manage services and system operation together and can be switched over. When disaster occurs, services can be switched over to the DR DC with almost no data loss, ensuring service continuity. Compared with the remote DR DC, two intra-city DCs have lower investment cost, faster building speed, easier operation and maintenance, and higher reliability. A remote DR DC is deployed in a different city and is used to back up data of the two DCs. When faults occur in the two DCs, the remote DR DC can recover services from backup data. + +Specifications + +- Streaming replication-based remote DR solution: + + - The network latency within the primary or DR database instance must be less than or equal to 10 ms, and the network latency between the primary and standby database instances must be less than or equal to 100 ms. The DR can run normally within the range of the required network latency. Otherwise, the primary and standby nodes will be disconnected. + + - The following table lists the log generation speeds in the primary database instance supported by different hardware specifications when the network bandwidth is not a bottleneck and the parallel playback function is enabled in the DR database instance. The RPO and RTO can be ensured only under the log generation speed. + + **Table 1** Log generation speed supported by different hardware specifications + + + + + + + + + + + + + + +

Typical Configuration

+

Log Generation Speed of the Primary Database Instance

+

96U/768G/SATA SSD

+

<=10MB/s

+

128U/2T/NVMe SSD

+

<=40MB/s

+
+ + - A certain amount of data can be lost when the DR database instance is promoted to primary, and the RPO is less than or equal to 10 seconds. When the DR database instance is normal, the RTO for promoting the DR database instance to primary is less than or equal to 10 minutes. When the DR database instance is degraded, the RTO for promoting the DR database instance to primary is within 20 minutes. + + - Practice: Planned primary/standby database instance switchover, no data loss, RPO = 0, RTO ≤ 20 minutes \(including the processes of demoting the primary database instance to the DR instance and promoting the DR database instance to the primary database instance\) + + +>![](../Technicalwhitepaper/public_sys-resources/icon-notice.gif) **NOTICE:** +>Tests show that the maximum write rate of SATA SSDs is about 240 MB/s, that of SAS SSDs is over 500 MB/s, and that of NVMe SSDs is even better. Currently, only the performance metric under the SATA SSD hardware specifications is provided. If the hardware conditions do not meet the preceding specifications, the single-shard log generation speed in the primary database instance must be reduced to ensure the RPO and RTO. +> +>Resources such as file handles and memory are used up in the primary and standby database instances. As a result, the RPO and RTO cannot be ensured. + +## Maintainability + +### Workload Diagnosis Report + +The workload diagnosis report \(WDR\) generates a performance report between two different time points based on the system performance snapshot data at two different time points. The report is used to diagnose database kernel performance faults. + +WDR depends on the following two components: + +- SNAPSHOT: The performance snapshot can be configured to collect a certain amount of performance data from the kernel at a specified interval and store the data in the user tablespace. Any snapshot can be used as a performance baseline for comparison with other snapshots. +- WDR Reporter: This tool analyzes the overall system performance based on two snapshots, calculates the changes of more specific performance indicators between the two time periods, and generates summarized and detailed performance data. For details, see [Table 1](#en-us_concept_0238164494_table14895120191613) and [Table 2](#en-us_concept_0238164494_table23331848193120). + +**Table 1** Summarized diagnosis report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Diagnosis Type

+

Description

+

Database Stat

+

Evaluates the load and I/O status of the current database. Load and I/O are the most important indicators of the TP system.

+

The statistics include the number of sessions connected to the database, number of committed and rolled back transactions, number of read disk blocks, number of disk blocks found in the cache, number of rows returned, captured, inserted, updated, and deleted through database query, number of conflicts and deadlocks, usage of temporary files, and I/O read/write time.

+

Load Profile

+

Evaluates the current system load from the time, I/O, transaction, and SQL dimensions.

+

The statistics include the job running elapse time, CPU time, daily transaction quality, logical and physical read volume, read and write I/O times and size, login and logout times, SQL, transaction execution volume, and SQL P85 and P90 response time.

+

Instance Efficiency Percentages

+

Evaluates the cache efficiency of the current system.

+

The statistics include the database cache hit ratio.

+

Events

+

Evaluates the performance of key system kernel resources and key events.

+

The statistics include the number of times that the key time of the database kernel occurs and the waiting time.

+

Wait Classes

+

Evaluates the performance of key events in the system.

+

The statistics include the release of the data kernel in the main types of waiting events, such as STATUS, LWLOCK_EVENT, LOCK_EVENT, and IO_EVENT.

+

CPU

+

Includes time release of the CPU in user mode, kernel mode, wait I/O, and idle mode.

+

IO Profile

+

Includes the number of database I/O times, database I/O data volume, number of redo I/O times, and redo I/O volume.

+

Memory Statistics

+

Includes maximum process memory, used process memory, maximum shared memory, and used shared memory.

+
+ + +**Table 2** Detailed diagnosis report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Diagnosis Type

+

Description

+

Time Model

+

Evaluates the performance of the current system in the time dimension.

+

The statistics include time consumed by the system in each phase, including the kernel time, CPU time, execution time, parsing time, compilation time, query rewriting time, plan generation time, network time, and I/O time.

+

SQL Statistics

+

Diagnoses SQL statement performance problems.

+

The statistics include normalized SQL performance indicators in multiple dimensions: elapsed time, CPU time, rows returned, tuple reads, executions, physical reads, and logical reads. The indicators can be classified into execution time, number of execution times, row activity, and cache I/O.

+

Wait Events

+

Diagnoses performance of key system resources and key time in detail.

+

The statistics include the performance of all key events in a period of time, including the number of events and the time consumed.

+

Cache IO Stats

+

Diagnoses the performance of user tables and indexes.

+

The statistics include read and write operations on all user tables and indexes, and the cache hit ratio.

+

Utility status

+

Diagnoses the performance of backend jobs.

+

The statistics include the performance of backend operations such as page operation and replication.

+

Object stats

+

Diagnoses the performance of database objects.

+

The statistics include user tables, tables on indexes, index scan activities, insert, update, and delete activities, number of valid rows, and table maintenance status.

+

Configuration settings

+

Determines whether the configuration is changed.

+

It is a snapshot that contains all current configuration parameters.

+
+ + +Benefits: + +- WDR is the main method for diagnosing long-term performance problems. Based on the performance baseline of a snapshot, performance analysis is performed from multiple dimensions, helping DBAs understand the system load, performance of each component, and performance bottlenecks. +- Snapshots are also an important data source for subsequent performance problem self-diagnosis and self-optimization suggestions. + +### Slow SQL Diagnosis + +Slow SQL records information about all jobs whose execution time exceeds the threshold. + +Historical slow SQL provides table-based and function-based query interfaces. You can query the execution plan, start time, end time, query statement, row activity, kernel time, CPU time, execution time, parsing time, compilation time, query rewriting time, plan generation time, network time, I/O time, network overhead, lock overhead, and wait event. All information is anonymized. + +Slow SQL provides detailed information required for slow SQL diagnosis. You can diagnose performance problems of specific slow SQL statements offline without reproducing the problem. The table-based and function-based APIs help users collect statistics on slow SQL indicators and connect to third-party platforms. + +Both primary and standby nodes support slow SQL diagnosis. + +## Database Security + +### Access Control + +Access control is to manage users' database access control permissions, including database system permissions and object permissions. + +Role-based access control is supported. Roles and permissions are associated. Permissions are assigned to roles and then roles are assigned to users, implementing user access control permission management. The login access control is implemented by using the user ID and authentication technology. The object access control is implemented by checking the object permission based on the user permission on the object. You can assign the minimum permissions required for completing tasks to related database users to minimize database usage risks. + +An access control model based on separation of permissions is supported. Database roles are classified into system administrator, security administrator, and audit administrator. The security administrator creates and manages users, the system administrator grants and revokes user permissions, and the audit administrator audits all user behaviors. + +By default, the role-based access control model is used. You can set parameters to determine whether to enable the access control model based on separation of permissions. + +### Separation of Control and Access Permissions + +For the system administrator, the control and access permissions on table objects are separated to improve data security of common users and restrict the object access permissions of administrators. + +This feature applies to the following scenarios: An enterprise has multiple business departments using different database users to perform service operations. Database maintenance departments at the same level use the database administrator to perform O&M operations. The business departments require that administrators can only perform control operations \(DROP, ALTER, and TRUNCATE\) on data of each department and cannot perform access operations \(INSERT, DELETE, UPDATE, SELECT, and COPY\) without authorization. That is, the control permissions of database administrators for tables need to be isolated from their access permissions to improve the data security of common users. + +The system administrators can specify the **INDEPENDENT** attribute when creating a user, indicating that the user is a private user. Database administrators \(including initial users and other administrators\) can control \(**DROP**, **ALTER**, and **TRUNCATE**\) objects of private users but cannot access \(**INSERT**, **DELETE**, **UPDATE**, **SELECT**, **COPY**, **GRANT**, **REVOKE**, and **ALTER OWNER**\) the objects without authorization. + +### Built-in Database Role Permission Management + +openGauss provides a group of default roles whose names start with **gs\_role\_**. These roles are provided to access to specific, typically high-privileged operations. You can grant these roles to other users or roles within the database so that they can use specific functions. These roles should be given with great care to ensure that they are used where they are needed. [Table 1](#table2118117460) describes the permissions of built-in roles. + +**Table 1** Built-in role permissions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Role

+

Permission

+

gs_role_copy_files

+

Permission to run the copy... to/from filename command. However, the GUC parameter enable_copy_server_files must be set first to enable the function of copying server files.

+

gs_role_signal_backend

+

Permission to invoke the pg_cancel_backend, pg_terminate_backend, and pg_terminate_session functions to cancel or terminate other sessions. However, this role cannot perform operations on sessions of the initial user or PERSISTENCE user.

+

gs_role_tablespace

+

Permission to create a tablespace.

+

gs_role_replication

+

Permission to invoke logical replication functions, such as kill_snapshot, pg_create_logical_replication_slot, pg_create_physical_replication_slot, pg_drop_replication_slot, pg_replication_slot_advance, pg_create_physical_replication_slot_extern, pg_logical_slot_get_changes, pg_logical_slot_peek_changes, pg_logical_slot_get_binary_changes and pg_logical_slot_peek_binary_changes.

+

gs_role_account_lock

+

Permission to lock and unlock users. However, this role cannot lock or unlock the initial user or PERSISTENCE user.

+

gs_role_directory_create

+

Permission to create directory objects. However, this role needs to enable the GUC parameter enable_access_server_directory first.

+

gs_role_directory_drop

+

Permission to delete directory objects. However, this role needs to enable the GUC parameter enable_access_server_directory first.

+
+ + +### Database Encryption Authentication + +The password encryption method based on the RFC5802 mechanism is used for authentication. + +The unidirectional, irreversible Hash encryption algorithm PBKDF2 is used for encryption and authentication, effectively defending against rainbow attacks. + +The password of the created user is encrypted and stored in the system catalog. During the entire authentication process, passwords are encrypted for storage and transmission. The hash value is calculated and compared with the value stored on the server to verify the correctness. + +The message processing flow in the unified encryption and authentication process effectively prevents attackers from cracking the username or password by capturing packets. + +### Database Audit + +Audit logs record user operations performed on database startup and stopping, connection, and DDL, DML, and DCL operations. The audit log mechanism enhances the database capability of tracing illegal operations and collecting evidence. + +You can set parameters to specify the statements or operations for which audit logs are recorded. + +Audit logs record the event time, type, execution result, username, database, connection information, database object, database instance name, port number, and details. You can query audit logs by start time and end time and filter audit logs by recorded field. + +Database security administrators can use the audit logs to reproduce a series of events that cause faults in the database and identify unauthorized users, unauthorized operations, and the time when these operations are performed. + +### Network Communication Security + +SSL can be used to encrypt communication data between the client and server, ensuring communication security between the client and server. + +The TLS 1.2 protocol and a highly secure encryption algorithm suite are adopted. [Table 2](#table13251121491017) lists the supported encryption algorithm suites. + +**Table 2** Encryption algorithm suites + + + + + + + + + + + + + + + + + + + + + + + + + +

OpenSSL Suite Name

+

IANA Suite Name

+

Security

+

ECDHE-RSA-AES128-GCM-SHA256

+

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

+

HIGH

+

ECDHE-RSA-AES256-GCM-SHA384

+

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

+

HIGH

+

ECDHE-ECDSA-AES128-GCM-SHA256

+

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

+

HIGH

+

ECDHE-ECDSA-AES256-GCM-SHA384

+

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

+

HIGH

+
+ + +### Row-Level Security + +The row-level security \(RLS\) feature enables database access control to be accurate to each row of data tables. When different users perform the same SQL query operation, the read results may be different according to the RLS policy. + +You can create an RLS policy for a data table. The policy defines an expression that takes effect only for specific database users and SQL operations. When a database user accesses the data table, if a SQL statement meets the specified RLS policy of the data table, the expressions that meet the specified condition will be combined by using **AND** or **OR** based on the attribute type \(**PERMISSIVE** | **RESTRICTIVE**\) and applied to the execution plan in the query optimization phase. + +RLS is used to control the visibility of row-level data in tables. By predefining filters for data tables, the expressions that meet the specified condition can be applied to execution plans in the query optimization phase, which will affect the final execution result. Currently, RLS supports the following SQL statements: SELECT, UPDATE, and DELETE. + +### Resource Labels + +The resource label feature classifies database resources based on user-defined rules to implement resource classification and management. Administrators can configure resource labels to configure security policies, such as auditing or data masking, for a group of database resources. + +Resource labels can be used to group database resources based on features and application scenarios. You can manage all database resources with specified labels, which greatly reduces policy configuration complexity and information redundancy and improves management efficiency. + +Currently, resource labels support the following database resource types: schema, table, column, view, and function. + +### Dynamic Data Masking + +To prevent unauthorized users from sniffing privacy data, the dynamic data masking feature can be used to protect user privacy data. When an unauthorized user accesses the data for which a dynamic data masking policy is configured, the database returns the anonymized data to protect privacy data. + +Administrators can create dynamic data masking policies on data columns. The policies specify the data masking methods for specific user scenarios. After the dynamic data masking function is enabled, the system matches user identity information \(such as the access IP address, client tool, and username\) with the masking policy when a user accesses data in the sensitive column. After the matching is successful, the system masks the sensitive data in the query result of the column based on the masking policy. + +The purpose of dynamic data masking is to flexibly protect privacy data by configuring the filter, and specifying sensitive column labels and corresponding masking functions in the masking policy without changing the source data. + +### Unified Auditing + +Unified auditing allows administrators to configure audit policies for database resources or resource labels to simplify management, generate audit logs, reduce redundant audit logs, and improve management efficiency. + +Administrators can customize audit policies for configuring operation behaviors or database resources. The policies are used to audit specific user scenarios, user behaviors, or database resources. After the unified auditing function is enabled, when a user accesses the database, the system matches the corresponding unified audit policy based on the user identity information, such as the access IP address, client tool, and username. Then, the system classifies the user behaviors based on the access resource label and user operation type \(DML or DDL\) in the policy to perform unified auditing. + +The purpose of unified auditing is to change the existing traditional audit behavior into specific tracking audit behavior and exclude other behaviors from the audit, thereby simplifying management and improving the security of audit data generated by the database. + +### Password Strength Verification + +To harden the security of customer accounts and data, do not set weak passwords. You need to specify a password when initializing the database, creating a user, or modifying a user. The password must meet the strength requirements. Otherwise, the system prompts you to enter the password again. + +The account password complexity policy restricts the minimum number of uppercase letters, lowercase letters, digits, and special characters in a password, the maximum and minimum length of a password, the password cannot be the same as the username or the reverse of the username, and the password cannot be a weak password. This policy enhances user account security. + +Weak passwords are easy to crack. The definition of weak passwords may vary with users or user groups. Users can define their own weak passwords. + +The **password\_policy** parameter specifies whether to enable the password strength verification mechanism. The default value is **1**, indicating that the password strength verification mechanism is enabled. + +### Data Encryption and Storage + +Imported data is encrypted before stored. + +This feature provides data encryption and decryption APIs for users and uses encryption functions to encrypt sensitive information columns identified by users, so that data can be stored in tables after being encrypted. + +If you need to encrypt the entire table, you need to write an encryption function for each column. Different attribute columns can use different input parameters. + +If a user with the required permission wants to view specific data, the user can decrypt required columns using the decryption function API. + +### Ledger Database + +To prevent database O&M personnel from stealing, tampering with, and erasing traces of the database, you can use the ledger database feature to perform comprehensive audit and trace the history. When a tamper-proof user table is modified, the database records the modification behavior to the history table where only data can be appended. In this way, the operation history can be recorded and the operation source can be traced. + +The ledger database stores and verifies historical operations by generating data hash digests. Ledgers refer to user history tables and global blockchain tables. For table-level data modification operations, the system records the operation information and hash digest in a global blockchain table. In addition, each tamper-proof user table corresponds to a user history table to record the hash digest of row-level data changes. You can determine whether the user table is tampered by recalculating the hash digest and verifying the hash digest consistency. + +Each record in the ledger represents a given operation fact that has occurred. The content of the record can only be appended and cannot be modified. The consistency between the tamper-proof user table and the corresponding history table can be checked to identify and track the tampering behavior. In addition, the ledger database provides an API for checking the tamper-proof user table consistency and an API for restoring and archiving history tables to meet the requirements of tampering identification, data expansion and mitigation, and historical data restoration and archiving. \ No newline at end of file diff --git a/content/docs-lite/en/docs/Technicalwhitepaper/database-security.md b/content/docs-lite/en/docs/Technicalwhitepaper/database-security.md deleted file mode 100644 index 3993e95eb..000000000 --- a/content/docs-lite/en/docs/Technicalwhitepaper/database-security.md +++ /dev/null @@ -1,199 +0,0 @@ -# Database Security - -## Access Control - -Access control is to manage users' database access control permissions, including database system permissions and object permissions. - -Role-based access control is supported. Roles and permissions are associated. Permissions are assigned to roles and then roles are assigned to users, implementing user access control permission management. The login access control is implemented by using the user ID and authentication technology. The object access control is implemented by checking the object permission based on the user permission on the object. You can assign the minimum permissions required for completing tasks to related database users to minimize database usage risks. - -An access control model based on separation of permissions is supported. Database roles are classified into system administrator, security administrator, and audit administrator. The security administrator creates and manages users, the system administrator grants and revokes user permissions, and the audit administrator audits all user behaviors. - -By default, the role-based access control model is used. You can set parameters to determine whether to enable the access control model based on separation of permissions. - -## Separation of Control and Access Permissions - -For the system administrator, the control and access permissions on table objects are separated to improve data security of common users and restrict the object access permissions of administrators. - -This feature applies to the following scenarios: An enterprise has multiple business departments using different database users to perform service operations. Database maintenance departments at the same level use the database administrator to perform O&M operations. The business departments require that administrators can only perform control operations \(DROP, ALTER, and TRUNCATE\) on data of each department and cannot perform access operations \(INSERT, DELETE, UPDATE, SELECT, and COPY\) without authorization. That is, the control permissions of database administrators for tables need to be isolated from their access permissions to improve the data security of common users. - -The system administrators can specify the **INDEPENDENT** attribute when creating a user, indicating that the user is a private user. Database administrators \(including initial users and other administrators\) can control \(**DROP**, **ALTER**, and **TRUNCATE**\) objects of private users but cannot access \(**INSERT**, **DELETE**, **UPDATE**, **SELECT**, **COPY**, **GRANT**, **REVOKE**, and **ALTER OWNER**\) the objects without authorization. - -## Built-in Database Role Permission Management - -openGauss provides a group of default roles whose names start with **gs\_role\_**. These roles are provided to access to specific, typically high-privileged operations. You can grant these roles to other users or roles within the database so that they can use specific functions. These roles should be given with great care to ensure that they are used where they are needed. [Table 1](#table2118117460) describes the permissions of built-in roles. - -**Table 1** Built-in role permissions - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Role

-

Permission

-

gs_role_copy_files

-

Permission to run the copy... to/from filename command. However, the GUC parameter enable_copy_server_files must be set first to enable the function of copying server files.

-

gs_role_signal_backend

-

Permission to invoke the pg_cancel_backend, pg_terminate_backend, and pg_terminate_session functions to cancel or terminate other sessions. However, this role cannot perform operations on sessions of the initial user or PERSISTENCE user.

-

gs_role_tablespace

-

Permission to create a tablespace.

-

gs_role_replication

-

Permission to invoke logical replication functions, such as kill_snapshot, pg_create_logical_replication_slot, pg_create_physical_replication_slot, pg_drop_replication_slot, pg_replication_slot_advance, pg_create_physical_replication_slot_extern, pg_logical_slot_get_changes, pg_logical_slot_peek_changes, pg_logical_slot_get_binary_changes and pg_logical_slot_peek_binary_changes.

-

gs_role_account_lock

-

Permission to lock and unlock users. However, this role cannot lock or unlock the initial user or PERSISTENCE user.

-

gs_role_directory_create

-

Permission to create directory objects. However, this role needs to enable the GUC parameter enable_access_server_directory first.

-

gs_role_directory_drop

-

Permission to delete directory objects. However, this role needs to enable the GUC parameter enable_access_server_directory first.

-
- -## Database Encryption Authentication - -The password encryption method based on the RFC5802 mechanism is used for authentication. - -The unidirectional, irreversible Hash encryption algorithm PBKDF2 is used for encryption and authentication, effectively defending against rainbow attacks. - -The password of the created user is encrypted and stored in the system catalog. During the entire authentication process, passwords are encrypted for storage and transmission. The hash value is calculated and compared with the value stored on the server to verify the correctness. - -The message processing flow in the unified encryption and authentication process effectively prevents attackers from cracking the username or password by capturing packets. - -## Database Audit - -Audit logs record user operations performed on database startup and stopping, connection, and DDL, DML, and DCL operations. The audit log mechanism enhances the database capability of tracing illegal operations and collecting evidence. - -You can set parameters to specify the statements or operations for which audit logs are recorded. - -Audit logs record the event time, type, execution result, username, database, connection information, database object, database instance name, port number, and details. You can query audit logs by start time and end time and filter audit logs by recorded field. - -Database security administrators can use the audit logs to reproduce a series of events that cause faults in the database and identify unauthorized users, unauthorized operations, and the time when these operations are performed. - -## Network Communication Security - -SSL can be used to encrypt communication data between the client and server, ensuring communication security between the client and server. - -The TLS 1.2 protocol and a highly secure encryption algorithm suite are adopted. [Table 2](#table13251121491017) lists the supported encryption algorithm suites. - -**Table 2** Encryption algorithm suites - - - - - - - - - - - - - - - - - - - - - - - - -

OpenSSL Suite Name

-

IANA Suite Name

-

Security

-

ECDHE-RSA-AES128-GCM-SHA256

-

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

-

HIGH

-

ECDHE-RSA-AES256-GCM-SHA384

-

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

-

HIGH

-

ECDHE-ECDSA-AES128-GCM-SHA256

-

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

-

HIGH

-

ECDHE-ECDSA-AES256-GCM-SHA384

-

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

-

HIGH

-
- -## Row-Level Security - -The row-level security \(RLS\) feature enables database access control to be accurate to each row of data tables. When different users perform the same SQL query operation, the read results may be different according to the RLS policy. - -You can create an RLS policy for a data table. The policy defines an expression that takes effect only for specific database users and SQL operations. When a database user accesses the data table, if a SQL statement meets the specified RLS policy of the data table, the expressions that meet the specified condition will be combined by using **AND** or **OR** based on the attribute type \(**PERMISSIVE** | **RESTRICTIVE**\) and applied to the execution plan in the query optimization phase. - -RLS is used to control the visibility of row-level data in tables. By predefining filters for data tables, the expressions that meet the specified condition can be applied to execution plans in the query optimization phase, which will affect the final execution result. Currently, RLS supports the following SQL statements: SELECT, UPDATE, and DELETE. - -## Resource Labels - -The resource label feature classifies database resources based on user-defined rules to implement resource classification and management. Administrators can configure resource labels to configure security policies, such as auditing or data masking, for a group of database resources. - -Resource labels can be used to group database resources based on features and application scenarios. You can manage all database resources with specified labels, which greatly reduces policy configuration complexity and information redundancy and improves management efficiency. - -Currently, resource labels support the following database resource types: schema, table, column, view, and function. - -## Dynamic Data Masking - -To prevent unauthorized users from sniffing privacy data, the dynamic data masking feature can be used to protect user privacy data. When an unauthorized user accesses the data for which a dynamic data masking policy is configured, the database returns the anonymized data to protect privacy data. - -Administrators can create dynamic data masking policies on data columns. The policies specify the data masking methods for specific user scenarios. After the dynamic data masking function is enabled, the system matches user identity information \(such as the access IP address, client tool, and username\) with the masking policy when a user accesses data in the sensitive column. After the matching is successful, the system masks the sensitive data in the query result of the column based on the masking policy. - -The purpose of dynamic data masking is to flexibly protect privacy data by configuring the filter, and specifying sensitive column labels and corresponding masking functions in the masking policy without changing the source data. - -## Unified Auditing - -Unified auditing allows administrators to configure audit policies for database resources or resource labels to simplify management, generate audit logs, reduce redundant audit logs, and improve management efficiency. - -Administrators can customize audit policies for configuring operation behaviors or database resources. The policies are used to audit specific user scenarios, user behaviors, or database resources. After the unified auditing function is enabled, when a user accesses the database, the system matches the corresponding unified audit policy based on the user identity information, such as the access IP address, client tool, and username. Then, the system classifies the user behaviors based on the access resource label and user operation type \(DML or DDL\) in the policy to perform unified auditing. - -The purpose of unified auditing is to change the existing traditional audit behavior into specific tracking audit behavior and exclude other behaviors from the audit, thereby simplifying management and improving the security of audit data generated by the database. - -## Password Strength Verification - -To harden the security of customer accounts and data, do not set weak passwords. You need to specify a password when initializing the database, creating a user, or modifying a user. The password must meet the strength requirements. Otherwise, the system prompts you to enter the password again. - -The account password complexity policy restricts the minimum number of uppercase letters, lowercase letters, digits, and special characters in a password, the maximum and minimum length of a password, the password cannot be the same as the username or the reverse of the username, and the password cannot be a weak password. This policy enhances user account security. - -Weak passwords are easy to crack. The definition of weak passwords may vary with users or user groups. Users can define their own weak passwords. - -The **password\_policy** parameter specifies whether to enable the password strength verification mechanism. The default value is **1**, indicating that the password strength verification mechanism is enabled. - -## Data Encryption and Storage - -Imported data is encrypted before stored. - -This feature provides data encryption and decryption APIs for users and uses encryption functions to encrypt sensitive information columns identified by users, so that data can be stored in tables after being encrypted. - -If you need to encrypt the entire table, you need to write an encryption function for each column. Different attribute columns can use different input parameters. - -If a user with the required permission wants to view specific data, the user can decrypt required columns using the decryption function API. - -## Ledger Database - -To prevent database O&M personnel from stealing, tampering with, and erasing traces of the database, you can use the ledger database feature to perform comprehensive audit and trace the history. When a tamper-proof user table is modified, the database records the modification behavior to the history table where only data can be appended. In this way, the operation history can be recorded and the operation source can be traced. - -The ledger database stores and verifies historical operations by generating data hash digests. Ledgers refer to user history tables and global blockchain tables. For table-level data modification operations, the system records the operation information and hash digest in a global blockchain table. In addition, each tamper-proof user table corresponds to a user history table to record the hash digest of row-level data changes. You can determine whether the user table is tampered by recalculating the hash digest and verifying the hash digest consistency. - -Each record in the ledger represents a given operation fact that has occurred. The content of the record can only be appended and cannot be modified. The consistency between the tamper-proof user table and the corresponding history table can be checked to identify and track the tampering behavior. In addition, the ledger database provides an API for checking the tamper-proof user table consistency and an API for restoring and archiving history tables to meet the requirements of tampering identification, data expansion and mitigation, and historical data restoration and archiving. - diff --git a/content/docs-lite/en/docs/Technicalwhitepaper/high-availability.md b/content/docs-lite/en/docs/Technicalwhitepaper/high-availability.md deleted file mode 100644 index 3b0cf07db..000000000 --- a/content/docs-lite/en/docs/Technicalwhitepaper/high-availability.md +++ /dev/null @@ -1,43 +0,0 @@ -# High Availability - -## Primary/Standby - -To ensure that a fault can be rectified, data needs to be written into multiple copies. Multiple copies are configured for the primary and standby nodes, and logs are used for data synchronization. In this way, openGauss has no data lost when a node is faulty or the system restarts after a stop, meeting the ACID feature requirements. The primary/standby environment supports two modes: primary/standby, and one primary and multiple standbys. In primary/standby mode, if the standby node needs to redo logs, it can be promoted to primary. In the one primary and multiple standbys mode, all standby nodes need to redo logs and can be promoted to primary. The primary/standby mode is mainly used for OLTP systems with general reliability to save storage resources. The one primary and multiple standbys mode provides higher DR capabilities and is suitable for the OLTP system with higher availability transaction processing. - -The **switchover** command can be used to trigger a switchover between the primary and standby nodes. If the primary node is faulty, the **failover** command can be used to promote the standby node to the primary. - -To ensure that the failover time is controllable, you can enable the log flow control function to control the rate of sending logs to the standby node. This ensures that the logs accumulated on the standby node will be replayed within the time configured for flow control. After flow control is enabled, the rate of sending logs to the standby node is dynamically adjusted. As a result, the overall transaction performance deteriorates. - -In scenarios such as initial installation or backup and restoration, data on the standby node needs to be rebuilt based on the primary node. In this case, the build function is required to send the data and WALs of the primary node to the standby node. When the primary node is faulty and joins again as a standby node, the build function needs to be used to synchronize data and WALs with those of the new primary node. Build includes full build and incremental build. Full build depends on primary node data for rebuild. The amount of data to be copied is large and the time required is long. Incremental build copies only differential files. The amount of data to be copied is small and the time required is short. Generally, the incremental build is preferred for fault recovery. If the incremental build fails, the full build continues until the fault is rectified. - -In addition to streaming replication in primary/standby mode, openGauss also supports logical replication. In logical replication, the primary database is called the source database, and the standby database is called the target database. The source database parses the WAL file based on the specified logical parsing rule and parses the DML operation into certain logical change information \(standard SQL statements\). The source database sends standard SQL statements to the target database. After receiving the SQL statements, the target database applies them to implement data synchronization. Logical replication involves only DML operations. Logical replication can implement cross-version replication, heterogeneous database replication, dual-write database replication, and table-level replication. - ->![](public_sys-resources/icon-note.gif) **NOTE:** ->In the current Lite scenario, openGauss does not support deployment with one primary and multiple standbys. - -## Logical Backup - -openGauss provides the logical backup capability to back up data in user tables to local disk files in text or CSV format and restore the data in homogeneous or heterogeneous databases. - -## Flashback Restoration - -The flashback function is used to restore dropped tables from the recycle bin. Like in a Window OS, dropped table information is stored in the recycle bin of databases. The MVCC mechanism is used to restore data to a specified point in time or system change number \(SCN\). - -## Ultimate RTO - -After the ultimate RTO function is enabled, multi-level pipelines are established for Xlog log playback to improve the concurrency and log playback speed. - -When the service load is heavy, the playback speed of the standby node cannot catch up with that of the primary node. After the system runs for a long time, logs are accumulated on the standby node. If a host is faulty, data restoration takes a long time and the database is unavailable, which severely affects system availability. The ultimate recovery time object \(RTO\) is enabled to reduce the data recovery time after a host fault occurs and improve availability. - -## Logical Replication - -openGauss provides the logical decoding function to reversely parse physical logs into logical logs. Logical replication tools such as DRS convert logical logs to SQL statements and replay the SQL statements in the peer database. In this way, data can be synchronized between heterogeneous databases. Currently, unidirectional and bidirectional logical replication between the openGauss database and the MySQL or Oracle database is supported. DNs reversely parse physical logs to logical logs. Logical replication tools such as DRS extract logical logs from DNs, convert the logs to SQL statements, and replay the SQL statements in MySQL. Logical replication tools also extract logical logs from a MySQL database, reversely parse the logs to SQL statements, and replay the SQL statements in openGauss. In this way, data can be synchronized between heterogeneous databases. - -## Publication-Subscription - -Publication-subscription is implemented based on logical replication, with one or more subscribers subscribing to one or more publications on a publisher node. The subscriber pulls data from the publication they subscribe to. Data can be synchronized between clusters in real time. Changes on the publisher are sent to the subscriber as they occur in real time. The subscriber applies the data in the same order as the publisher, so that transactional consistency is guaranteed for publications within a single subscription. This method of data replication is sometimes called transactional replication. - -## Point-In-Time Recovery \(PITR\) - -PITR uses basic hot backup, WALs, and WAL archive logs for backup and recovery. When replaying a WAL record, you can stop at any point in time, so that there is a snapshot of the consistent database at any point in time. That is, you can restore the database to the state at any time since the backup starts. During recovery, openGauss supports specifying the recovery stop point as TID, time, and LSN. - diff --git a/content/docs-lite/en/docs/Technicalwhitepaper/high-performance.md b/content/docs-lite/en/docs/Technicalwhitepaper/high-performance.md deleted file mode 100644 index 75fbea1bd..000000000 --- a/content/docs-lite/en/docs/Technicalwhitepaper/high-performance.md +++ /dev/null @@ -1,204 +0,0 @@ -# High Performance - -## CBO Optimizer - -The openGauss optimizer is a typical Cost-based Optimization \(CBO\). By using CBO, the database calculates the number of tuples and the execution cost for each execution step under each execution plan based on the number of table tuples, column width, NULL record ratio, and characteristic values, such as distinct, MCV, and HB values, and certain cost calculation methods. The database then selects the execution plan that takes the lowest cost for the overall execution or for the return of the first tuple. - -The CBO optimizer can select the most efficient execution plan among multiple plans based on the cost to meet customer service requirements to the maximum extent. - -## Hybrid Row-Column Storage - -openGauss supports both the row-store and column-store models. Users can choose a row-store or column-store table based on their needs. - -Column-store is recommended if a table contains many columns \(called a wide table\) but its query involves only a few columns. Row-store is recommended if a table contains only a few columns and a query involves most of the columns. - -[Figure 1](#en-us_concept_0283139011_en-us_topic_0242724708_fig4487133722819) shows the column-store model. - -**Figure 1** Column-store -![](figures/column-store.png "column-store") - -In a wide table containing a huge amount of data, a query usually only involves certain columns. In this case, the query performance of the row-store engine is poor. For example, a single table containing the data of a meteorological agency has 200 to 800 columns. Among these columns, only 10 are frequently accessed. In this case, the vectorized execution technology and column-store engine can significantly improve performance by saving storage space. - -Row-store tables and column-store tables have their own advantages and disadvantages. You are advised to select a table based on the site requirements. - -- Row-store table - - Row-store tables are created by default. Data is stored by row. Row-store supports adding, deleting, modifying, and querying data of a complete row. Therefore, this storage model applies to scenarios where data needs to be updated frequently. - -- Column-store table - - Data is stored by column. The I/O of data query in a single column is small, and column-store tables occupy less storage space than row-store tables. This storage model applies to scenarios where data is inserted in batches, less updated, and queried for statistical analysis. The performance of single point query and single record insertion in a column-store table is poor. - - -The principles for selecting row-store and column-store tables are as follows: - -- Update frequency - - If data is frequently updated, use a row-store table. - -- Data insertion frequency - - If a small amount of data is frequently inserted each time, use a row-store table. If a large amount of data is inserted at a time, use a column-store table. - -- Number of columns - - If a table is to contain many columns, use a column-store table. - -- Number of columns to be queried - - If only a small number of columns \(less than 50% of the total\) is queried each time, use a column-store table. - -- Compression ratio - - The compression ratio of a column-store table is higher than that of a row-store table. High compression ratio consumes more CPU resources. - - -## In-place Update Storage - -The in-place update storage engine solves the problems of space expansion and large tuples of the Append update storage engine. The design of efficient rollback segments is the basis of the in-place update storage engine. - -## Xlog Lockless Update and Parallel Page Playback - -**Figure 2** Xlog lock less Design -![](figures/xlog-lock-less-design.png "xlog-lock-less-design") - -This feature optimizes the WalInsertLock mechanism by using log sequence numbers \(LSNs\) and log record counts \(LRCs\) to record the copy progress of each backend and canceling the WalInsertLock mechanism. The backend can directly copy logs to the WalBuffer without contending for the WalInsertLock. In addition, a dedicated WALWriter thread is used to write logs, and the backend thread does not need to ensure the Xlog flushing. After the preceding optimization, the WalInsertLock contention and WalWriter dedicated disk write threads are canceled. The system performance can be further improved while the original XLog function remains unchanged. This feature optimizes the Ustore in-place update WALs and Ustore DML operation parallel playback and distribution. Prefixes and suffixes are used to reduce the update WALs. The playback thread is divided into multiple types to solve the problem that most Ustore DML WALs are replayed on multiple pages. In addition, the Ustore data page playback is distributed based on blkno to improve the degree of parallel playback. - -## Adaptive Compression - -Currently, mainstream databases usually use the data compression technology. Various compression algorithms are used for different data types. If pieces of data of the same type have different characteristics, their compression algorithms and results will also be different. Adaptive compression chooses the suitable compression algorithm for data based on the data type and characteristics, achieving high performance in compression ratio, import, and query. - -Importing and frequently querying a huge amount of data are the main application scenarios. When you import data, adaptive compression greatly reduces the data volume, increases I/O operation efficiency several times, and clusters data before storage, achieving fast data import. In this way, only a small number of I/O operations is required and data is quickly decompressed in a query. Data can be quickly retrieved and the query result is quickly returned. - -Currently, the database has implemented various compression algorithms, including RLE, DELTA, BYTEPACK/BITPACK, LZ4, ZLIB, and LOCAL DICTIONARY. The following table lists data types and the compression algorithms suitable for them. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-

-

RLE

-

DELTA

-

BITPACK/BYTEPACK

-

LZ4

-

ZLIB

-

LOCAL DICTIONARY

-

Smallint/int/bigint/Oid

-

Decimal/real/double

-

Money/time/date/

-

timestamp

-

-

-

-

-

-

-

-

Tinterval/interval/Time with time zone/

-

-

-

-

-

-

-

-

-

-

-

-

Numeric/char/varchar/text/nvarchar2

-

and other supported data types

-

-

-

-

-

-

-
- -For example, large integer compression of mobile number-like character strings, large integer compression of the numeric type, and adjustment of the compression algorithm compression level are supported. - -## Partition - -In the openGauss system, data is partitioned horizontally in an instance using a specified policy. This operation splits a table into multiple partitions that are not overlapped. - -In common scenarios, a partitioned table has the following advantages over a common table: - -- High query performance: You can specify partitions when querying partitioned tables, improving query efficiency. -- High availability: If a certain partition in a partitioned table is faulty, data in the other partitions is still available. -- Easy maintenance: To fix a partitioned table having a faulty partition, you only need to fix the partition. -- Balanced I/O: Partitions can be mapped to different disks to balance I/O and improve the overall system performance. - -Currently, openGauss supports range partitioned tables, list partitioned tables, and hash partitioned tables. - -- In a range partitioned table, data within a certain range is mapped to each partition. The range is determined by the partition key specified when the partitioned table is created. This partitioning mode is most commonly used. - - With the range partitioning function, the database divides a record, which is to be inserted into a table, into multiple ranges using one or multiple columns and creates a partition for each range to store data. Partition ranges do not overlap. - -- In a list partitioned table, data is mapped to each partition based on the key values contained in each partition. The key values contained in a partition are specified when the partition is created. - - The list partitioning function divides the key values in the records to be inserted into a table into multiple lists \(the lists do not overlap in different partitions\) based on a column of the table, and then creates a partition for each list to store the corresponding data. - -- In a hash partitioned table, data is mapped to each partition using the hash algorithm, and each partition stores records with the same hash value. - - The hash partitioning function uses the internal hash algorithm to divide records to be inserted into a table into partitions based on a column of the table. - - -If you specify the **PARTITION** parameter when running the **CREATE TABLE** statement, data in the table will be partitioned. - -Users can modify partition keys as needed during table creation to make the query result stored in the same or least partitions \(called partition pruning\), so as to obtain consecutive I/O to improve the query performance. - -In actual services, time is often used as a filter criterion for query objects. Therefore, you can select the time column as the partition key. The key value range can be adjusted based on the total data volume and the data volume queried at a time. - -## SQL by pass - -In a typical OLTP scenario, simple queries account for a large proportion. This type of queries involves only single tables and simple expressions. To accelerate such query, the SQL bypass framework is proposed. After simple mode judgment is performed on such query at the parse layer, the query enters a special execution path and skips the classic execution framework, including operator initialization and execution, expression, and projection. Instead, it directly rewrites a set of simple execution paths and directly invokes storage APIs, greatly accelerating the execution of simple queries. - -## Kunpeng NUMA Architecture Optimization - -The following figure shows the Kunpeng NUMA architecture optimization. - -**Figure 3** Kunpeng NUMA architecture optimization -![](figures/kunpeng-numa-architecture-optimization.png "kunpeng-numa-architecture-optimization") - -1. Based on the multi-core NUMA architecture of the Kunpeng processor, openGauss optimizes the NUMA architecture to reduce the cross-core memory access latency and maximize the multi-core Kunpeng computing capability. The key technologies include redo log batch insertion, NUMA distribution of hotspot data, and Clog partitions, greatly improving the processing performance of the TP system. -2. Based on the ARMv8.1 architecture used by the Kunpeng chip, openGauss uses the LSE instruction set to implement efficient atomic operations, effectively improving the CPU usage, multi-thread synchronization performance, and XLog write performance. -3. Based on the wider L3 cache line provided by the Kunpeng chip, openGauss optimizes hotspot data access, effectively improving the cache access hit ratio, reducing the cache consistency maintenance overhead, and greatly improving the overall data access performance of the system. - -## High Concurrency of the Thread Pool - -In the OLTP field, a database needs to process a large quantity of client connections. Therefore, the processing capability in high-concurrency scenarios is one of the important capabilities of the database. - -The simplest processing mode for external connections is the per-thread-per-connection mode, in which a user connection generates a thread. This mode features simple processing thanks to its architecture. However, in high-concurrency scenarios, there are too many threads, causing heavy workload in thread switchover and large conflict between the lightweight lock areas of the database. As a result, the performance \(throughput\) deteriorates sharply and the SLA of user performance cannot be met. - -Therefore, a thread resource pooling and reuse technology needs to be used to resolve this problem. The overall design idea of the thread pool technology is to pool thread resources and reuse them among different connections. After the system is started, a fixed number of working threads are started based on the current number of cores or user configuration. A working thread serves one or more connection sessions. In this way, the session and thread are decoupled. The number of worker threads is fixed. Therefore, frequent thread switchover does not occur in case of high concurrency. The database layer schedules and manages sessions. - -## Parallel Query - -The Symmetric Multi-Processing \(SMP\) parallel technology of openGauss uses the multi-core CPU architecture of a computer to implement multi-thread parallel computing, fully using CPU resources to improve query performance. In complex query scenarios, a single query execution takes long time and the system concurrency is low. Therefore, the SMP parallel execution technology is used to implement operator-level parallel execution, which effectively reduces the query execution time and improves the query performance and resource utilization. The overall implementation of the SMP parallel technology is as follows: For query operators that can be executed in parallel, data is sliced, multiple working threads are started for computation, and then the results are summarized and returned to the frontend. The data interaction operator **Stream** is added to SMP parallel execution to implement data interaction between multiple working threads, ensuring the correctness of the query and completing the overall query. - diff --git a/content/docs-lite/en/docs/Technicalwhitepaper/maintainability.md b/content/docs-lite/en/docs/Technicalwhitepaper/maintainability.md deleted file mode 100644 index 770ec2a02..000000000 --- a/content/docs-lite/en/docs/Technicalwhitepaper/maintainability.md +++ /dev/null @@ -1,139 +0,0 @@ -# Maintainability - -## Workload Diagnosis Report - -The workload diagnosis report \(WDR\) generates a performance report between two different time points based on the system performance snapshot data at two different time points. The report is used to diagnose database kernel performance faults. - -The WDR performance snapshot data is stored in the snapshot schema of the **postgres** database. The default collection and retention policies are as follows: - -- A snapshot is collected every hour \(wdr\_snapshot\_interval=1h\). -- It is retained for 8 days \(wdr\_snapshot\_retention\_days=8\). - -WDR depends on the following two components: - -- SNAPSHOT: The performance snapshot can be configured to collect a certain amount of performance data from the kernel at a specified interval and store the data in the user tablespace. Any snapshot can be used as a performance baseline for comparison with other snapshots. -- WDR Reporter: This tool analyzes the overall system performance based on two snapshots, calculates the changes of more specific performance indicators between the two time periods, and generates summarized and detailed performance data. For details, see [Table 1](#en-us_concept_0283139006_en-us_concept_0238164494_table14895120191613) and [Table 2](#en-us_concept_0283139006_en-us_concept_0238164494_table23331848193120). - -**Table 1** Summarized diagnosis report - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Diagnosis Type

-

Description

-

Database Stat

-

Evaluates the load and I/O status of the current database. Load and I/O are the most important indicators of the TP system.

-

The statistics include the number of sessions connected to the database, number of committed and rolled back transactions, number of read disk blocks, number of disk blocks found in the cache, number of rows returned, captured, inserted, updated, and deleted through database query, number of conflicts and deadlocks, usage of temporary files, and I/O read/write time.

-

Load Profile

-

Evaluates the current system load from the time, I/O, transaction, and SQL dimensions.

-

The statistics include the job running elapse time, CPU time, daily transaction quality, logical and physical read volume, read and write I/O times and size, login and logout times, SQL, transaction execution volume, and SQL P85 and P90 response time.

-

Instance Efficiency Percentages

-

Evaluates the cache efficiency of the current system.

-

The statistics include the database cache hit ratio.

-

Events

-

Evaluates the performance of key system kernel resources and key events.

-

The statistics include the number of times that the key time of the database kernel occurs and the waiting time.

-

Wait Classes

-

Evaluates the performance of key events in the system.

-

The statistics include the release of the data kernel in the main types of waiting events, such as STATUS, LWLOCK_EVENT, LOCK_EVENT, and IO_EVENT.

-

CPU

-

Includes time release of the CPU in user mode, kernel mode, wait I/O, and idle mode.

-

IO Profile

-

Includes the number of database I/O times, database I/O data volume, number of redo I/O times, and redo I/O volume.

-

Memory Statistics

-

Includes maximum process memory, used process memory, maximum shared memory, and used shared memory.

-
- -**Table 2** Detailed diagnosis report - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Diagnosis Type

-

Description

-

Time Model

-

Evaluates the performance of the current system in the time dimension.

-

The statistics include time consumed by the system in each phase, including the kernel time, CPU time, execution time, parsing time, compilation time, query rewriting time, plan generation time, network time, and I/O time.

-

SQL Statistics

-

Diagnoses SQL statement performance problems.

-

The statistics include normalized SQL performance indicators in multiple dimensions: elapsed time, CPU time, rows returned, tuple reads, executions, physical reads, and logical reads. The indicators can be classified into execution time, number of execution times, row activity, and cache I/O.

-

Wait Events

-

Diagnoses performance of key system resources and key time in detail.

-

The statistics include the performance of all key events in a period of time, including the number of events and the time consumed.

-

Cache IO Stats

-

Diagnoses the performance of user tables and indexes.

-

The statistics include read and write operations on all user tables and indexes, and the cache hit ratio.

-

Utility status

-

Diagnoses the performance of backend jobs.

-

The statistics include the performance of backend operations such as page operation and replication.

-

Object stats

-

Diagnoses the performance of database objects.

-

The statistics include user tables, tables on indexes, index scan activities, insert, update, and delete activities, number of valid rows, and table maintenance status.

-

Configuration settings

-

Determines whether the configuration is changed.

-

It is a snapshot that contains all current configuration parameters.

-
- -Benefits: - -- WDR is the main method for diagnosing long-term performance problems. Based on the performance baseline of a snapshot, performance analysis is performed from multiple dimensions, helping DBAs understand the system load, performance of each component, and performance bottlenecks. -- Snapshots are also an important data source for subsequent performance problem self-diagnosis and self-optimization suggestions. - -## Slow SQL Diagnosis - -Slow SQL records information about all jobs whose execution time exceeds the threshold. - -Historical slow SQL provides table-based and function-based query interfaces. You can query the execution plan, start time, end time, query statement, row activity, kernel time, CPU time, execution time, parsing time, compilation time, query rewriting time, plan generation time, network time, I/O time, network overhead, and lock overhead. All information is anonymized. - -Slow SQL provides detailed information required for slow SQL diagnosis. You can diagnose performance problems of specific slow SQL statements offline without reproducing the problem. The table-based and function-based APIs help users collect statistics on slow SQL indicators and connect to third-party platforms. diff --git a/content/docs-lite/en/menu/index.md b/content/docs-lite/en/menu/index.md index 752ee646f..55461cd38 100644 --- a/content/docs-lite/en/menu/index.md +++ b/content/docs-lite/en/menu/index.md @@ -133,12 +133,9 @@ headless: true - [Getting Started]({{< relref "./docs/GettingStarted/GettingStarted.md" >}}) - [Understanding openGauss]({{< relref "./docs/GettingStarted/understanding-opengauss.md" >}}) - - [Installation]({{< relref "./docs/GettingStarted/installation.md" >}}) + - [Installing openGauss]({{< relref "./docs/GettingStarted/installing-opengauss.md" >}}) - [Preparing for Installation]({{< relref "./docs/GettingStarted/preparing-for-installation.md" >}}) - - [Obtaining and Verifying an Installation Package]({{< relref "./docs/GettingStarted/obtaining-and-verifying-an-installation-package.md" >}}) - - [Preparing the Software and Hardware Installation Environment]({{< relref "./docs/GettingStarted/preparing-the-software-and-hardware-installation-environment.md" >}}) - - [Container-based Installation on a Single Node]({{< relref "./docs/GettingStarted/container-based-installation-on-a-single-node.md" >}}) - - [Installation on a Single Node]({{< relref "./docs/GettingStarted/installation-on-a-single-node.md" >}}) + - [Installation]({{< relref "./docs/GettingStarted/installation.md" >}}) - [Connecting to openGauss]({{< relref "./docs/GettingStarted/connecting-to-opengauss.md" >}}) - [gsql Connection and Usage]({{< relref "./docs/GettingStarted/gsql-connection-and-usage.md" >}}) - [Connecting to a Database]({{< relref "./docs/GettingStarted/connecting-to-a-database.md" >}}) -- Gitee From 51d9195cc15747b512875990f746597a8140de9c Mon Sep 17 00:00:00 2001 From: freyaqqianjin Date: Wed, 26 Apr 2023 17:40:26 +0800 Subject: [PATCH 4/7] FIX BUG --- .../BriefTutorial/event-trigger-functions.md | 112 ++ .../en/docs/BriefTutorial/event-trigger.md | 125 ++ .../en/docs/BriefTutorial/transactions.md | 2 +- ...=> get_global_prepared_xacts-discarded.md} | 0 .../DataBaseReference/pg_event_trigger.md | 75 + .../DataBaseReference/pg_subscription_rel.md | 54 + .../querying-a-system-catalog.md | 128 ++ .../en/docs/DataBaseReference/system-views.md | 4 - .../en/docs/DataBaseReference/wait-events.md | 16 + ...ertificate-authentication-configuration.md | 68 - .../unified-audit-policy.md | 5 - .../concurrent-insert-in-the-same-table.md | 2 +- .../en/docs/DatabaseOMGuide/quick-setup.md | 27 +- .../application-development-guide.md | 13 - .../docs/Developerguide/connection-close.md | 27 + .../docs/Developerguide/connection-commit.md | 27 + .../docs/Developerguide/connection-cursor.md | 54 + .../Developerguide/connection-rollback.md | 27 + .../en/docs/Developerguide/copymanager.md | 109 ++ .../curosr-executemany_query-vars_list.md | 44 + .../en/docs/Developerguide/cursor-close.md | 24 + .../cursor-execute_query-vars_list.md | 44 + .../en/docs/Developerguide/cursor-fetchall.md | 24 + .../en/docs/Developerguide/cursor-fetchone.md | 24 + .../database-connection-control-functions.md | 23 + .../database-statement-execution-functions.md | 29 + ...-primary-standby-cluster-load-balancing.md | 89 ++ ...ons-for-asynchronous-command-processing.md | 26 + ...tions-for-canceling-queries-in-progress.md | 11 + .../java-sql-callablestatement.md | 206 +++ .../Developerguide/java-sql-connection.md | 364 +++++ .../java-sql-databasemetadata.md | 1266 +++++++++++++++++ .../en/docs/Developerguide/java-sql-driver.md | 67 + .../java-sql-preparedstatement.md | 354 +++++ .../docs/Developerguide/java-sql-resultset.md | 960 +++++++++++++ .../java-sql-resultsetmetadata.md | 170 +++ .../docs/Developerguide/java-sql-statement.md | 359 +++++ .../Developerguide/javax-naming-context.md | 88 ++ .../javax-naming-spi-initialcontextfactory.md | 25 + .../javax-sql-connectionpooldatasource.md | 32 + .../Developerguide/javax-sql-datasource.md | 60 + .../javax-sql-pooledconnection.md | 46 + .../docs/Developerguide/jdbc-configuration.md | 59 + .../jdbc-interface-reference.md | 29 +- .../Developerguide/libpq-api-reference.md | 11 +- .../Developerguide/psycopg-api-reference.md | 21 +- .../docs/Developerguide/psycopg2-connect.md | 79 + .../Developerguide/tool-interconnection.md | 2 +- ...t-for-degrading-some-errors-to-warnings.md | 2 +- .../SQL-language-structure-and-syntax.md | 2 - .../docs/SQLReference/alter-event-trigger.md | 41 + .../en/docs/SQLReference/alter-event.md | 74 + .../alter-foreign-data-wrapper.md | 63 + .../docs/SQLReference/create-event-trigger.md | 97 ++ .../en/docs/SQLReference/create-event.md | 93 ++ .../create-foreign-data-wrapper.md | 48 + .../en/docs/SQLReference/cursors-1.md | 340 ----- .../docs-lite/en/docs/SQLReference/cursors.md | 339 ++++- .../docs/SQLReference/drop-event-trigger.md | 36 + .../en/docs/SQLReference/drop-event.md | 32 + .../SQLReference/drop-foreign-data-wrapper.md | 36 + .../insert_right_ref_default_value.md | 76 + .../en/docs/SQLReference/show-events.md | 39 + .../docs-lite/en/docs/SQLReference/shrink.md | 49 + .../SQLReference/sql-structure-and-syntax.md | 1 + .../docs/SQLReference/sql-syntax-formats.md | 53 + .../SQLReference/stored-procedure-cursors.md | 11 + content/docs-lite/en/menu/index.md | 503 +++---- content/en/docs/BriefTutorial/transactions.md | 2 +- .../concurrent-insert-in-the-same-table.md | 2 +- .../querying-a-system-catalog.md | 128 ++ .../en/docs/DatabaseReference/wait-events.md | 16 + .../docs/DeveloperGuide/connection-close.md | 27 + .../docs/DeveloperGuide/connection-commit.md | 27 + .../docs/DeveloperGuide/connection-cursor.md | 54 + .../DeveloperGuide/connection-rollback.md | 27 + content/en/docs/DeveloperGuide/copymanager.md | 109 ++ .../curosr-executemany_query-vars_list.md | 44 + .../en/docs/DeveloperGuide/cursor-close.md | 24 + .../cursor-execute_query-vars_list.md | 44 + .../en/docs/DeveloperGuide/cursor-fetchall.md | 24 + .../en/docs/DeveloperGuide/cursor-fetchone.md | 24 + .../java-sql-callablestatement.md | 206 +++ .../DeveloperGuide/java-sql-connection.md | 364 +++++ .../java-sql-databasemetadata.md | 1266 +++++++++++++++++ .../en/docs/DeveloperGuide/java-sql-driver.md | 67 + .../java-sql-preparedstatement.md | 354 +++++ .../docs/DeveloperGuide/java-sql-resultset.md | 960 +++++++++++++ .../java-sql-resultsetmetadata.md | 170 +++ .../docs/DeveloperGuide/java-sql-statement.md | 359 +++++ .../DeveloperGuide/javax-naming-context.md | 88 ++ .../javax-naming-spi-initialcontextfactory.md | 25 + .../javax-sql-connectionpooldatasource.md | 32 + .../DeveloperGuide/javax-sql-datasource.md | 60 + .../javax-sql-pooledconnection.md | 46 + .../jdbc-interface-reference.md | 29 +- .../DeveloperGuide/libpq-api-reference.md | 11 +- .../DeveloperGuide/psycopg-api-reference.md | 21 +- .../docs/DeveloperGuide/psycopg2-connect.md | 79 + ...t-for-degrading-some-errors-to-warnings.md | 2 +- .../alter-foreign-data-wrapper.md | 63 + .../en/docs/SQLReference/clean-connection.md | 66 + .../create-foreign-data-wrapper.md | 48 + .../SQLReference/drop-foreign-data-wrapper.md | 36 + content/en/menu/index.md | 83 +- 105 files changed, 11593 insertions(+), 740 deletions(-) create mode 100644 content/docs-lite/en/docs/BriefTutorial/event-trigger-functions.md create mode 100644 content/docs-lite/en/docs/BriefTutorial/event-trigger.md rename content/docs-lite/en/docs/DataBaseReference/{get_global_prepared_xacts-(discarded).md => get_global_prepared_xacts-discarded.md} (100%) create mode 100644 content/docs-lite/en/docs/DataBaseReference/pg_event_trigger.md create mode 100644 content/docs-lite/en/docs/DataBaseReference/pg_subscription_rel.md create mode 100644 content/docs-lite/en/docs/DataBaseReference/querying-a-system-catalog.md create mode 100644 content/docs-lite/en/docs/DataBaseReference/wait-events.md delete mode 100644 content/docs-lite/en/docs/DatabaseAdministrationGuide/primary-standby-certificate-authentication-configuration.md delete mode 100644 content/docs-lite/en/docs/DatabaseAdministrationGuide/unified-audit-policy.md delete mode 100644 content/docs-lite/en/docs/Developerguide/application-development-guide.md create mode 100644 content/docs-lite/en/docs/Developerguide/connection-close.md create mode 100644 content/docs-lite/en/docs/Developerguide/connection-commit.md create mode 100644 content/docs-lite/en/docs/Developerguide/connection-cursor.md create mode 100644 content/docs-lite/en/docs/Developerguide/connection-rollback.md create mode 100644 content/docs-lite/en/docs/Developerguide/copymanager.md create mode 100644 content/docs-lite/en/docs/Developerguide/curosr-executemany_query-vars_list.md create mode 100644 content/docs-lite/en/docs/Developerguide/cursor-close.md create mode 100644 content/docs-lite/en/docs/Developerguide/cursor-execute_query-vars_list.md create mode 100644 content/docs-lite/en/docs/Developerguide/cursor-fetchall.md create mode 100644 content/docs-lite/en/docs/Developerguide/cursor-fetchone.md create mode 100644 content/docs-lite/en/docs/Developerguide/database-connection-control-functions.md create mode 100644 content/docs-lite/en/docs/Developerguide/database-statement-execution-functions.md create mode 100644 content/docs-lite/en/docs/Developerguide/example-jdbc-primary-standby-cluster-load-balancing.md create mode 100644 content/docs-lite/en/docs/Developerguide/functions-for-asynchronous-command-processing.md create mode 100644 content/docs-lite/en/docs/Developerguide/functions-for-canceling-queries-in-progress.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-callablestatement.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-connection.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-databasemetadata.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-driver.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-preparedstatement.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-resultset.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-resultsetmetadata.md create mode 100644 content/docs-lite/en/docs/Developerguide/java-sql-statement.md create mode 100644 content/docs-lite/en/docs/Developerguide/javax-naming-context.md create mode 100644 content/docs-lite/en/docs/Developerguide/javax-naming-spi-initialcontextfactory.md create mode 100644 content/docs-lite/en/docs/Developerguide/javax-sql-connectionpooldatasource.md create mode 100644 content/docs-lite/en/docs/Developerguide/javax-sql-datasource.md create mode 100644 content/docs-lite/en/docs/Developerguide/javax-sql-pooledconnection.md create mode 100644 content/docs-lite/en/docs/Developerguide/jdbc-configuration.md create mode 100644 content/docs-lite/en/docs/Developerguide/psycopg2-connect.md delete mode 100644 content/docs-lite/en/docs/SQLReference/SQL-language-structure-and-syntax.md create mode 100644 content/docs-lite/en/docs/SQLReference/alter-event-trigger.md create mode 100644 content/docs-lite/en/docs/SQLReference/alter-event.md create mode 100644 content/docs-lite/en/docs/SQLReference/alter-foreign-data-wrapper.md create mode 100644 content/docs-lite/en/docs/SQLReference/create-event-trigger.md create mode 100644 content/docs-lite/en/docs/SQLReference/create-event.md create mode 100644 content/docs-lite/en/docs/SQLReference/create-foreign-data-wrapper.md delete mode 100644 content/docs-lite/en/docs/SQLReference/cursors-1.md create mode 100644 content/docs-lite/en/docs/SQLReference/drop-event-trigger.md create mode 100644 content/docs-lite/en/docs/SQLReference/drop-event.md create mode 100644 content/docs-lite/en/docs/SQLReference/drop-foreign-data-wrapper.md create mode 100644 content/docs-lite/en/docs/SQLReference/insert_right_ref_default_value.md create mode 100644 content/docs-lite/en/docs/SQLReference/show-events.md create mode 100644 content/docs-lite/en/docs/SQLReference/shrink.md create mode 100644 content/docs-lite/en/docs/SQLReference/sql-structure-and-syntax.md create mode 100644 content/docs-lite/en/docs/SQLReference/sql-syntax-formats.md create mode 100644 content/docs-lite/en/docs/SQLReference/stored-procedure-cursors.md create mode 100644 content/en/docs/DatabaseReference/querying-a-system-catalog.md create mode 100644 content/en/docs/DatabaseReference/wait-events.md create mode 100644 content/en/docs/DeveloperGuide/connection-close.md create mode 100644 content/en/docs/DeveloperGuide/connection-commit.md create mode 100644 content/en/docs/DeveloperGuide/connection-cursor.md create mode 100644 content/en/docs/DeveloperGuide/connection-rollback.md create mode 100644 content/en/docs/DeveloperGuide/copymanager.md create mode 100644 content/en/docs/DeveloperGuide/curosr-executemany_query-vars_list.md create mode 100644 content/en/docs/DeveloperGuide/cursor-close.md create mode 100644 content/en/docs/DeveloperGuide/cursor-execute_query-vars_list.md create mode 100644 content/en/docs/DeveloperGuide/cursor-fetchall.md create mode 100644 content/en/docs/DeveloperGuide/cursor-fetchone.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-callablestatement.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-connection.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-databasemetadata.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-driver.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-preparedstatement.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-resultset.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-resultsetmetadata.md create mode 100644 content/en/docs/DeveloperGuide/java-sql-statement.md create mode 100644 content/en/docs/DeveloperGuide/javax-naming-context.md create mode 100644 content/en/docs/DeveloperGuide/javax-naming-spi-initialcontextfactory.md create mode 100644 content/en/docs/DeveloperGuide/javax-sql-connectionpooldatasource.md create mode 100644 content/en/docs/DeveloperGuide/javax-sql-datasource.md create mode 100644 content/en/docs/DeveloperGuide/javax-sql-pooledconnection.md create mode 100644 content/en/docs/DeveloperGuide/psycopg2-connect.md create mode 100644 content/en/docs/SQLReference/alter-foreign-data-wrapper.md create mode 100644 content/en/docs/SQLReference/clean-connection.md create mode 100644 content/en/docs/SQLReference/create-foreign-data-wrapper.md create mode 100644 content/en/docs/SQLReference/drop-foreign-data-wrapper.md diff --git a/content/docs-lite/en/docs/BriefTutorial/event-trigger-functions.md b/content/docs-lite/en/docs/BriefTutorial/event-trigger-functions.md new file mode 100644 index 000000000..a25073bae --- /dev/null +++ b/content/docs-lite/en/docs/BriefTutorial/event-trigger-functions.md @@ -0,0 +1,112 @@ +# Event Trigger Functions + +- pg\_event\_trigger\_ddl\_commands + + Description: Reports running DDL commands in the ddl_command_end event trigger. + + Parameter: null + >![](public_sys-resources/icon-note.gif) **NOTE:** + >This function is used only in event triggers. + + Return type: oid,oid,int4,text,text,text,text,bool,pg_ddl_command. + + Example: + + ``` + openGauss=# CREATE OR REPLACE FUNCTION ddl_command_test() + RETURNS event_trigger + AS $$ + DECLARE + obj record; + BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'command: %', + obj.command_tag; + + RAISE NOTICE 'triggered'; + END LOOP; + END; $$ LANGUAGE plpgsql; + ``` + +- pg\_event\_trigger\_dropped\_objects + + Description: Makes the list of deleted objects visible to users in the sql\_drop event trigger. + + Parameter: null + + >![](public_sys-resources/icon-note.gif) **NOTE:** + >This function is used only in event triggers. + + Return types: oid,oid,int4,bool,bool,booloid,text,text,text,text,TEXTARRAY,TEXTARRAY + + Example: + + ``` + openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_dropped_objects() RETURNS event_trigger + LANGUAGE plpgsql AS $$ + DECLARE + obj record; + BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type = 'table' THEN + EXECUTE format('DROP TABLE IF EXISTS audit_tbls.%I', + format('%s_%s', obj.schema_name, obj.object_name)); + END IF; + + INSERT INTO dropped_objects + (type, schema, object) VALUES + (obj.object_type, obj.schema_name, obj.object_identity); + END LOOP; + END + $$; + ``` + +- pg\_event\_trigger\_table\_rewrite\_oid + + Description: Makes the overwritten object OIDs visible to users in the table\_rewrite event trigger. + + Parameter: null + + >![](public_sys-resources/icon-note.gif) **NOTE:** + >This function is used only in event triggers. + + Return type: oid + + Example: + + ``` + openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger + LANGUAGE plpgsql AS $$ + BEGIN + RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', + pg_event_trigger_table_rewrite_oid()::regclass, + pg_event_trigger_table_rewrite_reason(); + END; + $$; + ``` + +- pg\_event\_trigger\_table\_rewrite\_reason + + Description: Makes reasons for rewriting objects visible to users in the table\_rewrite event trigger. + + Parameter: null + + >![](public_sys-resources/icon-note.gif) **NOTE:** + >This function is used only in event triggers. + + Return type: int4 + + Example: + + ``` + openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger + LANGUAGE plpgsql AS $$ + BEGIN + RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', + pg_event_trigger_table_rewrite_oid()::regclass, + pg_event_trigger_table_rewrite_reason(); + END; + $$; + ``` diff --git a/content/docs-lite/en/docs/BriefTutorial/event-trigger.md b/content/docs-lite/en/docs/BriefTutorial/event-trigger.md new file mode 100644 index 000000000..3ce3bcee0 --- /dev/null +++ b/content/docs-lite/en/docs/BriefTutorial/event-trigger.md @@ -0,0 +1,125 @@ +# Event Trigger + +A trigger automatically executes functions when the specified DDL event occurs. Currently, event triggers are available only in PG-compatible mode. + +## Syntax + +- Create an event trigger. + + ``` + CREATE EVENT TRIGGER name + ON event + [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ] + EXECUTE PROCEDURE function_name() + ``` + + +- Modify an event trigger. + + ``` + ALTER EVENT TRIGGER name DISABLE + ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ] + ALTER EVENT TRIGGER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } + ALTER EVENT TRIGGER name RENAME TO new_name + ``` + + +- Delete an event trigger. + + ``` + DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ]; + ``` +## Parameter Description + +- **name** + + Specifies the event trigger name. + +- **filter\_variable** + + Specifies the variable used by the event trigger for filtering. Currently, only TAG is supported. + +- **event** + + Specifies the events supported by the event trigger. Currently, ddl\_command\_start, ddl\_command\_end, sql\_drop and table\_rewrite are supported. + +- **function\_name** + + Specifies a user-defined function, which must be declared as taking no parameters and returning data of event\_trigger type. This function is executed when an event trigger fires. + +- **new\_name** + + Specifies the new event trigger name. + +- **disable** + + Disables the event trigger. + +- **ENABLE [ REPLICA | ALWAYS ]** + + This event trigger is available when **session\_replication\_role** is set to **REPLICA** or any value. +## Examples + +``` +--Create an event trigger function (for ddl_command_start and ddl_command_end events). +openGauss=# create function test_event_trigger() returns event_trigger as $$ +BEGIN + RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag; +END +$$ language plpgsql; + +--Create an event trigger function (for the sql_drop event). +openGauss=# CREATE OR REPLACE FUNCTION drop_sql_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - sql_drop', tg_tag; +END; +$$ LANGUAGE plpgsql; + +--Create an event trigger function (for the table_rewrite event). +openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE EXCEPTION 'rewrites not allowed'; +END; +$$; + +--Create an event trigger whose event type is ddl_command_start. +openGauss=# create event trigger regress_event_trigger on ddl_command_start + execute procedure test_event_trigger(); + +--Create an event trigger whose event type is ddl_command_end. +openGauss=# create event trigger regress_event_trigger_end on ddl_command_end + execute procedure test_event_trigger(); + +--Create an event trigger whose event type is sql_drop. +openGauss=# CREATE EVENT TRIGGER sql_drop_command ON sql_drop + EXECUTE PROCEDURE drop_sql_command(); + +--Create an event trigger whose event type is table_rewrite. +openGauss=# create event trigger no_rewrite_allowed on table_rewrite + when tag in ('alter table') execute procedure test_evtrig_no_rewrite(); + +--Run the DDL statement to check the event trigger effect (ddl_command_start and ddl_command_end are triggered). +openGauss=# create table event_trigger_table (a int); + +--Run the alter table statement to check the event trigger effect. ddl_command_start and table_rewrite,ddl_command_end are not triggered because rewrite is disabled. +openGauss=# alter table event_trigger_table alter column a type numeric; + +--Run the drop statement to check the event trigger effect (ddl_command_start, sql_drop, and ddl_command_end are triggered). +openGauss=# drop table event_trigger_table; + +--Modify an event trigger. +openGauss=# create role regress_evt_user WITH ENCRYPTED PASSWORD 'EvtUser123'; +openGauss=# ALTER EVENT TRIGGER regress_event_trigger RENAME TO regress_event_trigger_start; +--This operation should fail. The owner of the event trigger can only be the super user. +openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start owner to regress_evt_user; +openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start disable; +openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start enable always; + +--Delete a trigger. +openGauss=# DROP EVENT TRIGGER regress_event_trigger_start; +openGauss=# DROP EVENT TRIGGER regress_event_trigger_end; +openGauss=# DROP EVENT TRIGGER sql_drop_command; +openGauss=# DROP EVENT TRIGGER no_rewrite_allowed; +``` diff --git a/content/docs-lite/en/docs/BriefTutorial/transactions.md b/content/docs-lite/en/docs/BriefTutorial/transactions.md index f0de60e48..d0c076e97 100644 --- a/content/docs-lite/en/docs/BriefTutorial/transactions.md +++ b/content/docs-lite/en/docs/BriefTutorial/transactions.md @@ -10,7 +10,7 @@ A transaction is a user-defined sequence of database operations, which form an i Transaction isolation at this level meets the requirements of many applications, and is fast and easy to use. However, applications performing complicated queries and updates may require data that is more consistent than this level can provide. -- **REPEATABLE READ**: A transaction can only read data committed before it starts. Uncommitted data or data committed in other concurrent transactions cannot be read. However, a query can read earlier data updates in its transaction, regardless of whether they have been committed. **READ UNCOMMITTED** differs from this level in that a transaction reads the snapshot taken at the start of the transaction, not at the beginning of the current query within the transaction. Therefore, the SELECT statement within a transaction always reads the same data, and cannot read data committed by other concurrent transactions after the transaction starts. Applications at this level must be able to retry transactions, because serialization failures may occur. +- **REPEATABLE READ**: A transaction can only read data committed before it starts. Uncommitted data or data committed in other concurrent transactions cannot be read. However, a query can read earlier data updates in its transaction, regardless of whether they have been committed. **READ COMMITTED** differs from this level in that a transaction reads the snapshot taken at the start of the transaction, not at the beginning of the current query within the transaction. Therefore, the SELECT statement within a transaction always reads the same data, and cannot read data committed by other concurrent transactions after the transaction starts. Applications at this level must be able to retry transactions, because serialization failures may occur. ## Syntax diff --git a/content/docs-lite/en/docs/DataBaseReference/get_global_prepared_xacts-(discarded).md b/content/docs-lite/en/docs/DataBaseReference/get_global_prepared_xacts-discarded.md similarity index 100% rename from content/docs-lite/en/docs/DataBaseReference/get_global_prepared_xacts-(discarded).md rename to content/docs-lite/en/docs/DataBaseReference/get_global_prepared_xacts-discarded.md diff --git a/content/docs-lite/en/docs/DataBaseReference/pg_event_trigger.md b/content/docs-lite/en/docs/DataBaseReference/pg_event_trigger.md new file mode 100644 index 000000000..490beab9b --- /dev/null +++ b/content/docs-lite/en/docs/DataBaseReference/pg_event_trigger.md @@ -0,0 +1,75 @@ +# PG\_EVENT\_TRIGGER + +PG\_EVENT\_TRIGGER records information about each event trigger. + +**Table 1** PG\_EVENT\_TRIGGER columns + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Reference

+

Description

+

evtname

+

name

+

-

+

Trigger name, which must be unique.

+

evtevent

+

name

+

-

+

Identifies the event for which this trigger fires.

+

evtowner

+

oid

+

pg_authid.oid

+

Owner of the event trigger.

+

evtfoid

+

oid

+

pg_proc.oid

+

Function to be called.

+

evtenabled

+

char

+

-

+

Controls in which the session replication role modes the event trigger fires. O: Trigger fires in "origin" and "local" modes. D: Trigger is disabled. R: Trigger fires in "replica" mode. A: Trigger fires always.

+

evttags

+

text[]

+

-

+

Command tags for which this trigger will fire. If NULL, the firing of this trigger is not restricted by the command tag.

+
diff --git a/content/docs-lite/en/docs/DataBaseReference/pg_subscription_rel.md b/content/docs-lite/en/docs/DataBaseReference/pg_subscription_rel.md new file mode 100644 index 000000000..0e744214e --- /dev/null +++ b/content/docs-lite/en/docs/DataBaseReference/pg_subscription_rel.md @@ -0,0 +1,54 @@ +# PG\_SUBSCRIPTION\_REL + +The system catalog PG\_SUBSCRIPTION\_REL contains the status of each replicated table in each subscription. It is a many-to-many mapping. + +This system catalog contains only tables known to the subscription after running [CREATE SUBSCRIPTION](../SQLReference/create-subscription.md) or [ALTER SUBSCRIPTION... REFRESH PUBLICATION](../SQLReference/alter-subscription.md). + +**Table 1** PG\_SUBSCRIPTION\_REL columns + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Description

+

srsubid

+

oid

+

Identifier of the subscription.

+

srrelid

+

oid

+

Subscription relationship ID.

+

srsubstate

+

char

+

Subscription status.

  • i: Initialization.
  • d: Basic data being replicated.
  • f: Basic data replication completed.
  • s: Progress synchronized with incremental replication.
  • r: Incremental replication ready.

    +
  • srcsn

    +

    int8

    +

    Snapshot CSN during basic data replication.

    +

    srsublsn

    +

    text

    +

    Remote LSN used to synchronize the incremental replication progress in the s or r state. Otherwise, the value is null.

    +
    diff --git a/content/docs-lite/en/docs/DataBaseReference/querying-a-system-catalog.md b/content/docs-lite/en/docs/DataBaseReference/querying-a-system-catalog.md new file mode 100644 index 000000000..055d005f6 --- /dev/null +++ b/content/docs-lite/en/docs/DataBaseReference/querying-a-system-catalog.md @@ -0,0 +1,128 @@ +# Querying a System Catalog + +In addition to the created tables, a database contains many system catalogs. These system catalogs contain openGauss installation information and information about various queries and processes in openGauss. You can collect information about the database by querying system catalogs. + +In [System Catalogs and System Views](system-catalogs-and-system-views.md), the description about each table indicates whether the table is visible to all users or only the initial user. To query tables that are visible only to the initial user, log in as the user. + +openGauss provides the following types of system catalogs and views: + +- System catalogs and views inherited from PG + + These system catalogs and views have the prefix **PG**. + +- New system catalogs and views of openGauss + + These system catalogs and views have the prefix **GS**. + + +## Querying Database Tables + +For example, you can run the following command to query the **PG\_TABLES** system catalog for all tables in the **public** schema: + +``` +SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; +``` + +Information similar to the following is displayed: + +``` + tablename +------------------- + err_hr_staffs + test + err_hr_staffs_ft3 + web_returns_p1 + mig_seq_table + films4 +(6 rows) +``` + +## Viewing Database Users + +You can run the **PG\_USER** command to view the list of all users in the database, and view the user ID \(**USESYSID**\) and permissions. + +``` +SELECT * FROM pg_user; +``` + +``` + usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | + valuntil | respool | parent | spacelimit | useconfig | nodegroup | tempspacelimit | +spillspacelimit +---------+----------+-------------+----------+-----------+---------+----------+----------+ +----------+--------------+--------+------------+-----------+-----------+----------------+- +---------------- + omm | 10 | t | t | t | t | ******** | | + | default_pool | 0 | | | | | + joe | 16806 | f | f | f | f | ******** | | + | default_pool | 0 | | | | | +(2 rows) +``` + +## Viewing and Stopping the Running Query Statements + +You can view the running query statements in the [PG\_STAT\_ACTIVITY](pg_stat_activity.md) view. You can use the following methods: + +1. Set the parameter **track\_activities** to **on**. + + ``` + SET track_activities = on; + ``` + + The database collects the running information about active queries only if the parameter is set to **on**. + +2. View the running query statements. Run the following command to view the database names, users performing queries, query status, and the corresponding PIDs which are connected to the running query statements: + + ``` + SELECT datname, usename, state,pid FROM pg_stat_activity; + ``` + + ``` + datname | usename | state | pid + ----------+---------+--------+----------------- + postgres | Ruby | active | 140298793514752 + postgres | Ruby | active | 140298718004992 + postgres | Ruby | idle | 140298650908416 + postgres | Ruby | idle | 140298625742592 + postgres | omm | active | 140298575406848 + (5 rows) + ``` + + If the **state** column is **idle**, the connection is idle and requires a user to enter a command. + + To identify only active query statements, run the following command: + + ``` + SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle'; + ``` + +3. To cancel queries that have been running for a long time, use the **PG\_TERMINATE\_BACKEND** function to end sessions based on the thread ID. + + ``` + SELECT PG_TERMINATE_BACKEND(139834759993104); + ``` + + If information similar to the following is displayed, the session is successfully terminated: + + ``` + PG_TERMINATE_BACKEND + ---------------------- + t + (1 row) + ``` + + If information similar to the following is displayed, a user has terminated the current session: + + ``` + FATAL: terminating connection due to administrator command + FATAL: terminating connection due to administrator command + ``` + + >![](public_sys-resources/icon-note.gif) **NOTE:** + > + >If the **PG\_TERMINATE\_BACKEND** function is used to terminate the backend threads of the current session, the **gsql** client will be reconnected automatically rather than be logged out. The message "The connection to the server was lost. Attempting reset: Succeeded." is returned. + >``` + >FATAL: terminating connection due to administrator command + >FATAL: terminating connection due to administrator command + >The connection to the server was lost. Attempting reset: Succeeded. + >``` diff --git a/content/docs-lite/en/docs/DataBaseReference/system-views.md b/content/docs-lite/en/docs/DataBaseReference/system-views.md index 818ac8b3e..a948759c8 100644 --- a/content/docs-lite/en/docs/DataBaseReference/system-views.md +++ b/content/docs-lite/en/docs/DataBaseReference/system-views.md @@ -1,9 +1,5 @@ # System Views -- **[DV\_SESSIONS](dv_sessions.md)** - -- **[DV\_SESSION\_LONGOPS](dv_session_longops.md)** - - **[GET\_GLOBAL\_PREPARED\_XACTS \(Discarded\)](get_global_prepared_xacts-(discarded).md)** - **[GS\_AUDITING](gs_auditing.md)** diff --git a/content/docs-lite/en/docs/DataBaseReference/wait-events.md b/content/docs-lite/en/docs/DataBaseReference/wait-events.md new file mode 100644 index 000000000..e145bbe5b --- /dev/null +++ b/content/docs-lite/en/docs/DataBaseReference/wait-events.md @@ -0,0 +1,16 @@ +# Wait Events + +## enable\_instr\_track\_wait + +**Parameter description**: Specifies whether to enable real-time collection of wait event information. + +In the x86-based centralized deployment scenario, the hardware configuration specifications are 32-core CPU and 256 GB memory. When the Benchmark SQL 5.0 tool is used to test performance, the performance fluctuates by about 1.4% by enabling or disabling this parameter. + +This parameter is a SIGHUP parameter. Set it based on instructions provided in [Table 1](resetting-parameters.md#en-us_topic_0283137176_en-us_topic_0237121562_en-us_topic_0059777490_t91a6f212010f4503b24d7943aed6d846). + +**Value range**: Boolean + +- **on** indicates that the function of collecting wait event information is enabled. +- **off** indicates that the function of collecting wait event information is disabled. + +**Default value**: **on** diff --git a/content/docs-lite/en/docs/DatabaseAdministrationGuide/primary-standby-certificate-authentication-configuration.md b/content/docs-lite/en/docs/DatabaseAdministrationGuide/primary-standby-certificate-authentication-configuration.md deleted file mode 100644 index 7aaa4cf62..000000000 --- a/content/docs-lite/en/docs/DatabaseAdministrationGuide/primary-standby-certificate-authentication-configuration.md +++ /dev/null @@ -1,68 +0,0 @@ -# Primary/Standby Certificate Authentication Configuration - -## Scenarios - -In the Lite scenario, the SSL certificate is required for direct authentication of the primary and standby nodes. - -## Prerequisites - -The formal certificates and keys for the server and client have been obtained from the CA. - -## Precautions - -Currently, openGauss supports only the X509v3 certificate in PEM format. - -## Procedure - -1. Prepare certificates and private keys. - - Conventions for configuration file names on the server: - - - Certificate name: server.crt - - Private key name: server.key - - Private key password and encrypted file: server.key.cipher and server.key.rand - - Conventions for configuration file names on the client: - - - Certificate name: client.crt - - Private key name: client.key - - Private keypassword and encrypted file: client.key.cipher and client.key.rand - - Root certificate name: cacert.pem - - CRL file name: sslcrl-file.crl - -2. Copy the certificates to the data directory of each node. - 1. Copy the configuration files **server.crt**, **server.key**, **server.key.cipher**, and **server.key.rand** on the server to the corresponding directories. - 2. Copy the configuration files **client.crt**, **client.key**, **client.key.cipher**, **client.key.rand**, and **cacert.pem** \(if a CRL needs to be configured, the CRL must contain **sslcrl-file.crl**\) on the client to the corresponding directories. - -3. \(Optional\) Encrypt the user password \(skip this step if private keys have been generated for the certificates\). - - - Primary node: **gs\_guc encrypt -M server -K** _key password_ **-D $\{GAUSSDATA\}/** - - Standby node: **gs\_guc encrypt -M client -K** _key password_ **-D $\{GAUSSDATA\}/** - - **$\{GAUSSDATA\}** indicates the data directory. - -4. Configure SSL. - - ``` - gs_guc set -D ${GAUSSDATA} -c "ssl=on" - gs_guc set -D ${GAUSSDATA} -c "ssl_ciphers = 'ALL'" - gs_guc set -D ${GAUSSDATA} -c "ssl_cert_file = 'server.crt'" - gs_guc set -D ${GAUSSDATA} -c "ssl_key_file = 'server.key'" - gs_guc set -D ${GAUSSDATA} -c "ssl_ca_file = 'cacert.pem'" - ``` - -5. Export the following environment variables from the standby node \(the file permission cannot be greater than 600\): - - export PGSSLCERT="$\{GAUSSDATA\}/client.crt" - - export PGSSLKEY="$\{GAUSSDATA\}/client.key" - - export PGSSLROOTCERT="$\{GAUSSDATA\}/cacert.pem" - -6. Restart the primary and standby openGauss in sequence. - - ``` - gs_ctl restart -D ${GAUSSDATA} - ``` - - diff --git a/content/docs-lite/en/docs/DatabaseAdministrationGuide/unified-audit-policy.md b/content/docs-lite/en/docs/DatabaseAdministrationGuide/unified-audit-policy.md deleted file mode 100644 index a74556a4a..000000000 --- a/content/docs-lite/en/docs/DatabaseAdministrationGuide/unified-audit-policy.md +++ /dev/null @@ -1,5 +0,0 @@ -# Unified Audit Policy - -## Background - -Traditional audit generates a large number of audit logs, and does not support customized access objects and access source configurations, making it inconvenient for database security administrators to analyze audit logs. However, the unified audit policy allows you to bind resource tags and configure data sources to output audit logs, improving the efficiency of database monitoring by security administrators. diff --git a/content/docs-lite/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md b/content/docs-lite/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md index c60a6c204..c66283324 100644 --- a/content/docs-lite/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md +++ b/content/docs-lite/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md @@ -1,4 +1,4 @@ -# Concurrent INSERT in the Same table +# Concurrent INSERT in the Same Table Transaction T1: diff --git a/content/docs-lite/en/docs/DatabaseOMGuide/quick-setup.md b/content/docs-lite/en/docs/DatabaseOMGuide/quick-setup.md index 3234d549b..9a7c692f1 100644 --- a/content/docs-lite/en/docs/DatabaseOMGuide/quick-setup.md +++ b/content/docs-lite/en/docs/DatabaseOMGuide/quick-setup.md @@ -1,21 +1,38 @@ # Quick Setup -Set the following configuration items in the **postgresql.conf** file: +Set the following configuration items in the **postgresql.conf** file. ``` wal_level = logical ``` For a basic setup, retain the default values for the other necessary configuration items. -You need to adjust the **pg_hba.conf** file to allow replication (the value depends on the actual network configuration and the user used for connection). +You need to adjust the **pg\_hba.conf** file to allow replication (the value depends on the actual network configuration and the user used for connection). ``` host all repuser 0.0.0.0/0 sha256 ``` -In the publisher database: +Run the following command in the publisher database. (For details about the command for creating a publication, see [CREATE PUBLICATION](../SQLReference/create-publication.md).) ``` CREATE PUBLICATION mypub FOR TABLE users, departments; ``` -In the subscriber database: +Run the following command in the subscriber database: (For details about the command for creating a subscription, see [CREATE SUBSCRIPTION](../SQLReference/create-subscription.md).) ``` CREATE SUBSCRIPTION mysub CONNECTION 'dbname=foo host=bar user=repuser' PUBLICATION mypub; ``` -The above statements start the replication process, replicating incremental changes to those tables. +The preceding statement starts the replication process, synchronizes the initial data of the **users** and **departments** tables, and then starts to replicate incremental changes to those tables. + +You can modify the publication later, for example, add or delete the publication table. (For details about the command for modifying a publication, see [ALTER PUBLICATION](../SQLReference/alter-publication.md).) +``` +ALTER PUBLICATION mypub ADD TABLE new_tbl; +``` +After adding a publication table, you need to update the table in the subscriber database. (For details about the command for modifying a subscription, see [ALTER SUBSCRIPTION](../SQLReference/alter-subscription.md).) +``` +ALTER SUBSCRIPTION mysub REFRESH PUBLICATION; +``` +Delete the publication from the publisher database. (For details about the command for deleting a publication, see [DROP PUBLICATION](../SQLReference/drop-publication.md).) +``` +DROP PUBLICATION mypub; +``` +Delete the subscription from the subscriber database. For details about the command for deleting a subscription, see [DROP SUBSCRIPTION](../SQLReference/drop-subscription.md).) +``` +DROP SUBSCRIPTION mysub; +``` diff --git a/content/docs-lite/en/docs/Developerguide/application-development-guide.md b/content/docs-lite/en/docs/Developerguide/application-development-guide.md deleted file mode 100644 index b67d2803e..000000000 --- a/content/docs-lite/en/docs/Developerguide/application-development-guide.md +++ /dev/null @@ -1,13 +0,0 @@ -# Application Development Guide - -- **[Development Specifications](development-specifications.md)** - -- **[Development Based on JDBC](development-based-on-jdbc.md)** - -- **[Development Based on libpq](development-based-on-libpq.md)** - -- **[Psycopg-Based Development](psycopg-based-development.md)** - -- **[Commissioning](commissioning.md)** - - diff --git a/content/docs-lite/en/docs/Developerguide/connection-close.md b/content/docs-lite/en/docs/Developerguide/connection-close.md new file mode 100644 index 000000000..431acab67 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/connection-close.md @@ -0,0 +1,27 @@ +# connection.close\(\) + +## Function + +This method closes the database connection. + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>This method closes the database connection and does not automatically call **commit\(\)**. If you just close the database connection without calling **commit\(\)** first, changes will be lost. + +## Prototype + +``` +connection.close() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/connection-commit.md b/content/docs-lite/en/docs/Developerguide/connection-commit.md new file mode 100644 index 000000000..68438775f --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/connection-commit.md @@ -0,0 +1,27 @@ +# connection.commit\(\) + +## Function + +This method commits the currently pending transaction to the database. + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>By default, Psycopg opens a transaction before executing the first command. If **commit\(\)** is not called, the effect of any data operation will be lost. + +## Prototype + +``` +connection.commit() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/connection-cursor.md b/content/docs-lite/en/docs/Developerguide/connection-cursor.md new file mode 100644 index 000000000..58c3adc7c --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/connection-cursor.md @@ -0,0 +1,54 @@ +# connection.cursor\(\) + +## Function + +This method returns a new cursor object. + +## Prototype + +``` +cursor(name=None, cursor_factory=None, scrollable=None, withhold=False) +``` + +## Parameter + +**Table 1** connection.cursor parameters + + + + + + + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    name

    +

    Cursor name. The default value is None.

    +

    cursor_factory

    +

    Creates a non-standard cursor. The default value is None.

    +

    scrollable

    +

    Sets the SCROLL option. The default value is None.

    +

    withhold

    +

    Sets the HOLD option. The default value is False.

    +
    + +## Return Value + +Cursor object \(used for cusors that are programmed using Python in the entire database\) + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/connection-rollback.md b/content/docs-lite/en/docs/Developerguide/connection-rollback.md new file mode 100644 index 000000000..97e753cb5 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/connection-rollback.md @@ -0,0 +1,27 @@ +# connection.rollback\(\) + +## Function + +This method rolls back the current pending transaction. + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>If you close the connection using **close\(\)** but do not commit the change using **commit\(\)**, an implicit rollback will be performed. + +## Prototype + +``` +connection.rollback() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/copymanager.md b/content/docs-lite/en/docs/Developerguide/copymanager.md new file mode 100644 index 000000000..27a74edda --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/copymanager.md @@ -0,0 +1,109 @@ +# CopyManager + +CopyManager is an API class provided by the JDBC driver in openGauss. It is used to import data to openGauss in batches. + +## Inheritance Relationship of CopyManager + +The CopyManager class is in the **org.opengauss.copy** package and inherits the java.lang.Object class. The declaration of the class is as follows: + +``` +public class CopyManager +extends Object +``` + +## Construction Method + +public CopyManager\(BaseConnection connection\) + +throws SQLException + +## Common Methods + +**Table 1** Common methods of CopyManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Return Value

    +

    Method

    +

    Description

    +

    throws

    +

    CopyIn

    +

    copyIn(String sql)

    +

    -

    +

    SQLException

    +

    long

    +

    copyIn(String sql, InputStream from)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from InputStream.

    +

    SQLException,IOException

    +

    long

    +

    copyIn(String sql, InputStream from, int bufferSize)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from InputStream.

    +

    SQLException,IOException

    +

    long

    +

    copyIn(String sql, Reader from)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from Reader.

    +

    SQLException,IOException

    +

    long

    +

    copyIn(String sql, Reader from, int bufferSize)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from Reader.

    +

    SQLException,IOException

    +

    CopyOut

    +

    copyOut(String sql)

    +

    -

    +

    SQLException

    +

    long

    +

    copyOut(String sql, OutputStream to)

    +

    Sends the result set of COPY TO STDOUT from the database to the OutputStream class.

    +

    SQLException,IOException

    +

    long

    +

    copyOut(String sql, Writer to)

    +

    Sends the result set of COPY TO STDOUT from the database to the Writer class.

    +

    SQLException,IOException

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/curosr-executemany_query-vars_list.md b/content/docs-lite/en/docs/Developerguide/curosr-executemany_query-vars_list.md new file mode 100644 index 000000000..eefa077f1 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/curosr-executemany_query-vars_list.md @@ -0,0 +1,44 @@ +# curosr.executemany\(query,vars\_list\) + +## Function + +This method executes an SQL command against all parameter sequences or mappings found in the sequence SQL. + +## Prototype + +``` +curosr.executemany(query,vars_list) +``` + +## Parameter + +**Table 1** curosr.executemany parameters + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    query

    +

    SQL statement that you want to execute.

    +

    vars_list

    +

    Variable list, which matches the %s placeholder in the query.

    +
    + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/cursor-close.md b/content/docs-lite/en/docs/Developerguide/cursor-close.md new file mode 100644 index 000000000..9741c85f1 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/cursor-close.md @@ -0,0 +1,24 @@ +# cursor.close\(\) + +## Function + +This method closes the cursor of the current connection. + +## Prototype + +``` +cursor.close() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/cursor-execute_query-vars_list.md b/content/docs-lite/en/docs/Developerguide/cursor-execute_query-vars_list.md new file mode 100644 index 000000000..58b43ea6f --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/cursor-execute_query-vars_list.md @@ -0,0 +1,44 @@ +# cursor.execute\(query,vars\_list\) + +## Function + +This method executes the parameterized SQL statements \(that is, placeholders instead of SQL literals\). The psycopg2 module supports placeholders marked with **%s**. + +## Prototype + +``` +curosr.execute(query,vars_list) +``` + +## Parameters + +**Table 1** curosr.execute parameters + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    query

    +

    SQL statement to be executed.

    +

    vars_list

    +

    Variable list, which matches the %s placeholder in the query.

    +
    + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/cursor-fetchall.md b/content/docs-lite/en/docs/Developerguide/cursor-fetchall.md new file mode 100644 index 000000000..9cbbda22c --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/cursor-fetchall.md @@ -0,0 +1,24 @@ +# cursor.fetchall\(\) + +## Function + +This method obtains all the \(remaining\) rows of the query result and returns them as a list of tuples. + +## Prototype + +``` +cursor.fetchall() +``` + +## Parameter + +None + +## Return Value + +Tuple list, which contains all results of the result set. An empty list is returned when no rows are available. + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/cursor-fetchone.md b/content/docs-lite/en/docs/Developerguide/cursor-fetchone.md new file mode 100644 index 000000000..9a4caced5 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/cursor-fetchone.md @@ -0,0 +1,24 @@ +# cursor.fetchone\(\) + +## Function + +This method extracts the next row of the query result set and returns a tuple. + +## Prototype + +``` +cursor.fetchone() +``` + +## Parameter + +None + +## Return Value + +A single tuple is the first result in the result set. If no more data is available, **None** is returned. + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/database-connection-control-functions.md b/content/docs-lite/en/docs/Developerguide/database-connection-control-functions.md new file mode 100644 index 000000000..ad181fc62 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/database-connection-control-functions.md @@ -0,0 +1,23 @@ +# Database Connection Control Functions + +Database connection control functions control the connections to GaussDB servers. An application can connect to multiple servers at a time. For example, a client connects to multiple databases. Each connection is represented by a PGconn object, which is obtained from the function PQconnectdb, PQconnectdbParams, or PQsetdbLogin. Note that these functions will always return a non-null object pointer, unless there is too little memory to allocate the PGconn object. The interface for establishing a connection is stored in the PGconn object. The PQstatus function can be called to check the return value for a successful connection. + +- **[PQconnectdbParams](pqconnectdbparams.md)** + +- **[PQconnectdb](pqconnectdb.md)** + +- **[PQconninfoParse](pqconninfoparse.md)** + +- **[PQconnectStart](pqconnectstart.md)** + +- **[PQerrorMessage](pqerrormessage.md)** + +- **[PQsetdbLogin](pqsetdblogin.md)** + +- **[PQfinish](pqfinish.md)** + +- **[PQreset](pqreset.md)** + +- **[PQstatus](pqstatus.md)** + + diff --git a/content/docs-lite/en/docs/Developerguide/database-statement-execution-functions.md b/content/docs-lite/en/docs/Developerguide/database-statement-execution-functions.md new file mode 100644 index 000000000..98c4beba8 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/database-statement-execution-functions.md @@ -0,0 +1,29 @@ +# **Database Statement Execution Functions** + +After the connection to the database server is successfully established, you can use the functions described in this section to execute SQL queries and commands. + +- **[PQclear](pqclear.md)** + +- **[PQexec](pqexec.md)** + +- **[PQexecParams](pqexecparams.md)** + +- **[PQexecParamsBatch](pqexecparamsbatch.md)** + +- **[PQexecPrepared](pqexecprepared.md)** + +- **[PQexecPreparedBatch](pqexecpreparedbatch.md)** + +- **[PQfname](pqfname.md)** + +- **[PQgetvalue](pqgetvalue.md)** + +- **[PQnfields](pqnfields.md)** + +- **[PQntuples](pqntuples.md)** + +- **[PQprepare](pqprepare.md)** + +- **[PQresultStatus](pqresultstatus.md)** + + diff --git a/content/docs-lite/en/docs/Developerguide/example-jdbc-primary-standby-cluster-load-balancing.md b/content/docs-lite/en/docs/Developerguide/example-jdbc-primary-standby-cluster-load-balancing.md new file mode 100644 index 000000000..3114f56f7 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/example-jdbc-primary-standby-cluster-load-balancing.md @@ -0,0 +1,89 @@ +# Example: JDBC Primary/Standby Cluster Load Balancing + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>In the following example, **host:port** represents a node, where **host** indicates the name or IP address of the server where the database resides, and **port** indicates the port number of the server where the database resides. + + +## JDBC Load Balancing Functions + +JDBC can set multiple database nodes in the URL to access the primary/standby cluster. After the load balancing parameter **autoBalance** is set in the URL, JDBC can establish the connection between the client and the primary/standby cluster on each node in the URL based on specific load balancing rules to implement load balancing. +The default value is **false**. In this case, the JDBC always connects to the same node that meets the connection setup conditions configured in the URL. When connecting to the primary/standby cluster, ensure that no write operation is performed in the service or use this parameter together with **targetServerType=slave** to restrict the client to connect only to the standby node. Currently, JDBC provides four load balancing modes: roundrobin, priority roundrobin, leastconn, and shuffle. The following provides some examples. +* **roundrobin**: +Round-robin mode, that is, JDBC connects to candidate nodes in the URL string in turn. The value can be **roundrobin**, **true**, or **balance**. + * If a client wants to connect to the one-primary-two-standby cluster in round-robin mode and can select nodes in the cluster in turn when creating connections for multiple times, you can use the following configuration: + ``` + jdbc:opengauss://node1,node2,node3/database?autoBalance=roundrobin + ``` + * If a client wants to use the round-robin mode to connect only to the standby node of the one-primary-two-standby cluster and perform the read-only operation on the standby node, you can use the following configuration: + ``` + jdbc:opengauss://node1,node2,node3/database?autoBalance=roundrobin&targetServerType=slave + ``` + * If a client wants to use the round-robin mode to connect only to the primary node of the one-primary-two-standby cluster to prevent write operations from being routed to the standby node, you can use the following configuration: + ``` + jdbc:opengauss://node1,node2,node3/database?autoBalance=roundrobin&targetServerType=master + ``` +* **shuffle**: +Shuffle mode, where a node in the URL string is randomly selected to establish a connection. The value is **shuffle**. The reference configuration for connecting one-primary-two-standby cluster in shuffle mode is as follows: +``` +jdbc:opengauss://node1,node2,node3/database?autoBalance=shuffle +``` +* **leastconn**: The minimum connection mode, where candidate nodes are sorted based on the number of valid connections of each node. Connections are preferentially established with the node with fewer connections. +This mode collects statistics on the connections established in leastconn mode in the current cluster through the current driver and periodically checks the validity of these connections. The value is **leastconn**. The reference configuration for connecting one-primary-two-standby cluster in leastconn mode is as follows: +``` +jdbc:opengauss://node1,node2,node3/database?autoBalance=leastconn +``` +* **priority roundrobin**: Round-robin mode with priorities. The connections for the first *n* candidate nodes are preferentially established. The value is **proprity[n]**, where **n** is a non-negative integer. Take the one-primary-two-standby cluster as an example. You can set the parameter as follows if a client wants to preferentially execute services on the primary node and standby node 1, and standby node 2 functions only as the standby node when other nodes are abnormal. + +``` +jdbc:opengauss://node1,node2,node3/database?autoBalance=priority2 +``` + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>- JDBC load balancing identifies a cluster based on the node set specified in the URL string. If multiple URLs with the same node set and load balancing mode use the same driver to establish connections, JDBC considers the connections as connections in the same cluster and performs load balancing as a whole. +>- JDBC supports driver-level load balancing. It balances the load of connections created in the same cluster based on the driver instead of the actual number of connections on each node in the cluster or other drivers. +>- In leastconn mode, the heartbeat thread is enabled, and scheduled tasks such as connection validity monitoring are executed every 20 seconds. If the heartbeat thread detects that the number of cached connections in leastconn mode is 0 for two consecutive times, the heartbeat thread is disabled and the cached leastconn information is cleared. + +## JDBC Quick Load Balancing Functions when Cluster Status Changes + +This function applies to the scenario where the connection pool is used to connect to the primary/standby cluster and the leastconn mode is set. The connection pool usually maintains a certain number of long-lived connections. When a node in the cluster fails, the connection pool re-creates connections on the remaining nodes. When the failed node is recovered, the connection pool has created sufficient long-lived connections on other nodes. Therefore, the newly recovered node is always idle unless some original connections are closed. +When this function is enabled, the JDBC periodically checks the status of the node configured in the URL. When detecting that a node is recovered, JDBC filters out idle connections on other nodes and closes them. After detecting that the number of cached connections decreases, the connection pool creates connections on the newly recovered node based on the leastconn mode to rebalance the cluster load. This function is used together with **enableQuickAutoBalance**, **maxIdleTimeBeforeTerminal**, **minReservedConPerCluster**, and **minReservedConPerDatanode**. The details are as follows: +* **enableQuickAutoBalance**: indicates whether to enable the JDBC quick load balancing function when the cluster changes. This function must be used together with the leastconn mode. When this parameter is set to **true** and **autoBalance** is set to **leastconn**, this function is enabled. The parameters take effect for connections. + + Value range: **"true"** or **"false"** + + Default value: **"false"** + +* **maxIdleTimeBeforeTerminal**: maximum idle duration of a connection when JDBC triggers quick load balancing. When filtering idle connections, the JDBC quick load balancing function considers the connections that are in the idle state and last for a period longer than or equal to the value of **maxIdleTimeBeforeTerminal** as idle connections. These connections may be closed by the JDBC. This parameter is valid only when **autoBalance** is set to **leastconn** and **enableQuickAutoBalance** is set to **true**. The parameters take effect for connections. + + Unit: second. + + Value range: an integer in [0, 9223372036854775). + + Default value: **0** + +* **minReservedConPerCluster**: The minimum percentage of idle connections in a cluster when JDBC triggers quick load balancing. By default, when JDBC triggers quick load balancing, all filtered idle connections are closed. If this parameter is set, JDBC reserves at least *minReservedConPerCluster*% of idle connections in the cluster when quick load balancing is triggered. This parameter takes effect for clusters. If this parameter is set for multiple URLs for which the same node is configured and the quick load balancing function is enabled, the minimum value is used. + + Value range: an integer in [0, 100]. + + Default value: **0** + +* **minReservedConPerDatanode**: minimum percentage of idle connections on a node when JDBC triggers quick load balancing. If this parameter is set, JDBC reserves at least *minReservedConPerDatanode*% of idle connections on each node when quick load balancing is triggered. If both **minReservedConPerDatanode** and **minReservedConPerCluster** are set for the URL string, JDBC ensures that the filtered connections to be closed meet both parameters. This parameter takes effect for clusters. If this parameter is set for multiple URLs for which the same node is configured and the quick load balancing function is enabled, the minimum value is used. + + Value range: an integer in [0, 100]. + + Default value: **0** + +The following is a simple case for enabling JDBC quick load balancing. You can perform the following configuration to enable the leastconn mode when the JDBC connection is established and the quick load balancing when the cluster status changes. After the functions are enabled, JDBC caches valid connections created using the URL and periodically queries the status of node 1, node 2, and node 3. When detecting that the node is recovered, JDBC filters out idle connections (idle duration > 30 seconds) from the cached connections and closes the connections. The connection pool establishes connections in leastconn mode to rebalance the number of connections in the cluster. +``` +jdbc:opengauss://node1,node2,node3/database?autoBalance=leastconn&enableQuickAutoBalance=true +``` +In addition, you can set additional parameters to control the criteria for filtering idle connections and the percentage of idle connections to be closed in the cluster and on each node. +``` +jdbc:opengauss://node1,node2,node3/database?autoBalance=leastconn&enableQuickAutoBalance=true&maxIdleTimeBeforeTerminal=20&minReservedConPerCluster=20&minReservedConPerDatanode=20 +``` + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>- JDBC implements load balancing only based on the connections of the driver in the same cluster. When quick load balancing is triggered, only the connections created by the driver in a cluster and configured with corresponding parameters are disabled. +>- To use this function, you need to adjust parameters to meet the service requirements of the client. The JDBC cannot detect whether a connection is required by the actual service. Therefore, the JDBC filters out connections that can be closed by determining idle connections. If the parameters do not match the actual service requirements, connections held by a user may be closed. +>- When performing quick load balancing, JDBC closes some connections that meet the conditions based on the configured parameters. If most existing connections do not meet the conditions, for example, all connections are active, the quick load balancing result may be poor. +>- The JDBC quick load balancing function enables the heartbeat thread to close idle connections by phase. Quick load balancing depends on the leastconn mode. Therefore, the mechanism for disabling this function is the same as that in the leastconn mode. diff --git a/content/docs-lite/en/docs/Developerguide/functions-for-asynchronous-command-processing.md b/content/docs-lite/en/docs/Developerguide/functions-for-asynchronous-command-processing.md new file mode 100644 index 000000000..d9f34cd45 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/functions-for-asynchronous-command-processing.md @@ -0,0 +1,26 @@ +# Functions for Asynchronous Command Processing + +The PQexec function is adequate for committing commands in common, synchronous applications. However, it has several defects, which may be important to some users: + +- PQexec waits for the end of the command, but the application may have other work to do \(for example, maintaining a user interface\). In this case, PQexec would not want to be blocked to wait for the response. + +- As the client application is suspended while waiting for the result, it is difficult for the application to determine whether to cancel the ongoing command. + +- PQexec can return only one PGresult structure. If the committed command string contains multiple SQL commands, all the PGresult structures except the last PGresult are discarded by PQexec. + +- PQexec always collects the entire result of the command and caches it in a PGresult. Although this mode simplifies the error handling logic for applications, it is impractical for results that contain multiple rows. + + +Applications that do not want to be restricted by these limitations can use the following functions that PQexec is built from: PQsendQuery and PQgetResult. The functions PQsendQueryParams, PQsendPrepare, and PQsendQueryPrepared can also be used with PQgetResult. + +- **[PQsendQuery](pqsendquery.md)** + +- **[PQsendQueryParams](pqsendqueryparams.md)** + +- **[PQsendPrepare](pqsendprepare.md)** + +- **[PQsendQueryPrepared](pqsendqueryprepared.md)** + +- **[PQflush](pqflush.md)** + + diff --git a/content/docs-lite/en/docs/Developerguide/functions-for-canceling-queries-in-progress.md b/content/docs-lite/en/docs/Developerguide/functions-for-canceling-queries-in-progress.md new file mode 100644 index 000000000..c1d1b9f26 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/functions-for-canceling-queries-in-progress.md @@ -0,0 +1,11 @@ +# Functions for Canceling Queries in Progress + +A client application can use the functions described in this section to cancel a command that is still being processed by the server. + +- **[PQgetCancel](pqgetcancel.md)** + +- **[PQfreeCancel](pqfreecancel.md)** + +- **[PQcancel](pqcancel.md)** + + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-callablestatement.md b/content/docs-lite/en/docs/Developerguide/java-sql-callablestatement.md new file mode 100644 index 000000000..cace820f2 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-callablestatement.md @@ -0,0 +1,206 @@ +# java.sql.CallableStatement + +This section describes **java.sql.CallableStatement**, the API for executing the stored procedure. + +**Table 1** Support status for java.sql.CallableStatement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    getArray(int parameterIndex)

    +

    Array

    +

    Yes

    +

    getBigDecimal(int parameterIndex)

    +

    BigDecimal

    +

    Yes

    +

    getBlob(int parameterIndex)

    +

    Blob

    +

    Yes

    +

    getBoolean(int parameterIndex)

    +

    Boolean

    +

    Yes

    +

    getByte(int parameterIndex)

    +

    byte

    +

    Yes

    +

    getBytes(int parameterIndex)

    +

    byte[]

    +

    Yes

    +

    getClob(int parameterIndex)

    +

    Clob

    +

    Yes

    +

    getDate(int parameterIndex)

    +

    Date

    +

    Yes

    +

    getDate(int parameterIndex, Calendar cal)

    +

    Date

    +

    Yes

    +

    getDouble(int parameterIndex)

    +

    double

    +

    Yes

    +

    getFloat(int parameterIndex)

    +

    float

    +

    Yes

    +

    getInt(int parameterIndex)

    +

    int

    +

    Yes

    +

    getLong(int parameterIndex)

    +

    long

    +

    Yes

    +

    getObject(int parameterIndex)

    +

    Object

    +

    Yes

    +

    getObject(int parameterIndex, Class<T> type)

    +

    Object

    +

    Yes

    +

    getShort(int parameterIndex)

    +

    short

    +

    Yes

    +

    getSQLXML(int parameterIndex)

    +

    SQLXML

    +

    Yes

    +

    getString(int parameterIndex)

    +

    String

    +

    Yes

    +

    getNString(int parameterIndex)

    +

    String

    +

    Yes

    +

    getTime(int parameterIndex)

    +

    Time

    +

    Yes

    +

    getTime(int parameterIndex, Calendar cal)

    +

    Time

    +

    Yes

    +

    getTimestamp(int parameterIndex)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp(int parameterIndex, Calendar cal)

    +

    Timestamp

    +

    Yes

    +

    registerOutParameter(int parameterIndex, int type)

    +

    void

    +

    Yes

    +

    registerOutParameter(int parameterIndex, int sqlType, int type)

    +

    void

    +

    Yes

    +

    wasNull()

    +

    Boolean

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- The batch operation of statements containing OUT parameter is not allowed. +>- The following methods are inherited from **java.sql.Statement**: **close**, **execute**, **executeQuery**, **executeUpdate**, **getConnection**, **getResultSet**, **getUpdateCount**, **isClosed**, **setMaxRows**, and **setFetchSize**. +>- The following methods are inherited from **java.sql.PreparedStatement**: **addBatch**, **clearParameters**, **execute**, **executeQuery**, **executeUpdate**, **getMetaData**, **setBigDecimal**, **setBoolean**, **setByte**, **setBytes**, **setDate**, **setDouble**, **setFloat**, **setInt**, **setLong**,** setNull**, **setObject**, **setString**, **setTime**, and **setTimestamp**. +>- The **registerOutParameter\(int parameterIndex, int sqlType, int type\)** method is used only to register the composite data type. + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-connection.md b/content/docs-lite/en/docs/Developerguide/java-sql-connection.md new file mode 100644 index 000000000..a8d2d383c --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-connection.md @@ -0,0 +1,364 @@ +# java.sql.Connection + +This section describes **java.sql.Connection**, the API for connecting to a database. + +**Table 1** Support status for java.sql.Connection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    abort(Executor executor)

    +

    void

    +

    Yes

    +

    clearWarnings()

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    commit()

    +

    void

    +

    Yes

    +

    createArrayOf​(String typeName, Object[] elements)

    +

    Array

    +

    Yes

    +

    createBlob()

    +

    Blob

    +

    Yes

    +

    createClob()

    +

    Clob

    +

    Yes

    +

    createSQLXML()

    +

    SQLXML

    +

    Yes

    +

    createStatement()

    +

    Statement

    +

    Yes

    +

    createStatement​(int resultSetType, int resultSetConcurrency)

    +

    Statement

    +

    Yes

    +

    createStatement​(int resultSetType, int resultSetConcurrency, int resultSetHoldability)

    +

    Statement

    +

    Yes

    +

    getAutoCommit()

    +

    Boolean

    +

    Yes

    +

    getCatalog()

    +

    String

    +

    Yes

    +

    getClientInfo()

    +

    Properties

    +

    Yes

    +

    getClientInfo(String name)

    +

    String

    +

    Yes

    +

    getHoldability()

    +

    int

    +

    Yes

    +

    getMetaData()

    +

    DatabaseMetaData

    +

    Yes

    +

    getNetworkTimeout()

    +

    int

    +

    Yes

    +

    getSchema()

    +

    String

    +

    Yes

    +

    getTransactionIsolation()

    +

    int

    +

    Yes

    +

    getTypeMap()

    +

    Map<String,​Class<?>>

    +

    Yes

    +

    getWarnings()

    +

    SQLWarning

    +

    Yes

    +

    isClosed()

    +

    Boolean

    +

    Yes

    +

    isReadOnly()

    +

    Boolean

    +

    Yes

    +

    isValid​(int timeout)

    +

    Boolean

    +

    Yes

    +

    nativeSQL​(String sql)

    +

    String

    +

    Yes

    +

    prepareCall​(String sql)

    +

    CallableStatement

    +

    Yes

    +

    prepareCall​(String sql, int resultSetType, int resultSetConcurrency)

    +

    CallableStatement

    +

    Yes

    +

    prepareCall​(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)

    +

    CallableStatement

    +

    Yes

    +

    prepareStatement(String sql)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int autoGeneratedKeys)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int[] columnIndexes)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int resultSetType, int resultSetConcurrency)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, String[] columnNames)

    +

    PreparedStatement

    +

    Yes

    +

    releaseSavepoint​(Savepoint savepoint)

    +

    void

    +

    Yes

    +

    rollback()

    +

    void

    +

    Yes

    +

    rollback​(Savepoint savepoint)

    +

    void

    +

    Yes

    +

    setAutoCommit(boolean autoCommit)

    +

    void

    +

    Yes

    +

    setClientInfo(Properties properties)

    +

    void

    +

    Yes

    +

    setClientInfo(String name,String value)

    +

    void

    +

    Yes

    +

    setHoldability​(int holdability)

    +

    void

    +

    Yes

    +

    setNetworkTimeout​(Executor executor, int milliseconds)

    +

    void

    +

    Yes

    +

    setReadOnly​(boolean readOnly)

    +

    void

    +

    Yes

    +

    setSavepoint()

    +

    Savepoint

    +

    Yes

    +

    setSavepoint​(String name)

    +

    Savepoint

    +

    Yes

    +

    setSchema​(String schema)

    +

    void

    +

    Yes

    +

    setTransactionIsolation​(int level)

    +

    void

    +

    Yes

    +

    setTypeMap​(Map<String,​Class<?>> map)

    +

    void

    +

    Yes

    +
    + +>![](public_sys-resources/icon-notice.gif) **NOTICE:** +>The AutoCommit mode is used by default within the API. If you disable it by running **setAutoCommit\(false\)**, all the statements executed later will be packaged in explicit transactions, and you cannot execute statements that cannot be executed within transactions. + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-databasemetadata.md b/content/docs-lite/en/docs/Developerguide/java-sql-databasemetadata.md new file mode 100644 index 000000000..4c3406ee9 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-databasemetadata.md @@ -0,0 +1,1266 @@ +# java.sql.DatabaseMetaData + +This section describes **java.sql.DatabaseMetaData**, the API for defining database objects. + +**Table 1** Support status for java.sql.DatabaseMetaData + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    allProceduresAreCallable()

    +

    Boolean

    +

    Yes

    +

    allTablesAreSelectable()

    +

    Boolean

    +

    Yes

    +

    autoCommitFailureClosesAllResultSets()

    +

    Boolean

    +

    Yes

    +

    dataDefinitionCausesTransactionCommit()

    +

    Boolean

    +

    Yes

    +

    dataDefinitionIgnoredInTransactions()

    +

    Boolean

    +

    Yes

    +

    deletesAreDetected​(int type)

    +

    Boolean

    +

    Yes

    +

    doesMaxRowSizeIncludeBlobs()

    +

    Boolean

    +

    Yes

    +

    generatedKeyAlwaysReturned()

    +

    Boolean

    +

    Yes

    +

    getBestRowIdentifier​(String catalog, String schema, String table, int scope, boolean nullable)

    +

    ResultSet

    +

    Yes

    +

    getCatalogs()

    +

    ResultSet

    +

    Yes

    +

    getCatalogSeparator()

    +

    String

    +

    Yes

    +

    getCatalogTerm()

    +

    String

    +

    Yes

    +

    getClientInfoProperties()

    +

    ResultSet

    +

    Yes

    +

    getColumnPrivileges​(String catalog, String schema, String table, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getConnection()

    +

    Connection

    +

    Yes

    +

    getCrossReference​(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable)

    +

    ResultSet

    +

    Yes

    +

    getDefaultTransactionIsolation()

    +

    int

    +

    Yes

    +

    getExportedKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getExtraNameCharacters()

    +

    String

    +

    Yes

    +

    getFunctionColumns​(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getFunctions​(String catalog, String schemaPattern, String functionNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getIdentifierQuoteString()

    +

    String

    +

    Yes

    +

    getImportedKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getIndexInfo​(String catalog, String schema, String table, boolean unique, boolean approximate)

    +

    ResultSet

    +

    Yes

    +

    getMaxBinaryLiteralLength()

    +

    int

    +

    Yes

    +

    getMaxCatalogNameLength()

    +

    int

    +

    Yes

    +

    getMaxCharLiteralLength()

    +

    int

    +

    Yes

    +

    getMaxColumnNameLength()

    +

    int

    +

    Yes

    +

    getMaxColumnsInGroupBy()

    +

    int

    +

    Yes

    +

    getMaxColumnsInIndex()

    +

    int

    +

    Yes

    +

    getMaxColumnsInOrderBy()

    +

    int

    +

    Yes

    +

    getMaxColumnsInSelect()

    +

    int

    +

    Yes

    +

    getMaxColumnsInTable()

    +

    int

    +

    Yes

    +

    getMaxConnections()

    +

    int

    +

    Yes

    +

    getMaxCursorNameLength()

    +

    int

    +

    Yes

    +

    getMaxIndexLength()

    +

    int

    +

    Yes

    +

    getMaxLogicalLobSize()

    +

    default long

    +

    Yes

    +

    getMaxProcedureNameLength()

    +

    int

    +

    Yes

    +

    getMaxRowSize()

    +

    int

    +

    Yes

    +

    getMaxSchemaNameLength()

    +

    int

    +

    Yes

    +

    getMaxStatementLength()

    +

    int

    +

    Yes

    +

    getMaxStatements()

    +

    int

    +

    Yes

    +

    getMaxTableNameLength()

    +

    int

    +

    Yes

    +

    getMaxTablesInSelect()

    +

    int

    +

    Yes

    +

    getMaxUserNameLength()

    +

    int

    +

    Yes

    +

    getNumericFunctions()

    +

    String

    +

    Yes

    +

    getPrimaryKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getPartitionTablePrimaryKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getProcedureColumns​(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getProcedures​(String catalog, String schemaPattern, String procedureNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getProcedureTerm()

    +

    String

    +

    Yes

    +

    getSchemas()

    +

    ResultSet

    +

    Yes

    +

    getSchemas​(String catalog, String schemaPattern)

    +

    ResultSet

    +

    Yes

    +

    getSchemaTerm()

    +

    String

    +

    Yes

    +

    getSearchStringEscape()

    +

    String

    +

    Yes

    +

    getSQLKeywords()

    +

    String

    +

    Yes

    +

    getSQLStateType()

    +

    int

    +

    Yes

    +

    getStringFunctions()

    +

    String

    +

    Yes

    +

    getSystemFunctions()

    +

    String

    +

    Yes

    +

    getTablePrivileges​(String catalog, String schemaPattern, String tableNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getTimeDateFunctions()

    +

    String

    +

    Yes

    +

    getTypeInfo()

    +

    ResultSet

    +

    Yes

    +

    getUDTs​(String catalog, String schemaPattern, String typeNamePattern, int[] types)

    +

    ResultSet

    +

    Yes

    +

    getURL()

    +

    String

    +

    Yes

    +

    getVersionColumns​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    insertsAreDetected​(int type)

    +

    Boolean

    +

    Yes

    +

    locatorsUpdateCopy()

    +

    Boolean

    +

    Yes

    +

    othersDeletesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    othersInsertsAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    othersUpdatesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    ownDeletesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    ownInsertsAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    ownUpdatesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    storesLowerCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesMixedCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesUpperCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsBatchUpdates()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInDataManipulation()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInIndexDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInPrivilegeDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInProcedureCalls()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInTableDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsCorrelatedSubqueries()

    +

    Boolean

    +

    Yes

    +

    supportsDataDefinitionAndDataManipulationTransactions()

    +

    Boolean

    +

    Yes

    +

    supportsDataManipulationTransactionsOnly()

    +

    Boolean

    +

    Yes

    +

    supportsGetGeneratedKeys()

    +

    Boolean

    +

    Yes

    +

    supportsMixedCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsMultipleOpenResults()

    +

    Boolean

    +

    Yes

    +

    supportsNamedParameters()

    +

    Boolean

    +

    Yes

    +

    supportsOpenCursorsAcrossCommit()

    +

    Boolean

    +

    Yes

    +

    supportsOpenCursorsAcrossRollback()

    +

    Boolean

    +

    Yes

    +

    supportsOpenStatementsAcrossCommit()

    +

    Boolean

    +

    Yes

    +

    supportsOpenStatementsAcrossRollback()

    +

    Boolean

    +

    Yes

    +

    supportsPositionedDelete()

    +

    Boolean

    +

    Yes

    +

    supportsPositionedUpdate()

    +

    Boolean

    +

    Yes

    +

    supportsRefCursors()

    +

    Boolean

    +

    Yes

    +

    supportsResultSetConcurrency​(int type, int concurrency)

    +

    Boolean

    +

    Yes

    +

    supportsResultSetType​(int type)

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInIndexDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInPrivilegeDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInProcedureCalls()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInTableDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsSelectForUpdate()

    +

    Boolean

    +

    Yes

    +

    supportsStatementPooling()

    +

    Boolean

    +

    Yes

    +

    supportsStoredFunctionsUsingCallSyntax()

    +

    Boolean

    +

    Yes

    +

    supportsStoredProcedures()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInComparisons()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInExists()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInIns()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInQuantifieds()

    +

    Boolean

    +

    Yes

    +

    supportsTransactionIsolationLevel​(int level)

    +

    Boolean

    +

    Yes

    +

    supportsTransactions()

    +

    Boolean

    +

    Yes

    +

    supportsUnion()

    +

    Boolean

    +

    Yes

    +

    supportsUnionAll()

    +

    Boolean

    +

    Yes

    +

    updatesAreDetected​(int type)

    +

    Boolean

    +

    Yes

    +

    getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)

    +

    ResultSet

    +

    Yes

    +

    getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getTableTypes()

    +

    ResultSet

    +

    Yes

    +

    getUserName()

    +

    String

    +

    Yes

    +

    isReadOnly()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedHigh()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedLow()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedAtStart()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedAtEnd()

    +

    Boolean

    +

    Yes

    +

    getDatabaseProductName()

    +

    String

    +

    Yes

    +

    getDatabaseProductVersion()

    +

    String

    +

    Yes

    +

    getDriverName()

    +

    String

    +

    Yes

    +

    getDriverVersion()

    +

    String

    +

    Yes

    +

    getDriverMajorVersion()

    +

    int

    +

    Yes

    +

    getDriverMinorVersion()

    +

    int

    +

    Yes

    +

    usesLocalFiles()

    +

    Boolean

    +

    Yes

    +

    usesLocalFilePerTable()

    +

    Boolean

    +

    Yes

    +

    supportsMixedCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesUpperCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesLowerCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsMixedCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesUpperCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesLowerCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesMixedCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsAlterTableWithAddColumn()

    +

    Boolean

    +

    Yes

    +

    supportsAlterTableWithDropColumn()

    +

    Boolean

    +

    Yes

    +

    supportsColumnAliasing()

    +

    Boolean

    +

    Yes

    +

    nullPlusNonNullIsNull()

    +

    Boolean

    +

    Yes

    +

    supportsConvert()

    +

    Boolean

    +

    Yes

    +

    supportsConvert(int fromType, int toType)

    +

    Boolean

    +

    Yes

    +

    supportsTableCorrelationNames()

    +

    Boolean

    +

    Yes

    +

    supportsDifferentTableCorrelationNames()

    +

    Boolean

    +

    Yes

    +

    supportsExpressionsInOrderBy()

    +

    Boolean

    +

    Yes

    +

    supportsOrderByUnrelated()

    +

    Boolean

    +

    Yes

    +

    supportsGroupBy()

    +

    Boolean

    +

    Yes

    +

    supportsGroupByUnrelated()

    +

    Boolean

    +

    Yes

    +

    supportsGroupByBeyondSelect()

    +

    Boolean

    +

    Yes

    +

    supportsLikeEscapeClause()

    +

    Boolean

    +

    Yes

    +

    supportsMultipleResultSets()

    +

    Boolean

    +

    Yes

    +

    supportsMultipleTransactions()

    +

    Boolean

    +

    Yes

    +

    supportsNonNullableColumns()

    +

    Boolean

    +

    Yes

    +

    supportsMinimumSQLGrammar()

    +

    Boolean

    +

    Yes

    +

    supportsCoreSQLGrammar()

    +

    Boolean

    +

    Yes

    +

    supportsExtendedSQLGrammar()

    +

    Boolean

    +

    Yes

    +

    supportsANSI92EntryLevelSQL()

    +

    Boolean

    +

    Yes

    +

    supportsANSI92IntermediateSQL()

    +

    Boolean

    +

    Yes

    +

    supportsANSI92FullSQL()

    +

    Boolean

    +

    Yes

    +

    supportsIntegrityEnhancementFacility()

    +

    Boolean

    +

    Yes

    +

    supportsOuterJoins()

    +

    Boolean

    +

    Yes

    +

    supportsFullOuterJoins()

    +

    Boolean

    +

    Yes

    +

    supportsLimitedOuterJoins()

    +

    Boolean

    +

    Yes

    +

    isCatalogAtStart()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInDataManipulation()

    +

    Boolean

    +

    Yes

    +

    supportsSavepoints()

    +

    Boolean

    +

    Yes

    +

    supportsResultSetHoldability(int holdability)

    +

    Boolean

    +

    Yes

    +

    getResultSetHoldability()

    +

    int

    +

    Yes

    +

    getDatabaseMajorVersion()

    +

    int

    +

    Yes

    +

    getDatabaseMinorVersion()

    +

    int

    +

    Yes

    +

    getJDBCMajorVersion()

    +

    int

    +

    Yes

    +

    getJDBCMinorVersion()

    +

    int

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>If the value of **uppercaseAttributeName** is **true**, the following APIs convert the query result to uppercase letters. The conversion range is the same as that of the **toUpperCase** method in Java. +>- public ResultSet getProcedures\(String catalog, String schemaPattern, String procedureNamePattern\) +>- public ResultSet getProcedureColumns\(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern\) +>- public ResultSet getTables\(String catalog, String schemaPattern, String tableNamePattern, String\[\] types\) +>- public ResultSet getSchemas\(String catalog, String schemaPattern\) +>- public ResultSet getColumns\(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern\) +>- public ResultSet getColumnPrivileges\(String catalog, String schema, String table, String columnNamePattern\) +>- public ResultSet getTablePrivileges\(String catalog, String schemaPattern, String tableNamePattern\) +>- public ResultSet getBestRowIdentifier\(String catalog, String schema, String table, int scope, boolean nullable\) +>- public ResultSet getPrimaryKeys\(String catalog, String schema, String table\) +>- protected ResultSet getImportedExportedKeys\(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable\) +>- public ResultSet getIndexInfo\(String catalog, String schema, String tableName, boolean unique, boolean approximate\) +>- public ResultSet getUDTs\(String catalog, String schemaPattern, String typeNamePattern, int\[\] types\) +>- public ResultSet getFunctions\(String catalog, String schemaPattern, String functionNamePattern\) + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>The **getPartitionTablePrimaryKeys\(String catalog, String schema, String table\)** API is used to obtain the primary key column of a partitioned table that contains global indexes. The following is an example: +>``` +>PgDatabaseMetaData dbmd = (PgDatabaseMetaData)conn.getMetaData(); +>dbmd.getPartitionTablePrimaryKeys("catalogName", "schemaName", "tableName"); +>``` + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-driver.md b/content/docs-lite/en/docs/Developerguide/java-sql-driver.md new file mode 100644 index 000000000..59db5f6fa --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-driver.md @@ -0,0 +1,67 @@ +# java.sql.Driver + +This section describes **java.sql.Driver**, the database driver API. + +**Table 1** Support status for java.sql.Driver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    acceptsURL(String url)

    +

    Boolean

    +

    Yes

    +

    connect(String url, Properties info)

    +

    Connection

    +

    Yes

    +

    jdbcCompliant()

    +

    Boolean

    +

    Yes

    +

    getMajorVersion()

    +

    int

    +

    Yes

    +

    getMinorVersion()

    +

    int

    +

    Yes

    +

    getParentLogger()

    +

    Logger

    +

    Yes

    +

    getPropertyInfo​(String url, Properties info)

    +

    DriverPropertyInfo[]

    +

    Yes

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-preparedstatement.md b/content/docs-lite/en/docs/Developerguide/java-sql-preparedstatement.md new file mode 100644 index 000000000..b43e72c19 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-preparedstatement.md @@ -0,0 +1,354 @@ +# java.sql.PreparedStatement + +This section describes **java.sql.PreparedStatement**, the API for preparing statements. + +**Table 1** Support status for java.sql.PreparedStatement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    clearParameters()

    +

    void

    +

    Yes

    +

    execute()

    +

    Boolean

    +

    Yes

    +

    executeQuery()

    +

    ResultSet

    +

    Yes

    +

    excuteUpdate()

    +

    int

    +

    Yes

    +

    executeLargeUpdate()

    +

    long

    +

    No

    +

    getMetaData()

    +

    ResultSetMetaData

    +

    Yes

    +

    getParameterMetaData()

    +

    ParameterMetaData

    +

    Yes

    +

    setArray​(int parameterIndex, Array x)

    +

    void

    +

    Yes

    +

    setAsciiStream​(int parameterIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    setBinaryStream​(int parameterIndex, InputStream x)

    +

    void

    +

    Yes

    +

    setBinaryStream​(int parameterIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    setBinaryStream​(int parameterIndex, InputStream x, long length)

    +

    void

    +

    Yes

    +

    setBlob​(int parameterIndex, InputStream inputStream)

    +

    void

    +

    Yes

    +

    setBlob​(int parameterIndex, InputStream inputStream, long length)

    +

    void

    +

    Yes

    +

    setBlob​(int parameterIndex, Blob x)

    +

    void

    +

    Yes

    +

    setCharacterStream​(int parameterIndex, Reader reader)

    +

    void

    +

    Yes

    +

    setCharacterStream​(int parameterIndex, Reader reader, int length)

    +

    void

    +

    Yes

    +

    setClob​(int parameterIndex, Reader reader)

    +

    void

    +

    Yes

    +

    setClob​(int parameterIndex, Reader reader, long length)

    +

    void

    +

    Yes

    +

    setClob​(int parameterIndex, Clob x)

    +

    void

    +

    Yes

    +

    setDate​(int parameterIndex, Date x, Calendar cal)

    +

    void

    +

    Yes

    +

    setNull​(int parameterIndex, int sqlType)

    +

    void

    +

    Yes

    +

    setNull​(int parameterIndex, int sqlType, String typeName)

    +

    void

    +

    Yes

    +

    setObject​(int parameterIndex, Object x)

    +

    void

    +

    Yes

    +

    setObject​(int parameterIndex, Object x, int targetSqlType)

    +

    void

    +

    Yes

    +

    setObject​(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)

    +

    void

    +

    Yes

    +

    setSQLXML​(int parameterIndex, SQLXML xmlObject)

    +

    void

    +

    Yes

    +

    setTime​(int parameterIndex, Time x)

    +

    void

    +

    Yes

    +

    setTime​(int parameterIndex, Time x, Calendar cal)

    +

    void

    +

    Yes

    +

    setTimestamp​(int parameterIndex, Timestamp x)

    +

    void

    +

    Yes

    +

    setTimestamp​(int parameterIndex, Timestamp x, Calendar cal)

    +

    void

    +

    Yes

    +

    setUnicodeStream(int parameterIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    setURL(int parameterIndex, URL x)

    +

    void

    +

    Yes

    +

    setBoolean(int parameterIndex, boolean x)

    +

    void

    +

    Yes

    +

    setBigDecimal(int parameterIndex, BigDecimal x)

    +

    void

    +

    Yes

    +

    setByte(int parameterIndex, byte x)

    +

    void

    +

    Yes

    +

    setBytes(int parameterIndex, byte[] x)

    +

    void

    +

    Yes

    +

    setDate(int parameterIndex, Date x)

    +

    void

    +

    Yes

    +

    setDouble(int parameterIndex, double x)

    +

    void

    +

    Yes

    +

    setFloat(int parameterIndex, float x)

    +

    void

    +

    Yes

    +

    setInt(int parameterIndex, int x)

    +

    void

    +

    Yes

    +

    setLong(int parameterIndex, long x)

    +

    void

    +

    Yes

    +

    setShort(int parameterIndex, short x)

    +

    void

    +

    Yes

    +

    setString(int parameterIndex, String x)

    +

    void

    +

    Yes

    +

    setNString(int parameterIndex, String x)

    +

    void

    +

    Yes

    +

    addBatch()

    +

    void

    +

    Yes

    +

    executeBatch()

    +

    int[]

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- Execute **addBatch\(\)** and **execute\(\)** only after running **clearBatch\(\)**. +>- Batch is not cleared by calling **executeBatch\(\)**. Clear batch by explicitly calling **clearBatch\(\)**. +>- After bounded variables of a batch are added, if you want to reuse these values, you do not need to use **set\*\(\)** again. Instead, add a batch. +>- The following methods are inherited from **java.sql.Statement**: **close**, **execute**, **executeQuery**, **executeUpdate**, **getConnection**, **getResultSet**, **getUpdateCount**, **isClosed**, **setMaxRows**, and **setFetchSize**. +>- The **executeLargeUpdate\(\)** method can only be used in JDBC 4.2 or later. + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-resultset.md b/content/docs-lite/en/docs/Developerguide/java-sql-resultset.md new file mode 100644 index 000000000..4bd5a0bfb --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-resultset.md @@ -0,0 +1,960 @@ +# java.sql.ResultSet + +This section describes **java.sql.ResultSet**, the API for execution result sets. + +**Table 1** Support status for java.sql.ResultSet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    absolute​(int row)

    +

    Boolean

    +

    Yes

    +

    afterLast()

    +

    void

    +

    Yes

    +

    beforeFirst()

    +

    void

    +

    Yes

    +

    cancelRowUpdates()

    +

    void

    +

    Yes

    +

    clearWarnings()

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    deleteRow()

    +

    void

    +

    Yes

    +

    findColumn(String columnLabel)

    +

    int

    +

    Yes

    +

    first()

    +

    Boolean

    +

    Yes

    +

    getArray​(int columnIndex)

    +

    Array

    +

    Yes

    +

    getArray​(String columnLabel)

    +

    Array

    +

    Yes

    +

    getAsciiStream​(int columnIndex)

    +

    InputStream

    +

    Yes

    +

    getAsciiStream​(String columnLabel)

    +

    InputStream

    +

    Yes

    +

    getBigDecimal(int columnIndex)

    +

    BigDecimal

    +

    Yes

    +

    getBigDecimal(String columnLabel)

    +

    BigDecimal

    +

    Yes

    +

    getBinaryStream​(int columnIndex)

    +

    InputStream

    +

    Yes

    +

    getBinaryStream​(String columnLabel)

    +

    InputStream

    +

    Yes

    +

    getBlob​(int columnIndex)

    +

    Blob

    +

    Yes

    +

    getBlob​(String columnLabel)

    +

    Blob

    +

    Yes

    +

    getBoolean(int columnIndex)

    +

    Boolean

    +

    Yes

    +

    getBoolean(String columnLabel)

    +

    Boolean

    +

    Yes

    +

    getByte(int columnIndex)

    +

    byte

    +

    Yes

    +

    getBytes(int columnIndex)

    +

    byte[]

    +

    Yes

    +

    getByte(String columnLabel)

    +

    byte

    +

    Yes

    +

    getBytes(String columnLabel)

    +

    byte[]

    +

    Yes

    +

    getCharacterStream​(int columnIndex)

    +

    Reader

    +

    Yes

    +

    getCharacterStream​(String columnLabel)

    +

    Reader

    +

    Yes

    +

    getClob​(int columnIndex)

    +

    Clob

    +

    Yes

    +

    getClob​(String columnLabel)

    +

    Clob

    +

    Yes

    +

    getConcurrency()

    +

    int

    +

    Yes

    +

    getCursorName()

    +

    String

    +

    Yes

    +

    getDate(int columnIndex)

    +

    Date

    +

    Yes

    +

    getDate​(int columnIndex, Calendar cal)

    +

    Date

    +

    Yes

    +

    getDate(String columnLabel)

    +

    Date

    +

    Yes

    +

    getDate​(String columnLabel, Calendar cal)

    +

    Date

    +

    Yes

    +

    getDouble(int columnIndex)

    +

    double

    +

    Yes

    +

    getDouble(String columnLabel)

    +

    double

    +

    Yes

    +

    getFetchDirection()

    +

    int

    +

    Yes

    +

    getFetchSize()

    +

    int

    +

    Yes

    +

    getFloat(int columnIndex)

    +

    float

    +

    Yes

    +

    getFloat(String columnLabel)

    +

    float

    +

    Yes

    +

    getInt(int columnIndex)

    +

    int

    +

    Yes

    +

    getInt(String columnLabel)

    +

    int

    +

    Yes

    +

    getLong(int columnIndex)

    +

    long

    +

    Yes

    +

    getLong(String columnLabel)

    +

    long

    +

    Yes

    +

    getMetaData()

    +

    ResultSetMetaData

    +

    Yes

    +

    getObject​(int columnIndex)

    +

    Object

    +

    Yes

    +

    getObject​(int columnIndex, Class<T> type)

    +

    <T> T

    +

    Yes

    +

    getObject​(int columnIndex, Map<String,​Class<?>> map)

    +

    Object

    +

    Yes

    +

    getObject​(String columnLabel)

    +

    Object

    +

    Yes

    +

    getObject​(String columnLabel, Class<T> type)

    +

    <T> T

    +

    Yes

    +

    getObject​(String columnLabel, Map<String,​Class<?>> map)

    +

    Object

    +

    Yes

    +

    getRow()

    +

    int

    +

    Yes

    +

    getShort(int columnIndex)

    +

    short

    +

    Yes

    +

    getShort(String columnLabel)

    +

    short

    +

    Yes

    +

    getSQLXML​(int columnIndex)

    +

    SQLXML

    +

    Yes

    +

    getSQLXML​(String columnLabel)

    +

    SQLXML

    +

    Yes

    +

    getStatement()

    +

    Statement

    +

    Yes

    +

    getString(int columnIndex)

    +

    String

    +

    Yes

    +

    getString(String columnLabel)

    +

    String

    +

    Yes

    +

    getNString(int columnIndex)

    +

    String

    +

    Yes

    +

    getNString(String columnLabel)

    +

    String

    +

    Yes

    +

    getTime(int columnIndex)

    +

    Time

    +

    Yes

    +

    getTime​(int columnIndex, Calendar cal)

    +

    Time

    +

    Yes

    +

    getTime(String columnLabel)

    +

    Time

    +

    Yes

    +

    getTime​(String columnLabel, Calendar cal)

    +

    Time

    +

    Yes

    +

    getTimestamp(int columnIndex)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp​(int columnIndex, Calendar cal)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp(String columnLabel)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp​(String columnLabel, Calendar cal)

    +

    Timestamp

    +

    Yes

    +

    getType()

    +

    int

    +

    Yes

    +

    getWarnings()

    +

    SQLWarning

    +

    Yes

    +

    insertRow()

    +

    void

    +

    Yes

    +

    isAfterLast()

    +

    Boolean

    +

    Yes

    +

    isBeforeFirst()

    +

    Boolean

    +

    Yes

    +

    isClosed()

    +

    Boolean

    +

    Yes

    +

    isFirst()

    +

    Boolean

    +

    Yes

    +

    isLast()

    +

    Boolean

    +

    Yes

    +

    last()

    +

    Boolean

    +

    Yes

    +

    moveToCurrentRow()

    +

    void

    +

    Yes

    +

    moveToInsertRow()

    +

    void

    +

    Yes

    +

    next()

    +

    Boolean

    +

    Yes

    +

    previous()

    +

    Boolean

    +

    Yes

    +

    refreshRow()

    +

    void

    +

    Yes

    +

    relative​(int rows)

    +

    Boolean

    +

    Yes

    +

    rowDeleted()

    +

    Boolean

    +

    Yes

    +

    rowInserted()

    +

    Boolean

    +

    Yes

    +

    rowUpdated()

    +

    Boolean

    +

    Yes

    +

    setFetchDirection​(int direction)

    +

    void

    +

    Yes

    +

    setFetchSize​(int rows)

    +

    void

    +

    Yes

    +

    updateArray​(int columnIndex, Array x)

    +

    void

    +

    Yes

    +

    updateArray​(String columnLabel, Array x)

    +

    void

    +

    Yes

    +

    updateAsciiStream​(int columnIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateAsciiStream​(String columnLabel, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateBigDecimal​(int columnIndex, BigDecimal x)

    +

    void

    +

    Yes

    +

    updateBigDecimal​(String columnLabel, BigDecimal x)

    +

    void

    +

    Yes

    +

    updateBinaryStream​(int columnIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateBinaryStream​(String columnLabel, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateBoolean​(int columnIndex, boolean x)

    +

    void

    +

    Yes

    +

    updateBoolean​(String columnLabel, boolean x)

    +

    void

    +

    Yes

    +

    updateByte​(int columnIndex, byte x)

    +

    void

    +

    Yes

    +

    updateByte​(String columnLabel, byte x)

    +

    void

    +

    Yes

    +

    updateBytes​(int columnIndex, byte[] x)

    +

    void

    +

    Yes

    +

    updateBytes​(String columnLabel, byte[] x)

    +

    void

    +

    Yes

    +

    updateCharacterStream​(int columnIndex, Reader x, int length)

    +

    void

    +

    Yes

    +

    updateCharacterStream​(String columnLabel, Reader reader, int length)

    +

    void

    +

    Yes

    +

    updateDate​(int columnIndex, Date x)

    +

    void

    +

    Yes

    +

    updateDate​(String columnLabel, Date x)

    +

    void

    +

    Yes

    +

    updateDouble​(int columnIndex, double x)

    +

    void

    +

    Yes

    +

    updateDouble​(String columnLabel, double x)

    +

    void

    +

    Yes

    +

    updateFloat​(int columnIndex, float x)

    +

    void

    +

    Yes

    +

    updateFloat​(String columnLabel, float x)

    +

    void

    +

    Yes

    +

    updateInt​(int columnIndex, int x)

    +

    void

    +

    Yes

    +

    updateInt​(String columnLabel, int x)

    +

    void

    +

    Yes

    +

    updateLong​(int columnIndex, long x)

    +

    void

    +

    Yes

    +

    updateLong​(String columnLabel, long x)

    +

    void

    +

    Yes

    +

    updateNull​(int columnIndex)

    +

    void

    +

    Yes

    +

    updateNull​(String columnLabel)

    +

    void

    +

    Yes

    +

    updateObject​(int columnIndex, Object x)

    +

    void

    +

    Yes

    +

    updateObject​(int columnIndex, Object x, int scaleOrLength)

    +

    void

    +

    Yes

    +

    updateObject​(String columnLabel, Object x)

    +

    void

    +

    Yes

    +

    updateObject​(String columnLabel, Object x, int scaleOrLength)

    +

    void

    +

    Yes

    +

    updateRow()

    +

    void

    +

    Yes

    +

    updateShort​(int columnIndex, short x)

    +

    void

    +

    Yes

    +

    updateShort​(String columnLabel, short x)

    +

    void

    +

    Yes

    +

    updateSQLXML​(int columnIndex, SQLXML xmlObject)

    +

    void

    +

    Yes

    +

    updateSQLXML​(String columnLabel, SQLXML xmlObject)

    +

    void

    +

    Yes

    +

    updateString​(int columnIndex, String x)

    +

    void

    +

    Yes

    +

    updateString​(String columnLabel, String x)

    +

    void

    +

    Yes

    +

    updateTime​(int columnIndex, Time x)

    +

    void

    +

    Yes

    +

    updateTime​(String columnLabel, Time x)

    +

    void

    +

    Yes

    +

    updateTimestamp​(int columnIndex, Timestamp x)

    +

    void

    +

    Yes

    +

    updateTimestamp​(String columnLabel, Timestamp x)

    +

    void

    +

    Yes

    +

    wasNull()

    +

    Boolean

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- One statement cannot have multiple open ResultSets. +>- The cursor that is used for traversing the ResultSet cannot be open after being committed. + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-resultsetmetadata.md b/content/docs-lite/en/docs/Developerguide/java-sql-resultsetmetadata.md new file mode 100644 index 000000000..0e8da887c --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-resultsetmetadata.md @@ -0,0 +1,170 @@ +# java.sql.ResultSetMetaData + +This section describes **java.sql.ResultSetMetaData**, which provides details about ResultSet object information. + +**Table 1** Support status for java.sql.ResultSetMetaData + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    getCatalogName​(int column)

    +

    String

    +

    Yes

    +

    getColumnClassName​(int column)

    +

    String

    +

    Yes

    +

    getColumnCount()

    +

    int

    +

    Yes

    +

    getColumnDisplaySize​(int column)

    +

    int

    +

    Yes

    +

    getColumnLabel​(int column)

    +

    String

    +

    Yes

    +

    getColumnName(int column)

    +

    String

    +

    Yes

    +

    getColumnType(int column)

    +

    int

    +

    Yes

    +

    getColumnTypeName(int column)

    +

    String

    +

    Yes

    +

    getPrecision​(int column)

    +

    int

    +

    Yes

    +

    getScale​(int column)

    +

    int

    +

    Yes

    +

    getSchemaName​(int column)

    +

    String

    +

    Yes

    +

    getTableName​(int column)

    +

    String

    +

    Yes

    +

    isAutoIncrement​(int column)

    +

    Boolean

    +

    Yes

    +

    isCaseSensitive​(int column)

    +

    Boolean

    +

    Yes

    +

    isCurrency​(int column)

    +

    Boolean

    +

    Yes

    +

    isDefinitelyWritable​(int column)

    +

    Boolean

    +

    Yes

    +

    isNullable​(int column)

    +

    int

    +

    Yes

    +

    isReadOnly​(int column)

    +

    Boolean

    +

    Yes

    +

    isSearchable​(int column)

    +

    Boolean

    +

    Yes

    +

    isSigned​(int column)

    +

    Boolean

    +

    Yes

    +

    isWritable​(int column)

    +

    Boolean

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>When **uppercaseAttributeName** is set to **true**, the following APIs convert the query result to uppercase letters. The conversion range is 26 English letters. +>- public String getColumnName\(int column\) +>- public String getColumnLabel\(int column\) + diff --git a/content/docs-lite/en/docs/Developerguide/java-sql-statement.md b/content/docs-lite/en/docs/Developerguide/java-sql-statement.md new file mode 100644 index 000000000..a85220a62 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/java-sql-statement.md @@ -0,0 +1,359 @@ +# java.sql.Statement + +This section describes **java.sql.Statement**, the interface for executing SQL statements. + +**Table 1** Support status for java.sql.Statement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    addBatch​(String sql)

    +

    void

    +

    Yes

    +

    clearBatch()

    +

    void

    +

    Yes

    +

    clearWarnings()

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    closeOnCompletion()

    +

    void

    +

    Yes

    +

    execute(String sql)

    +

    Boolean

    +

    Yes

    +

    execute​(String sql, int autoGeneratedKeys)

    +

    Boolean

    +

    Yes

    +

    execute​(String sql, int[] columnIndexes)

    +

    Boolean

    +

    Yes

    +

    execute​(String sql, String[] columnNames)

    +

    Boolean

    +

    Yes

    +

    executeBatch()

    +

    Boolean

    +

    Yes

    +

    executeQuery(String sql)

    +

    ResultSet

    +

    Yes

    +

    executeUpdate(String sql)

    +

    int

    +

    Yes

    +

    executeUpdate​(String sql, int autoGeneratedKeys)

    +

    int

    +

    Yes

    +

    executeUpdate​(String sql, int[] columnIndexes)

    +

    int

    +

    Yes

    +

    executeUpdate​(String sql, String[] columnNames)

    +

    int

    +

    Yes

    +

    getConnection()

    +

    Connection

    +

    Yes

    +

    getFetchDirection()

    +

    int

    +

    Yes

    +

    getFetchSize()

    +

    int

    +

    Yes

    +

    getGeneratedKeys()

    +

    ResultSet

    +

    Yes

    +

    getMaxFieldSize()

    +

    int

    +

    Yes

    +

    getMaxRows()

    +

    int

    +

    Yes

    +

    getMoreResults()

    +

    boolean

    +

    Yes

    +

    getMoreResults​(int current)

    +

    boolean

    +

    Yes

    +

    getResultSet()

    +

    ResultSet

    +

    Yes

    +

    getResultSetConcurrency()

    +

    int

    +

    Yes

    +

    getResultSetHoldability()

    +

    int

    +

    Yes

    +

    getResultSetType()

    +

    int

    +

    Yes

    +

    getQueryTimeout()

    +

    int

    +

    Yes

    +

    getUpdateCount()

    +

    int

    +

    Yes

    +

    getWarnings()

    +

    SQLWarning

    +

    Yes

    +

    isClosed()

    +

    Boolean

    +

    Yes

    +

    isCloseOnCompletion()

    +

    Boolean

    +

    Yes

    +

    isPoolable()

    +

    Boolean

    +

    Yes

    +

    setCursorName​(String name)

    +

    void

    +

    Yes

    +

    setEscapeProcessing​(boolean enable)

    +

    void

    +

    Yes

    +

    setFetchDirection​(int direction)

    +

    void

    +

    Yes

    +

    setMaxFieldSize​(int max)

    +

    void

    +

    Yes

    +

    setMaxRows​(int max)

    +

    void

    +

    Yes

    +

    setPoolable​(boolean poolable)

    +

    void

    +

    Yes

    +

    setQueryTimeout(int seconds)

    +

    void

    +

    Yes

    +

    setFetchSize(int rows)

    +

    void

    +

    Yes

    +

    cancel()

    +

    void

    +

    Yes

    +

    executeLargeUpdate(String sql)

    +

    long

    +

    No

    +

    getLargeUpdateCount()

    +

    long

    +

    No

    +

    executeLargeBatch()

    +

    long

    +

    No

    +

    executeLargeUpdate(String sql, int autoGeneratedKeys)

    +

    long

    +

    No

    +

    executeLargeUpdate(String sql, int[] columnIndexes)

    +

    long

    +

    No

    +

    executeLargeUpdate(String sql, String[] columnNames)

    +

    long

    +

    No

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- Using setFetchSize can reduce the memory occupied by result sets on the client. Result sets are packaged into cursors and segmented for processing, which will increase the communication traffic between the database and the client, affecting performance. +>- Database cursors are valid only within their transactions. If **setFetchSize** is set, set **setAutoCommit\(false\)** and commit transactions on the connection to flush service data to a database. +>- **LargeUpdate** methods can only be used in JDBC 4.2 or later. + diff --git a/content/docs-lite/en/docs/Developerguide/javax-naming-context.md b/content/docs-lite/en/docs/Developerguide/javax-naming-context.md new file mode 100644 index 000000000..9e8e69d76 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/javax-naming-context.md @@ -0,0 +1,88 @@ +# javax.naming.Context + +This section describes **javax.naming.Context**, the context interface for connection configuration. + +**Table 1** Support status for javax.naming.Context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    Support JDBC 4

    +

    bind(Name name, Object obj)

    +

    void

    +

    Yes

    +

    bind(String name, Object obj)

    +

    void

    +

    Yes

    +

    lookup(Name name)

    +

    Object

    +

    Yes

    +

    lookup(String name)

    +

    Object

    +

    Yes

    +

    rebind(Name name, Object obj)

    +

    void

    +

    Yes

    +

    rebind(String name, Object obj)

    +

    void

    +

    Yes

    +

    rename(Name oldName, Name newName)

    +

    void

    +

    Yes

    +

    rename(String oldName, String newName)

    +

    void

    +

    Yes

    +

    unbind(Name name)

    +

    void

    +

    Yes

    +

    unbind(String name)

    +

    void

    +

    Yes

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/javax-naming-spi-initialcontextfactory.md b/content/docs-lite/en/docs/Developerguide/javax-naming-spi-initialcontextfactory.md new file mode 100644 index 000000000..b3fdff4e6 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/javax-naming-spi-initialcontextfactory.md @@ -0,0 +1,25 @@ +# javax.naming.spi.InitialContextFactory + +This section describes **javax.naming.spi.InitialContextFactory**, the initial context factory interface. + +**Table 1** Support status for javax.naming.spi.InitialContextFactory + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    Support JDBC 4

    +

    getInitialContext(Hashtable<?,?> environment)

    +

    Context

    +

    Yes

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/javax-sql-connectionpooldatasource.md b/content/docs-lite/en/docs/Developerguide/javax-sql-connectionpooldatasource.md new file mode 100644 index 000000000..0cad7c474 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/javax-sql-connectionpooldatasource.md @@ -0,0 +1,32 @@ +# javax.sql.ConnectionPoolDataSource + +This section describes **javax.sql.ConnectionPoolDataSource**, the API for data source connection pools. + +**Table 1** Support status for javax.sql.ConnectionPoolDataSource + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    getPooledConnection()

    +

    PooledConnection

    +

    Yes

    +

    getPooledConnection(String user,String password)

    +

    PooledConnection

    +

    Yes

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/javax-sql-datasource.md b/content/docs-lite/en/docs/Developerguide/javax-sql-datasource.md new file mode 100644 index 000000000..5187728e3 --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/javax-sql-datasource.md @@ -0,0 +1,60 @@ +# javax.sql.DataSource + +This section describes **javax.sql.DataSource**, the interface for data sources. + +**Table 1** Support status for javax.sql.DataSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    Support JDBC 4

    +

    getConneciton()

    +

    Connection

    +

    Yes

    +

    getConnection(String username,String password)

    +

    Connection

    +

    Yes

    +

    getLoginTimeout()

    +

    int

    +

    Yes

    +

    getLogWriter()

    +

    PrintWriter

    +

    Yes

    +

    setLoginTimeout(int seconds)

    +

    void

    +

    Yes

    +

    setLogWriter(PrintWriter out)

    +

    void

    +

    Yes

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/javax-sql-pooledconnection.md b/content/docs-lite/en/docs/Developerguide/javax-sql-pooledconnection.md new file mode 100644 index 000000000..91d24ab9e --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/javax-sql-pooledconnection.md @@ -0,0 +1,46 @@ +# javax.sql.PooledConnection + +This section describes **javax.sql.PooledConnection**, the connection API created by a connection pool. + +**Table 1** Support status for javax.sql.PooledConnection + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    addConnectionEventListener (ConnectionEventListener listener)

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    getConnection()

    +

    Connection

    +

    Yes

    +

    removeConnectionEventListener (ConnectionEventListener listener)

    +

    void

    +

    Yes

    +
    + diff --git a/content/docs-lite/en/docs/Developerguide/jdbc-configuration.md b/content/docs-lite/en/docs/Developerguide/jdbc-configuration.md new file mode 100644 index 000000000..c51158a9d --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/jdbc-configuration.md @@ -0,0 +1,59 @@ +# JDBC Configuration + +Currently, third-party tools related to openGauss are connected through JDBC. This section describes the precautions for configuring the tool. + +## Connection Parameters + +- \[Notice\] When a third-party tool connects to openGauss through JDBC, JDBC sends a connection request to openGauss. By default, the following configuration parameters are added. For details, see the implementation of the ConnectionFactoryImpl class in the JDBC code. + + ``` + params = { + { "user", user }, + { "database", database }, + { "client_encoding", "UTF8" }, + { "DateStyle", "ISO" }, + { "extra_float_digits", "3" }, + { "TimeZone", createPostgresTimeZone() }, + }; + ``` + + These parameters may cause the JDBC and **gsql** clients to display inconsistent data, for example, date data display mode, floating point precision representation, and timezone. + + If the result is not as expected, you are advised to explicitly set these parameters in the Java connection setting. + +- [Proposal] When the database is connected through JDBC, **extra_float_digits** is set to **3**. When the database is connected using gsql, **extra_float_digits** is set to **0**. As a result, the precision of the same data displayed in JDBC clients may be different from that displayed in gsql clients. + +- [Proposal] In precision-sensitive scenarios, the numeric type is recommended. + +- \[Proposal\] When connecting to the database through JDBC, ensure that the following three time zones are the same: + - Time zone of the host where the JDBC client is located + - Time zone of the host where the openGauss database instance is located. + - Time zone used during openGauss database instance configuration. + + >![](public_sys-resources/icon-note.gif) **NOTE:** + >For details about how to set the time zone, see "Initial Configuration \> Synchronizing System Time" in *Installation Guide*. + + + +## fetchsize + +\[Notice\] To use **fetchsize** in applications, disable **autocommit**. Enabling the **autocommit** switch makes the **fetchsize** configuration invalid. + +## autocommit + +\[Proposal\] You are advised to enable **autocommit** in the code for connecting to openGauss by the JDBC. If **autocommit** needs to be disabled to improve performance or for other purposes, applications need to ensure their transactions are committed. For example, explicitly commit translations after specifying service SQL statements. Particularly, ensure that all transactions are committed before the client exits. + +## Connection Releasing + +\[Proposal\] You are advised to use connection pools to limit the number of connections from applications. Do not connect to a database every time you run an SQL statement. + +\[Proposal\] After an application completes its tasks, disconnect its connection to openGauss to release occupied resources. You are advised to set the session timeout interval in the jobs. + +\[Proposal\] Reset the session environment before releasing connections to the JDBC connection tool. Otherwise, historical session information may cause object conflicts. + +- If GUC parameters are set in the connection, run **SET SESSION AUTHORIZATION DEFAULT;RESET ALL;** to clear the connection status before you return the connection to the connection pool. +- If a temporary table is used, delete the temporary table before you return the connection to the connection pool. + +## CopyManager + +\[Proposal\] In the scenario where the ETL tool is not used and real-time data import is required, it is recommended that you use the **CopyManager** interface driven by the openGauss JDBC to import data in batches during application development. diff --git a/content/docs-lite/en/docs/Developerguide/jdbc-interface-reference.md b/content/docs-lite/en/docs/Developerguide/jdbc-interface-reference.md index db5de7769..083be4c5d 100644 --- a/content/docs-lite/en/docs/Developerguide/jdbc-interface-reference.md +++ b/content/docs-lite/en/docs/Developerguide/jdbc-interface-reference.md @@ -1,4 +1,31 @@ # JDBC API Reference -For details, see [JDBC](development-based-on-jdbc.md). +This section describes common JDBC interfaces. For more interfaces, check JDK1.8 (software package) and JDBC 4.0. +- **[java.sql.Connection](java-sql-Connection.md)** + +- **[java.sql.CallableStatement](java-sql-CallableStatement.md)** + +- **[java.sql.DatabaseMetaData](java-sql-DatabaseMetaData.md)** + +- **[java.sql.Driver](java-sql-Driver.md)** + +- **[java.sql.PreparedStatement](java-sql-PreparedStatement.md)** + +- **[java.sql.ResultSet](java-sql-ResultSet.md)** + +- **[java.sql.ResultSetMetaData](java-sql-ResultSetMetaData.md)** + +- **[java.sql.Statement](java-sql-Statement.md)** + +- **[javax.sql.ConnectionPoolDataSource](javax-sql-ConnectionPoolDataSource.md)** + +- **[javax.sql.DataSource](javax-sql-DataSource.md)** + +- **[javax.sql.PooledConnection](javax-sql-PooledConnection.md)** + +- **[javax.naming.Context](javax-naming-Context.md)** + +- **[javax.naming.spi.InitialContextFactory](javax-naming-spi-InitialContextFactory.md)** + +- **[CopyManager](CopyManager.md)** \ No newline at end of file diff --git a/content/docs-lite/en/docs/Developerguide/libpq-api-reference.md b/content/docs-lite/en/docs/Developerguide/libpq-api-reference.md index 38be73ebc..6df748edc 100644 --- a/content/docs-lite/en/docs/Developerguide/libpq-api-reference.md +++ b/content/docs-lite/en/docs/Developerguide/libpq-api-reference.md @@ -1,4 +1,13 @@ # libpq API Reference -For details, see [libpq](development-based-on-libpq.md). +- **[Database Connection Control Functions](database-connection-control-functions.md)** +- **[Database Statement Execution Functions](database-statement-execution-functions.md)** + +- **[Functions for Asynchronous Command Processing](functions-for-asynchronous-command-processing.md)** + +- **[Functions for Canceling Queries in Progress](functions-for-canceling-queries-in-progress.md)** + +- **[Example](example-libpq.md)** + +- **[Link Parameters](link-parameters-libpq.md)** diff --git a/content/docs-lite/en/docs/Developerguide/psycopg-api-reference.md b/content/docs-lite/en/docs/Developerguide/psycopg-api-reference.md index 3fd3972ad..a3bcdb8e3 100644 --- a/content/docs-lite/en/docs/Developerguide/psycopg-api-reference.md +++ b/content/docs-lite/en/docs/Developerguide/psycopg-api-reference.md @@ -1,4 +1,23 @@ # Psycopg API Reference -For details, see [Psycopg](psycopg-based-development.md). +Psycopg APIs are a set of methods provided for users. This section describes some common APIs. +- **[psycopg2.connect\(\)](psycopg2-connect.md)** + +- **[connection.cursor\(\)](connection-cursor.md)** + +- **[cursor.execute\(query,vars\_list\)](cursor-execute-query-vars_list.md)** + +- **[curosr.executemany\(query,vars\_list\)](curosr-executemany-query-vars_list.md)** + +- **[connection.commit\(\)](connection-commit.md)** + +- **[connection.rollback\(\)](connection-rollback.md)** + +- **[cursor.fetchone\(\)](cursor-fetchone.md)** + +- **[cursor.fetchall\(\)](cursor-fetchall.md)** + +- **[cursor.close\(\)](cursor-close.md)** + +- **[connection.close\(\)](connection-close.md)** \ No newline at end of file diff --git a/content/docs-lite/en/docs/Developerguide/psycopg2-connect.md b/content/docs-lite/en/docs/Developerguide/psycopg2-connect.md new file mode 100644 index 000000000..daee4420a --- /dev/null +++ b/content/docs-lite/en/docs/Developerguide/psycopg2-connect.md @@ -0,0 +1,79 @@ +# psycopg2.connect\(\) + +## Function + +This method creates a database session and returns a new connection object. + +## Prototype + +``` +conn=psycopg2.connect(dbname="test",user="postgres",password="secret",host="127.0.0.1",port="5432") +``` + +## Parameter + +**Table 1** psycopg2.connect parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    dbname

    +

    Database name.

    +

    user

    +

    Username.

    +

    password

    +

    Password.

    +

    host

    +

    Database IP address. The default type is UNIX socket.

    +

    port

    +

    Connection port number. The default value is 5432.

    +

    sslmode

    +

    SSL mode, which is used for SSL connection.

    +

    sslcert

    +

    Path of the client certificate, which is used for SSL connection.

    +

    sslkey

    +

    Path of the client key, which is used for SSL connection.

    +

    sslrootcert

    +

    Path of the root certificate, which is used for SSL connection.

    +
    + +## Return Value + +Connection object \(for connecting to the openGauss DB instance\) + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/docs-lite/en/docs/Developerguide/tool-interconnection.md b/content/docs-lite/en/docs/Developerguide/tool-interconnection.md index c25f43cb5..c532afb4b 100644 --- a/content/docs-lite/en/docs/Developerguide/tool-interconnection.md +++ b/content/docs-lite/en/docs/Developerguide/tool-interconnection.md @@ -1,3 +1,3 @@ # Tool Interconnection - +**[JDBC Configuration](jdbc-configuration.md)** diff --git a/content/docs-lite/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md b/content/docs-lite/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md index 6d429c2f6..ce9510440 100644 --- a/content/docs-lite/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md +++ b/content/docs-lite/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md @@ -1,4 +1,4 @@ -# Hint for Degrading Some Errors to Warnings. +# Hint for Degrading Some Errors to Warnings ## Function diff --git a/content/docs-lite/en/docs/SQLReference/SQL-language-structure-and-syntax.md b/content/docs-lite/en/docs/SQLReference/SQL-language-structure-and-syntax.md deleted file mode 100644 index 5341e581a..000000000 --- a/content/docs-lite/en/docs/SQLReference/SQL-language-structure-and-syntax.md +++ /dev/null @@ -1,2 +0,0 @@ -# SQL-language-structure-and-syntax - diff --git a/content/docs-lite/en/docs/SQLReference/alter-event-trigger.md b/content/docs-lite/en/docs/SQLReference/alter-event-trigger.md new file mode 100644 index 000000000..6cfaf493b --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/alter-event-trigger.md @@ -0,0 +1,41 @@ +# ALTER EVENT TRIGGER + +## Function + +ALTER EVENT TRIGGER modifies an event trigger. + + +## Precautions + +Only the system administrator or super user has the permission to modify event triggers. +## Syntax + +``` +ALTER EVENT TRIGGER name DISABLE +ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ] +ALTER EVENT TRIGGER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } +ALTER EVENT TRIGGER name RENAME TO new_name +``` + +## Parameter Description + +- **name** + + Specifies the name of the event trigger to be modified. + + Value range: all existing event triggers. + +- **new\_name** + + Specifies the new name after modification. + + Value range: strings that comply with the identifier naming convention. A value contains a maximum of 63 characters and cannot be the same as other event triggers on the same table. + + +## Examples + +For details, see [Examples](create-event-trigger.md#en-us_topic_0283137014_en-us_topic_0237122081_en-us_topic_0059777895_s7f55076bb56940b7920a431c0c344669) in [CREATE EVENT TRIGGER](create-event-trigger.md). + +## Helpful Links + +[CREATE EVENT TRIGGER](create-event-trigger.md) and [DROP EVENT TRIGGER](drop-event-trigger.md) diff --git a/content/docs-lite/en/docs/SQLReference/alter-event.md b/content/docs-lite/en/docs/SQLReference/alter-event.md new file mode 100644 index 000000000..d198fc953 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/alter-event.md @@ -0,0 +1,74 @@ +# ALTER EVENT + +## Function + +**ALTER EVENT** modifies the parameters in the created scheduled event. + +## Precautions + +- Operations related to scheduled events are supported only when **sql\_compatibility** is set to **'B'**. +- Only the owner has the permission to modify the scheduled event to be modified. By default, the system administrator has the permission to modify all scheduled events. +- You can execute SHOW EVENTS or view the log\_user column in the PG\_JOB table to obtain the event owner information. +- Each time a scheduled event is modified, the owner of the modified event is changed to the current user. If a definer is specified during modification, the owner is changed to the specified definer. +- The restrictions for the definer are the same as those described in [CREATE EVENT](create-event.md). + + >![](public_sys-resources/icon-notice.gif) **NOTICE:** + >- If a system administrator modifies a scheduled event created by another user, the owner of the modified event is changed to the system administrator. The statements to be executed are executed by the system administrator. + + +## Syntax + +``` +ALTER + [DEFINER = user] +EVENT event_name + [ON SCHEDULE schedule] + [ON COMPLETION [NOT] PRESERVE] + [RENAME TO new_event_name] + [ENABLE | DISABLE | DISABLE ON SLAVE] + [COMMENT 'string'] + [DO event_body] +``` + +## Parameter Description + +- definer + + Specifies the permission for the scheduled event statement to be executed during execution. By default, the permission of the user who creates the scheduled event is used. When definer is specified, the permission of the specified user is used. + + Only users with the sysadmin permission can specify the definer. + +- RENAME TO + + Specifies the updated scheduled event name. + +- ON COMPLETION \[NOT\] PRESERVE + + Once a transaction is complete, the scheduled event is deleted from the system catalog immediately by default. You can overwrite the default behavior by setting **ON COMPLETION PRESERVE**. + +- ENABLE | DISABLE | DISABLE ON SLAVE + + The scheduled event is in the **ENABLE** state by default after it is created. That is, the statement to be executed is executed immediately at the specified time. You can use the keyword **DISABLE** to change the **ENABLE** state. The performance of **DISABLE ON SLAVE** is the same as that of **DISABLE**. + +- COMMENT 'string' + + You can add comments to the scheduled event. The comments can be viewed in the **GS\_JOB\_ATTRIBUTE** table. + +- event\_body + + Specifies the statement to be executed for a scheduled event. + + +## Examples + +``` +--Create a scheduled task. +openGauss=# CREATE TABLE t_ev(num int); + +openGauss=# CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE AT sysdate + interval 5 second + interval 33 minute DISABLE DO insert into t_ev values(0); + +--Modify a scheduled task. +openGauss=# ALTER EVENT event_e1 ENABLE DO select 1; + +openGauss=# ALTER EVENT event_e1 RENAME TO event_ee; +``` diff --git a/content/docs-lite/en/docs/SQLReference/alter-foreign-data-wrapper.md b/content/docs-lite/en/docs/SQLReference/alter-foreign-data-wrapper.md new file mode 100644 index 000000000..c39992f1b --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/alter-foreign-data-wrapper.md @@ -0,0 +1,63 @@ +# ALTER FOREIGN DATA WRAPPER + +## Function Description + +Modifies the definition of a foreign data wrapper (FDW). + +## Syntax + +``` +ALTER FOREIGN DATA WRAPPER name + [ HANDLER handler_function | NO HANDLER ] + [ VALIDATOR validator_function | NO VALIDATOR ] + [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [,...] ) ] +``` + +## Parameter Description + +- **name** + + Specifies the name of an FDW to be modified. + +- **HANDLER handler\_function** + + Specifies a new handler function for an FDW. + + +- **NO HANDLER** + + Specifies that an FDW no longer has a handler function. + + >![](public_sys-resources/icon-notice.gif) **NOTICE:** + > + > Foreign tables that use FDWs without handler functions cannot be accessed. + +- **VALIDATOR validator_function** + + Specifies a new validator function for an FDW. + + >![](public_sys-resources/icon-notice.gif) **NOTICE:** + > + > After a validator function is modified, options for an FDW, server, and user mapping may become invalid. Before using the FDW, the user should ensure that these options are correct. + + +- **NO VALIDATOR** + + Specifies that the FDW no longer has a validator function. + + +- **OPTIONS \( \[ ADD | SET | DROP \] option \['value'\] \[,...\] \)** + + Specifies options to be modified (added, set, or dropped) for the FDW. If the operation is not explicitly specified, it is assumed that the operation is ADD. The option name must be unique. Use the FDW's validator function (if any) to validate the name and value. + + +## Examples + +``` +--Create an FDW named dbi. +openGauss=# CREATE FOREIGN DATA WRAPPER dbi OPTIONS (debug 'true'); +--Modify dbi: Add the foo option and delete the debug option. +openGauss=# ALTER FOREIGN DATA WRAPPER dbi OPTIONS (ADD foo '1', DROP debug); +--Change the dbi validator to myvalidator. +openGauss=# ALTER FOREIGN DATA WRAPPER dbi VALIDATOR file_fdw_validator; +``` diff --git a/content/docs-lite/en/docs/SQLReference/create-event-trigger.md b/content/docs-lite/en/docs/SQLReference/create-event-trigger.md new file mode 100644 index 000000000..a4ffb1a54 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/create-event-trigger.md @@ -0,0 +1,97 @@ +# CREATE EVENT TRIGGER + +## Function + +CREATE EVENT TRIGGER creates an event trigger to execute a specified event trigger function when a specified event occurs. + +## Precautions + +- Only the super user or system administrator has the permission to create event triggers. +- If multiple event triggers of the same kind are defined for the same event, they will be fired in alphabetical order by name. +- Event triggers may affect the performance of DDL operations, depending on the number of event triggers and the complexity of executing the function. + +## Syntax + + CREATE EVENT TRIGGER name + ON event + [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ] + EXECUTE PROCEDURE function_name() + +## Parameter Description + +- **name** + + Specifies the event trigger name. + +- **filter\_variable** + + Specifies the variable used by the event trigger for filtering. Currently, only TAG is supported. + +- **event** + + Specifies the events supported by the event trigger. Currently, ddl_command_start, ddl_command_end, sql_drop and table_rewrite are supported. + +- **function\_name** + + Specifies a user-defined function, which must be declared as taking no parameters and returning data of event_trigger type. This function is executed when an event trigger fires. + +## Examples +``` +--Create an event trigger function (for ddl_command_start and ddl_command_end events). +openGauss=# create function test_event_trigger() returns event_trigger as $$ +BEGIN + RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag; +END +$$ language plpgsql; + +--Create an event trigger function (for the sql_drop event). +openGauss=# CREATE OR REPLACE FUNCTION drop_sql_command() +RETURNS event_trigger AS $$ +BEGIN +RAISE NOTICE '% - sql_drop', tg_tag; +END; +$$ LANGUAGE plpgsql; + +--Create an event trigger function (for the table_rewrite event). +openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE EXCEPTION 'rewrites not allowed'; +END; +$$; + +--Create an event trigger whose event type is ddl_command_start. +openGauss=# create event trigger regress_event_trigger on ddl_command_start + execute procedure test_event_trigger(); + +--Create an event trigger whose event type is ddl_command_end. +openGauss=# create event trigger regress_event_trigger_end on ddl_command_end + execute procedure test_event_trigger(); + +--Create an event trigger whose event type is sql_drop. +openGauss=# CREATE EVENT TRIGGER sql_drop_command ON sql_drop + EXECUTE PROCEDURE drop_sql_command(); + +--Create an event trigger whose event type is table_rewrite. +openGauss=# create event trigger no_rewrite_allowed on table_rewrite + when tag in ('alter table') execute procedure test_evtrig_no_rewrite(); + +--Modify an event trigger. +openGauss=# create role regress_evt_user WITH ENCRYPTED PASSWORD 'EvtUser123'; +openGauss=# ALTER EVENT TRIGGER regress_event_trigger RENAME TO regress_event_trigger_start; +--This operation should fail. The owner of the event trigger can only be the super user. +openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start owner to regress_evt_user; +openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start disable; +openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start enable always; + +--Delete an event trigger. +openGauss=# DROP EVENT TRIGGER regress_event_trigger_start; +openGauss=# DROP EVENT TRIGGER regress_event_trigger_end; +openGauss=# DROP EVENT TRIGGER sql_drop_command; +openGauss=# DROP EVENT TRIGGER no_rewrite_allowed; +``` + + +## Helpful Links + +[ALTER EVENT TRIGGER](alter-event-trigger.md) and [DROP EVENT TRIGGER](drop-event-trigger.md) diff --git a/content/docs-lite/en/docs/SQLReference/create-event.md b/content/docs-lite/en/docs/SQLReference/create-event.md new file mode 100644 index 000000000..1c1853a08 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/create-event.md @@ -0,0 +1,93 @@ +# CREATE EVENT + +## Function + +CREATE EVENT creates a scheduled event. + +## Precautions + +- Operations related to scheduled events are supported only when **sql\_compatibility** is set to **'B'**. +- A user without the sysadmin permission must obtain the permission from the user who has the sysadmin permission to create, modify or delete the scheduled event. The operation permissions of the scheduled event are the same as those of creating scheduled events for the advanced package **DBE\_SCHEDULER**. +- Currently, the interval expression of a scheduled event is compatible with the syntax of floating-point number, for example, interval 0.5 minutes. However, the floating-point number is rounded up during calculation. Therefore, you are not advised to use the floating-point number for the interval. +- Scheduled events with the same name are not supported in the same database. +- The statements to be executed in a scheduled event are any SQL statements except security-related operations. However, some statements with restrictions fail to be executed. For example, a database cannot be created by using composite statements. +- The security-related operations are as follows. + - Use encryption functions. + - Create and set users and groups. + - Connect to a database. + - Encrypt a function. + +- The definer fails to be specified for a scheduled event in the following scenarios: + - The user who operates the scheduled event does not have the sysadmin permission. + - If the current user is inconsistent with the specified definer: + - An initial user is specified as the definer. + - A private user, O&M administrator, or monitoring administrator is specified as the definer. + - The parameter **enableSeparationOfDuty** is set to **on** to enable the separation of duties. + + + +## Syntax + +``` +CREATE + [DEFINER = user] +EVENT + [IF NOT EXISTS] + event_name + ON SCHEDULE schedule + [ON COMPLETION [NOT] PRESERVE] + [ENABLE | DISABLE | DISABLE ON SLAVE] + [COMMENT 'string'] + DO event_body; +schedule: { + AT timestamp [+ INTERVAL interval] ... + | EVERY interval + [STARTS timestamp [+ INTERVAL interval] ...] + [ENDS timestamp [+ INTERVAL interval] ...] +} +interval: + quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | + YEAR TO MONTH | DAY TO HOUR | DAY TO MINUTE | + DAY TO SECOND | HOUR TO MINUTE | HOUR TO SECOND | + MINUTE TO SECOND} +``` + +## Parameter Description + +- definer + + Specifies the permission for the scheduled event statement to be executed during execution. By default, the permission of the user who creates the scheduled event is used. When definer is specified, the permission of the specified user is used. + + Only users with the sysadmin permission can specify the definer. + +- ON COMPLETION \[NOT\] PRESERVE + + Once a transaction is complete, the scheduled event is deleted from the system catalog immediately by default. You can overwrite the default behavior by setting **ON COMPLETION PRESERVE**. + +- ENABLE | DISABLE | DISABLE ON SLAVE + + The scheduled event is in the **ENABLE** state by default after it is created. That is, the statement to be executed is executed immediately at the specified time. You can use the keyword **DISABLE** to change the **ENABLE** state. The performance of **DISABLE ON SLAVE** is the same as that of **DISABLE**. + +- COMMENT 'string' + + You can add comments to the scheduled event. The comments can be viewed in the **GS\_JOB\_ATTRIBUTE** table. + +- event\_body + + Specifies the statement to be executed for a scheduled event. + + +## Examples + +``` +openGauss=# CREATE TABLE t_ev(num int); + +openGauss=# CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE AT sysdate + interval 5 second + interval 33 minute DISABLE DO insert into t_ev values(0); + +openGauss=# CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(1); + +``` + +>![](public_sys-resources/icon-notice.gif) **NOTICE:** +>- If a scheduled event fails to be executed after being created, you can view the failure cause in the **SHOW EVENTS** or **PG\_JOB** table. +>- When operations related to user passwords (such as creating weak passwords) are performed in the statements to be executed for a scheduled event, system catalog records the password in plaintext. Therefore, you are not advised to perform operations related to user passwords in the statements to be executed for the scheduled event. diff --git a/content/docs-lite/en/docs/SQLReference/create-foreign-data-wrapper.md b/content/docs-lite/en/docs/SQLReference/create-foreign-data-wrapper.md new file mode 100644 index 000000000..2cd0c9567 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/create-foreign-data-wrapper.md @@ -0,0 +1,48 @@ +# CREATE FUNCTION DATA WRAPPER + +## Function Description + +Defines a new foreign data wrapper (FDW). + +## Syntax + +``` +CREATE FOREIGN DATA WRAPPER name + [ HANDLER handler_function | NO HANDLER ] + [ VALIDATOR validator_function | NO VALIDATOR ] + [ OPTIONS ( option 'value' [,...] ) ] +``` + +## Parameter Description + +- **name** + + Specifies the name of an FDW to be created. + +- **HANDLER handler\_function** + + **handler\_function** is the name of the previously registered function that will be called to retrieve the execution function of the foreign table. The handler function cannot contain any parameter, and its return type must be fdw_handler. + + +- **VALIDATOR validator\_function** + + **validator\_function** is the name of the previously registered function that will be called to check the general options of the given FDW, as well as the options for the foreign server and user mapping using the FDW. If no validator function is specified, options are not checked at creation time. (The FDW may ignore or reject invalid option specifications at runtime, depending on the implementation.) The validator function must accept two arguments: one is of type text[], which will contain an array of options stored in the system directory, and the other is of type oid, which will be the oid of the system directory that contains the options. The return type is ignored. The function should report invalid options using the ereport (ERROR) function. + + +- **OPTIONS \(option 'value' \[,...\]\)** + + Specifies options for the new FDW. The allowed option names and values are specific to each FDW and validated using the FDW validator function. The option name must be unique. + + +## Examples + +``` +--Creates a useless FDW named dummy. +openGauss=# CREATE FOREIGN DATA WRAPPER dummy; + +--Use the handler function file_fdw_handler to create an FDW named file. +openGauss=# CREATE FOREIGN DATA WRAPPER file HANDLER file_fdw_handler; + +--Create an FDW named mywrapper. +openGauss=# CREATE FOREIGN DATA WRAPPER mywrapper OPTIONS (debug 'true'); +``` diff --git a/content/docs-lite/en/docs/SQLReference/cursors-1.md b/content/docs-lite/en/docs/SQLReference/cursors-1.md deleted file mode 100644 index 4b3e99281..000000000 --- a/content/docs-lite/en/docs/SQLReference/cursors-1.md +++ /dev/null @@ -1,340 +0,0 @@ -# Cursors - -To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers pointing to context regions. With cursors, stored procedures can control alterations in context regions. - -## Syntax - -- Define a cursor. - - ``` - CURSOR cursor_name - [ BINARY ] [ NO SCROLL ] [ { WITH | WITHOUT } HOLD ] - FOR query ; - ``` - -- Retrieve data by using a created cursor. - - ``` - FETCH [ direction { FROM | IN } ] cursor_name; - ``` - - The **direction** clause specifies optional parameters. - - ``` - NEXT - | PRIOR - | FIRST - | LAST - | ABSOLUTE count - | RELATIVE count - | count - | ALL - | FORWARD - | FORWARD count - | FORWARD ALL - | BACKWARD - | BACKWARD count - | BACKWARD ALL - ``` - -- Reposition a cursor without retrieving any data. - - The MOVE statement works exactly like the FETCH statement, except that it only repositions the cursor and does not return rows. - - ``` - MOVE [ direction [ FROM | IN ] ] cursor_name; - ``` - - The **direction** clause specifies optional parameters. - - ``` - NEXT - | PRIOR - | FIRST - | LAST - | ABSOLUTE count - | RELATIVE count - | count - | ALL - | FORWARD - | FORWARD count - | FORWARD ALL - | BACKWARD - | BACKWARD count - | BACKWARD ALL - ``` - -- Close a cursor and release all resources associated with the cursor. - - ``` - CLOSE { cursor_name | ALL } ; - ``` - - -## Parameter Description - -- **cursor\_name** - - Specifies the name of the cursor to be created or closed. - -- **BINARY** - - Specifies that data retrieved by a cursor will be returned in binary format, not in text format. - -- **NO SCROLL** - - Specifies how a cursor retrieves rows. - - - **NO SCROLL**: specifies that the cursor cannot be used to retrieve rows in a nonsequential fashion. - - Unspecified: Based on the query's execution plan, the system automatically determines whether the cursor can be used to retrieve rows in a nonsequential fashion. - -- **WITH HOLD | WITHOUT HOLD** - - Specifies whether a cursor can be used after the transaction that created it ends. - - - **WITH HOLD**: The cursor can be used after the transaction that created it ends. - - **WITHOUT HOLD**: The cursor cannot be used outside of the transaction that created it. - - If neither **WITH HOLD** nor **WITHOUT HOLD** is specified, the default is **WITHOUT HOLD**. - - Cross-node transactions \(for example, DDL-contained transactions created in openGauss with multiple DBnode\) do not support **WITH HOLD**. - -- **query** - - Uses the **SELECT** or **VALUES** clause to specify the rows to be returned by a cursor. - - Value range: **SELECT** or **VALUES** clause - -- **direction\_clause** - - Defines the fetch direction. - - Value range: - - - **NEXT** \(default value\) - - Fetches the next row. - - - PRIOR - - Fetches the prior row. - - - FIRST - - Fetches the first row of the query \(same as **ABSOLUTE 1**\). - - - LAST - - Fetches the last row of the query \(same as **ABSOLUTE – 1**\). - - - ABSOLUTE count - - Fetches the _count_th row of the query. - - **ABSOLUTE** fetches are not any faster than navigating to the desired row with a relative move, because the underlying implementation must traverse all the intermediate rows anyway. - - Value range: a possibly-signed integer - - - If **count** is positive, the _count_th row of the query will be fetched. - - If **count** is negative, the _abs\(count\)_th row from the end of the query result will be fetched. - - If **count** is set to **0**, the cursor is positioned before the first row. - - - RELATIVE count - - Fetches the _count_th succeeding row or the _count_th prior row. - - Value range: a possibly-signed integer - - - If **count** is positive, the _count_th succeeding rows will be fetched. - - If **count** is negative, the _abs\(count\)_th prior rows will be fetched. - - If the current row contains no data, **RELATIVE 0** returns **NULL**. - - - count - - Fetches the next _count_ rows \(same as **FORWARD** _count_\). - - - ALL - - Fetches all remaining rows \(same as **FORWARD ALL**\). - - - FORWARD - - Fetches the next row \(same as **NEXT**\). - - - FORWARD count - - Fetches the _count_ succeeding rows or _count_ prior rows. - - - FORWARD ALL - - Fetches all remaining rows. - - - BACKWARD - - Fetches the prior row \(same as **PRIOR**\). - - - BACKWARD count - - Fetches the prior _count_ rows \(scanning backwards\). - - Value range: a possibly-signed integer - - - If **count** is positive, the prior _count_ rows will be fetched. - - If **count** is a negative, the succeeding _abs \(count\)_ rows will be fetched. - - **BACKWARD 0** re-fetches the current row, if any. - - - BACKWARD ALL - - Fetches all prior rows \(scanning backwards\). - - -- **\{ FROM | IN \} cursor\_name** - - Specifies the cursor name using the keyword **FROM** or **IN**. - - Value range: an existing cursor name - -- **ALL** - - Closes all open cursors. - - -## Examples - -Assume that the **customer\_t1** table exists and contains the following data: - -``` -openGauss=# SELECT * FROM customer_t1; - c_customer_sk | c_customer_id | c_first_name | c_last_name | amount ----------------+---------------+--------------+-------------+-------- - 3769 | | Grace | | - 3769 | hello | | | - 6885 | maps | Joes | | 2200 - 4321 | tpcds | Lily | | 3000 - 9527 | world | James | | 5000 -(5 rows) -``` - -- Read a table using a cursor. - - ``` - -- Start a transaction. - openGauss=# START TRANSACTION; - START TRANSACTION - - -- Set up cursor1. - openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1; - DECLARE CURSOR - - -- Fetch the first three rows in cursor1. - openGauss=# FETCH FORWARD 3 FROM cursor1; - c_customer_sk | c_customer_id | c_first_name | c_last_name | amount - ---------------+---------------+--------------+-------------+-------- - 3769 | | Grace | | - 3769 | hello | | | - 6885 | maps | Joes | | 2200 - (3 rows) - - -- Close the cursor and commit the transaction. - openGauss=# CLOSE cursor1; - CLOSE CURSOR - - -- End the transaction. - openGauss=# END; - COMMIT - ``` - - -- Read the **VALUES** clause using a cursor. - - ``` - -- Start a transaction. - openGauss=# START TRANSACTION; - START TRANSACTION - - -- Set up cursor2. - openGauss=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1; - DECLARE CURSOR - - -- Fetch the first two rows in cursor2. - openGauss=# FETCH FORWARD 2 FROM cursor2; - column1 | column2 - ---------+--------- - 0 | 3 - 1 | 2 - (2 rows) - - -- Close the cursor and commit the transaction. - openGauss=# CLOSE cursor2; - CLOSE CURSOR - - -- End the transaction. - openGauss=# END; - COMMIT - ``` - -- Use the **WITH HOLD** cursor. - - ``` - -- Start a transaction. - openGauss=# START TRANSACTION; - - -- Set up the WITH HOLD cursor. - openGauss=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM customer_t1; - - -- Fetch the first two rows in cursor1. - openGauss=# FETCH FORWARD 2 FROM cursor1; - c_customer_sk | c_customer_id | c_first_name | c_last_name | amount - ---------------+---------------+--------------+-------------+-------- - 3769 | | Grace | | - 3769 | hello | | | - (2 rows) - - -- End the transaction. - openGauss=# END; - COMMIT - - -- Fetch the next row in cursor1. - openGauss=# FETCH FORWARD 1 FROM cursor1; - c_customer_sk | c_customer_id | c_first_name | c_last_name | amount - ---------------+---------------+--------------+-------------+-------- - 6885 | maps | Joes | | 2200 - (1 row) - - -- Close the cursor. - openGauss=# CLOSE cursor1; - CLOSE CURSOR - ``` - -- Use the MOVE statement. - - ``` - -- Start a transaction. - openGauss=# START TRANSACTION; - START TRANSACTION - - -- Define cursor1. - openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1; - DECLARE CURSOR - - -- Skip the first three rows in cursor1. - openGauss=# MOVE FORWARD 1 FROM cursor1; - MOVE 1 - - -- Fetch the first two rows in cursor1. - openGauss=# FETCH 2 FROM cursor1; - c_customer_sk | c_customer_id | c_first_name | c_last_name | amount - ---------------+---------------+--------------+-------------+-------- - 3769 | hello | | | - 6885 | maps | Joes | | 2200 - (2 rows) - - - -- Close the cursor. - openGauss=# CLOSE cursor1; - CLOSE CURSOR - - -- End the transaction. - openGauss=# END; - COMMIT - ``` - - diff --git a/content/docs-lite/en/docs/SQLReference/cursors.md b/content/docs-lite/en/docs/SQLReference/cursors.md index e48170b58..4b3e99281 100644 --- a/content/docs-lite/en/docs/SQLReference/cursors.md +++ b/content/docs-lite/en/docs/SQLReference/cursors.md @@ -1,11 +1,340 @@ -# Cursors +# Cursors -- **[Overview](overview-23.md)** +To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers pointing to context regions. With cursors, stored procedures can control alterations in context regions. -- **[Explicit Cursor](explicit-cursor.md)** +## Syntax -- **[Implicit Cursor](implicit-cursor.md)** +- Define a cursor. -- **[Cursor Loop](cursor-loop.md)** + ``` + CURSOR cursor_name + [ BINARY ] [ NO SCROLL ] [ { WITH | WITHOUT } HOLD ] + FOR query ; + ``` + +- Retrieve data by using a created cursor. + + ``` + FETCH [ direction { FROM | IN } ] cursor_name; + ``` + + The **direction** clause specifies optional parameters. + + ``` + NEXT + | PRIOR + | FIRST + | LAST + | ABSOLUTE count + | RELATIVE count + | count + | ALL + | FORWARD + | FORWARD count + | FORWARD ALL + | BACKWARD + | BACKWARD count + | BACKWARD ALL + ``` + +- Reposition a cursor without retrieving any data. + + The MOVE statement works exactly like the FETCH statement, except that it only repositions the cursor and does not return rows. + + ``` + MOVE [ direction [ FROM | IN ] ] cursor_name; + ``` + + The **direction** clause specifies optional parameters. + + ``` + NEXT + | PRIOR + | FIRST + | LAST + | ABSOLUTE count + | RELATIVE count + | count + | ALL + | FORWARD + | FORWARD count + | FORWARD ALL + | BACKWARD + | BACKWARD count + | BACKWARD ALL + ``` + +- Close a cursor and release all resources associated with the cursor. + + ``` + CLOSE { cursor_name | ALL } ; + ``` + + +## Parameter Description + +- **cursor\_name** + + Specifies the name of the cursor to be created or closed. + +- **BINARY** + + Specifies that data retrieved by a cursor will be returned in binary format, not in text format. + +- **NO SCROLL** + + Specifies how a cursor retrieves rows. + + - **NO SCROLL**: specifies that the cursor cannot be used to retrieve rows in a nonsequential fashion. + - Unspecified: Based on the query's execution plan, the system automatically determines whether the cursor can be used to retrieve rows in a nonsequential fashion. + +- **WITH HOLD | WITHOUT HOLD** + + Specifies whether a cursor can be used after the transaction that created it ends. + + - **WITH HOLD**: The cursor can be used after the transaction that created it ends. + - **WITHOUT HOLD**: The cursor cannot be used outside of the transaction that created it. + - If neither **WITH HOLD** nor **WITHOUT HOLD** is specified, the default is **WITHOUT HOLD**. + - Cross-node transactions \(for example, DDL-contained transactions created in openGauss with multiple DBnode\) do not support **WITH HOLD**. + +- **query** + + Uses the **SELECT** or **VALUES** clause to specify the rows to be returned by a cursor. + + Value range: **SELECT** or **VALUES** clause + +- **direction\_clause** + + Defines the fetch direction. + + Value range: + + - **NEXT** \(default value\) + + Fetches the next row. + + - PRIOR + + Fetches the prior row. + + - FIRST + + Fetches the first row of the query \(same as **ABSOLUTE 1**\). + + - LAST + + Fetches the last row of the query \(same as **ABSOLUTE – 1**\). + + - ABSOLUTE count + + Fetches the _count_th row of the query. + + **ABSOLUTE** fetches are not any faster than navigating to the desired row with a relative move, because the underlying implementation must traverse all the intermediate rows anyway. + + Value range: a possibly-signed integer + + - If **count** is positive, the _count_th row of the query will be fetched. + - If **count** is negative, the _abs\(count\)_th row from the end of the query result will be fetched. + - If **count** is set to **0**, the cursor is positioned before the first row. + + - RELATIVE count + + Fetches the _count_th succeeding row or the _count_th prior row. + + Value range: a possibly-signed integer + + - If **count** is positive, the _count_th succeeding rows will be fetched. + - If **count** is negative, the _abs\(count\)_th prior rows will be fetched. + - If the current row contains no data, **RELATIVE 0** returns **NULL**. + + - count + + Fetches the next _count_ rows \(same as **FORWARD** _count_\). + + - ALL + + Fetches all remaining rows \(same as **FORWARD ALL**\). + + - FORWARD + + Fetches the next row \(same as **NEXT**\). + + - FORWARD count + + Fetches the _count_ succeeding rows or _count_ prior rows. + + - FORWARD ALL + + Fetches all remaining rows. + + - BACKWARD + + Fetches the prior row \(same as **PRIOR**\). + + - BACKWARD count + + Fetches the prior _count_ rows \(scanning backwards\). + + Value range: a possibly-signed integer + + - If **count** is positive, the prior _count_ rows will be fetched. + - If **count** is a negative, the succeeding _abs \(count\)_ rows will be fetched. + - **BACKWARD 0** re-fetches the current row, if any. + + - BACKWARD ALL + + Fetches all prior rows \(scanning backwards\). + + +- **\{ FROM | IN \} cursor\_name** + + Specifies the cursor name using the keyword **FROM** or **IN**. + + Value range: an existing cursor name + +- **ALL** + + Closes all open cursors. + + +## Examples + +Assume that the **customer\_t1** table exists and contains the following data: + +``` +openGauss=# SELECT * FROM customer_t1; + c_customer_sk | c_customer_id | c_first_name | c_last_name | amount +---------------+---------------+--------------+-------------+-------- + 3769 | | Grace | | + 3769 | hello | | | + 6885 | maps | Joes | | 2200 + 4321 | tpcds | Lily | | 3000 + 9527 | world | James | | 5000 +(5 rows) +``` + +- Read a table using a cursor. + + ``` + -- Start a transaction. + openGauss=# START TRANSACTION; + START TRANSACTION + + -- Set up cursor1. + openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1; + DECLARE CURSOR + + -- Fetch the first three rows in cursor1. + openGauss=# FETCH FORWARD 3 FROM cursor1; + c_customer_sk | c_customer_id | c_first_name | c_last_name | amount + ---------------+---------------+--------------+-------------+-------- + 3769 | | Grace | | + 3769 | hello | | | + 6885 | maps | Joes | | 2200 + (3 rows) + + -- Close the cursor and commit the transaction. + openGauss=# CLOSE cursor1; + CLOSE CURSOR + + -- End the transaction. + openGauss=# END; + COMMIT + ``` + + +- Read the **VALUES** clause using a cursor. + + ``` + -- Start a transaction. + openGauss=# START TRANSACTION; + START TRANSACTION + + -- Set up cursor2. + openGauss=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1; + DECLARE CURSOR + + -- Fetch the first two rows in cursor2. + openGauss=# FETCH FORWARD 2 FROM cursor2; + column1 | column2 + ---------+--------- + 0 | 3 + 1 | 2 + (2 rows) + + -- Close the cursor and commit the transaction. + openGauss=# CLOSE cursor2; + CLOSE CURSOR + + -- End the transaction. + openGauss=# END; + COMMIT + ``` + +- Use the **WITH HOLD** cursor. + + ``` + -- Start a transaction. + openGauss=# START TRANSACTION; + + -- Set up the WITH HOLD cursor. + openGauss=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM customer_t1; + + -- Fetch the first two rows in cursor1. + openGauss=# FETCH FORWARD 2 FROM cursor1; + c_customer_sk | c_customer_id | c_first_name | c_last_name | amount + ---------------+---------------+--------------+-------------+-------- + 3769 | | Grace | | + 3769 | hello | | | + (2 rows) + + -- End the transaction. + openGauss=# END; + COMMIT + + -- Fetch the next row in cursor1. + openGauss=# FETCH FORWARD 1 FROM cursor1; + c_customer_sk | c_customer_id | c_first_name | c_last_name | amount + ---------------+---------------+--------------+-------------+-------- + 6885 | maps | Joes | | 2200 + (1 row) + + -- Close the cursor. + openGauss=# CLOSE cursor1; + CLOSE CURSOR + ``` + +- Use the MOVE statement. + + ``` + -- Start a transaction. + openGauss=# START TRANSACTION; + START TRANSACTION + + -- Define cursor1. + openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1; + DECLARE CURSOR + + -- Skip the first three rows in cursor1. + openGauss=# MOVE FORWARD 1 FROM cursor1; + MOVE 1 + + -- Fetch the first two rows in cursor1. + openGauss=# FETCH 2 FROM cursor1; + c_customer_sk | c_customer_id | c_first_name | c_last_name | amount + ---------------+---------------+--------------+-------------+-------- + 3769 | hello | | | + 6885 | maps | Joes | | 2200 + (2 rows) + + + -- Close the cursor. + openGauss=# CLOSE cursor1; + CLOSE CURSOR + + -- End the transaction. + openGauss=# END; + COMMIT + ``` diff --git a/content/docs-lite/en/docs/SQLReference/drop-event-trigger.md b/content/docs-lite/en/docs/SQLReference/drop-event-trigger.md new file mode 100644 index 000000000..846b54edb --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/drop-event-trigger.md @@ -0,0 +1,36 @@ +# DROP EVENT TRIGGER + +## Function + +DROP EVENT TRIGGER deletes an event trigger. + +## Precautions + +Only the super user or system administrator has the permission to delete an event trigger. + +## Syntax +DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ]; + +## Parameter Description + +- **IF EXISTS** + + Reports a notice instead of an error if the specified event trigger does not exist. + +- **name** + + Specifies the name of the event trigger to be deleted. + + Value range: all existing event triggers. + +- **CASCADE | RESTRICT** + - **CASCADE**: automatically deletes the objects that depend on the trigger. + - **RESTRICT**: refuses to delete the trigger if any objects depend on it. This is the default action. + +## Examples + +For details, see [Examples](create-event-trigger.md#en-us_topic_0283137014_en-us_topic_0237122081_en-us_topic_0059777895_s7f55076bb56940b7920a431c0c344669) in [CREATE EVENT TRIGGER](create-event-trigger.md). + +## Helpful Links + +[ALTER EVENT TRIGGER](alter-event-trigger.md) and [CREATE EVENT TRIGGER](create-event-trigger.md) diff --git a/content/docs-lite/en/docs/SQLReference/drop-event.md b/content/docs-lite/en/docs/SQLReference/drop-event.md new file mode 100644 index 000000000..e14e4da88 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/drop-event.md @@ -0,0 +1,32 @@ +# DROP EVENT + +## Function + +DROP EVENT deletes a scheduled task. + +## Precautions + +Operations related to scheduled events are supported only when **sql\_compatibility** is set to **'B'**. + +## Syntax + +``` +DROP EVENT [IF EXISTS] event_name +``` + +## Parameter Description + +- IF EXISTS + + If the scheduled task does not exist, a NOTICE message is displayed. + +- name + + Name of the scheduled task to be deleted. + + +## Examples + +``` +openGauss=# DROP EVENT event_e1; +``` diff --git a/content/docs-lite/en/docs/SQLReference/drop-foreign-data-wrapper.md b/content/docs-lite/en/docs/SQLReference/drop-foreign-data-wrapper.md new file mode 100644 index 000000000..96d5f1186 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/drop-foreign-data-wrapper.md @@ -0,0 +1,36 @@ +# DROP FOREIGN DATA WRAPPER + +## Function Description + +Drops a foreign data wrapper (FDW). + +## Syntax + +``` +DROP FOREIGN DATA WRAPPER [ IF EXISTS ] name [ CASCADE | RESTRICT ] +``` + +## Parameter Description + +- **name** + + Specifies the name of an FDW to be dropped. + +- **CASCADE** + + Automatically drops objects (such as servers) that depend on the FDW. + + +- **RESTRICT** + + Refuses to drop the FDW if there is any dependency on the FDW. This option is the default option. + + +## Examples + +``` +--Create an FDW named dbi. +openGauss=# CREATE FOREIGN DATA WRAPPER dbi OPTIONS (debug 'true'); +--Drop dbi. +openGauss=# DROP FOREIGN DATA WRAPPER dbi; +``` diff --git a/content/docs-lite/en/docs/SQLReference/insert_right_ref_default_value.md b/content/docs-lite/en/docs/SQLReference/insert_right_ref_default_value.md new file mode 100644 index 000000000..76d404de1 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/insert_right_ref_default_value.md @@ -0,0 +1,76 @@ +# INSERT_RIGHT_REF_DEFAULT_VALUE +In B-compatible mode, the INSERT statement supports right-value reference. If a referenced column has a NOT NULL constraint and does not have a default value, its base value is used for calculation. If there is no basic value, the NULL value is used for calculation (array type or user-defined type). +The basic values of the supported types are shown in [Table 1](#table1). + +Table 1 Type basic values + +| Type| Basic Value| Description| +| --- | ----- | --- | +| int | 0 | | +| tinyint | 0 | | +| smallint | 0 | | +| integer | 0 | | +| binary_integer | 0 | | +| bigint | 0 | | +| boolean | f | | +| numeric | 0 | | +| decimal | 0 | | +| dec | 0 | | +| double precision | 0 | | +| float8 | 0 | | +| float | 0 | | +| char(n) | "" | Note: When a character string is involved in calculation, the value type is converted based on built-in rules.
    The length of the value stored by a fixed-length character string is the same as the specified length, and blank characters are filled (which may vary according to the storage mode).| +| varchar(n) | "" | | +| varchar2(n) | "" | | +| nchar(n) | "" | Note: When a character string is involved in calculation, the value type is converted based on built-in rules.
    The length of the value stored by a fixed-length character string is the same as the specified length, and blank characters are filled (which may vary according to the storage mode).| +| nvarchar2(n) | "" | | +| nvarchar(n) | "" | | +| date | 01-01-1970 | | +| time | 00:00:00 | | +| timestamp | Current timestamp| | +| smalldatetime | Thu Jan 01 00:00:00 1970 | | +| interval year | @ 0 | | +| interval month | @ 0 | | +| interval day | @ 0 | | +| interval hour | @ 0 | | +| interval minute | @ 0 | | +| interval second | @ 0 | | +| interval day to second | @ 0 | | +| interval day to hour | @ 0 | | +| interval day to minute | @ 0 | | +| interval hour to minute | @ 0 | | +| interval hour to second | @ 0 | | +| interval minute to second | @ 0 | | +| reltime | @ 0 | | +| abstime | Wed Dec 31 16:00:00 1969 PST | | +| money | $0.00 | | +| int4range | empty | | +| blob | | Object without data content| +| raw | | Object without data content| +| bytea | \x | | +| point | (0,0) | | +| lseg | [(0,0),(0,0)] | | +| box | (0,0),(0,0) | | +| path | ((0,0)) | | +| polygon | ((0,0)) | | +| circle | <(0,0),0> | | +| cidr | 0.0.0.0/32 | | +| inet | 0.0.0.0 | | +| macaddr | 00:00:00:00:00:00 | | +| BIT | | Object without data content| +| BIT VARYING | | Object without data content| +| UUID | 00000000-0000-0000-0000-000000000000 | | +| json | null | The data content is null.| +| jsonb | null | The data content is null.| +| int8range | empty | | +| numrange | empty | | +| tsrange | empty | | +| tstzrange | empty | | +| daterange | empty | | +| hll | \x | | +| SET | "" | | +| tsvector | | Object without data content| +| tsquery | | Object without data content| +| HASH16 | 0000000000000000 | | +| HASH32 | 00000000000000000000000000000000 | | +| enum | The first item| | diff --git a/content/docs-lite/en/docs/SQLReference/show-events.md b/content/docs-lite/en/docs/SQLReference/show-events.md new file mode 100644 index 000000000..7f6dc6078 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/show-events.md @@ -0,0 +1,39 @@ +# SHOW EVENTS + +## Function + +SHOW EVENTS displays basic information about all scheduled tasks in a specified schema. + +## Precautions + +Operations related to scheduled events are supported only when **sql\_compatibility** is set to **'B'**. + +## Syntax + +``` +SHOW EVENTS + [{FROM | IN} schema_name] + [LIKE 'pattern' | WHERE condition] +``` + +## Parameter Description + +- \{FROM | IN\} schema\_name + + Specifies the schema to be queried. By default, the current schema is queried. + +- LIKE 'pattern' + + Matches a scheduled task by name. If this parameter is not specified, all scheduled tasks in the current schema are printed. + +- WHERE condition + + Forms an expression for row selection to narrow down the query range of **SHOW EVENTS**. **condition** indicates any expression that returns a value of Boolean type. Rows that do not meet this condition will not be retrieved. + + +## Examples + +``` +--View information about all scheduled tasks queried through pattern matching **'_e'** in the **event_a** schema. +openGauss=# SHOW EVENTS IN event_a LIKE '_e'; +``` diff --git a/content/docs-lite/en/docs/SQLReference/shrink.md b/content/docs-lite/en/docs/SQLReference/shrink.md new file mode 100644 index 000000000..dd7ae5fd5 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/shrink.md @@ -0,0 +1,49 @@ +# SHRINK + +## Function + +Shrinks chunks in a specified compressed table to facilitate page read and write. + +## Precautions + +- The shrink operation is performed only on the primary node and cannot be manually performed on the standby node. +- The shrink operation time is related to the current CPU usage and table size. +- Shrink is an optimization operation. If the database is abnormal during optimization, the optimization will not continue after the database is restarted. + +## Syntax + +``` +SHRINK TABLE table_name [nowait]; +SHRINK INDEX index_name [nowait]; +``` + +## Parameter Description + +- nowait + + Indicates that a task is returned immediately after being initiated without waiting for the sorting result. The daemon thread periodically wakes up to sort the tasks added by shrink. + + +## Example + +The following uses SHRINK TABLE as an example. The operation of SHRINK INDEX is the same as that of SHRINK TABLE. + +``` +--Create the row_compression table. +openGauss=# CREATE TABLE row_compression +( + id int +) with (compresstype=2, compress_chunk_size = 512, compress_level = 1); + +--Insert data. +openGauss=# Insert into row_compression select generate_series(1,1000); + +--View data. +openGauss=# SELECT * FROM row_compression; + +--Shrink the table. +openGauss=# SHRINK TABLE row_compression; + +--Delete the table. +openGauss=# DROP TABLE row_compression; +``` diff --git a/content/docs-lite/en/docs/SQLReference/sql-structure-and-syntax.md b/content/docs-lite/en/docs/SQLReference/sql-structure-and-syntax.md new file mode 100644 index 000000000..b2b9c24ea --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/sql-structure-and-syntax.md @@ -0,0 +1 @@ +# SQL Structure and Syntax diff --git a/content/docs-lite/en/docs/SQLReference/sql-syntax-formats.md b/content/docs-lite/en/docs/SQLReference/sql-syntax-formats.md new file mode 100644 index 000000000..e90260711 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/sql-syntax-formats.md @@ -0,0 +1,53 @@ +# SQL Syntax Formats + +**Table 1** SQL syntax formats + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Format

    +

    Description

    +

    [ ]

    +

    Items (keywords or arguments) in square brackets [ ] are optional.

    +

    ...

    +

    Preceding elements can appear repeatedly.

    +

    [ x | y | ... ]

    +

    Optional alternative items are grouped in square brackets and separated by vertical bars. One or none is selected.

    +

    { x | y | ... }

    +

    Alternative items are grouped in braces and separated by vertical bars. One is selected.

    +

    [x | y | ... ] [ ... ]

    +

    Multiple parameters or no parameter can be selected. If multiple parameters are selected, separate them with spaces.

    +

    [ x | y | ... ] [ ,... ]

    +

    Multiple parameters or no parameter can be selected. If multiple parameters are selected, separate them with commas (,).

    +

    { x | y | ... } [ ... ]

    +

    At least one parameter can be selected. If multiple parameters are selected, separate them with spaces.

    +

    { x | y | ... } [ ,... ]

    +

    At least one parameter can be selected. If multiple parameters are selected, separate them with commas (,).

    +
    diff --git a/content/docs-lite/en/docs/SQLReference/stored-procedure-cursors.md b/content/docs-lite/en/docs/SQLReference/stored-procedure-cursors.md new file mode 100644 index 000000000..e48170b58 --- /dev/null +++ b/content/docs-lite/en/docs/SQLReference/stored-procedure-cursors.md @@ -0,0 +1,11 @@ +# Cursors + +- **[Overview](overview-23.md)** + +- **[Explicit Cursor](explicit-cursor.md)** + +- **[Implicit Cursor](implicit-cursor.md)** + +- **[Cursor Loop](cursor-loop.md)** + + diff --git a/content/docs-lite/en/menu/index.md b/content/docs-lite/en/menu/index.md index 55461cd38..52c6d3c90 100644 --- a/content/docs-lite/en/menu/index.md +++ b/content/docs-lite/en/menu/index.md @@ -175,6 +175,7 @@ headless: true - [Date/Time Functions and Operators]({{< relref "./docs/BriefTutorial/date-time-functions-and-operators.md" >}}) - [Mode Matching Operators]({{< relref "./docs/BriefTutorial/mode-matching-operators.md" >}}) - [Aggregate Functions]({{< relref "./docs/BriefTutorial/aggregate-functions.md" >}}) + - [Event Trigger Functions]({{< relref "./docs/BriefTutorial/event-trigger-functions.md" >}}) - [Advanced Data Management]({{< relref "./docs/BriefTutorial/advanced-data-management.md" >}}) - [Constraints]({{< relref "./docs/BriefTutorial/constraints.md" >}}) - [JOIN]({{< relref "./docs/BriefTutorial/JOIN.md" >}}) @@ -193,6 +194,7 @@ headless: true - [Locks]({{< relref "./docs/BriefTutorial/locks.md" >}}) - [Anonymous Blocks]({{< relref "./docs/BriefTutorial/anonymous-blocks.md" >}}) - [Triggers]({{< relref "./docs/BriefTutorial/triggers.md" >}}) + - [Event Trigger]({{< relref "./docs/BriefTutorial/event-trigger.md" >}}) - [Stored Procedures]({{< relref "./docs/BriefTutorial/stored-procedures.md" >}}) - [Materialized Views]({{< relref "./docs/BriefTutorial/materialized-views.md" >}}) - [Subqueries]({{< relref "./docs/BriefTutorial/subqueries.md" >}}) @@ -216,74 +218,74 @@ headless: true - [Application Development Specifications]({{< relref "./docs/DeveloperGuide/application-development-specifications.md" >}}) - [Development Specifications]({{< relref "./docs/DeveloperGuide/development-specifications.md" >}}) - [Tool Interconnection]({{< relref "./docs/DeveloperGuide/tool-interconnection.md" >}}) - - [Application Development Guide]({{< relref "./docs/DeveloperGuide/application-development-guide.md" >}}) - - [Development Based on JDBC]({{< relref "./docs/DeveloperGuide/development-based-on-jdbc.md" >}}) - - [JDBC Package, Driver Class, and Environment Class]({{< relref "./docs/DeveloperGuide/jdbc-package-driver-class-and-environment-class.md" >}}) - - [Development Process]({{< relref "./docs/DeveloperGuide/development-process.md" >}}) - - [Loading the Driver]({{< relref "./docs/DeveloperGuide/loading-the-driver.md" >}}) - - [Connecting to a Database]({{< relref "./docs/DeveloperGuide/connecting-to-a-database-JDBC.md" >}}) - - [Connecting to a Database (Using SSL)]({{< relref "./docs/DeveloperGuide/connecting-to-the-database-using-ssl.md" >}}) - - [Connecting to a Database (Using UDS)]({{< relref "./docs/DeveloperGuide/connecting-to-a-database-using-uds.md" >}}) - - [Running SQL Statements]({{< relref "./docs/DeveloperGuide/running-sql-statements.md" >}}) - - [Processing Data in a Result Set]({{< relref "./docs/DeveloperGuide/processing-data-in-a-result-set.md" >}}) - - [Closing a Connection]({{< relref "./docs/DeveloperGuide/closing-a-connection.md" >}}) - - [Log Management]({{< relref "./docs/DeveloperGuide/log-management.md" >}}) - - [Examples: Common Operations]({{< relref "./docs/DeveloperGuide/example-common-operations-JDBC.md" >}}) - - [Example: Retrying SQL Queries for Applications]({{< relref "./docs/DeveloperGuide/example-retrying-sql-queries-for-applications.md" >}}) - - [Example: Importing and Exporting Data Through Local Files]({{< relref "./docs/DeveloperGuide/example-importing-and-exporting-data-through-local-files.md" >}}) - - [Example: Migrating Data from a MY Database to openGauss]({{< relref "./docs/DeveloperGuide/example-migrating-data-from-a-my-database-to-opengauss.md" >}}) - - [Example: Logical Replication Code]({{< relref "./docs/DeveloperGuide/example-logic-replication-code.md" >}}) - - [Example: Parameters for Connecting to the Database in Different Scenarios]({{< relref "./docs/DeveloperGuide/example-parameters-for-connecting-to-the-database-in-different-scenarios.md" >}}) - - [JDBC Interface Reference]({{< relref "./docs/DeveloperGuide/jdbc-interface-reference.md" >}}) - - [Common JDBC Parameters]({{< relref "./docs/DeveloperGuide/common-jdbc-parameters.md" >}}) - - [Development Based on ODBC]({{< relref "./docs/DeveloperGuide/development-based-on-odbc.md" >}}) - - [ODBC Packages, Dependent Libraries, and Header Files]({{< relref "./docs/DeveloperGuide/odbc-packages-dependent-libraries-and-header-files.md" >}}) - - [Configuring a Data Source in the Linux OS]({{< relref "./docs/DeveloperGuide/configuring-a-data-source-in-the-linux-os.md" >}}) - - [Development Process]({{< relref "./docs/DeveloperGuide/development-process-odbc.md" >}}) - - [Example: Common Functions and Batch Binding]({{< relref "./docs/DeveloperGuide/development-process-odbc.md.md" >}}) - - [Typical Application Scenarios and Configurations]({{< relref "./docs/DeveloperGuide/typical-application-scenarios-and-configurations.md" >}}) - - [ODBC Interface Reference]({{< relref "./docs/DeveloperGuide/odbc-interface-reference.md" >}}) - - [SQLAllocEnv]({{< relref "./docs/Developerguide/sqlallocenv.md" >}}) - - [SQLAllocConnect]({{< relref "./docs/Developerguide/sqlallocconnect.md" >}}) - - [SQLAllocHandle]({{< relref "./docs/Developerguide/sqlallochandle.md" >}}) - - [SQLAllocStmt]({{< relref "./docs/Developerguide/sqlallocstmt.md" >}}) - - [SQLBindCol]({{< relref "./docs/Developerguide/sqlbindcol.md" >}}) - - [SQLBindParameter]({{< relref "./docs/Developerguide/sqlbindparameter.md" >}}) - - [SQLColAttribute]({{< relref "./docs/Developerguide/sqlcolattribute.md" >}}) - - [SQLConnect]({{< relref "./docs/Developerguide/sqlconnect.md" >}}) - - [SQLDisconnect]({{< relref "./docs/Developerguide/sqldisconnect.md" >}}) - - [SQLExecDirect]({{< relref "./docs/Developerguide/sqlexecdirect.md" >}}) - - [SQLExecute]({{< relref "./docs/Developerguide/sqlexecute.md" >}}) - - [SQLFetch]({{< relref "./docs/Developerguide/sqlfetch.md" >}}) - - [SQLFreeStmt]({{< relref "./docs/Developerguide/sqlfreestmt.md" >}}) - - [SQLFreeConnect]({{< relref "./docs/Developerguide/sqlfreeconnect.md" >}}) - - [SQLFreeHandle]({{< relref "./docs/Developerguide/sqlfreehandle.md" >}}) - - [SQLFreeEnv]({{< relref "./docs/Developerguide/sqlfreeenv.md" >}}) - - [SQLPrepare]({{< relref "./docs/Developerguide/sqlprepare.md" >}}) - - [SQLGetData]({{< relref "./docs/Developerguide/sqlgetdata.md" >}}) - - [SQLGetDiagRec]({{< relref "./docs/Developerguide/sqlgetdiagrec.md" >}}) - - [SQLSetConnectAttr]({{< relref "./docs/Developerguide/sqlsetconnectattr.md" >}}) - - [SQLSetEnvAttr]({{< relref "./docs/Developerguide/sqlsetenvattr.md" >}}) - - [SQLSetStmtAttr]({{< relref "./docs/Developerguide/sqlsetstmtattr.md" >}}) - - [Example]({{< relref "./docs/Developerguide/example-odbc.md" >}}) - - [Development Based on libpq]({{< relref "./docs/DeveloperGuide/development-based-on-libpq.md" >}}) - - [Dependent Header Files of libpq]({{< relref "./docs/DeveloperGuide/dependent-header-files-of-libpq.md" >}}) - - [Development Process]({{< relref "./docs/DeveloperGuide/development-process-libpq.md" >}}) - - [Example]({{< relref "./docs/DeveloperGuide/example-libpq.md" >}}) - - [libpq API Reference]({{< relref "./docs/DeveloperGuide/libpq-api-reference.md" >}}) - - [Link Parameters]({{< relref "./docs/DeveloperGuide/link-parameters-libpq.md" >}}) - - [Psycopg-Based Development]({{< relref "./docs/DeveloperGuide/psycopg-based-development.md" >}}) - - [Psycopg Package]({{< relref "./docs/DeveloperGuide/psycopg-package.md" >}}) - - [Development Process]({{< relref "./docs/DeveloperGuide/development-process-psycopg.md" >}}) - - [Loading a Driver]({{< relref "./docs/DeveloperGuide/loading-a-driver.md" >}}) - - [Connecting to a Database]({{< relref "./docs/DeveloperGuide/connecting-to-a-database-psycopg.md" >}}) - - [Executing SQL Statements]({{< relref "./docs/DeveloperGuide/executing-sql-statements.md" >}}) - - [Processing the Result Set]({{< relref "./docs/DeveloperGuide/processing-the-result-set.md" >}}) - - [Closing the Connection]({{< relref "./docs/DeveloperGuide/closing-the-connection.md" >}}) - - [Connecting to the Database (Using SSL)]({{< relref "./docs/DeveloperGuide/connecting-to-the-database-using-ssl-psycopg.md" >}}) - - [Example: Common Operations]({{< relref "./docs/DeveloperGuide/example-common-operations-psycopg.md" >}}) - - [Psycopg API Reference]({{< relref "./docs/DeveloperGuide/psycopg-api-reference.md" >}}) - - [Commissioning]({{< relref "./docs/DeveloperGuide/commissioning.md" >}}) + - [Development Based on JDBC]({{< relref "./docs/DeveloperGuide/development-based-on-jdbc.md" >}}) + - [JDBC Package, Driver Class, and Environment Class]({{< relref "./docs/DeveloperGuide/jdbc-package-driver-class-and-environment-class.md" >}}) + - [Development Process]({{< relref "./docs/DeveloperGuide/development-process.md" >}}) + - [Loading the Driver]({{< relref "./docs/DeveloperGuide/loading-the-driver.md" >}}) + - [Connecting to a Database]({{< relref "./docs/DeveloperGuide/connecting-to-a-database-JDBC.md" >}}) + - [Connecting to a Database (Using SSL)]({{< relref "./docs/DeveloperGuide/connecting-to-the-database-using-ssl.md" >}}) + - [Connecting to a Database (Using UDS)]({{< relref "./docs/DeveloperGuide/connecting-to-a-database-using-uds.md" >}}) + - [Running SQL Statements]({{< relref "./docs/DeveloperGuide/running-sql-statements.md" >}}) + - [Processing Data in a Result Set]({{< relref "./docs/DeveloperGuide/processing-data-in-a-result-set.md" >}}) + - [Closing a Connection]({{< relref "./docs/DeveloperGuide/closing-a-connection.md" >}}) + - [Log Management]({{< relref "./docs/DeveloperGuide/log-management.md" >}}) + - [Examples: Common Operations]({{< relref "./docs/DeveloperGuide/example-common-operations-JDBC.md" >}}) + - [Example: Retrying SQL Queries for Applications]({{< relref "./docs/DeveloperGuide/example-retrying-sql-queries-for-applications.md" >}}) + - [Example: Importing and Exporting Data Through Local Files]({{< relref "./docs/DeveloperGuide/example-importing-and-exporting-data-through-local-files.md" >}}) + - [Example: Migrating Data from a MY Database to openGauss]({{< relref "./docs/DeveloperGuide/example-migrating-data-from-a-my-database-to-opengauss.md" >}}) + - [Example: Logical Replication Code]({{< relref "./docs/DeveloperGuide/example-logic-replication-code.md" >}}) + - [Example: Parameters for Connecting to the Database in Different Scenarios]({{< relref "./docs/DeveloperGuide/example-parameters-for-connecting-to-the-database-in-different-scenarios.md" >}}) + - [Example: JDBC Primary/Standby Cluster Load Balancing]({{< relref "./docs/DeveloperGuide/example-jdbc-primary-standby-cluster-load-balancing.md" >}}) + - [JDBC Interface Reference]({{< relref "./docs/DeveloperGuide/jdbc-interface-reference.md" >}}) + - [Common JDBC Parameters]({{< relref "./docs/DeveloperGuide/common-jdbc-parameters.md" >}}) + - [Development Based on ODBC]({{< relref "./docs/DeveloperGuide/development-based-on-odbc.md" >}}) + - [ODBC Packages, Dependent Libraries, and Header Files]({{< relref "./docs/DeveloperGuide/odbc-packages-dependent-libraries-and-header-files.md" >}}) + - [Configuring a Data Source in the Linux OS]({{< relref "./docs/DeveloperGuide/configuring-a-data-source-in-the-linux-os.md" >}}) + - [Development Process]({{< relref "./docs/DeveloperGuide/development-process-odbc.md" >}}) + - [Example: Common Functions and Batch Binding]({{< relref "./docs/DeveloperGuide/development-process-odbc.md" >}}) + - [Typical Application Scenarios and Configurations]({{< relref "./docs/DeveloperGuide/typical-application-scenarios-and-configurations.md" >}}) + - [ODBC Interface Reference]({{< relref "./docs/DeveloperGuide/odbc-interface-reference.md" >}}) + - [SQLAllocEnv]({{< relref "./docs/Developerguide/sqlallocenv.md" >}}) + - [SQLAllocConnect]({{< relref "./docs/Developerguide/sqlallocconnect.md" >}}) + - [SQLAllocHandle]({{< relref "./docs/Developerguide/sqlallochandle.md" >}}) + - [SQLAllocStmt]({{< relref "./docs/Developerguide/sqlallocstmt.md" >}}) + - [SQLBindCol]({{< relref "./docs/Developerguide/sqlbindcol.md" >}}) + - [SQLBindParameter]({{< relref "./docs/Developerguide/sqlbindparameter.md" >}}) + - [SQLColAttribute]({{< relref "./docs/Developerguide/sqlcolattribute.md" >}}) + - [SQLConnect]({{< relref "./docs/Developerguide/sqlconnect.md" >}}) + - [SQLDisconnect]({{< relref "./docs/Developerguide/sqldisconnect.md" >}}) + - [SQLExecDirect]({{< relref "./docs/Developerguide/sqlexecdirect.md" >}}) + - [SQLExecute]({{< relref "./docs/Developerguide/sqlexecute.md" >}}) + - [SQLFetch]({{< relref "./docs/Developerguide/sqlfetch.md" >}}) + - [SQLFreeStmt]({{< relref "./docs/Developerguide/sqlfreestmt.md" >}}) + - [SQLFreeConnect]({{< relref "./docs/Developerguide/sqlfreeconnect.md" >}}) + - [SQLFreeHandle]({{< relref "./docs/Developerguide/sqlfreehandle.md" >}}) + - [SQLFreeEnv]({{< relref "./docs/Developerguide/sqlfreeenv.md" >}}) + - [SQLPrepare]({{< relref "./docs/Developerguide/sqlprepare.md" >}}) + - [SQLGetData]({{< relref "./docs/Developerguide/sqlgetdata.md" >}}) + - [SQLGetDiagRec]({{< relref "./docs/Developerguide/sqlgetdiagrec.md" >}}) + - [SQLSetConnectAttr]({{< relref "./docs/Developerguide/sqlsetconnectattr.md" >}}) + - [SQLSetEnvAttr]({{< relref "./docs/Developerguide/sqlsetenvattr.md" >}}) + - [SQLSetStmtAttr]({{< relref "./docs/Developerguide/sqlsetstmtattr.md" >}}) + - [Example]({{< relref "./docs/Developerguide/example-odbc.md" >}}) + - [Development Based on libpq]({{< relref "./docs/DeveloperGuide/development-based-on-libpq.md" >}}) + - [Dependent Header Files of libpq]({{< relref "./docs/DeveloperGuide/dependent-header-files-of-libpq.md" >}}) + - [Development Process]({{< relref "./docs/DeveloperGuide/development-process-libpq.md" >}}) + - [Example]({{< relref "./docs/DeveloperGuide/example-libpq.md" >}}) + - [libpq API Reference]({{< relref "./docs/DeveloperGuide/libpq-api-reference.md" >}}) + - [Link Parameters]({{< relref "./docs/DeveloperGuide/link-parameters-libpq.md" >}}) + - [Psycopg-Based Development]({{< relref "./docs/DeveloperGuide/psycopg-based-development.md" >}}) + - [Psycopg Package]({{< relref "./docs/DeveloperGuide/psycopg-package.md" >}}) + - [Development Process]({{< relref "./docs/DeveloperGuide/development-process-psycopg.md" >}}) + - [Loading a Driver]({{< relref "./docs/DeveloperGuide/loading-a-driver.md" >}}) + - [Connecting to a Database]({{< relref "./docs/DeveloperGuide/connecting-to-a-database-psycopg.md" >}}) + - [Executing SQL Statements]({{< relref "./docs/DeveloperGuide/executing-sql-statements.md" >}}) + - [Processing the Result Set]({{< relref "./docs/DeveloperGuide/processing-the-result-set.md" >}}) + - [Closing the Connection]({{< relref "./docs/DeveloperGuide/closing-the-connection.md" >}}) + - [Connecting to the Database (Using SSL)]({{< relref "./docs/DeveloperGuide/connecting-to-the-database-using-ssl-psycopg.md" >}}) + - [Example: Common Operations]({{< relref "./docs/DeveloperGuide/example-common-operations-psycopg.md" >}}) + - [Psycopg API Reference]({{< relref "./docs/DeveloperGuide/psycopg-api-reference.md" >}}) + - [Commissioning]({{< relref "./docs/DeveloperGuide/commissioning.md" >}}) - [Compilation Guide]({{< relref "./docs/CompilationGuide/Compilation.md" >}}) - [Introduction]({{< relref "./docs/CompilationGuide/introduction.md" >}}) @@ -380,7 +382,6 @@ headless: true - [Managing SSL Certificates]({{< relref "./docs/DatabaseAdministrationGuide/managing-ssl-certificates.md" >}}) - [Generating Certificates]({{< relref "./docs/DatabaseAdministrationGuide/generating-certificates.md" >}}) - [Replacing Certificates]({{< relref "./docs/DatabaseAdministrationGuide/replacing-certificates.md" >}}) - - [Primary Standby Certificate Authentication Configuration]({{< relref "./docs/DatabaseAdministrationGuide/primary-standby-certificate-authentication-configuration.md" >}}) - [Managing Users and Their Permissions]({{< relref "./docs/DatabaseAdministrationGuide/managing-users-and-their-permissions.md" >}}) - [Default Permission Mechanism]({{< relref "./docs/DatabaseAdministrationGuide/default-permission-mechanism.md" >}}) - [Administrator]({{< relref "./docs/DatabaseAdministrationGuide/administrator.md" >}}) @@ -399,7 +400,6 @@ headless: true - [Querying Audit Results]({{< relref "./docs/DatabaseAdministrationGuide/querying-audit-results.md" >}}) - [Maintaining Audit Logs]({{< relref "./docs/DatabaseAdministrationGuide/maintaining-audit-logs.md" >}}) - [Configuring File Permission Security Policies]({{< relref "./docs/DatabaseAdministrationGuide/configuring-file-permission-security-policies.md" >}}) - - [Unified Audit Policy]({{< relref "./docs/DatabaseAdministrationGuide/unified-audit-policy.md" >}}) - [Setting a Ledger Database]({{< relref "./docs/DatabaseAdministrationGuide/setting-a-ledger-database.md" >}}) - [Overview]({{< relref "./docs/DatabaseAdministrationGuide/overview-leader-database.md" >}}) - [Viewing Historical Operation Records in the Ledger]({{< relref "./docs/DatabaseAdministrationGuide/viewing-historical-operation-records-in-the-ledger.md" >}}) @@ -602,7 +602,8 @@ headless: true - [Case: Rewriting SQL Statements and Deleting in-clause]({{< relref "./docs/PerformanceTuningGuide/case-rewriting-sql-statements-and-deleting-in-clause.md" >}}) - [SQL Reference]({{< relref "./docs/SQLReference/sql-reference.md" >}}) - - [SQL Language Structure and Syntax]({{< relref "./docs/SQLReference/SQL-language-structure-and-syntax.md" >}}) + - [SQL Syntax Formats]({{< relref "./docs/SQLReference/sql-syntax-formats.md" >}}) + - [SQL Structure and Syntax]({{< relref "./docs/SQLReference/sql-structure-and-syntax.md" >}}) - [Keywords]({{< relref "./docs/SQLReference/keywords.md" >}}) - [Constant and Macro]({{< relref "./docs/SQLReference/constant-and-macro.md" >}}) - [Expressions]({{< relref "./docs/SQLReference/expressions.md" >}}) @@ -624,6 +625,9 @@ headless: true - [ALTER DEFAULT PRIVILEGES]({{< relref "./docs/SQLReference/alter-default-privileges.md" >}}) - [ALTER DIRECTORY]({{< relref "./docs/SQLReference/alter-directory.md" >}}) - [ALTER EXTENSION]({{< relref "./docs/SQLReference/alter-extension.md" >}}) + - [ALTER EVENT]({{< relref "./docs/SQLReference/alter-event.md" >}}) + - [ALTER EVENT TRIGGER]({{< relref "./docs/SQLReference/alter-event-trigger.md" >}}) + - [ALTER FOREIGN DATA WRAPPER]({{< relref "./docs/SQLReference/alter-foreign-data-wrapper.md" >}}) - [ALTER FOREIGN TABLE]({{< relref "./docs/SQLReference/alter-foreign-table.md" >}}) - [ALTER FUNCTION]({{< relref "./docs/SQLReference/alter-function.md" >}}) - [ALTER GROUP]({{< relref "./docs/SQLReference/alter-group.md" >}}) @@ -678,6 +682,9 @@ headless: true - [CREATE DATA SOURCE]({{< relref "./docs/SQLReference/create-data-source.md" >}}) - [CREATE DIRECTORY]({{< relref "./docs/SQLReference/create-directory.md" >}}) - [CREATE EXTENSION]({{< relref "./docs/SQLReference/create-extension.md" >}}) + - [CREATE EVENT]({{< relref "./docs/SQLReference/create-event.md" >}}) + - [CREATE EVENT TRIGGER]({{< relref "./docs/SQLReference/create-event-trigger.md" >}}) + - [CREATE FOREIGN DATA WRAPPER]({{< relref "./docs/SQLReference/create-foreign-data-wrapper.md" >}}) - [CREATE FOREIGN TABLE]({{< relref "./docs/SQLReference/create-foreign-table.md" >}}) - [CREATE FUNCTION]({{< relref "./docs/SQLReference/create-function.md" >}}) - [CREATE GROUP]({{< relref "./docs/SQLReference/create-group.md" >}}) @@ -727,6 +734,9 @@ headless: true - [DROP DATA SOURCE]({{< relref "./docs/SQLReference/drop-data-source.md" >}}) - [DROP DIRECTORY]({{< relref "./docs/SQLReference/drop-directory.md" >}}) - [DROP EXTENSION]({{< relref "./docs/SQLReference/drop-extension.md" >}}) + - [DROP EVENT]({{< relref "./docs/SQLReference/drop-event.md" >}}) + - [DROP EVENT TRIGGER]({{< relref "./docs/SQLReference/drop-event-trigger.md" >}}) + - [DROP FOREIGN DATA WRAPPER]({{< relref "./docs/SQLReference/drop-foreign-data-wrapper.md" >}}) - [DROP FOREIGN TABLE]({{< relref "./docs/SQLReference/drop-foreign-table.md" >}}) - [DROP FUNCTION]({{< relref "./docs/SQLReference/drop-function.md" >}}) - [DROP GROUP]({{< relref "./docs/SQLReference/drop-group.md" >}}) @@ -792,6 +802,7 @@ headless: true - [SET SESSION AUTHORIZATION]({{< relref "./docs/SQLReference/set-session-authorization.md" >}}) - [SET TRANSACTION]({{< relref "./docs/SQLReference/set-transaction.md" >}}) - [SHOW]({{< relref "./docs/SQLReference/show.md" >}}) + - [SHOW EVENTS]({{< relref "./docs/SQLReference/show-events.md" >}}) - [SHUTDOWN]({{< relref "./docs/SQLReference/shutdown.md" >}}) - [SNAPSHOT]({{< relref "./docs/SQLReference/snapshot.md" >}}) - [START TRANSACTION]({{< relref "./docs/SQLReference/start-transaction.md" >}}) @@ -800,6 +811,7 @@ headless: true - [UPDATE]({{< relref "./docs/SQLReference/update.md" >}}) - [VACUUM]({{< relref "./docs/SQLReference/vacuum.md" >}}) - [VALUES]({{< relref "./docs/SQLReference/values.md" >}}) + - [SHRINK]({{< relref "./docs/SQLReference/shrink.md" >}}) - [ALTER PROCEDURE]({{< relref "./docs/SQLReference/alter-procedure.md" >}}) - [ALTER GLOBAL CONFIGURATION]({{< relref "./docs/SQLReference/alter-global-configuration.md" >}}) - [DROP GLOBAL CONFIGURATION]({{< relref "./docs/SQLReference/drop-global-configuration.md" >}}) @@ -824,58 +836,58 @@ headless: true - [XML Type]({{< relref "./docs/SQLReference/xml-type.md" >}}) - [Data Type Used by the Ledger Database]({{< relref "./docs/SQLReference/data-type-used-by-the-ledger-database.md" >}}) - [SET Type]({{< relref "./docs/SQLReference/set-type.md" >}}) - - [Functions and Operators]({{< relref "./docs/SQLReference/functions-and-operators.md" >}}) - - [Logical Operators]({{< relref "./docs/SQLReference/logical-operators.md" >}}) - - [Comparison Operators]({{< relref "./docs/SQLReference/comparison-operators.md" >}}) - - [Character Processing Functions and Operators]({{< relref "./docs/SQLReference/character-processing-functions-and-operators.md" >}}) - - [Binary String Functions and Operators]({{< relref "./docs/SQLReference/binary-string-functions-and-operators.md" >}}) - - [Bit String Functions and Operators]({{< relref "./docs/SQLReference/bit-string-functions-and-operators.md" >}}) - - [Mode Matching Operators]({{< relref "./docs/SQLReference/mode-matching-operators.md" >}}) - - [Mathematical Functions and Operators]({{< relref "./docs/SQLReference/mathematical-functions-and-operators.md" >}}) - - [Date and Time Processing Functions and Operators]({{< relref "./docs/SQLReference/date-and-time-processing-functions-and-operators.md" >}}) - - [Type Conversion Functions]({{< relref "./docs/SQLReference/type-conversion-functions.md" >}}) - - [Geometric Functions and Operators]({{< relref "./docs/SQLReference/geometric-functions-and-operators.md" >}}) - - [Network Address Functions and Operators]({{< relref "./docs/SQLReference/network-address-functions-and-operators.md" >}}) - - [Text Search Functions and Operators]({{< relref "./docs/SQLReference/text-search-functions-and-operators.md" >}}) - - [JSON/JSONB Functions and Operators]({{< relref "./docs/SQLReference/json-jsonb-functions-and-operators.md" >}}) - - [HLL Functions and Operators]({{< relref "./docs/SQLReference/hll-functions-and-operators.md" >}}) - - [SEQUENCE Functions]({{< relref "./docs/SQLReference/sequence-functions.md" >}}) - - [Array Functions and Operators]({{< relref "./docs/SQLReference/array-functions-and-operators.md" >}}) - - [Range Functions and Operators]({{< relref "./docs/SQLReference/range-functions-and-operators.md" >}}) - - [Aggregate Functions]({{< relref "./docs/SQLReference/aggregate-functions.md" >}}) - - [Window Functions]({{< relref "./docs/SQLReference/window-functions.md" >}}) - - [Security Functions]({{< relref "./docs/SQLReference/security-functions.md" >}}) - - [Ledger Database Functions]({{< relref "./docs/SQLReference/ledger-database-functions.md" >}}) - - [Encrypted Equality Functions]({{< relref "./docs/SQLReference/encrypted-equality-functions.md" >}}) - - [Set Returning Functions]({{< relref "./docs/SQLReference/set-returning-functions.md" >}}) - - [Conditional Expression Functions]({{< relref "./docs/SQLReference/conditional-expression-functions.md" >}}) - - [System Information Functions]({{< relref "./docs/SQLReference/system-information-functions.md" >}}) - - [System Administration Functions]({{< relref "./docs/SQLReference/system-administration-functions.md" >}}) - - [Configuration Settings Functions]({{< relref "./docs/SQLReference/configuration-settings-functions.md" >}}) - - [Universal File Access Functions]({{< relref "./docs/SQLReference/universal-file-access-functions.md" >}}) - - [Server Signal Functions]({{< relref "./docs/SQLReference/server-signal-functions.md" >}}) - - [Backup and Restoration Control Functions]({{< relref "./docs/SQLReference/backup-and-restoration-control-functions.md" >}}) - - [Snapshot Synchronization Functions]({{< relref "./docs/SQLReference/snapshot-synchronization-functions.md" >}}) - - [Database Object Functions]({{< relref "./docs/SQLReference/database-object-functions.md" >}}) - - [Advisory Lock Functions]({{< relref "./docs/SQLReference/advisory-lock-functions.md" >}}) - - [Logical Replication Functions]({{< relref "./docs/SQLReference/logical-replication-functions.md" >}}) - - [Segment-Page Storage Functions]({{< relref "./docs/SQLReference/segment-page-storage-functions.md" >}}) - - [Other Functions]({{< relref "./docs/SQLReference/other-functions.md" >}}) - - [Undo System Functions]({{< relref "./docs/SQLReference/undo-system-functions.md" >}}) - - [Row-store Compression System Functions]({{< relref "./docs/SQLReference/row-store-compression-system-functions.md" >}}) - - [Statistics Information Functions]({{< relref "./docs/SQLReference/statistics-information-functions.md" >}}) - - [Trigger Functions]({{< relref "./docs/SQLReference/trigger-functions.md" >}}) - - [Hash Function]({{< relref "./docs/SQLReference/hash-function.md" >}}) - - [Prompt Message Function]({{< relref "./docs/SQLReference/prompt-message-function.md" >}}) - - [Global Temporary Table Functions]({{< relref "./docs/SQLReference/global-temporary-table-functions.md" >}}) - - [Fault Injection System Function]({{< relref "./docs/SQLReference/fault-injection-system-function.md" >}}) - - [AI Feature Functions]({{< relref "./docs/SQLReference/ai-feature-functions.md" >}}) - - [Dynamic Data Masking Functions]({{< relref "./docs/SQLReference/dynamic-data-masking-functions.md" >}}) - - [Other System Functions]({{< relref "./docs/SQLReference/other-system-functions.md" >}}) - - [Internal Functions]({{< relref "./docs/SQLReference/internal-functions.md" >}}) - - [Obsolete Functions]({{< relref "./docs/SQLReference/obsolete-functions.md" >}}) - - [Global SysCache Feature Functions]({{< relref "./docs/SQLReference/global-syscache-feature-functions.md" >}}) - - [Data Damage Detection and Repair Functions]({{< relref "./docs/SQLReference/data-damage-detection-and-repair-functions.md" >}}) + - [Functions and Operators]({{< relref "./docs/SQLReference/functions-and-operators.md" >}}) + - [Logical Operators]({{< relref "./docs/SQLReference/logical-operators.md" >}}) + - [Comparison Operators]({{< relref "./docs/SQLReference/comparison-operators.md" >}}) + - [Character Processing Functions and Operators]({{< relref "./docs/SQLReference/character-processing-functions-and-operators.md" >}}) + - [Binary String Functions and Operators]({{< relref "./docs/SQLReference/binary-string-functions-and-operators.md" >}}) + - [Bit String Functions and Operators]({{< relref "./docs/SQLReference/bit-string-functions-and-operators.md" >}}) + - [Mode Matching Operators]({{< relref "./docs/SQLReference/mode-matching-operators.md" >}}) + - [Mathematical Functions and Operators]({{< relref "./docs/SQLReference/mathematical-functions-and-operators.md" >}}) + - [Date and Time Processing Functions and Operators]({{< relref "./docs/SQLReference/date-and-time-processing-functions-and-operators.md" >}}) + - [Type Conversion Functions]({{< relref "./docs/SQLReference/type-conversion-functions.md" >}}) + - [Geometric Functions and Operators]({{< relref "./docs/SQLReference/geometric-functions-and-operators.md" >}}) + - [Network Address Functions and Operators]({{< relref "./docs/SQLReference/network-address-functions-and-operators.md" >}}) + - [Text Search Functions and Operators]({{< relref "./docs/SQLReference/text-search-functions-and-operators.md" >}}) + - [JSON/JSONB Functions and Operators]({{< relref "./docs/SQLReference/json-jsonb-functions-and-operators.md" >}}) + - [HLL Functions and Operators]({{< relref "./docs/SQLReference/hll-functions-and-operators.md" >}}) + - [SEQUENCE Functions]({{< relref "./docs/SQLReference/sequence-functions.md" >}}) + - [Array Functions and Operators]({{< relref "./docs/SQLReference/array-functions-and-operators.md" >}}) + - [Range Functions and Operators]({{< relref "./docs/SQLReference/range-functions-and-operators.md" >}}) + - [Aggregate Functions]({{< relref "./docs/SQLReference/aggregate-functions.md" >}}) + - [Window Functions]({{< relref "./docs/SQLReference/window-functions.md" >}}) + - [Security Functions]({{< relref "./docs/SQLReference/security-functions.md" >}}) + - [Ledger Database Functions]({{< relref "./docs/SQLReference/ledger-database-functions.md" >}}) + - [Encrypted Equality Functions]({{< relref "./docs/SQLReference/encrypted-equality-functions.md" >}}) + - [Set Returning Functions]({{< relref "./docs/SQLReference/set-returning-functions.md" >}}) + - [Conditional Expression Functions]({{< relref "./docs/SQLReference/conditional-expression-functions.md" >}}) + - [System Information Functions]({{< relref "./docs/SQLReference/system-information-functions.md" >}}) + - [System Administration Functions]({{< relref "./docs/SQLReference/system-administration-functions.md" >}}) + - [Configuration Settings Functions]({{< relref "./docs/SQLReference/configuration-settings-functions.md" >}}) + - [Universal File Access Functions]({{< relref "./docs/SQLReference/universal-file-access-functions.md" >}}) + - [Server Signal Functions]({{< relref "./docs/SQLReference/server-signal-functions.md" >}}) + - [Backup and Restoration Control Functions]({{< relref "./docs/SQLReference/backup-and-restoration-control-functions.md" >}}) + - [Snapshot Synchronization Functions]({{< relref "./docs/SQLReference/snapshot-synchronization-functions.md" >}}) + - [Database Object Functions]({{< relref "./docs/SQLReference/database-object-functions.md" >}}) + - [Advisory Lock Functions]({{< relref "./docs/SQLReference/advisory-lock-functions.md" >}}) + - [Logical Replication Functions]({{< relref "./docs/SQLReference/logical-replication-functions.md" >}}) + - [Segment-Page Storage Functions]({{< relref "./docs/SQLReference/segment-page-storage-functions.md" >}}) + - [Other Functions]({{< relref "./docs/SQLReference/other-functions.md" >}}) + - [Undo System Functions]({{< relref "./docs/SQLReference/undo-system-functions.md" >}}) + - [Row-store Compression System Functions]({{< relref "./docs/SQLReference/row-store-compression-system-functions.md" >}}) + - [Statistics Information Functions]({{< relref "./docs/SQLReference/statistics-information-functions.md" >}}) + - [Trigger Functions]({{< relref "./docs/SQLReference/trigger-functions.md" >}}) + - [Hash Function]({{< relref "./docs/SQLReference/hash-function.md" >}}) + - [Prompt Message Function]({{< relref "./docs/SQLReference/prompt-message-function.md" >}}) + - [Global Temporary Table Functions]({{< relref "./docs/SQLReference/global-temporary-table-functions.md" >}}) + - [Fault Injection System Function]({{< relref "./docs/SQLReference/fault-injection-system-function.md" >}}) + - [AI Feature Functions]({{< relref "./docs/SQLReference/ai-feature-functions.md" >}}) + - [Dynamic Data Masking Functions]({{< relref "./docs/SQLReference/dynamic-data-masking-functions.md" >}}) + - [Other System Functions]({{< relref "./docs/SQLReference/other-system-functions.md" >}}) + - [Internal Functions]({{< relref "./docs/SQLReference/internal-functions.md" >}}) + - [Obsolete Functions]({{< relref "./docs/SQLReference/obsolete-functions.md" >}}) + - [Global SysCache Feature Functions]({{< relref "./docs/SQLReference/global-syscache-feature-functions.md" >}}) + - [Data Damage Detection and Repair Functions]({{< relref "./docs/SQLReference/data-damage-detection-and-repair-functions.md" >}}) - [Type Conversion]({{< relref "./docs/SQLReference/type-conversion.md" >}}) - [Overview]({{< relref "./docs/SQLReference/overview-18.md" >}}) - [Operators]({{< relref "./docs/SQLReference/operators.md" >}}) @@ -894,8 +906,6 @@ headless: true - [Partitioned Tables]({{< relref "./docs/SQLReference/partitioned-tables.md" >}}) - [Indexes]({{< relref "./docs/SQLReference/indexes.md" >}}) - [Constraints]({{< relref "./docs/SQLReference/constraints.md" >}}) - - [Anonymous Blocks]({{< relref "./docs/SQLReference/anonymous-blocks-1.md" >}}) - - [Cursors]({{< relref "./docs/SQLReference/cursors.md" >}}) - [Materialized View]({{< relref "./docs/SQLReference/materialized-view.md" >}}) - [Complete-refresh Materialized View]({{< relref "./docs/SQLReference/complete-refresh-materialized-view.md" >}}) - [Overview]({{< relref "./docs/SQLReference/overview-31.md" >}}) @@ -905,6 +915,8 @@ headless: true - [Overview]({{< relref "./docs/SQLReference/overview-32.md" >}}) - [Usage]({{< relref "./docs/SQLReference/usage-33.md" >}}) - [Support and Constraints]({{< relref "./docs/SQLReference/support-and-constraints-34.md" >}}) + - [Cursors]({{< relref "./docs/SQLReference/cursors.md" >}}) + - [Anonymous Blocks]({{< relref "./docs/SQLReference/anonymous-blocks-1.md" >}}) - [Stored Procedure]({{< relref "./docs/SQLReference/stored-procedure.md" >}}) - [Stored Procedure]({{< relref "./docs/SQLReference/stored-procedure-21.md" >}}) - [Data Types]({{< relref "./docs/SQLReference/data-types-22.md" >}}) @@ -939,7 +951,7 @@ headless: true - [Other Statements]({{< relref "./docs/SQLReference/other-statements.md" >}}) - [Lock Operations]({{< relref "./docs/SQLReference/lock-operations.md" >}}) - [Cursor Operations]({{< relref "./docs/SQLReference/cursor-operations.md" >}}) - - [Cursors]({{< relref "./docs/SQLReference/cursors.md" >}}) + - [Cursors]({{< relref "./docs/SQLReference/stored-procedure-cursors.md" >}}) - [Overview]({{< relref "./docs/SQLReference/overview-23.md" >}}) - [Explicit Cursor]({{< relref "./docs/SQLReference/explicit-cursor.md" >}}) - [Implicit Cursor]({{< relref "./docs/SQLReference/implicit-cursor.md" >}}) @@ -983,15 +995,15 @@ headless: true - [Testing a Parser]({{< relref "./docs/SQLReference/testing-a-parser.md" >}}) - [Testing a Dictionary]({{< relref "./docs/SQLReference/testing-a-dictionary.md" >}}) - [Limitations]({{< relref "./docs/SQLReference/limitations.md" >}}) - - [System Operation]({{< relref "./docs/SQLReference/system-operation.md" >}}) - - [Controlling Transactions]({{< relref "./docs/SQLReference/controlling-transactions.md" >}}) - [Extended Functions]({{< relref "./docs/SQLReference/extended-functions.md" >}}) - [Extended Syntax]({{< relref "./docs/SQLReference/extended-syntax.md" >}}) + - [INSERT_RIGHT_REF_DEFAULT_VALUE]({{< relref "./docs/SQLReference/insert_right_ref_default_value.md" >}}) - [GIN Indexes]({{< relref "./docs/SQLReference/gin-indexes.md" >}}) - [Introduction]({{< relref "./docs/SQLReference/introduction-20.md" >}}) - [Scalability]({{< relref "./docs/SQLReference/scalability.md" >}}) - [Implementation]({{< relref "./docs/SQLReference/implementation.md" >}}) - [GIN Tips and Tricks]({{< relref "./docs/SQLReference/gin-tips-and-tricks.md" >}}) + - [System Operation]({{< relref "./docs/SQLReference/system-operation.md" >}}) - [Schemas]({{< relref "./docs/SQLReference/schemas-25.md" >}}) - [Information Schema]({{< relref "./docs/SQLReference/information-schema.md" >}}) - [\_PG\_FOREIGN\_DATA\_WRAPPERS]({{< relref "./docs/SQLReference/_pg_foreign_data_wrappers.md" >}}) @@ -1291,122 +1303,123 @@ headless: true - [Database Reference]({{< relref "./docs/DatabaseReference/database-reference.md" >}}) - [System Catalogs and System Views]({{< relref "./docs/DatabaseReference/system-catalogs-and-system-views.md" >}}) - - [Overview of System Catalogs and System Views]({{< relref "./docs/DatabaseReference/overview-of-system-catalogs-and-system-views.md" >}}) - - [System Catalogs]({{< relref "./docs/DatabaseReference/system-catalogs.md" >}}) - - [GS\_ASP]({{< relref "./docs/DatabaseReference/gs_asp.md" >}}) - - [GS\_AUDITING\_POLICY]({{< relref "./docs/DatabaseReference/gs_auditing_policy.md" >}}) - - [GS\_AUDITING\_POLICY\_ACCESS]({{< relref "./docs/DatabaseReference/gs_auditing_policy_access.md" >}}) - - [GS\_AUDITING\_POLICY\_FILTERS]({{< relref "./docs/DatabaseReference/gs_auditing_policy_filters.md" >}}) - - [GS\_AUDITING\_POLICY\_PRIVILEGES]({{< relref "./docs/DatabaseReference/gs_auditing_policy_privileges.md" >}}) - - [GS\_CLIENT\_GLOBAL\_KEYS]({{< relref "./docs/DatabaseReference/gs_client_global_keys.md" >}}) - - [GS\_CLIENT\_GLOBAL\_KEYS\_ARGS]({{< relref "./docs/DatabaseReference/gs_client_global_keys_args.md" >}}) - - [GS\_COLUMN\_KEYS]({{< relref "./docs/DatabaseReference/gs_column_keys.md" >}}) - - [GS\_COLUMN\_KEYS\_ARGS]({{< relref "./docs/DatabaseReference/gs_column_keys_args.md" >}}) - - [GS\_DB\_PRIVILEGE]({{< relref "./docs/DatabaseReference/gs_db_privilege.md" >}}) - - [GS\_ENCRYPTED\_COLUMNS]({{< relref "./docs/DatabaseReference/gs_encrypted_columns.md" >}}) - - [GS\_ENCRYPTED\_PROC]({{< relref "./docs/DatabaseReference/gs_encrypted_proc.md" >}}) - - [GS\_GLOBAL\_CHAIN]({{< relref "./docs/DatabaseReference/gs_global_chain.md" >}}) - - [GS\_GLOBAL\_CONFIG]({{< relref "./docs/DatabaseReference/gs_global_config.md" >}}) - - [GS\_MASKING\_POLICY]({{< relref "./docs/DatabaseReference/gs_masking_policy.md" >}}) - - [GS\_MASKING\_POLICY\_ACTIONS]({{< relref "./docs/DatabaseReference/gs_masking_policy_actions.md" >}}) - - [GS\_MASKING\_POLICY\_FILTERS]({{< relref "./docs/DatabaseReference/gs_masking_policy_filters.md" >}}) - - [GS\_MATVIEW]({{< relref "./docs/DatabaseReference/gs_matview.md" >}}) - - [GS\_MATVIEW\_DEPENDENCY]({{< relref "./docs/DatabaseReference/gs_matview_dependency.md" >}}) - - [GS\_MODEL\_WAREHOUSE]({{< relref "./docs/DatabaseReference/gs_model_warehouse.md" >}}) - - [GS\_OPT\_MODEL]({{< relref "./docs/DatabaseReference/gs_opt_model.md" >}}) - - [GS\_PACKAGE]({{< relref "./docs/DatabaseReference/gs_package.md" >}}) - - [GS\_POLICY\_LABEL]({{< relref "./docs/DatabaseReference/gs_policy_label.md" >}}) - - [GS\_RECYCLEBIN]({{< relref "./docs/DatabaseReference/gs_recyclebin.md" >}}) - - [GS\_SQL\_PATCH]({{< relref "./docs/DatabaseReference/gs_sql_patch.md" >}}) - - [GS\_TXN\_SNAPSHOT]({{< relref "./docs/DatabaseReference/gs_txn_snapshot.md" >}}) - - [GS\_UID]({{< relref "./docs/DatabaseReference/gs_uid.md" >}}) - - [GS\_WLM\_EC\_OPERATOR\_INFO]({{< relref "./docs/DatabaseReference/gs_wlm_ec_operator_info.md" >}}) - - [GS\_WLM\_INSTANCE\_HISTORY]({{< relref "./docs/DatabaseReference/gs_wlm_instance_history.md" >}}) - - [GS\_WLM\_OPERATOR\_INFO]({{< relref "./docs/DatabaseReference/gs_wlm_operator_info.md" >}}) - - [GS\_WLM\_PLAN\_ENCODING\_TABLE]({{< relref "./docs/DatabaseReference/gs_wlm_plan_encoding_table.md" >}}) - - [GS\_WLM\_PLAN\_OPERATOR\_INFO]({{< relref "./docs/DatabaseReference/gs_wlm_plan_operator_info.md" >}}) - - [GS\_WLM\_SESSION\_QUERY\_INFO\_ALL]({{< relref "./docs/DatabaseReference/gs_wlm_session_query_info_all.md" >}}) - - [GS\_WLM\_USER\_RESOURCE\_HISTORY]({{< relref "./docs/DatabaseReference/gs_wlm_user_resource_history.md" >}}) - - [PG\_AGGREGATE]({{< relref "./docs/DatabaseReference/pg_aggregate.md" >}}) - - [PG\_AM]({{< relref "./docs/DatabaseReference/pg_am.md" >}}) - - [PG\_AMOP]({{< relref "./docs/DatabaseReference/pg_amop.md" >}}) - - [PG\_AMPROC]({{< relref "./docs/DatabaseReference/pg_amproc.md" >}}) - - [PG\_APP\_WORKLOADGROUP\_MAPPING]({{< relref "./docs/DatabaseReference/pg_app_workloadgroup_mapping.md" >}}) - - [PG\_ATTRDEF]({{< relref "./docs/DatabaseReference/pg_attrdef.md" >}}) - - [PG\_ATTRIBUTE]({{< relref "./docs/DatabaseReference/pg_attribute.md" >}}) - - [PG\_AUTHID]({{< relref "./docs/DatabaseReference/pg_authid.md" >}}) - - [PG\_AUTH\_HISTORY]({{< relref "./docs/DatabaseReference/pg_auth_history.md" >}}) - - [PG\_AUTH\_MEMBERS]({{< relref "./docs/DatabaseReference/pg_auth_members.md" >}}) - - [PG\_CAST]({{< relref "./docs/DatabaseReference/pg_cast.md" >}}) - - [PG\_CLASS]({{< relref "./docs/DatabaseReference/pg_class.md" >}}) - - [PG\_COLLATION]({{< relref "./docs/DatabaseReference/pg_collation.md" >}}) - - [PG\_CONSTRAINT]({{< relref "./docs/DatabaseReference/pg_constraint.md" >}}) - - [PG\_CONVERSION]({{< relref "./docs/DatabaseReference/pg_conversion.md" >}}) - - [PG\_DATABASE]({{< relref "./docs/DatabaseReference/pg_database.md" >}}) - - [PG\_DB\_ROLE\_SETTING]({{< relref "./docs/DatabaseReference/pg_db_role_setting.md" >}}) - - [PG\_DEFAULT\_ACL]({{< relref "./docs/DatabaseReference/pg_default_acl.md" >}}) - - [PG\_DEPEND]({{< relref "./docs/DatabaseReference/pg_depend.md" >}}) - - [PG\_DESCRIPTION]({{< relref "./docs/DatabaseReference/pg_description.md" >}}) - - [PG\_DIRECTORY]({{< relref "./docs/DatabaseReference/pg_directory.md" >}}) - - [PG\_ENUM]({{< relref "./docs/DatabaseReference/pg_enum.md" >}}) - - [PG\_EXTENSION]({{< relref "./docs/DatabaseReference/pg_extension.md" >}}) - - [PG\_EXTENSION\_DATA\_SOURCE]({{< relref "./docs/DatabaseReference/pg_extension_data_source.md" >}}) - - [PG\_FOREIGN\_DATA\_WRAPPER]({{< relref "./docs/DatabaseReference/pg_foreign_data_wrapper.md" >}}) - - [PG\_FOREIGN\_SERVER]({{< relref "./docs/DatabaseReference/pg_foreign_server.md" >}}) - - [PG\_FOREIGN\_TABLE]({{< relref "./docs/DatabaseReference/pg_foreign_table.md" >}}) - - [PG\_HASHBUCKET]({{< relref "./docs/DatabaseReference/pg_hashbucket.md" >}}) - - [PG\_INDEX]({{< relref "./docs/DatabaseReference/pg_index.md" >}}) - - [PG\_INHERITS]({{< relref "./docs/DatabaseReference/pg_inherits.md" >}}) - - [PG\_JOB]({{< relref "./docs/DatabaseReference/pg_job.md" >}}) - - [PG\_JOB\_PROC]({{< relref "./docs/DatabaseReference/pg_job_proc.md" >}}) - - [PG\_LANGUAGE]({{< relref "./docs/DatabaseReference/pg_language.md" >}}) - - [PG\_LARGEOBJECT]({{< relref "./docs/DatabaseReference/pg_largeobject.md" >}}) - - [PG\_LARGEOBJECT\_METADATA]({{< relref "./docs/DatabaseReference/pg_largeobject_metadata.md" >}}) - - [PG\_NAMESPACE]({{< relref "./docs/DatabaseReference/pg_namespace.md" >}}) - - [PG\_OBJECT]({{< relref "./docs/DatabaseReference/pg_object.md" >}}) - - [PG\_OPCLASS]({{< relref "./docs/DatabaseReference/pg_opclass.md" >}}) - - [PG\_OPERATOR]({{< relref "./docs/DatabaseReference/pg_operator.md" >}}) - - [PG\_OPFAMILY]({{< relref "./docs/DatabaseReference/pg_opfamily.md" >}}) - - [PG\_PARTITION]({{< relref "./docs/DatabaseReference/pg_partition.md" >}}) - - [PG\_PLTEMPLATE]({{< relref "./docs/DatabaseReference/pg_pltemplate.md" >}}) - - [PG\_PROC]({{< relref "./docs/DatabaseReference/pg_proc.md" >}}) - - [PG\_PUBLICATION]({{< relref "./docs/DatabaseReference/pg_publication.md" >}}) - - [PG\_PUBLICATION\_REL]({{< relref "./docs/DatabaseReference/pg_publication_rel.md" >}}) - - [PG\_RANGE]({{< relref "./docs/DatabaseReference/pg_range.md" >}}) - - [PG\_REPLICATION\_ORIGIN]({{< relref "./docs/DatabaseReference/pg_replication_origin.md" >}}) - - [PG\_RESOURCE\_POOL]({{< relref "./docs/DatabaseReference/pg_resource_pool.md" >}}) - - [PG\_REWRITE]({{< relref "./docs/DatabaseReference/pg_rewrite.md" >}}) - - [PG\_RLSPOLICY]({{< relref "./docs/DatabaseReference/pg_rlspolicy.md" >}}) - - [PG\_SECLABEL]({{< relref "./docs/DatabaseReference/pg_seclabel.md" >}}) - - [PG\_SET]({{< relref "./docs/DatabaseReference/pg_set.md" >}}) - - [PG\_SHDEPEND]({{< relref "./docs/DatabaseReference/pg_shdepend.md" >}}) - - [PG\_SHDESCRIPTION]({{< relref "./docs/DatabaseReference/pg_shdescription.md" >}}) - - [PG\_SHSECLABEL]({{< relref "./docs/DatabaseReference/pg_shseclabel.md" >}}) - - [PG\_STATISTIC]({{< relref "./docs/DatabaseReference/pg_statistic.md" >}}) - - [PG\_STATISTIC\_EXT]({{< relref "./docs/DatabaseReference/pg_statistic_ext.md" >}}) - - [PG\_SUBSCRIPTION]({{< relref "./docs/DatabaseReference/pg_subscription.md" >}}) - - [PG\_SYNONYM]({{< relref "./docs/DatabaseReference/pg_synonym.md" >}}) - - [PG\_TABLESPACE]({{< relref "./docs/DatabaseReference/pg_tablespace.md" >}}) - - [PG\_TRIGGER]({{< relref "./docs/DatabaseReference/pg_trigger.md" >}}) - - [PG\_TS\_CONFIG]({{< relref "./docs/DatabaseReference/pg_ts_config.md" >}}) - - [PG\_TS\_CONFIG\_MAP]({{< relref "./docs/DatabaseReference/pg_ts_config_map.md" >}}) - - [PG\_TS\_DICT]({{< relref "./docs/DatabaseReference/pg_ts_dict.md" >}}) - - [PG\_TS\_PARSER]({{< relref "./docs/DatabaseReference/pg_ts_parser.md" >}}) - - [PG\_TS\_TEMPLATE]({{< relref "./docs/DatabaseReference/pg_ts_template.md" >}}) - - [PG\_TYPE]({{< relref "./docs/DatabaseReference/pg_type.md" >}}) - - [PG\_USER\_MAPPING]({{< relref "./docs/DatabaseReference/pg_user_mapping.md" >}}) - - [PG\_USER\_STATUS]({{< relref "./docs/DatabaseReference/pg_user_status.md" >}}) - - [PG\_WORKLOAD\_GROUP]({{< relref "./docs/DatabaseReference/pg_workload_group.md" >}}) - - [PGXC\_CLASS]({{< relref "./docs/DatabaseReference/pgxc_class.md" >}}) - - [PGXC\_GROUP]({{< relref "./docs/DatabaseReference/pgxc_group.md" >}}) - - [PGXC\_NODE]({{< relref "./docs/DatabaseReference/pgxc_node.md" >}}) - - [PGXC\_SLICE]({{< relref "./docs/DatabaseReference/pgxc_slice.md" >}}) - - [PLAN\_TABLE\_DATA]({{< relref "./docs/DatabaseReference/plan_table_data.md" >}}) - - [STATEMENT\_HISTORY]({{< relref "./docs/DatabaseReference/statement_history.md" >}}) - - [System Views]({{< relref "./docs/DatabaseReference/system-views.md" >}}) - - [DV\_SESSIONS]({{< relref "./docs/DatabaseReference/dv_sessions.md" >}}) - - [DV\_SESSION\_LONGOPS]({{< relref "./docs/DatabaseReference/dv_session_longops.md" >}}) - - [GET\_GLOBAL\_PREPARED\_XACTS \(Discarded\)]({{< relref "./docs/DatabaseReference/get_global_prepared_xacts-(discarded).md" >}}) + - [Overview]({{< relref "./docs/DatabaseReference/overview-of-system-catalogs-and-system-views.md" >}}) + - [Querying a System Catalog]({{< relref "./docs/DatabaseReference/querying-a-system-catalog.md" >}}) + - [System Catalogs]({{< relref "./docs/DatabaseReference/system-catalogs.md" >}}) + - [GS\_ASP]({{< relref "./docs/DatabaseReference/gs_asp.md" >}}) + - [GS\_AUDITING\_POLICY]({{< relref "./docs/DatabaseReference/gs_auditing_policy.md" >}}) + - [GS\_AUDITING\_POLICY\_ACCESS]({{< relref "./docs/DatabaseReference/gs_auditing_policy_access.md" >}}) + - [GS\_AUDITING\_POLICY\_FILTERS]({{< relref "./docs/DatabaseReference/gs_auditing_policy_filters.md" >}}) + - [GS\_AUDITING\_POLICY\_PRIVILEGES]({{< relref "./docs/DatabaseReference/gs_auditing_policy_privileges.md" >}}) + - [GS\_CLIENT\_GLOBAL\_KEYS]({{< relref "./docs/DatabaseReference/gs_client_global_keys.md" >}}) + - [GS\_CLIENT\_GLOBAL\_KEYS\_ARGS]({{< relref "./docs/DatabaseReference/gs_client_global_keys_args.md" >}}) + - [GS\_COLUMN\_KEYS]({{< relref "./docs/DatabaseReference/gs_column_keys.md" >}}) + - [GS\_COLUMN\_KEYS\_ARGS]({{< relref "./docs/DatabaseReference/gs_column_keys_args.md" >}}) + - [GS\_DB\_PRIVILEGE]({{< relref "./docs/DatabaseReference/gs_db_privilege.md" >}}) + - [GS\_ENCRYPTED\_COLUMNS]({{< relref "./docs/DatabaseReference/gs_encrypted_columns.md" >}}) + - [GS\_ENCRYPTED\_PROC]({{< relref "./docs/DatabaseReference/gs_encrypted_proc.md" >}}) + - [GS\_GLOBAL\_CHAIN]({{< relref "./docs/DatabaseReference/gs_global_chain.md" >}}) + - [GS\_GLOBAL\_CONFIG]({{< relref "./docs/DatabaseReference/gs_global_config.md" >}}) + - [GS\_MASKING\_POLICY]({{< relref "./docs/DatabaseReference/gs_masking_policy.md" >}}) + - [GS\_MASKING\_POLICY\_ACTIONS]({{< relref "./docs/DatabaseReference/gs_masking_policy_actions.md" >}}) + - [GS\_MASKING\_POLICY\_FILTERS]({{< relref "./docs/DatabaseReference/gs_masking_policy_filters.md" >}}) + - [GS\_MATVIEW]({{< relref "./docs/DatabaseReference/gs_matview.md" >}}) + - [GS\_MATVIEW\_DEPENDENCY]({{< relref "./docs/DatabaseReference/gs_matview_dependency.md" >}}) + - [GS\_MODEL\_WAREHOUSE]({{< relref "./docs/DatabaseReference/gs_model_warehouse.md" >}}) + - [GS\_OPT\_MODEL]({{< relref "./docs/DatabaseReference/gs_opt_model.md" >}}) + - [GS\_PACKAGE]({{< relref "./docs/DatabaseReference/gs_package.md" >}}) + - [GS\_POLICY\_LABEL]({{< relref "./docs/DatabaseReference/gs_policy_label.md" >}}) + - [GS\_RECYCLEBIN]({{< relref "./docs/DatabaseReference/gs_recyclebin.md" >}}) + - [GS\_SQL\_PATCH]({{< relref "./docs/DatabaseReference/gs_sql_patch.md" >}}) + - [GS\_TXN\_SNAPSHOT]({{< relref "./docs/DatabaseReference/gs_txn_snapshot.md" >}}) + - [GS\_UID]({{< relref "./docs/DatabaseReference/gs_uid.md" >}}) + - [GS\_WLM\_EC\_OPERATOR\_INFO]({{< relref "./docs/DatabaseReference/gs_wlm_ec_operator_info.md" >}}) + - [GS\_WLM\_INSTANCE\_HISTORY]({{< relref "./docs/DatabaseReference/gs_wlm_instance_history.md" >}}) + - [GS\_WLM\_OPERATOR\_INFO]({{< relref "./docs/DatabaseReference/gs_wlm_operator_info.md" >}}) + - [GS\_WLM\_PLAN\_ENCODING\_TABLE]({{< relref "./docs/DatabaseReference/gs_wlm_plan_encoding_table.md" >}}) + - [GS\_WLM\_PLAN\_OPERATOR\_INFO]({{< relref "./docs/DatabaseReference/gs_wlm_plan_operator_info.md" >}}) + - [GS\_WLM\_SESSION\_QUERY\_INFO\_ALL]({{< relref "./docs/DatabaseReference/gs_wlm_session_query_info_all.md" >}}) + - [GS\_WLM\_USER\_RESOURCE\_HISTORY]({{< relref "./docs/DatabaseReference/gs_wlm_user_resource_history.md" >}}) + - [PG\_AGGREGATE]({{< relref "./docs/DatabaseReference/pg_aggregate.md" >}}) + - [PG\_AM]({{< relref "./docs/DatabaseReference/pg_am.md" >}}) + - [PG\_AMOP]({{< relref "./docs/DatabaseReference/pg_amop.md" >}}) + - [PG\_AMPROC]({{< relref "./docs/DatabaseReference/pg_amproc.md" >}}) + - [PG\_APP\_WORKLOADGROUP\_MAPPING]({{< relref "./docs/DatabaseReference/pg_app_workloadgroup_mapping.md" >}}) + - [PG\_ATTRDEF]({{< relref "./docs/DatabaseReference/pg_attrdef.md" >}}) + - [PG\_ATTRIBUTE]({{< relref "./docs/DatabaseReference/pg_attribute.md" >}}) + - [PG\_AUTHID]({{< relref "./docs/DatabaseReference/pg_authid.md" >}}) + - [PG\_AUTH\_HISTORY]({{< relref "./docs/DatabaseReference/pg_auth_history.md" >}}) + - [PG\_AUTH\_MEMBERS]({{< relref "./docs/DatabaseReference/pg_auth_members.md" >}}) + - [PG\_CAST]({{< relref "./docs/DatabaseReference/pg_cast.md" >}}) + - [PG\_CLASS]({{< relref "./docs/DatabaseReference/pg_class.md" >}}) + - [PG\_COLLATION]({{< relref "./docs/DatabaseReference/pg_collation.md" >}}) + - [PG\_CONSTRAINT]({{< relref "./docs/DatabaseReference/pg_constraint.md" >}}) + - [PG\_CONVERSION]({{< relref "./docs/DatabaseReference/pg_conversion.md" >}}) + - [PG\_DATABASE]({{< relref "./docs/DatabaseReference/pg_database.md" >}}) + - [PG\_DB\_ROLE\_SETTING]({{< relref "./docs/DatabaseReference/pg_db_role_setting.md" >}}) + - [PG\_DEFAULT\_ACL]({{< relref "./docs/DatabaseReference/pg_default_acl.md" >}}) + - [PG\_DEPEND]({{< relref "./docs/DatabaseReference/pg_depend.md" >}}) + - [PG\_DESCRIPTION]({{< relref "./docs/DatabaseReference/pg_description.md" >}}) + - [PG\_DIRECTORY]({{< relref "./docs/DatabaseReference/pg_directory.md" >}}) + - [PG\_ENUM]({{< relref "./docs/DatabaseReference/pg_enum.md" >}}) + - [PG\_EVENT\_TRIGGER]({{< relref "./docs/DatabaseReference/pg_event_trigger.md" >}}) + - [PG\_EXTENSION]({{< relref "./docs/DatabaseReference/pg_extension.md" >}}) + - [PG\_EXTENSION\_DATA\_SOURCE]({{< relref "./docs/DatabaseReference/pg_extension_data_source.md" >}}) + - [PG\_FOREIGN\_DATA\_WRAPPER]({{< relref "./docs/DatabaseReference/pg_foreign_data_wrapper.md" >}}) + - [PG\_FOREIGN\_SERVER]({{< relref "./docs/DatabaseReference/pg_foreign_server.md" >}}) + - [PG\_FOREIGN\_TABLE]({{< relref "./docs/DatabaseReference/pg_foreign_table.md" >}}) + - [PG\_HASHBUCKET]({{< relref "./docs/DatabaseReference/pg_hashbucket.md" >}}) + - [PG\_INDEX]({{< relref "./docs/DatabaseReference/pg_index.md" >}}) + - [PG\_INHERITS]({{< relref "./docs/DatabaseReference/pg_inherits.md" >}}) + - [PG\_JOB]({{< relref "./docs/DatabaseReference/pg_job.md" >}}) + - [PG\_JOB\_PROC]({{< relref "./docs/DatabaseReference/pg_job_proc.md" >}}) + - [PG\_LANGUAGE]({{< relref "./docs/DatabaseReference/pg_language.md" >}}) + - [PG\_LARGEOBJECT]({{< relref "./docs/DatabaseReference/pg_largeobject.md" >}}) + - [PG\_LARGEOBJECT\_METADATA]({{< relref "./docs/DatabaseReference/pg_largeobject_metadata.md" >}}) + - [PG\_NAMESPACE]({{< relref "./docs/DatabaseReference/pg_namespace.md" >}}) + - [PG\_OBJECT]({{< relref "./docs/DatabaseReference/pg_object.md" >}}) + - [PG\_OPCLASS]({{< relref "./docs/DatabaseReference/pg_opclass.md" >}}) + - [PG\_OPERATOR]({{< relref "./docs/DatabaseReference/pg_operator.md" >}}) + - [PG\_OPFAMILY]({{< relref "./docs/DatabaseReference/pg_opfamily.md" >}}) + - [PG\_PARTITION]({{< relref "./docs/DatabaseReference/pg_partition.md" >}}) + - [PG\_PLTEMPLATE]({{< relref "./docs/DatabaseReference/pg_pltemplate.md" >}}) + - [PG\_PROC]({{< relref "./docs/DatabaseReference/pg_proc.md" >}}) + - [PG\_PUBLICATION]({{< relref "./docs/DatabaseReference/pg_publication.md" >}}) + - [PG\_PUBLICATION\_REL]({{< relref "./docs/DatabaseReference/pg_publication_rel.md" >}}) + - [PG\_RANGE]({{< relref "./docs/DatabaseReference/pg_range.md" >}}) + - [PG\_REPLICATION\_ORIGIN]({{< relref "./docs/DatabaseReference/pg_replication_origin.md" >}}) + - [PG\_RESOURCE\_POOL]({{< relref "./docs/DatabaseReference/pg_resource_pool.md" >}}) + - [PG\_REWRITE]({{< relref "./docs/DatabaseReference/pg_rewrite.md" >}}) + - [PG\_RLSPOLICY]({{< relref "./docs/DatabaseReference/pg_rlspolicy.md" >}}) + - [PG\_SECLABEL]({{< relref "./docs/DatabaseReference/pg_seclabel.md" >}}) + - [PG\_SET]({{< relref "./docs/DatabaseReference/pg_set.md" >}}) + - [PG\_SHDEPEND]({{< relref "./docs/DatabaseReference/pg_shdepend.md" >}}) + - [PG\_SHDESCRIPTION]({{< relref "./docs/DatabaseReference/pg_shdescription.md" >}}) + - [PG\_SHSECLABEL]({{< relref "./docs/DatabaseReference/pg_shseclabel.md" >}}) + - [PG\_STATISTIC]({{< relref "./docs/DatabaseReference/pg_statistic.md" >}}) + - [PG\_SUBSCRIPTION\_REL]({{< relref "./docs/DatabaseReference/pg_subscription_rel.md" >}}) + - [PG\_STATISTIC\_EXT]({{< relref "./docs/DatabaseReference/pg_statistic_ext.md" >}}) + - [PG\_SUBSCRIPTION]({{< relref "./docs/DatabaseReference/pg_subscription.md" >}}) + - [PG\_SYNONYM]({{< relref "./docs/DatabaseReference/pg_synonym.md" >}}) + - [PG\_TABLESPACE]({{< relref "./docs/DatabaseReference/pg_tablespace.md" >}}) + - [PG\_TRIGGER]({{< relref "./docs/DatabaseReference/pg_trigger.md" >}}) + - [PG\_TS\_CONFIG]({{< relref "./docs/DatabaseReference/pg_ts_config.md" >}}) + - [PG\_TS\_CONFIG\_MAP]({{< relref "./docs/DatabaseReference/pg_ts_config_map.md" >}}) + - [PG\_TS\_DICT]({{< relref "./docs/DatabaseReference/pg_ts_dict.md" >}}) + - [PG\_TS\_PARSER]({{< relref "./docs/DatabaseReference/pg_ts_parser.md" >}}) + - [PG\_TS\_TEMPLATE]({{< relref "./docs/DatabaseReference/pg_ts_template.md" >}}) + - [PG\_TYPE]({{< relref "./docs/DatabaseReference/pg_type.md" >}}) + - [PG\_USER\_MAPPING]({{< relref "./docs/DatabaseReference/pg_user_mapping.md" >}}) + - [PG\_USER\_STATUS]({{< relref "./docs/DatabaseReference/pg_user_status.md" >}}) + - [PG\_WORKLOAD\_GROUP]({{< relref "./docs/DatabaseReference/pg_workload_group.md" >}}) + - [PGXC\_CLASS]({{< relref "./docs/DatabaseReference/pgxc_class.md" >}}) + - [PGXC\_GROUP]({{< relref "./docs/DatabaseReference/pgxc_group.md" >}}) + - [PGXC\_NODE]({{< relref "./docs/DatabaseReference/pgxc_node.md" >}}) + - [PGXC\_SLICE]({{< relref "./docs/DatabaseReference/pgxc_slice.md" >}}) + - [PLAN\_TABLE\_DATA]({{< relref "./docs/DatabaseReference/plan_table_data.md" >}}) + - [STATEMENT\_HISTORY]({{< relref "./docs/DatabaseReference/statement_history.md" >}}) + - [System Views]({{< relref "./docs/DatabaseReference/system-views.md" >}}) + -   [GET\_GLOBAL\_PREPARED\_XACTS \(Discarded\)]({{< relref "./docs/DatabaseReference/get_global_prepared_xacts-discarded.md" >}}) - [GS\_AUDITING]({{< relref "./docs/DatabaseReference/gs_auditing.md" >}}) - [GS\_AUDITING\_ACCESS]({{< relref "./docs/DatabaseReference/gs_auditing_access.md" >}}) - [GS\_AUDITING\_PRIVILEGE]({{< relref "./docs/DatabaseReference/gs_auditing_privilege.md" >}}) @@ -1580,7 +1593,7 @@ headless: true - [Operation Auditing]({{< relref "./docs/DatabaseReference/operation-auditing.md" >}}) - [Upgrade Parameters]({{< relref "./docs/DatabaseReference/upgrade-parameters.md" >}}) - [Miscellaneous Parameters]({{< relref "./docs/DatabaseReference/miscellaneous-parameters.md" >}}) - - [Wait Events]({{< relref "./docs/DatabaseReference/wait_events.md" >}}) + - [Wait Events]({{< relref "./docs/DatabaseReference/wait-events.md" >}}) - [Query]({{< relref "./docs/DatabaseReference/query-37.md" >}}) - [System Performance Snapshot]({{< relref "./docs/DatabaseReference/system-performance-snapshot.md" >}}) - [Security Configuration]({{< relref "./docs/DatabaseReference/security-configuration.md" >}}) diff --git a/content/en/docs/BriefTutorial/transactions.md b/content/en/docs/BriefTutorial/transactions.md index 37af3175f..bbe13994b 100644 --- a/content/en/docs/BriefTutorial/transactions.md +++ b/content/en/docs/BriefTutorial/transactions.md @@ -10,7 +10,7 @@ A transaction is a user-defined sequence of database operations, which form an i Transaction isolation at this level meets the requirements of many applications, and is fast and easy to use. However, applications performing complicated queries and updates may require data that is more consistent than this level can provide. -- **REPEATABLE READ**: A transaction can only read data committed before it starts. Uncommitted data or data committed in other concurrent transactions cannot be read. However, a query can read earlier data updates in its transaction, regardless of whether they have been committed. **READ UNCOMMITTED** differs from this level in that a transaction reads the snapshot taken at the start of the transaction, not at the beginning of the current query within the transaction. Therefore, the SELECT statement within a transaction always reads the same data, and cannot read data committed by other concurrent transactions after the transaction starts. Applications at this level must be able to retry transactions, because serialization failures may occur. +- **REPEATABLE READ**: A transaction can only read data committed before it starts. Uncommitted data or data committed in other concurrent transactions cannot be read. However, a query can read earlier data updates in its transaction, regardless of whether they have been committed. **READ COMMITTED** differs from this level in that a transaction reads the snapshot taken at the start of the transaction, not at the beginning of the current query within the transaction. Therefore, the SELECT statement within a transaction always reads the same data, and cannot read data committed by other concurrent transactions after the transaction starts. Applications at this level must be able to retry transactions, because serialization failures may occur. ## Syntax diff --git a/content/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md b/content/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md index 06e8e5662..d564c326e 100644 --- a/content/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md +++ b/content/en/docs/DatabaseOMGuide/concurrent-insert-in-the-same-table.md @@ -1,4 +1,4 @@ -# Concurrent INSERT in the Same table +# Concurrent INSERT in the Same Table Transaction T1: diff --git a/content/en/docs/DatabaseReference/querying-a-system-catalog.md b/content/en/docs/DatabaseReference/querying-a-system-catalog.md new file mode 100644 index 000000000..055d005f6 --- /dev/null +++ b/content/en/docs/DatabaseReference/querying-a-system-catalog.md @@ -0,0 +1,128 @@ +# Querying a System Catalog + +In addition to the created tables, a database contains many system catalogs. These system catalogs contain openGauss installation information and information about various queries and processes in openGauss. You can collect information about the database by querying system catalogs. + +In [System Catalogs and System Views](system-catalogs-and-system-views.md), the description about each table indicates whether the table is visible to all users or only the initial user. To query tables that are visible only to the initial user, log in as the user. + +openGauss provides the following types of system catalogs and views: + +- System catalogs and views inherited from PG + + These system catalogs and views have the prefix **PG**. + +- New system catalogs and views of openGauss + + These system catalogs and views have the prefix **GS**. + + +## Querying Database Tables + +For example, you can run the following command to query the **PG\_TABLES** system catalog for all tables in the **public** schema: + +``` +SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; +``` + +Information similar to the following is displayed: + +``` + tablename +------------------- + err_hr_staffs + test + err_hr_staffs_ft3 + web_returns_p1 + mig_seq_table + films4 +(6 rows) +``` + +## Viewing Database Users + +You can run the **PG\_USER** command to view the list of all users in the database, and view the user ID \(**USESYSID**\) and permissions. + +``` +SELECT * FROM pg_user; +``` + +``` + usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | + valuntil | respool | parent | spacelimit | useconfig | nodegroup | tempspacelimit | +spillspacelimit +---------+----------+-------------+----------+-----------+---------+----------+----------+ +----------+--------------+--------+------------+-----------+-----------+----------------+- +---------------- + omm | 10 | t | t | t | t | ******** | | + | default_pool | 0 | | | | | + joe | 16806 | f | f | f | f | ******** | | + | default_pool | 0 | | | | | +(2 rows) +``` + +## Viewing and Stopping the Running Query Statements + +You can view the running query statements in the [PG\_STAT\_ACTIVITY](pg_stat_activity.md) view. You can use the following methods: + +1. Set the parameter **track\_activities** to **on**. + + ``` + SET track_activities = on; + ``` + + The database collects the running information about active queries only if the parameter is set to **on**. + +2. View the running query statements. Run the following command to view the database names, users performing queries, query status, and the corresponding PIDs which are connected to the running query statements: + + ``` + SELECT datname, usename, state,pid FROM pg_stat_activity; + ``` + + ``` + datname | usename | state | pid + ----------+---------+--------+----------------- + postgres | Ruby | active | 140298793514752 + postgres | Ruby | active | 140298718004992 + postgres | Ruby | idle | 140298650908416 + postgres | Ruby | idle | 140298625742592 + postgres | omm | active | 140298575406848 + (5 rows) + ``` + + If the **state** column is **idle**, the connection is idle and requires a user to enter a command. + + To identify only active query statements, run the following command: + + ``` + SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle'; + ``` + +3. To cancel queries that have been running for a long time, use the **PG\_TERMINATE\_BACKEND** function to end sessions based on the thread ID. + + ``` + SELECT PG_TERMINATE_BACKEND(139834759993104); + ``` + + If information similar to the following is displayed, the session is successfully terminated: + + ``` + PG_TERMINATE_BACKEND + ---------------------- + t + (1 row) + ``` + + If information similar to the following is displayed, a user has terminated the current session: + + ``` + FATAL: terminating connection due to administrator command + FATAL: terminating connection due to administrator command + ``` + + >![](public_sys-resources/icon-note.gif) **NOTE:** + > + >If the **PG\_TERMINATE\_BACKEND** function is used to terminate the backend threads of the current session, the **gsql** client will be reconnected automatically rather than be logged out. The message "The connection to the server was lost. Attempting reset: Succeeded." is returned. + >``` + >FATAL: terminating connection due to administrator command + >FATAL: terminating connection due to administrator command + >The connection to the server was lost. Attempting reset: Succeeded. + >``` diff --git a/content/en/docs/DatabaseReference/wait-events.md b/content/en/docs/DatabaseReference/wait-events.md new file mode 100644 index 000000000..e145bbe5b --- /dev/null +++ b/content/en/docs/DatabaseReference/wait-events.md @@ -0,0 +1,16 @@ +# Wait Events + +## enable\_instr\_track\_wait + +**Parameter description**: Specifies whether to enable real-time collection of wait event information. + +In the x86-based centralized deployment scenario, the hardware configuration specifications are 32-core CPU and 256 GB memory. When the Benchmark SQL 5.0 tool is used to test performance, the performance fluctuates by about 1.4% by enabling or disabling this parameter. + +This parameter is a SIGHUP parameter. Set it based on instructions provided in [Table 1](resetting-parameters.md#en-us_topic_0283137176_en-us_topic_0237121562_en-us_topic_0059777490_t91a6f212010f4503b24d7943aed6d846). + +**Value range**: Boolean + +- **on** indicates that the function of collecting wait event information is enabled. +- **off** indicates that the function of collecting wait event information is disabled. + +**Default value**: **on** diff --git a/content/en/docs/DeveloperGuide/connection-close.md b/content/en/docs/DeveloperGuide/connection-close.md new file mode 100644 index 000000000..431acab67 --- /dev/null +++ b/content/en/docs/DeveloperGuide/connection-close.md @@ -0,0 +1,27 @@ +# connection.close\(\) + +## Function + +This method closes the database connection. + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>This method closes the database connection and does not automatically call **commit\(\)**. If you just close the database connection without calling **commit\(\)** first, changes will be lost. + +## Prototype + +``` +connection.close() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/connection-commit.md b/content/en/docs/DeveloperGuide/connection-commit.md new file mode 100644 index 000000000..68438775f --- /dev/null +++ b/content/en/docs/DeveloperGuide/connection-commit.md @@ -0,0 +1,27 @@ +# connection.commit\(\) + +## Function + +This method commits the currently pending transaction to the database. + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>By default, Psycopg opens a transaction before executing the first command. If **commit\(\)** is not called, the effect of any data operation will be lost. + +## Prototype + +``` +connection.commit() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/connection-cursor.md b/content/en/docs/DeveloperGuide/connection-cursor.md new file mode 100644 index 000000000..58c3adc7c --- /dev/null +++ b/content/en/docs/DeveloperGuide/connection-cursor.md @@ -0,0 +1,54 @@ +# connection.cursor\(\) + +## Function + +This method returns a new cursor object. + +## Prototype + +``` +cursor(name=None, cursor_factory=None, scrollable=None, withhold=False) +``` + +## Parameter + +**Table 1** connection.cursor parameters + + + + + + + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    name

    +

    Cursor name. The default value is None.

    +

    cursor_factory

    +

    Creates a non-standard cursor. The default value is None.

    +

    scrollable

    +

    Sets the SCROLL option. The default value is None.

    +

    withhold

    +

    Sets the HOLD option. The default value is False.

    +
    + +## Return Value + +Cursor object \(used for cusors that are programmed using Python in the entire database\) + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/connection-rollback.md b/content/en/docs/DeveloperGuide/connection-rollback.md new file mode 100644 index 000000000..97e753cb5 --- /dev/null +++ b/content/en/docs/DeveloperGuide/connection-rollback.md @@ -0,0 +1,27 @@ +# connection.rollback\(\) + +## Function + +This method rolls back the current pending transaction. + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>If you close the connection using **close\(\)** but do not commit the change using **commit\(\)**, an implicit rollback will be performed. + +## Prototype + +``` +connection.rollback() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/copymanager.md b/content/en/docs/DeveloperGuide/copymanager.md new file mode 100644 index 000000000..27a74edda --- /dev/null +++ b/content/en/docs/DeveloperGuide/copymanager.md @@ -0,0 +1,109 @@ +# CopyManager + +CopyManager is an API class provided by the JDBC driver in openGauss. It is used to import data to openGauss in batches. + +## Inheritance Relationship of CopyManager + +The CopyManager class is in the **org.opengauss.copy** package and inherits the java.lang.Object class. The declaration of the class is as follows: + +``` +public class CopyManager +extends Object +``` + +## Construction Method + +public CopyManager\(BaseConnection connection\) + +throws SQLException + +## Common Methods + +**Table 1** Common methods of CopyManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Return Value

    +

    Method

    +

    Description

    +

    throws

    +

    CopyIn

    +

    copyIn(String sql)

    +

    -

    +

    SQLException

    +

    long

    +

    copyIn(String sql, InputStream from)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from InputStream.

    +

    SQLException,IOException

    +

    long

    +

    copyIn(String sql, InputStream from, int bufferSize)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from InputStream.

    +

    SQLException,IOException

    +

    long

    +

    copyIn(String sql, Reader from)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from Reader.

    +

    SQLException,IOException

    +

    long

    +

    copyIn(String sql, Reader from, int bufferSize)

    +

    Uses COPY FROM STDIN to quickly load data to tables in the database from Reader.

    +

    SQLException,IOException

    +

    CopyOut

    +

    copyOut(String sql)

    +

    -

    +

    SQLException

    +

    long

    +

    copyOut(String sql, OutputStream to)

    +

    Sends the result set of COPY TO STDOUT from the database to the OutputStream class.

    +

    SQLException,IOException

    +

    long

    +

    copyOut(String sql, Writer to)

    +

    Sends the result set of COPY TO STDOUT from the database to the Writer class.

    +

    SQLException,IOException

    +
    + diff --git a/content/en/docs/DeveloperGuide/curosr-executemany_query-vars_list.md b/content/en/docs/DeveloperGuide/curosr-executemany_query-vars_list.md new file mode 100644 index 000000000..eefa077f1 --- /dev/null +++ b/content/en/docs/DeveloperGuide/curosr-executemany_query-vars_list.md @@ -0,0 +1,44 @@ +# curosr.executemany\(query,vars\_list\) + +## Function + +This method executes an SQL command against all parameter sequences or mappings found in the sequence SQL. + +## Prototype + +``` +curosr.executemany(query,vars_list) +``` + +## Parameter + +**Table 1** curosr.executemany parameters + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    query

    +

    SQL statement that you want to execute.

    +

    vars_list

    +

    Variable list, which matches the %s placeholder in the query.

    +
    + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/cursor-close.md b/content/en/docs/DeveloperGuide/cursor-close.md new file mode 100644 index 000000000..9741c85f1 --- /dev/null +++ b/content/en/docs/DeveloperGuide/cursor-close.md @@ -0,0 +1,24 @@ +# cursor.close\(\) + +## Function + +This method closes the cursor of the current connection. + +## Prototype + +``` +cursor.close() +``` + +## Parameter + +None + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/cursor-execute_query-vars_list.md b/content/en/docs/DeveloperGuide/cursor-execute_query-vars_list.md new file mode 100644 index 000000000..58b43ea6f --- /dev/null +++ b/content/en/docs/DeveloperGuide/cursor-execute_query-vars_list.md @@ -0,0 +1,44 @@ +# cursor.execute\(query,vars\_list\) + +## Function + +This method executes the parameterized SQL statements \(that is, placeholders instead of SQL literals\). The psycopg2 module supports placeholders marked with **%s**. + +## Prototype + +``` +curosr.execute(query,vars_list) +``` + +## Parameters + +**Table 1** curosr.execute parameters + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    query

    +

    SQL statement to be executed.

    +

    vars_list

    +

    Variable list, which matches the %s placeholder in the query.

    +
    + +## Return Value + +None + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/cursor-fetchall.md b/content/en/docs/DeveloperGuide/cursor-fetchall.md new file mode 100644 index 000000000..9cbbda22c --- /dev/null +++ b/content/en/docs/DeveloperGuide/cursor-fetchall.md @@ -0,0 +1,24 @@ +# cursor.fetchall\(\) + +## Function + +This method obtains all the \(remaining\) rows of the query result and returns them as a list of tuples. + +## Prototype + +``` +cursor.fetchall() +``` + +## Parameter + +None + +## Return Value + +Tuple list, which contains all results of the result set. An empty list is returned when no rows are available. + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/cursor-fetchone.md b/content/en/docs/DeveloperGuide/cursor-fetchone.md new file mode 100644 index 000000000..9a4caced5 --- /dev/null +++ b/content/en/docs/DeveloperGuide/cursor-fetchone.md @@ -0,0 +1,24 @@ +# cursor.fetchone\(\) + +## Function + +This method extracts the next row of the query result set and returns a tuple. + +## Prototype + +``` +cursor.fetchone() +``` + +## Parameter + +None + +## Return Value + +A single tuple is the first result in the result set. If no more data is available, **None** is returned. + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/DeveloperGuide/java-sql-callablestatement.md b/content/en/docs/DeveloperGuide/java-sql-callablestatement.md new file mode 100644 index 000000000..cace820f2 --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-callablestatement.md @@ -0,0 +1,206 @@ +# java.sql.CallableStatement + +This section describes **java.sql.CallableStatement**, the API for executing the stored procedure. + +**Table 1** Support status for java.sql.CallableStatement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    getArray(int parameterIndex)

    +

    Array

    +

    Yes

    +

    getBigDecimal(int parameterIndex)

    +

    BigDecimal

    +

    Yes

    +

    getBlob(int parameterIndex)

    +

    Blob

    +

    Yes

    +

    getBoolean(int parameterIndex)

    +

    Boolean

    +

    Yes

    +

    getByte(int parameterIndex)

    +

    byte

    +

    Yes

    +

    getBytes(int parameterIndex)

    +

    byte[]

    +

    Yes

    +

    getClob(int parameterIndex)

    +

    Clob

    +

    Yes

    +

    getDate(int parameterIndex)

    +

    Date

    +

    Yes

    +

    getDate(int parameterIndex, Calendar cal)

    +

    Date

    +

    Yes

    +

    getDouble(int parameterIndex)

    +

    double

    +

    Yes

    +

    getFloat(int parameterIndex)

    +

    float

    +

    Yes

    +

    getInt(int parameterIndex)

    +

    int

    +

    Yes

    +

    getLong(int parameterIndex)

    +

    long

    +

    Yes

    +

    getObject(int parameterIndex)

    +

    Object

    +

    Yes

    +

    getObject(int parameterIndex, Class<T> type)

    +

    Object

    +

    Yes

    +

    getShort(int parameterIndex)

    +

    short

    +

    Yes

    +

    getSQLXML(int parameterIndex)

    +

    SQLXML

    +

    Yes

    +

    getString(int parameterIndex)

    +

    String

    +

    Yes

    +

    getNString(int parameterIndex)

    +

    String

    +

    Yes

    +

    getTime(int parameterIndex)

    +

    Time

    +

    Yes

    +

    getTime(int parameterIndex, Calendar cal)

    +

    Time

    +

    Yes

    +

    getTimestamp(int parameterIndex)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp(int parameterIndex, Calendar cal)

    +

    Timestamp

    +

    Yes

    +

    registerOutParameter(int parameterIndex, int type)

    +

    void

    +

    Yes

    +

    registerOutParameter(int parameterIndex, int sqlType, int type)

    +

    void

    +

    Yes

    +

    wasNull()

    +

    Boolean

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- The batch operation of statements containing OUT parameter is not allowed. +>- The following methods are inherited from **java.sql.Statement**: **close**, **execute**, **executeQuery**, **executeUpdate**, **getConnection**, **getResultSet**, **getUpdateCount**, **isClosed**, **setMaxRows**, and **setFetchSize**. +>- The following methods are inherited from **java.sql.PreparedStatement**: **addBatch**, **clearParameters**, **execute**, **executeQuery**, **executeUpdate**, **getMetaData**, **setBigDecimal**, **setBoolean**, **setByte**, **setBytes**, **setDate**, **setDouble**, **setFloat**, **setInt**, **setLong**,** setNull**, **setObject**, **setString**, **setTime**, and **setTimestamp**. +>- The **registerOutParameter\(int parameterIndex, int sqlType, int type\)** method is used only to register the composite data type. + diff --git a/content/en/docs/DeveloperGuide/java-sql-connection.md b/content/en/docs/DeveloperGuide/java-sql-connection.md new file mode 100644 index 000000000..a8d2d383c --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-connection.md @@ -0,0 +1,364 @@ +# java.sql.Connection + +This section describes **java.sql.Connection**, the API for connecting to a database. + +**Table 1** Support status for java.sql.Connection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    abort(Executor executor)

    +

    void

    +

    Yes

    +

    clearWarnings()

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    commit()

    +

    void

    +

    Yes

    +

    createArrayOf​(String typeName, Object[] elements)

    +

    Array

    +

    Yes

    +

    createBlob()

    +

    Blob

    +

    Yes

    +

    createClob()

    +

    Clob

    +

    Yes

    +

    createSQLXML()

    +

    SQLXML

    +

    Yes

    +

    createStatement()

    +

    Statement

    +

    Yes

    +

    createStatement​(int resultSetType, int resultSetConcurrency)

    +

    Statement

    +

    Yes

    +

    createStatement​(int resultSetType, int resultSetConcurrency, int resultSetHoldability)

    +

    Statement

    +

    Yes

    +

    getAutoCommit()

    +

    Boolean

    +

    Yes

    +

    getCatalog()

    +

    String

    +

    Yes

    +

    getClientInfo()

    +

    Properties

    +

    Yes

    +

    getClientInfo(String name)

    +

    String

    +

    Yes

    +

    getHoldability()

    +

    int

    +

    Yes

    +

    getMetaData()

    +

    DatabaseMetaData

    +

    Yes

    +

    getNetworkTimeout()

    +

    int

    +

    Yes

    +

    getSchema()

    +

    String

    +

    Yes

    +

    getTransactionIsolation()

    +

    int

    +

    Yes

    +

    getTypeMap()

    +

    Map<String,​Class<?>>

    +

    Yes

    +

    getWarnings()

    +

    SQLWarning

    +

    Yes

    +

    isClosed()

    +

    Boolean

    +

    Yes

    +

    isReadOnly()

    +

    Boolean

    +

    Yes

    +

    isValid​(int timeout)

    +

    Boolean

    +

    Yes

    +

    nativeSQL​(String sql)

    +

    String

    +

    Yes

    +

    prepareCall​(String sql)

    +

    CallableStatement

    +

    Yes

    +

    prepareCall​(String sql, int resultSetType, int resultSetConcurrency)

    +

    CallableStatement

    +

    Yes

    +

    prepareCall​(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)

    +

    CallableStatement

    +

    Yes

    +

    prepareStatement(String sql)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int autoGeneratedKeys)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int[] columnIndexes)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int resultSetType, int resultSetConcurrency)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)

    +

    PreparedStatement

    +

    Yes

    +

    prepareStatement​(String sql, String[] columnNames)

    +

    PreparedStatement

    +

    Yes

    +

    releaseSavepoint​(Savepoint savepoint)

    +

    void

    +

    Yes

    +

    rollback()

    +

    void

    +

    Yes

    +

    rollback​(Savepoint savepoint)

    +

    void

    +

    Yes

    +

    setAutoCommit(boolean autoCommit)

    +

    void

    +

    Yes

    +

    setClientInfo(Properties properties)

    +

    void

    +

    Yes

    +

    setClientInfo(String name,String value)

    +

    void

    +

    Yes

    +

    setHoldability​(int holdability)

    +

    void

    +

    Yes

    +

    setNetworkTimeout​(Executor executor, int milliseconds)

    +

    void

    +

    Yes

    +

    setReadOnly​(boolean readOnly)

    +

    void

    +

    Yes

    +

    setSavepoint()

    +

    Savepoint

    +

    Yes

    +

    setSavepoint​(String name)

    +

    Savepoint

    +

    Yes

    +

    setSchema​(String schema)

    +

    void

    +

    Yes

    +

    setTransactionIsolation​(int level)

    +

    void

    +

    Yes

    +

    setTypeMap​(Map<String,​Class<?>> map)

    +

    void

    +

    Yes

    +
    + +>![](public_sys-resources/icon-notice.gif) **NOTICE:** +>The AutoCommit mode is used by default within the API. If you disable it by running **setAutoCommit\(false\)**, all the statements executed later will be packaged in explicit transactions, and you cannot execute statements that cannot be executed within transactions. + diff --git a/content/en/docs/DeveloperGuide/java-sql-databasemetadata.md b/content/en/docs/DeveloperGuide/java-sql-databasemetadata.md new file mode 100644 index 000000000..4c3406ee9 --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-databasemetadata.md @@ -0,0 +1,1266 @@ +# java.sql.DatabaseMetaData + +This section describes **java.sql.DatabaseMetaData**, the API for defining database objects. + +**Table 1** Support status for java.sql.DatabaseMetaData + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    allProceduresAreCallable()

    +

    Boolean

    +

    Yes

    +

    allTablesAreSelectable()

    +

    Boolean

    +

    Yes

    +

    autoCommitFailureClosesAllResultSets()

    +

    Boolean

    +

    Yes

    +

    dataDefinitionCausesTransactionCommit()

    +

    Boolean

    +

    Yes

    +

    dataDefinitionIgnoredInTransactions()

    +

    Boolean

    +

    Yes

    +

    deletesAreDetected​(int type)

    +

    Boolean

    +

    Yes

    +

    doesMaxRowSizeIncludeBlobs()

    +

    Boolean

    +

    Yes

    +

    generatedKeyAlwaysReturned()

    +

    Boolean

    +

    Yes

    +

    getBestRowIdentifier​(String catalog, String schema, String table, int scope, boolean nullable)

    +

    ResultSet

    +

    Yes

    +

    getCatalogs()

    +

    ResultSet

    +

    Yes

    +

    getCatalogSeparator()

    +

    String

    +

    Yes

    +

    getCatalogTerm()

    +

    String

    +

    Yes

    +

    getClientInfoProperties()

    +

    ResultSet

    +

    Yes

    +

    getColumnPrivileges​(String catalog, String schema, String table, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getConnection()

    +

    Connection

    +

    Yes

    +

    getCrossReference​(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable)

    +

    ResultSet

    +

    Yes

    +

    getDefaultTransactionIsolation()

    +

    int

    +

    Yes

    +

    getExportedKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getExtraNameCharacters()

    +

    String

    +

    Yes

    +

    getFunctionColumns​(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getFunctions​(String catalog, String schemaPattern, String functionNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getIdentifierQuoteString()

    +

    String

    +

    Yes

    +

    getImportedKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getIndexInfo​(String catalog, String schema, String table, boolean unique, boolean approximate)

    +

    ResultSet

    +

    Yes

    +

    getMaxBinaryLiteralLength()

    +

    int

    +

    Yes

    +

    getMaxCatalogNameLength()

    +

    int

    +

    Yes

    +

    getMaxCharLiteralLength()

    +

    int

    +

    Yes

    +

    getMaxColumnNameLength()

    +

    int

    +

    Yes

    +

    getMaxColumnsInGroupBy()

    +

    int

    +

    Yes

    +

    getMaxColumnsInIndex()

    +

    int

    +

    Yes

    +

    getMaxColumnsInOrderBy()

    +

    int

    +

    Yes

    +

    getMaxColumnsInSelect()

    +

    int

    +

    Yes

    +

    getMaxColumnsInTable()

    +

    int

    +

    Yes

    +

    getMaxConnections()

    +

    int

    +

    Yes

    +

    getMaxCursorNameLength()

    +

    int

    +

    Yes

    +

    getMaxIndexLength()

    +

    int

    +

    Yes

    +

    getMaxLogicalLobSize()

    +

    default long

    +

    Yes

    +

    getMaxProcedureNameLength()

    +

    int

    +

    Yes

    +

    getMaxRowSize()

    +

    int

    +

    Yes

    +

    getMaxSchemaNameLength()

    +

    int

    +

    Yes

    +

    getMaxStatementLength()

    +

    int

    +

    Yes

    +

    getMaxStatements()

    +

    int

    +

    Yes

    +

    getMaxTableNameLength()

    +

    int

    +

    Yes

    +

    getMaxTablesInSelect()

    +

    int

    +

    Yes

    +

    getMaxUserNameLength()

    +

    int

    +

    Yes

    +

    getNumericFunctions()

    +

    String

    +

    Yes

    +

    getPrimaryKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getPartitionTablePrimaryKeys​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    getProcedureColumns​(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getProcedures​(String catalog, String schemaPattern, String procedureNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getProcedureTerm()

    +

    String

    +

    Yes

    +

    getSchemas()

    +

    ResultSet

    +

    Yes

    +

    getSchemas​(String catalog, String schemaPattern)

    +

    ResultSet

    +

    Yes

    +

    getSchemaTerm()

    +

    String

    +

    Yes

    +

    getSearchStringEscape()

    +

    String

    +

    Yes

    +

    getSQLKeywords()

    +

    String

    +

    Yes

    +

    getSQLStateType()

    +

    int

    +

    Yes

    +

    getStringFunctions()

    +

    String

    +

    Yes

    +

    getSystemFunctions()

    +

    String

    +

    Yes

    +

    getTablePrivileges​(String catalog, String schemaPattern, String tableNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getTimeDateFunctions()

    +

    String

    +

    Yes

    +

    getTypeInfo()

    +

    ResultSet

    +

    Yes

    +

    getUDTs​(String catalog, String schemaPattern, String typeNamePattern, int[] types)

    +

    ResultSet

    +

    Yes

    +

    getURL()

    +

    String

    +

    Yes

    +

    getVersionColumns​(String catalog, String schema, String table)

    +

    ResultSet

    +

    Yes

    +

    insertsAreDetected​(int type)

    +

    Boolean

    +

    Yes

    +

    locatorsUpdateCopy()

    +

    Boolean

    +

    Yes

    +

    othersDeletesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    othersInsertsAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    othersUpdatesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    ownDeletesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    ownInsertsAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    ownUpdatesAreVisible​(int type)

    +

    Boolean

    +

    Yes

    +

    storesLowerCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesMixedCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesUpperCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsBatchUpdates()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInDataManipulation()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInIndexDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInPrivilegeDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInProcedureCalls()

    +

    Boolean

    +

    Yes

    +

    supportsCatalogsInTableDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsCorrelatedSubqueries()

    +

    Boolean

    +

    Yes

    +

    supportsDataDefinitionAndDataManipulationTransactions()

    +

    Boolean

    +

    Yes

    +

    supportsDataManipulationTransactionsOnly()

    +

    Boolean

    +

    Yes

    +

    supportsGetGeneratedKeys()

    +

    Boolean

    +

    Yes

    +

    supportsMixedCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsMultipleOpenResults()

    +

    Boolean

    +

    Yes

    +

    supportsNamedParameters()

    +

    Boolean

    +

    Yes

    +

    supportsOpenCursorsAcrossCommit()

    +

    Boolean

    +

    Yes

    +

    supportsOpenCursorsAcrossRollback()

    +

    Boolean

    +

    Yes

    +

    supportsOpenStatementsAcrossCommit()

    +

    Boolean

    +

    Yes

    +

    supportsOpenStatementsAcrossRollback()

    +

    Boolean

    +

    Yes

    +

    supportsPositionedDelete()

    +

    Boolean

    +

    Yes

    +

    supportsPositionedUpdate()

    +

    Boolean

    +

    Yes

    +

    supportsRefCursors()

    +

    Boolean

    +

    Yes

    +

    supportsResultSetConcurrency​(int type, int concurrency)

    +

    Boolean

    +

    Yes

    +

    supportsResultSetType​(int type)

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInIndexDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInPrivilegeDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInProcedureCalls()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInTableDefinitions()

    +

    Boolean

    +

    Yes

    +

    supportsSelectForUpdate()

    +

    Boolean

    +

    Yes

    +

    supportsStatementPooling()

    +

    Boolean

    +

    Yes

    +

    supportsStoredFunctionsUsingCallSyntax()

    +

    Boolean

    +

    Yes

    +

    supportsStoredProcedures()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInComparisons()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInExists()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInIns()

    +

    Boolean

    +

    Yes

    +

    supportsSubqueriesInQuantifieds()

    +

    Boolean

    +

    Yes

    +

    supportsTransactionIsolationLevel​(int level)

    +

    Boolean

    +

    Yes

    +

    supportsTransactions()

    +

    Boolean

    +

    Yes

    +

    supportsUnion()

    +

    Boolean

    +

    Yes

    +

    supportsUnionAll()

    +

    Boolean

    +

    Yes

    +

    updatesAreDetected​(int type)

    +

    Boolean

    +

    Yes

    +

    getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)

    +

    ResultSet

    +

    Yes

    +

    getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)

    +

    ResultSet

    +

    Yes

    +

    getTableTypes()

    +

    ResultSet

    +

    Yes

    +

    getUserName()

    +

    String

    +

    Yes

    +

    isReadOnly()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedHigh()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedLow()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedAtStart()

    +

    Boolean

    +

    Yes

    +

    nullsAreSortedAtEnd()

    +

    Boolean

    +

    Yes

    +

    getDatabaseProductName()

    +

    String

    +

    Yes

    +

    getDatabaseProductVersion()

    +

    String

    +

    Yes

    +

    getDriverName()

    +

    String

    +

    Yes

    +

    getDriverVersion()

    +

    String

    +

    Yes

    +

    getDriverMajorVersion()

    +

    int

    +

    Yes

    +

    getDriverMinorVersion()

    +

    int

    +

    Yes

    +

    usesLocalFiles()

    +

    Boolean

    +

    Yes

    +

    usesLocalFilePerTable()

    +

    Boolean

    +

    Yes

    +

    supportsMixedCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesUpperCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesLowerCaseIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsMixedCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesUpperCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesLowerCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    storesMixedCaseQuotedIdentifiers()

    +

    Boolean

    +

    Yes

    +

    supportsAlterTableWithAddColumn()

    +

    Boolean

    +

    Yes

    +

    supportsAlterTableWithDropColumn()

    +

    Boolean

    +

    Yes

    +

    supportsColumnAliasing()

    +

    Boolean

    +

    Yes

    +

    nullPlusNonNullIsNull()

    +

    Boolean

    +

    Yes

    +

    supportsConvert()

    +

    Boolean

    +

    Yes

    +

    supportsConvert(int fromType, int toType)

    +

    Boolean

    +

    Yes

    +

    supportsTableCorrelationNames()

    +

    Boolean

    +

    Yes

    +

    supportsDifferentTableCorrelationNames()

    +

    Boolean

    +

    Yes

    +

    supportsExpressionsInOrderBy()

    +

    Boolean

    +

    Yes

    +

    supportsOrderByUnrelated()

    +

    Boolean

    +

    Yes

    +

    supportsGroupBy()

    +

    Boolean

    +

    Yes

    +

    supportsGroupByUnrelated()

    +

    Boolean

    +

    Yes

    +

    supportsGroupByBeyondSelect()

    +

    Boolean

    +

    Yes

    +

    supportsLikeEscapeClause()

    +

    Boolean

    +

    Yes

    +

    supportsMultipleResultSets()

    +

    Boolean

    +

    Yes

    +

    supportsMultipleTransactions()

    +

    Boolean

    +

    Yes

    +

    supportsNonNullableColumns()

    +

    Boolean

    +

    Yes

    +

    supportsMinimumSQLGrammar()

    +

    Boolean

    +

    Yes

    +

    supportsCoreSQLGrammar()

    +

    Boolean

    +

    Yes

    +

    supportsExtendedSQLGrammar()

    +

    Boolean

    +

    Yes

    +

    supportsANSI92EntryLevelSQL()

    +

    Boolean

    +

    Yes

    +

    supportsANSI92IntermediateSQL()

    +

    Boolean

    +

    Yes

    +

    supportsANSI92FullSQL()

    +

    Boolean

    +

    Yes

    +

    supportsIntegrityEnhancementFacility()

    +

    Boolean

    +

    Yes

    +

    supportsOuterJoins()

    +

    Boolean

    +

    Yes

    +

    supportsFullOuterJoins()

    +

    Boolean

    +

    Yes

    +

    supportsLimitedOuterJoins()

    +

    Boolean

    +

    Yes

    +

    isCatalogAtStart()

    +

    Boolean

    +

    Yes

    +

    supportsSchemasInDataManipulation()

    +

    Boolean

    +

    Yes

    +

    supportsSavepoints()

    +

    Boolean

    +

    Yes

    +

    supportsResultSetHoldability(int holdability)

    +

    Boolean

    +

    Yes

    +

    getResultSetHoldability()

    +

    int

    +

    Yes

    +

    getDatabaseMajorVersion()

    +

    int

    +

    Yes

    +

    getDatabaseMinorVersion()

    +

    int

    +

    Yes

    +

    getJDBCMajorVersion()

    +

    int

    +

    Yes

    +

    getJDBCMinorVersion()

    +

    int

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>If the value of **uppercaseAttributeName** is **true**, the following APIs convert the query result to uppercase letters. The conversion range is the same as that of the **toUpperCase** method in Java. +>- public ResultSet getProcedures\(String catalog, String schemaPattern, String procedureNamePattern\) +>- public ResultSet getProcedureColumns\(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern\) +>- public ResultSet getTables\(String catalog, String schemaPattern, String tableNamePattern, String\[\] types\) +>- public ResultSet getSchemas\(String catalog, String schemaPattern\) +>- public ResultSet getColumns\(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern\) +>- public ResultSet getColumnPrivileges\(String catalog, String schema, String table, String columnNamePattern\) +>- public ResultSet getTablePrivileges\(String catalog, String schemaPattern, String tableNamePattern\) +>- public ResultSet getBestRowIdentifier\(String catalog, String schema, String table, int scope, boolean nullable\) +>- public ResultSet getPrimaryKeys\(String catalog, String schema, String table\) +>- protected ResultSet getImportedExportedKeys\(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable\) +>- public ResultSet getIndexInfo\(String catalog, String schema, String tableName, boolean unique, boolean approximate\) +>- public ResultSet getUDTs\(String catalog, String schemaPattern, String typeNamePattern, int\[\] types\) +>- public ResultSet getFunctions\(String catalog, String schemaPattern, String functionNamePattern\) + +>![](public_sys-resources/icon-caution.gif) **CAUTION:** +>The **getPartitionTablePrimaryKeys\(String catalog, String schema, String table\)** API is used to obtain the primary key column of a partitioned table that contains global indexes. The following is an example: +>``` +>PgDatabaseMetaData dbmd = (PgDatabaseMetaData)conn.getMetaData(); +>dbmd.getPartitionTablePrimaryKeys("catalogName", "schemaName", "tableName"); +>``` + diff --git a/content/en/docs/DeveloperGuide/java-sql-driver.md b/content/en/docs/DeveloperGuide/java-sql-driver.md new file mode 100644 index 000000000..59db5f6fa --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-driver.md @@ -0,0 +1,67 @@ +# java.sql.Driver + +This section describes **java.sql.Driver**, the database driver API. + +**Table 1** Support status for java.sql.Driver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    acceptsURL(String url)

    +

    Boolean

    +

    Yes

    +

    connect(String url, Properties info)

    +

    Connection

    +

    Yes

    +

    jdbcCompliant()

    +

    Boolean

    +

    Yes

    +

    getMajorVersion()

    +

    int

    +

    Yes

    +

    getMinorVersion()

    +

    int

    +

    Yes

    +

    getParentLogger()

    +

    Logger

    +

    Yes

    +

    getPropertyInfo​(String url, Properties info)

    +

    DriverPropertyInfo[]

    +

    Yes

    +
    + diff --git a/content/en/docs/DeveloperGuide/java-sql-preparedstatement.md b/content/en/docs/DeveloperGuide/java-sql-preparedstatement.md new file mode 100644 index 000000000..b43e72c19 --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-preparedstatement.md @@ -0,0 +1,354 @@ +# java.sql.PreparedStatement + +This section describes **java.sql.PreparedStatement**, the API for preparing statements. + +**Table 1** Support status for java.sql.PreparedStatement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    clearParameters()

    +

    void

    +

    Yes

    +

    execute()

    +

    Boolean

    +

    Yes

    +

    executeQuery()

    +

    ResultSet

    +

    Yes

    +

    excuteUpdate()

    +

    int

    +

    Yes

    +

    executeLargeUpdate()

    +

    long

    +

    No

    +

    getMetaData()

    +

    ResultSetMetaData

    +

    Yes

    +

    getParameterMetaData()

    +

    ParameterMetaData

    +

    Yes

    +

    setArray​(int parameterIndex, Array x)

    +

    void

    +

    Yes

    +

    setAsciiStream​(int parameterIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    setBinaryStream​(int parameterIndex, InputStream x)

    +

    void

    +

    Yes

    +

    setBinaryStream​(int parameterIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    setBinaryStream​(int parameterIndex, InputStream x, long length)

    +

    void

    +

    Yes

    +

    setBlob​(int parameterIndex, InputStream inputStream)

    +

    void

    +

    Yes

    +

    setBlob​(int parameterIndex, InputStream inputStream, long length)

    +

    void

    +

    Yes

    +

    setBlob​(int parameterIndex, Blob x)

    +

    void

    +

    Yes

    +

    setCharacterStream​(int parameterIndex, Reader reader)

    +

    void

    +

    Yes

    +

    setCharacterStream​(int parameterIndex, Reader reader, int length)

    +

    void

    +

    Yes

    +

    setClob​(int parameterIndex, Reader reader)

    +

    void

    +

    Yes

    +

    setClob​(int parameterIndex, Reader reader, long length)

    +

    void

    +

    Yes

    +

    setClob​(int parameterIndex, Clob x)

    +

    void

    +

    Yes

    +

    setDate​(int parameterIndex, Date x, Calendar cal)

    +

    void

    +

    Yes

    +

    setNull​(int parameterIndex, int sqlType)

    +

    void

    +

    Yes

    +

    setNull​(int parameterIndex, int sqlType, String typeName)

    +

    void

    +

    Yes

    +

    setObject​(int parameterIndex, Object x)

    +

    void

    +

    Yes

    +

    setObject​(int parameterIndex, Object x, int targetSqlType)

    +

    void

    +

    Yes

    +

    setObject​(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)

    +

    void

    +

    Yes

    +

    setSQLXML​(int parameterIndex, SQLXML xmlObject)

    +

    void

    +

    Yes

    +

    setTime​(int parameterIndex, Time x)

    +

    void

    +

    Yes

    +

    setTime​(int parameterIndex, Time x, Calendar cal)

    +

    void

    +

    Yes

    +

    setTimestamp​(int parameterIndex, Timestamp x)

    +

    void

    +

    Yes

    +

    setTimestamp​(int parameterIndex, Timestamp x, Calendar cal)

    +

    void

    +

    Yes

    +

    setUnicodeStream(int parameterIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    setURL(int parameterIndex, URL x)

    +

    void

    +

    Yes

    +

    setBoolean(int parameterIndex, boolean x)

    +

    void

    +

    Yes

    +

    setBigDecimal(int parameterIndex, BigDecimal x)

    +

    void

    +

    Yes

    +

    setByte(int parameterIndex, byte x)

    +

    void

    +

    Yes

    +

    setBytes(int parameterIndex, byte[] x)

    +

    void

    +

    Yes

    +

    setDate(int parameterIndex, Date x)

    +

    void

    +

    Yes

    +

    setDouble(int parameterIndex, double x)

    +

    void

    +

    Yes

    +

    setFloat(int parameterIndex, float x)

    +

    void

    +

    Yes

    +

    setInt(int parameterIndex, int x)

    +

    void

    +

    Yes

    +

    setLong(int parameterIndex, long x)

    +

    void

    +

    Yes

    +

    setShort(int parameterIndex, short x)

    +

    void

    +

    Yes

    +

    setString(int parameterIndex, String x)

    +

    void

    +

    Yes

    +

    setNString(int parameterIndex, String x)

    +

    void

    +

    Yes

    +

    addBatch()

    +

    void

    +

    Yes

    +

    executeBatch()

    +

    int[]

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- Execute **addBatch\(\)** and **execute\(\)** only after running **clearBatch\(\)**. +>- Batch is not cleared by calling **executeBatch\(\)**. Clear batch by explicitly calling **clearBatch\(\)**. +>- After bounded variables of a batch are added, if you want to reuse these values, you do not need to use **set\*\(\)** again. Instead, add a batch. +>- The following methods are inherited from **java.sql.Statement**: **close**, **execute**, **executeQuery**, **executeUpdate**, **getConnection**, **getResultSet**, **getUpdateCount**, **isClosed**, **setMaxRows**, and **setFetchSize**. +>- The **executeLargeUpdate\(\)** method can only be used in JDBC 4.2 or later. + diff --git a/content/en/docs/DeveloperGuide/java-sql-resultset.md b/content/en/docs/DeveloperGuide/java-sql-resultset.md new file mode 100644 index 000000000..4bd5a0bfb --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-resultset.md @@ -0,0 +1,960 @@ +# java.sql.ResultSet + +This section describes **java.sql.ResultSet**, the API for execution result sets. + +**Table 1** Support status for java.sql.ResultSet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    absolute​(int row)

    +

    Boolean

    +

    Yes

    +

    afterLast()

    +

    void

    +

    Yes

    +

    beforeFirst()

    +

    void

    +

    Yes

    +

    cancelRowUpdates()

    +

    void

    +

    Yes

    +

    clearWarnings()

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    deleteRow()

    +

    void

    +

    Yes

    +

    findColumn(String columnLabel)

    +

    int

    +

    Yes

    +

    first()

    +

    Boolean

    +

    Yes

    +

    getArray​(int columnIndex)

    +

    Array

    +

    Yes

    +

    getArray​(String columnLabel)

    +

    Array

    +

    Yes

    +

    getAsciiStream​(int columnIndex)

    +

    InputStream

    +

    Yes

    +

    getAsciiStream​(String columnLabel)

    +

    InputStream

    +

    Yes

    +

    getBigDecimal(int columnIndex)

    +

    BigDecimal

    +

    Yes

    +

    getBigDecimal(String columnLabel)

    +

    BigDecimal

    +

    Yes

    +

    getBinaryStream​(int columnIndex)

    +

    InputStream

    +

    Yes

    +

    getBinaryStream​(String columnLabel)

    +

    InputStream

    +

    Yes

    +

    getBlob​(int columnIndex)

    +

    Blob

    +

    Yes

    +

    getBlob​(String columnLabel)

    +

    Blob

    +

    Yes

    +

    getBoolean(int columnIndex)

    +

    Boolean

    +

    Yes

    +

    getBoolean(String columnLabel)

    +

    Boolean

    +

    Yes

    +

    getByte(int columnIndex)

    +

    byte

    +

    Yes

    +

    getBytes(int columnIndex)

    +

    byte[]

    +

    Yes

    +

    getByte(String columnLabel)

    +

    byte

    +

    Yes

    +

    getBytes(String columnLabel)

    +

    byte[]

    +

    Yes

    +

    getCharacterStream​(int columnIndex)

    +

    Reader

    +

    Yes

    +

    getCharacterStream​(String columnLabel)

    +

    Reader

    +

    Yes

    +

    getClob​(int columnIndex)

    +

    Clob

    +

    Yes

    +

    getClob​(String columnLabel)

    +

    Clob

    +

    Yes

    +

    getConcurrency()

    +

    int

    +

    Yes

    +

    getCursorName()

    +

    String

    +

    Yes

    +

    getDate(int columnIndex)

    +

    Date

    +

    Yes

    +

    getDate​(int columnIndex, Calendar cal)

    +

    Date

    +

    Yes

    +

    getDate(String columnLabel)

    +

    Date

    +

    Yes

    +

    getDate​(String columnLabel, Calendar cal)

    +

    Date

    +

    Yes

    +

    getDouble(int columnIndex)

    +

    double

    +

    Yes

    +

    getDouble(String columnLabel)

    +

    double

    +

    Yes

    +

    getFetchDirection()

    +

    int

    +

    Yes

    +

    getFetchSize()

    +

    int

    +

    Yes

    +

    getFloat(int columnIndex)

    +

    float

    +

    Yes

    +

    getFloat(String columnLabel)

    +

    float

    +

    Yes

    +

    getInt(int columnIndex)

    +

    int

    +

    Yes

    +

    getInt(String columnLabel)

    +

    int

    +

    Yes

    +

    getLong(int columnIndex)

    +

    long

    +

    Yes

    +

    getLong(String columnLabel)

    +

    long

    +

    Yes

    +

    getMetaData()

    +

    ResultSetMetaData

    +

    Yes

    +

    getObject​(int columnIndex)

    +

    Object

    +

    Yes

    +

    getObject​(int columnIndex, Class<T> type)

    +

    <T> T

    +

    Yes

    +

    getObject​(int columnIndex, Map<String,​Class<?>> map)

    +

    Object

    +

    Yes

    +

    getObject​(String columnLabel)

    +

    Object

    +

    Yes

    +

    getObject​(String columnLabel, Class<T> type)

    +

    <T> T

    +

    Yes

    +

    getObject​(String columnLabel, Map<String,​Class<?>> map)

    +

    Object

    +

    Yes

    +

    getRow()

    +

    int

    +

    Yes

    +

    getShort(int columnIndex)

    +

    short

    +

    Yes

    +

    getShort(String columnLabel)

    +

    short

    +

    Yes

    +

    getSQLXML​(int columnIndex)

    +

    SQLXML

    +

    Yes

    +

    getSQLXML​(String columnLabel)

    +

    SQLXML

    +

    Yes

    +

    getStatement()

    +

    Statement

    +

    Yes

    +

    getString(int columnIndex)

    +

    String

    +

    Yes

    +

    getString(String columnLabel)

    +

    String

    +

    Yes

    +

    getNString(int columnIndex)

    +

    String

    +

    Yes

    +

    getNString(String columnLabel)

    +

    String

    +

    Yes

    +

    getTime(int columnIndex)

    +

    Time

    +

    Yes

    +

    getTime​(int columnIndex, Calendar cal)

    +

    Time

    +

    Yes

    +

    getTime(String columnLabel)

    +

    Time

    +

    Yes

    +

    getTime​(String columnLabel, Calendar cal)

    +

    Time

    +

    Yes

    +

    getTimestamp(int columnIndex)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp​(int columnIndex, Calendar cal)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp(String columnLabel)

    +

    Timestamp

    +

    Yes

    +

    getTimestamp​(String columnLabel, Calendar cal)

    +

    Timestamp

    +

    Yes

    +

    getType()

    +

    int

    +

    Yes

    +

    getWarnings()

    +

    SQLWarning

    +

    Yes

    +

    insertRow()

    +

    void

    +

    Yes

    +

    isAfterLast()

    +

    Boolean

    +

    Yes

    +

    isBeforeFirst()

    +

    Boolean

    +

    Yes

    +

    isClosed()

    +

    Boolean

    +

    Yes

    +

    isFirst()

    +

    Boolean

    +

    Yes

    +

    isLast()

    +

    Boolean

    +

    Yes

    +

    last()

    +

    Boolean

    +

    Yes

    +

    moveToCurrentRow()

    +

    void

    +

    Yes

    +

    moveToInsertRow()

    +

    void

    +

    Yes

    +

    next()

    +

    Boolean

    +

    Yes

    +

    previous()

    +

    Boolean

    +

    Yes

    +

    refreshRow()

    +

    void

    +

    Yes

    +

    relative​(int rows)

    +

    Boolean

    +

    Yes

    +

    rowDeleted()

    +

    Boolean

    +

    Yes

    +

    rowInserted()

    +

    Boolean

    +

    Yes

    +

    rowUpdated()

    +

    Boolean

    +

    Yes

    +

    setFetchDirection​(int direction)

    +

    void

    +

    Yes

    +

    setFetchSize​(int rows)

    +

    void

    +

    Yes

    +

    updateArray​(int columnIndex, Array x)

    +

    void

    +

    Yes

    +

    updateArray​(String columnLabel, Array x)

    +

    void

    +

    Yes

    +

    updateAsciiStream​(int columnIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateAsciiStream​(String columnLabel, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateBigDecimal​(int columnIndex, BigDecimal x)

    +

    void

    +

    Yes

    +

    updateBigDecimal​(String columnLabel, BigDecimal x)

    +

    void

    +

    Yes

    +

    updateBinaryStream​(int columnIndex, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateBinaryStream​(String columnLabel, InputStream x, int length)

    +

    void

    +

    Yes

    +

    updateBoolean​(int columnIndex, boolean x)

    +

    void

    +

    Yes

    +

    updateBoolean​(String columnLabel, boolean x)

    +

    void

    +

    Yes

    +

    updateByte​(int columnIndex, byte x)

    +

    void

    +

    Yes

    +

    updateByte​(String columnLabel, byte x)

    +

    void

    +

    Yes

    +

    updateBytes​(int columnIndex, byte[] x)

    +

    void

    +

    Yes

    +

    updateBytes​(String columnLabel, byte[] x)

    +

    void

    +

    Yes

    +

    updateCharacterStream​(int columnIndex, Reader x, int length)

    +

    void

    +

    Yes

    +

    updateCharacterStream​(String columnLabel, Reader reader, int length)

    +

    void

    +

    Yes

    +

    updateDate​(int columnIndex, Date x)

    +

    void

    +

    Yes

    +

    updateDate​(String columnLabel, Date x)

    +

    void

    +

    Yes

    +

    updateDouble​(int columnIndex, double x)

    +

    void

    +

    Yes

    +

    updateDouble​(String columnLabel, double x)

    +

    void

    +

    Yes

    +

    updateFloat​(int columnIndex, float x)

    +

    void

    +

    Yes

    +

    updateFloat​(String columnLabel, float x)

    +

    void

    +

    Yes

    +

    updateInt​(int columnIndex, int x)

    +

    void

    +

    Yes

    +

    updateInt​(String columnLabel, int x)

    +

    void

    +

    Yes

    +

    updateLong​(int columnIndex, long x)

    +

    void

    +

    Yes

    +

    updateLong​(String columnLabel, long x)

    +

    void

    +

    Yes

    +

    updateNull​(int columnIndex)

    +

    void

    +

    Yes

    +

    updateNull​(String columnLabel)

    +

    void

    +

    Yes

    +

    updateObject​(int columnIndex, Object x)

    +

    void

    +

    Yes

    +

    updateObject​(int columnIndex, Object x, int scaleOrLength)

    +

    void

    +

    Yes

    +

    updateObject​(String columnLabel, Object x)

    +

    void

    +

    Yes

    +

    updateObject​(String columnLabel, Object x, int scaleOrLength)

    +

    void

    +

    Yes

    +

    updateRow()

    +

    void

    +

    Yes

    +

    updateShort​(int columnIndex, short x)

    +

    void

    +

    Yes

    +

    updateShort​(String columnLabel, short x)

    +

    void

    +

    Yes

    +

    updateSQLXML​(int columnIndex, SQLXML xmlObject)

    +

    void

    +

    Yes

    +

    updateSQLXML​(String columnLabel, SQLXML xmlObject)

    +

    void

    +

    Yes

    +

    updateString​(int columnIndex, String x)

    +

    void

    +

    Yes

    +

    updateString​(String columnLabel, String x)

    +

    void

    +

    Yes

    +

    updateTime​(int columnIndex, Time x)

    +

    void

    +

    Yes

    +

    updateTime​(String columnLabel, Time x)

    +

    void

    +

    Yes

    +

    updateTimestamp​(int columnIndex, Timestamp x)

    +

    void

    +

    Yes

    +

    updateTimestamp​(String columnLabel, Timestamp x)

    +

    void

    +

    Yes

    +

    wasNull()

    +

    Boolean

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- One statement cannot have multiple open ResultSets. +>- The cursor that is used for traversing the ResultSet cannot be open after being committed. + diff --git a/content/en/docs/DeveloperGuide/java-sql-resultsetmetadata.md b/content/en/docs/DeveloperGuide/java-sql-resultsetmetadata.md new file mode 100644 index 000000000..0e8da887c --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-resultsetmetadata.md @@ -0,0 +1,170 @@ +# java.sql.ResultSetMetaData + +This section describes **java.sql.ResultSetMetaData**, which provides details about ResultSet object information. + +**Table 1** Support status for java.sql.ResultSetMetaData + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    getCatalogName​(int column)

    +

    String

    +

    Yes

    +

    getColumnClassName​(int column)

    +

    String

    +

    Yes

    +

    getColumnCount()

    +

    int

    +

    Yes

    +

    getColumnDisplaySize​(int column)

    +

    int

    +

    Yes

    +

    getColumnLabel​(int column)

    +

    String

    +

    Yes

    +

    getColumnName(int column)

    +

    String

    +

    Yes

    +

    getColumnType(int column)

    +

    int

    +

    Yes

    +

    getColumnTypeName(int column)

    +

    String

    +

    Yes

    +

    getPrecision​(int column)

    +

    int

    +

    Yes

    +

    getScale​(int column)

    +

    int

    +

    Yes

    +

    getSchemaName​(int column)

    +

    String

    +

    Yes

    +

    getTableName​(int column)

    +

    String

    +

    Yes

    +

    isAutoIncrement​(int column)

    +

    Boolean

    +

    Yes

    +

    isCaseSensitive​(int column)

    +

    Boolean

    +

    Yes

    +

    isCurrency​(int column)

    +

    Boolean

    +

    Yes

    +

    isDefinitelyWritable​(int column)

    +

    Boolean

    +

    Yes

    +

    isNullable​(int column)

    +

    int

    +

    Yes

    +

    isReadOnly​(int column)

    +

    Boolean

    +

    Yes

    +

    isSearchable​(int column)

    +

    Boolean

    +

    Yes

    +

    isSigned​(int column)

    +

    Boolean

    +

    Yes

    +

    isWritable​(int column)

    +

    Boolean

    +

    Yes

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>When **uppercaseAttributeName** is set to **true**, the following APIs convert the query result to uppercase letters. The conversion range is 26 English letters. +>- public String getColumnName\(int column\) +>- public String getColumnLabel\(int column\) + diff --git a/content/en/docs/DeveloperGuide/java-sql-statement.md b/content/en/docs/DeveloperGuide/java-sql-statement.md new file mode 100644 index 000000000..a85220a62 --- /dev/null +++ b/content/en/docs/DeveloperGuide/java-sql-statement.md @@ -0,0 +1,359 @@ +# java.sql.Statement + +This section describes **java.sql.Statement**, the interface for executing SQL statements. + +**Table 1** Support status for java.sql.Statement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    addBatch​(String sql)

    +

    void

    +

    Yes

    +

    clearBatch()

    +

    void

    +

    Yes

    +

    clearWarnings()

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    closeOnCompletion()

    +

    void

    +

    Yes

    +

    execute(String sql)

    +

    Boolean

    +

    Yes

    +

    execute​(String sql, int autoGeneratedKeys)

    +

    Boolean

    +

    Yes

    +

    execute​(String sql, int[] columnIndexes)

    +

    Boolean

    +

    Yes

    +

    execute​(String sql, String[] columnNames)

    +

    Boolean

    +

    Yes

    +

    executeBatch()

    +

    Boolean

    +

    Yes

    +

    executeQuery(String sql)

    +

    ResultSet

    +

    Yes

    +

    executeUpdate(String sql)

    +

    int

    +

    Yes

    +

    executeUpdate​(String sql, int autoGeneratedKeys)

    +

    int

    +

    Yes

    +

    executeUpdate​(String sql, int[] columnIndexes)

    +

    int

    +

    Yes

    +

    executeUpdate​(String sql, String[] columnNames)

    +

    int

    +

    Yes

    +

    getConnection()

    +

    Connection

    +

    Yes

    +

    getFetchDirection()

    +

    int

    +

    Yes

    +

    getFetchSize()

    +

    int

    +

    Yes

    +

    getGeneratedKeys()

    +

    ResultSet

    +

    Yes

    +

    getMaxFieldSize()

    +

    int

    +

    Yes

    +

    getMaxRows()

    +

    int

    +

    Yes

    +

    getMoreResults()

    +

    boolean

    +

    Yes

    +

    getMoreResults​(int current)

    +

    boolean

    +

    Yes

    +

    getResultSet()

    +

    ResultSet

    +

    Yes

    +

    getResultSetConcurrency()

    +

    int

    +

    Yes

    +

    getResultSetHoldability()

    +

    int

    +

    Yes

    +

    getResultSetType()

    +

    int

    +

    Yes

    +

    getQueryTimeout()

    +

    int

    +

    Yes

    +

    getUpdateCount()

    +

    int

    +

    Yes

    +

    getWarnings()

    +

    SQLWarning

    +

    Yes

    +

    isClosed()

    +

    Boolean

    +

    Yes

    +

    isCloseOnCompletion()

    +

    Boolean

    +

    Yes

    +

    isPoolable()

    +

    Boolean

    +

    Yes

    +

    setCursorName​(String name)

    +

    void

    +

    Yes

    +

    setEscapeProcessing​(boolean enable)

    +

    void

    +

    Yes

    +

    setFetchDirection​(int direction)

    +

    void

    +

    Yes

    +

    setMaxFieldSize​(int max)

    +

    void

    +

    Yes

    +

    setMaxRows​(int max)

    +

    void

    +

    Yes

    +

    setPoolable​(boolean poolable)

    +

    void

    +

    Yes

    +

    setQueryTimeout(int seconds)

    +

    void

    +

    Yes

    +

    setFetchSize(int rows)

    +

    void

    +

    Yes

    +

    cancel()

    +

    void

    +

    Yes

    +

    executeLargeUpdate(String sql)

    +

    long

    +

    No

    +

    getLargeUpdateCount()

    +

    long

    +

    No

    +

    executeLargeBatch()

    +

    long

    +

    No

    +

    executeLargeUpdate(String sql, int autoGeneratedKeys)

    +

    long

    +

    No

    +

    executeLargeUpdate(String sql, int[] columnIndexes)

    +

    long

    +

    No

    +

    executeLargeUpdate(String sql, String[] columnNames)

    +

    long

    +

    No

    +
    + +>![](public_sys-resources/icon-note.gif) **NOTE:** +>- Using setFetchSize can reduce the memory occupied by result sets on the client. Result sets are packaged into cursors and segmented for processing, which will increase the communication traffic between the database and the client, affecting performance. +>- Database cursors are valid only within their transactions. If **setFetchSize** is set, set **setAutoCommit\(false\)** and commit transactions on the connection to flush service data to a database. +>- **LargeUpdate** methods can only be used in JDBC 4.2 or later. + diff --git a/content/en/docs/DeveloperGuide/javax-naming-context.md b/content/en/docs/DeveloperGuide/javax-naming-context.md new file mode 100644 index 000000000..9e8e69d76 --- /dev/null +++ b/content/en/docs/DeveloperGuide/javax-naming-context.md @@ -0,0 +1,88 @@ +# javax.naming.Context + +This section describes **javax.naming.Context**, the context interface for connection configuration. + +**Table 1** Support status for javax.naming.Context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    Support JDBC 4

    +

    bind(Name name, Object obj)

    +

    void

    +

    Yes

    +

    bind(String name, Object obj)

    +

    void

    +

    Yes

    +

    lookup(Name name)

    +

    Object

    +

    Yes

    +

    lookup(String name)

    +

    Object

    +

    Yes

    +

    rebind(Name name, Object obj)

    +

    void

    +

    Yes

    +

    rebind(String name, Object obj)

    +

    void

    +

    Yes

    +

    rename(Name oldName, Name newName)

    +

    void

    +

    Yes

    +

    rename(String oldName, String newName)

    +

    void

    +

    Yes

    +

    unbind(Name name)

    +

    void

    +

    Yes

    +

    unbind(String name)

    +

    void

    +

    Yes

    +
    + diff --git a/content/en/docs/DeveloperGuide/javax-naming-spi-initialcontextfactory.md b/content/en/docs/DeveloperGuide/javax-naming-spi-initialcontextfactory.md new file mode 100644 index 000000000..b3fdff4e6 --- /dev/null +++ b/content/en/docs/DeveloperGuide/javax-naming-spi-initialcontextfactory.md @@ -0,0 +1,25 @@ +# javax.naming.spi.InitialContextFactory + +This section describes **javax.naming.spi.InitialContextFactory**, the initial context factory interface. + +**Table 1** Support status for javax.naming.spi.InitialContextFactory + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    Support JDBC 4

    +

    getInitialContext(Hashtable<?,?> environment)

    +

    Context

    +

    Yes

    +
    + diff --git a/content/en/docs/DeveloperGuide/javax-sql-connectionpooldatasource.md b/content/en/docs/DeveloperGuide/javax-sql-connectionpooldatasource.md new file mode 100644 index 000000000..0cad7c474 --- /dev/null +++ b/content/en/docs/DeveloperGuide/javax-sql-connectionpooldatasource.md @@ -0,0 +1,32 @@ +# javax.sql.ConnectionPoolDataSource + +This section describes **javax.sql.ConnectionPoolDataSource**, the API for data source connection pools. + +**Table 1** Support status for javax.sql.ConnectionPoolDataSource + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    getPooledConnection()

    +

    PooledConnection

    +

    Yes

    +

    getPooledConnection(String user,String password)

    +

    PooledConnection

    +

    Yes

    +
    + diff --git a/content/en/docs/DeveloperGuide/javax-sql-datasource.md b/content/en/docs/DeveloperGuide/javax-sql-datasource.md new file mode 100644 index 000000000..5187728e3 --- /dev/null +++ b/content/en/docs/DeveloperGuide/javax-sql-datasource.md @@ -0,0 +1,60 @@ +# javax.sql.DataSource + +This section describes **javax.sql.DataSource**, the interface for data sources. + +**Table 1** Support status for javax.sql.DataSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    Support JDBC 4

    +

    getConneciton()

    +

    Connection

    +

    Yes

    +

    getConnection(String username,String password)

    +

    Connection

    +

    Yes

    +

    getLoginTimeout()

    +

    int

    +

    Yes

    +

    getLogWriter()

    +

    PrintWriter

    +

    Yes

    +

    setLoginTimeout(int seconds)

    +

    void

    +

    Yes

    +

    setLogWriter(PrintWriter out)

    +

    void

    +

    Yes

    +
    + diff --git a/content/en/docs/DeveloperGuide/javax-sql-pooledconnection.md b/content/en/docs/DeveloperGuide/javax-sql-pooledconnection.md new file mode 100644 index 000000000..91d24ab9e --- /dev/null +++ b/content/en/docs/DeveloperGuide/javax-sql-pooledconnection.md @@ -0,0 +1,46 @@ +# javax.sql.PooledConnection + +This section describes **javax.sql.PooledConnection**, the connection API created by a connection pool. + +**Table 1** Support status for javax.sql.PooledConnection + + + + + + + + + + + + + + + + + + + + + + + + +

    Method Name

    +

    Return Type

    +

    JDBC 4 Is Supported Or Not

    +

    addConnectionEventListener (ConnectionEventListener listener)

    +

    void

    +

    Yes

    +

    close()

    +

    void

    +

    Yes

    +

    getConnection()

    +

    Connection

    +

    Yes

    +

    removeConnectionEventListener (ConnectionEventListener listener)

    +

    void

    +

    Yes

    +
    + diff --git a/content/en/docs/DeveloperGuide/jdbc-interface-reference.md b/content/en/docs/DeveloperGuide/jdbc-interface-reference.md index 0aae2fc18..508620a11 100644 --- a/content/en/docs/DeveloperGuide/jdbc-interface-reference.md +++ b/content/en/docs/DeveloperGuide/jdbc-interface-reference.md @@ -1,4 +1,31 @@ # JDBC Interface Reference -For details, see [JDBC](jdbc.md). +This section describes common JDBC interfaces. For more interfaces, check JDK1.8 (software package) and JDBC 4.0. +- **[java.sql.Connection](java-sql-Connection.md)** + +- **[java.sql.CallableStatement](java-sql-CallableStatement.md)** + +- **[java.sql.DatabaseMetaData](java-sql-DatabaseMetaData.md)** + +- **[java.sql.Driver](java-sql-Driver.md)** + +- **[java.sql.PreparedStatement](java-sql-PreparedStatement.md)** + +- **[java.sql.ResultSet](java-sql-ResultSet.md)** + +- **[java.sql.ResultSetMetaData](java-sql-ResultSetMetaData.md)** + +- **[java.sql.Statement](java-sql-Statement.md)** + +- **[javax.sql.ConnectionPoolDataSource](javax-sql-ConnectionPoolDataSource.md)** + +- **[javax.sql.DataSource](javax-sql-DataSource.md)** + +- **[javax.sql.PooledConnection](javax-sql-PooledConnection.md)** + +- **[javax.naming.Context](javax-naming-Context.md)** + +- **[javax.naming.spi.InitialContextFactory](javax-naming-spi-InitialContextFactory.md)** + +- **[CopyManager](CopyManager.md)** \ No newline at end of file diff --git a/content/en/docs/DeveloperGuide/libpq-api-reference.md b/content/en/docs/DeveloperGuide/libpq-api-reference.md index 2796c7671..6df748edc 100644 --- a/content/en/docs/DeveloperGuide/libpq-api-reference.md +++ b/content/en/docs/DeveloperGuide/libpq-api-reference.md @@ -1,4 +1,13 @@ # libpq API Reference -For details, see [libpq](en-us_topic_0289899861.md). +- **[Database Connection Control Functions](database-connection-control-functions.md)** +- **[Database Statement Execution Functions](database-statement-execution-functions.md)** + +- **[Functions for Asynchronous Command Processing](functions-for-asynchronous-command-processing.md)** + +- **[Functions for Canceling Queries in Progress](functions-for-canceling-queries-in-progress.md)** + +- **[Example](example-libpq.md)** + +- **[Link Parameters](link-parameters-libpq.md)** diff --git a/content/en/docs/DeveloperGuide/psycopg-api-reference.md b/content/en/docs/DeveloperGuide/psycopg-api-reference.md index 9fa3b6e30..12ccd6b5f 100644 --- a/content/en/docs/DeveloperGuide/psycopg-api-reference.md +++ b/content/en/docs/DeveloperGuide/psycopg-api-reference.md @@ -1,4 +1,23 @@ # Psycopg API Reference -For details, see [Psycopg](en-us_topic_0000001080051584.md). +Psycopg APIs are a set of methods provided for users. This section describes some common APIs. +- **[psycopg2.connect\(\)](psycopg2-connect.md)** + +- **[connection.cursor\(\)](connection-cursor.md)** + +- **[cursor.execute\(query,vars\_list\)](cursor-execute-query-vars_list.md)** + +- **[curosr.executemany\(query,vars\_list\)](curosr-executemany_query-vars_list.md)** + +- **[connection.commit\(\)](connection-commit.md)** + +- **[connection.rollback\(\)](connection-rollback.md)** + +- **[cursor.fetchone\(\)](cursor-fetchone.md)** + +- **[cursor.fetchall\(\)](cursor-fetchall.md)** + +- **[cursor.close\(\)](cursor-close.md)** + +- **[connection.close\(\)](connection-close.md)** \ No newline at end of file diff --git a/content/en/docs/DeveloperGuide/psycopg2-connect.md b/content/en/docs/DeveloperGuide/psycopg2-connect.md new file mode 100644 index 000000000..daee4420a --- /dev/null +++ b/content/en/docs/DeveloperGuide/psycopg2-connect.md @@ -0,0 +1,79 @@ +# psycopg2.connect\(\) + +## Function + +This method creates a database session and returns a new connection object. + +## Prototype + +``` +conn=psycopg2.connect(dbname="test",user="postgres",password="secret",host="127.0.0.1",port="5432") +``` + +## Parameter + +**Table 1** psycopg2.connect parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Keyword

    +

    Description

    +

    dbname

    +

    Database name.

    +

    user

    +

    Username.

    +

    password

    +

    Password.

    +

    host

    +

    Database IP address. The default type is UNIX socket.

    +

    port

    +

    Connection port number. The default value is 5432.

    +

    sslmode

    +

    SSL mode, which is used for SSL connection.

    +

    sslcert

    +

    Path of the client certificate, which is used for SSL connection.

    +

    sslkey

    +

    Path of the client key, which is used for SSL connection.

    +

    sslrootcert

    +

    Path of the root certificate, which is used for SSL connection.

    +
    + +## Return Value + +Connection object \(for connecting to the openGauss DB instance\) + +## Examples + +For details, see [Example: Common Operations](example-common-operations.md). + diff --git a/content/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md b/content/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md index 745a408e4..32d127b98 100644 --- a/content/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md +++ b/content/en/docs/PerformanceTuningGuide/hint-for-degrading-some-errors-to-warnings.md @@ -1,4 +1,4 @@ -# Hint for Degrading Some Errors to Warnings. +# Hint for Degrading Some Errors to Warnings ## Function diff --git a/content/en/docs/SQLReference/alter-foreign-data-wrapper.md b/content/en/docs/SQLReference/alter-foreign-data-wrapper.md new file mode 100644 index 000000000..c39992f1b --- /dev/null +++ b/content/en/docs/SQLReference/alter-foreign-data-wrapper.md @@ -0,0 +1,63 @@ +# ALTER FOREIGN DATA WRAPPER + +## Function Description + +Modifies the definition of a foreign data wrapper (FDW). + +## Syntax + +``` +ALTER FOREIGN DATA WRAPPER name + [ HANDLER handler_function | NO HANDLER ] + [ VALIDATOR validator_function | NO VALIDATOR ] + [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [,...] ) ] +``` + +## Parameter Description + +- **name** + + Specifies the name of an FDW to be modified. + +- **HANDLER handler\_function** + + Specifies a new handler function for an FDW. + + +- **NO HANDLER** + + Specifies that an FDW no longer has a handler function. + + >![](public_sys-resources/icon-notice.gif) **NOTICE:** + > + > Foreign tables that use FDWs without handler functions cannot be accessed. + +- **VALIDATOR validator_function** + + Specifies a new validator function for an FDW. + + >![](public_sys-resources/icon-notice.gif) **NOTICE:** + > + > After a validator function is modified, options for an FDW, server, and user mapping may become invalid. Before using the FDW, the user should ensure that these options are correct. + + +- **NO VALIDATOR** + + Specifies that the FDW no longer has a validator function. + + +- **OPTIONS \( \[ ADD | SET | DROP \] option \['value'\] \[,...\] \)** + + Specifies options to be modified (added, set, or dropped) for the FDW. If the operation is not explicitly specified, it is assumed that the operation is ADD. The option name must be unique. Use the FDW's validator function (if any) to validate the name and value. + + +## Examples + +``` +--Create an FDW named dbi. +openGauss=# CREATE FOREIGN DATA WRAPPER dbi OPTIONS (debug 'true'); +--Modify dbi: Add the foo option and delete the debug option. +openGauss=# ALTER FOREIGN DATA WRAPPER dbi OPTIONS (ADD foo '1', DROP debug); +--Change the dbi validator to myvalidator. +openGauss=# ALTER FOREIGN DATA WRAPPER dbi VALIDATOR file_fdw_validator; +``` diff --git a/content/en/docs/SQLReference/clean-connection.md b/content/en/docs/SQLReference/clean-connection.md new file mode 100644 index 000000000..8d67316c9 --- /dev/null +++ b/content/en/docs/SQLReference/clean-connection.md @@ -0,0 +1,66 @@ +# CLEAN CONNECTION + +## Function + +**CLEAN CONNECTION** clears database connections. You may use this statement to delete a specific user's connections to a specified database. + +## Precautions + +- openGauss does not support specified nodes and supports only TO ALL. +- This function can be used to clear the normal connections that are being used only in force mode. + +## Syntax + +``` +CLEAN CONNECTION + TO { COORDINATOR ( nodename [, ... ] ) | NODE ( nodename [, ... ] )| ALL [ CHECK ] [ FORCE ] } + [ FOR DATABASE dbname ] + [ TO USER username ]; +``` + +## Parameter Description + +- **CHECK** + + This parameter can be specified only when the node list is specified as **TO ALL**. Setting this parameter will check whether a database is accessed by other sessions before its connections are cleared. If any sessions are detected before **DROP DATABASE** is executed, an error will be reported and the database will not be deleted. + +- **FORCE** + + This parameter can be specified only when the node list is specified as **TO ALL**. Setting this parameter will send **SIGTERM** signals to all the threads related to the specified **dbname** and **username** and forcibly shut them down. + +- **COORDINATOR \( nodename \[, ... \] \) | NODE \( nodename \[, ... \] \) | ALL** + + Only **TO ALL** is supported. This parameter must be specified. All specified connections on the node will be deleted. + +- **dbname** + + Deletes connections to a specified database. If this parameter is not specified, connections to all databases will be deleted. + + Value range: an existing database name + +- **username** + + Deletes connections of a specific user. If this parameter is not specified, connections of all users will be deleted. + + Value range: an existing username + + +## Examples + +``` +-- Create user jack. +CREATE USER jack PASSWORD 'Bigdata123@'; + +-- Clean the user jack's connections to the template1 database. +CLEAN CONNECTION TO ALL FOR DATABASE template1 TO USER jack; + +-- Delete all connections of user jack. +CLEAN CONNECTION TO ALL TO USER jack; + +-- Clean all the connections to the gaussdb database. +CLEAN CONNECTION TO ALL FORCE FOR DATABASE gaussdb; + +-- Delete user jack. +DROP USER jack; +``` + diff --git a/content/en/docs/SQLReference/create-foreign-data-wrapper.md b/content/en/docs/SQLReference/create-foreign-data-wrapper.md new file mode 100644 index 000000000..2cd0c9567 --- /dev/null +++ b/content/en/docs/SQLReference/create-foreign-data-wrapper.md @@ -0,0 +1,48 @@ +# CREATE FUNCTION DATA WRAPPER + +## Function Description + +Defines a new foreign data wrapper (FDW). + +## Syntax + +``` +CREATE FOREIGN DATA WRAPPER name + [ HANDLER handler_function | NO HANDLER ] + [ VALIDATOR validator_function | NO VALIDATOR ] + [ OPTIONS ( option 'value' [,...] ) ] +``` + +## Parameter Description + +- **name** + + Specifies the name of an FDW to be created. + +- **HANDLER handler\_function** + + **handler\_function** is the name of the previously registered function that will be called to retrieve the execution function of the foreign table. The handler function cannot contain any parameter, and its return type must be fdw_handler. + + +- **VALIDATOR validator\_function** + + **validator\_function** is the name of the previously registered function that will be called to check the general options of the given FDW, as well as the options for the foreign server and user mapping using the FDW. If no validator function is specified, options are not checked at creation time. (The FDW may ignore or reject invalid option specifications at runtime, depending on the implementation.) The validator function must accept two arguments: one is of type text[], which will contain an array of options stored in the system directory, and the other is of type oid, which will be the oid of the system directory that contains the options. The return type is ignored. The function should report invalid options using the ereport (ERROR) function. + + +- **OPTIONS \(option 'value' \[,...\]\)** + + Specifies options for the new FDW. The allowed option names and values are specific to each FDW and validated using the FDW validator function. The option name must be unique. + + +## Examples + +``` +--Creates a useless FDW named dummy. +openGauss=# CREATE FOREIGN DATA WRAPPER dummy; + +--Use the handler function file_fdw_handler to create an FDW named file. +openGauss=# CREATE FOREIGN DATA WRAPPER file HANDLER file_fdw_handler; + +--Create an FDW named mywrapper. +openGauss=# CREATE FOREIGN DATA WRAPPER mywrapper OPTIONS (debug 'true'); +``` diff --git a/content/en/docs/SQLReference/drop-foreign-data-wrapper.md b/content/en/docs/SQLReference/drop-foreign-data-wrapper.md new file mode 100644 index 000000000..96d5f1186 --- /dev/null +++ b/content/en/docs/SQLReference/drop-foreign-data-wrapper.md @@ -0,0 +1,36 @@ +# DROP FOREIGN DATA WRAPPER + +## Function Description + +Drops a foreign data wrapper (FDW). + +## Syntax + +``` +DROP FOREIGN DATA WRAPPER [ IF EXISTS ] name [ CASCADE | RESTRICT ] +``` + +## Parameter Description + +- **name** + + Specifies the name of an FDW to be dropped. + +- **CASCADE** + + Automatically drops objects (such as servers) that depend on the FDW. + + +- **RESTRICT** + + Refuses to drop the FDW if there is any dependency on the FDW. This option is the default option. + + +## Examples + +``` +--Create an FDW named dbi. +openGauss=# CREATE FOREIGN DATA WRAPPER dbi OPTIONS (debug 'true'); +--Drop dbi. +openGauss=# DROP FOREIGN DATA WRAPPER dbi; +``` diff --git a/content/en/menu/index.md b/content/en/menu/index.md index 665bc4947..6666b0436 100644 --- a/content/en/menu/index.md +++ b/content/en/menu/index.md @@ -899,23 +899,33 @@ headless: true - [Subqueries]({{< relref "./docs/SQLReference/subqueries.md" >}}) - [SQL Syntax]({{< relref "./docs/SQLReference/sql-syntax.md" >}}) - [ABORT]({{< relref "./docs/SQLReference/abort.md" >}}) + - [ALTER AGGREGATE]({{< relref "./docs/SQLReference/alter-aggregate.md" >}}) - [ALTER AUDIT POLICY]({{< relref "./docs/SQLReference/alter-audit-policy.md" >}}) - [ALTER DATABASE]({{< relref "./docs/SQLReference/alter-database.md" >}}) - [ALTER DATA SOURCE]({{< relref "./docs/SQLReference/alter-data-source.md" >}}) - [ALTER DEFAULT PRIVILEGES]({{< relref "./docs/SQLReference/alter-default-privileges.md" >}}) - [ALTER DIRECTORY]({{< relref "./docs/SQLReference/alter-directory.md" >}}) + - [ALTER EXTENSION]({{< relref "./docs/SQLReference/alter-extension.md" >}}) + - [ALTER EVENT]({{< relref "./docs/SQLReference/alter-event.md" >}}) + - [ALTER EVENT TRIGGER]({{< relref "./docs/SQLReference/alter-event-trigger.md" >}}) + - [ALTER FOREIGN DATA WRAPPER]({{< relref "./docs/SQLReference/alter-foreign-data-wrapper.md" >}}) - [ALTER FOREIGN TABLE]({{< relref "./docs/SQLReference/alter-foreign-table.md" >}}) - [ALTER FUNCTION]({{< relref "./docs/SQLReference/alter-function.md" >}}) + - [ALTER GLOBAL CONFIGURATION]({{< relref "./docs/SQLReference/alter-global-configuration.md" >}}) - [ALTER GROUP]({{< relref "./docs/SQLReference/alter-group.md" >}}) - [ALTER INDEX]({{< relref "./docs/SQLReference/alter-index.md" >}}) + - [ALTER LANGUAGE]({{< relref "./docs/SQLReference/alter-language.md" >}}) - [ALTER LARGE OBJECT]({{< relref "./docs/SQLReference/alter-large-object.md" >}}) - [ALTER MASKING POLICY]({{< relref "./docs/SQLReference/alter-masking-policy.md" >}}) - [ALTER MATERIALIZED VIEW]({{< relref "./docs/SQLReference/alter-materialized-view.md" >}}) + - [ALTER OPERATOR]({{< relref "./docs/SQLReference/alter-operator.md" >}}) + - [ALTER PUBLICATION]({{< relref "./docs/SQLReference/alter-publication.md" >}}) + - [ALTER PACKAGE]({{< relref "./docs/SQLReference/alter-package.md" >}}) + - [ALTER PROCEDURE]({{< relref "./docs/SQLReference/alter-procedure.md" >}}) - [ALTER RESOURCE LABEL]({{< relref "./docs/SQLReference/alter-resource-label.md" >}}) - [ALTER RESOURCE POOL]({{< relref "./docs/SQLReference/alter-resource-pool.md" >}}) - [ALTER ROLE]({{< relref "./docs/SQLReference/alter-role.md" >}}) - [ALTER ROW LEVEL SECURITY POLICY]({{< relref "./docs/SQLReference/alter-row-level-security-policy.md" >}}) - - [ALTER RULE]({{< relref "./docs/SQLReference/alter-rule.md" >}}) - [ALTER SCHEMA]({{< relref "./docs/SQLReference/alter-schema.md" >}}) - [ALTER SEQUENCE]({{< relref "./docs/SQLReference/alter-sequence.md" >}}) - [ALTER SERVER]({{< relref "./docs/SQLReference/alter-server.md" >}}) @@ -939,60 +949,47 @@ headless: true - [BEGIN]({{< relref "./docs/SQLReference/begin.md" >}}) - [CALL]({{< relref "./docs/SQLReference/call.md" >}}) - [CHECKPOINT]({{< relref "./docs/SQLReference/checkpoint.md" >}}) + - [CLEAN CONNECTION]({{< relref "./docs/SQLReference/clean-connection.md" >}}) - [CLOSE]({{< relref "./docs/SQLReference/close.md" >}}) - [CLUSTER]({{< relref "./docs/SQLReference/cluster.md" >}}) - [COMMENT]({{< relref "./docs/SQLReference/comment.md" >}}) - [COMMIT | END]({{< relref "./docs/SQLReference/commit-end.md" >}}) - [COMMIT PREPARED]({{< relref "./docs/SQLReference/commit-prepared.md" >}}) - [COPY]({{< relref "./docs/SQLReference/copy.md" >}}) - - [CREATE AUDIT POLICY]({{< relref "./docs/SQLReference/create-audit-policy.md" >}}) - [CREATE AGGREGATE]({{< relref "./docs/SQLReference/create-aggregate.md" >}}) - - [ALTER AGGREGATE]({{< relref "./docs/SQLReference/alter-aggregate.md" >}}) - - [DROP AGGREGATE]({{< relref "./docs/SQLReference/drop-aggregate.md" >}}) - - [CREATE EXTENSION]({{< relref "./docs/SQLReference/create-extension.md" >}}) - - [CREATE EVENT]({{< relref "./docs/SQLReference/create-event.md" >}}) - - [CREATE EVENT TRIGGER]({{< relref "./docs/SQLReference/create-event-trigger.md" >}}) - - [DROP EXTENSION]({{< relref "./docs/SQLReference/drop-extension.md" >}}) - - [DROP EVENT]({{< relref "./docs/SQLReference/drop-event.md" >}}) - - [DROP EVENT TRIGGER]({{< relref "./docs/SQLReference/drop-event-trigger.md" >}}) - - [ALTER EXTENSION]({{< relref "./docs/SQLReference/alter-extension.md" >}}) - - [ALTER EVENT]({{< relref "./docs/SQLReference/alter-event.md" >}}) - - [ALTER EVENT TRIGGER]({{< relref "./docs/SQLReference/alter-event-trigger.md" >}}) - - [ALTER GLOBAL CONFIGURATION]({{< relref "./docs/SQLReference/alter-global-configuration.md" >}}) + - [CREATE AUDIT POLICY]({{< relref "./docs/SQLReference/create-audit-policy.md" >}}) - [CREATE CAST]({{< relref "./docs/SQLReference/create-cast.md" >}}) - - [DROP CAST]({{< relref "./docs/SQLReference/drop-cast.md" >}}) - - [CREATE OPERATOR]({{< relref "./docs/SQLReference/create-operator.md" >}}) - - [DROP OPERATOR]({{< relref "./docs/SQLReference/drop-operator.md" >}}) - - [ALTER OPERATOR]({{< relref "./docs/SQLReference/alter-operator.md" >}}) - - [ALTER PUBLICATION]({{< relref "./docs/SQLReference/alter-publication.md" >}}) - - [ALTER PACKAGE]({{< relref "./docs/SQLReference/alter-package.md" >}}) - - [Create Publication]({{< relref "./docs/SQLReference/create-publication.md" >}}) - - [CREATE LANGUAGE]({{< relref "./docs/SQLReference/create-language.md" >}}) - - [ALTER LANGUAGE]({{< relref "./docs/SQLReference/alter-language.md" >}}) - - [DROP LANGUAGE]({{< relref "./docs/SQLReference/drop-language.md" >}}) - [CREATE CLIENT MASTER KEY]({{< relref "./docs/SQLReference/create-client-master-key.md" >}}) - [CREATE COLUMN ENCRYPTION KEY]({{< relref "./docs/SQLReference/create-column-encryption-key.md" >}}) - [CREATE DATABASE]({{< relref "./docs/SQLReference/create-database.md" >}}) - [CREATE DATA SOURCE]({{< relref "./docs/SQLReference/create-data-source.md" >}}) - [CREATE DIRECTORY]({{< relref "./docs/SQLReference/create-directory.md" >}}) + - [CREATE EXTENSION]({{< relref "./docs/SQLReference/create-extension.md" >}}) + - [CREATE EVENT]({{< relref "./docs/SQLReference/create-event.md" >}}) + - [CREATE EVENT TRIGGER]({{< relref "./docs/SQLReference/create-event-trigger.md" >}}) + - [CREATE FOREIGN DATA WRAPPER]({{< relref "./docs/SQLReference/create-foreign-data-wrapper.md" >}}) - [CREATE FOREIGN TABLE]({{< relref "./docs/SQLReference/create-foreign-table.md" >}}) - [CREATE FUNCTION]({{< relref "./docs/SQLReference/create-function.md" >}}) - [CREATE GROUP]({{< relref "./docs/SQLReference/create-group.md" >}}) - - [CREATE INDEX]({{< relref "./docs/SQLReference/create-index.md" >}}) - [CREATE INCREMENTAL MATERIALIZED VIEW]({{< relref "./docs/SQLReference/create-incremental-materialized-view.md" >}}) + - [CREATE INDEX]({{< relref "./docs/SQLReference/create-index.md" >}}) + - [CREATE LANGUAGE]({{< relref "./docs/SQLReference/create-language.md" >}}) - [CREATE MASKING POLICY]({{< relref "./docs/SQLReference/create-masking-policy.md" >}}) - [CREATE MATERIALIZED VIEW]({{< relref "./docs/SQLReference/create-materialized-view.md" >}}) - [CREATE MODEL]({{< relref "./docs/SQLReference/create-model.md" >}}) + - [CREATE OPERATOR]({{< relref "./docs/SQLReference/create-operator.md" >}}) - [CREATE PACKAGE]({{< relref "./docs/SQLReference/create-package.md" >}}) - [CREATE PROCEDURE]({{< relref "./docs/SQLReference/create-procedure.md" >}}) - - [CREATE ROW LEVEL SECURITY POLICY]({{< relref "./docs/SQLReference/create-row-level-security-policy.md" >}}) + - [CREATE PUBLICATION]({{< relref "./docs/SQLReference/create-publication.md" >}}) - [CREATE RESOURCE LABEL]({{< relref "./docs/SQLReference/create-resource-label.md" >}}) - [CREATE RESOURCE POOL]({{< relref "./docs/SQLReference/create-resource-pool.md" >}}) - [CREATE ROLE]({{< relref "./docs/SQLReference/create-role.md" >}}) + - [CREATE ROW LEVEL SECURITY POLICY]({{< relref "./docs/SQLReference/create-row-level-security-policy.md" >}}) - [CREATE RULE]({{< relref "./docs/SQLReference/create-rule.md" >}}) - [CREATE SCHEMA]({{< relref "./docs/SQLReference/create-schema.md" >}}) - [CREATE SEQUENCE]({{< relref "./docs/SQLReference/create-sequence.md" >}}) - [CREATE SERVER]({{< relref "./docs/SQLReference/create-server.md" >}}) + - [CREATE SUBSCRIPTION]({{< relref "./docs/SQLReference/create-subscription.md" >}}) - [CREATE SYNONYM]({{< relref "./docs/SQLReference/create-synonym.md" >}}) - [CREATE TABLE]({{< relref "./docs/SQLReference/create-table.md" >}}) - [CREATE TABLE AS]({{< relref "./docs/SQLReference/create-table-as.md" >}}) @@ -1013,30 +1010,41 @@ headless: true - [DELETE]({{< relref "./docs/SQLReference/delete.md" >}}) - [DO]({{< relref "./docs/SQLReference/do.md" >}}) - [DELIMITER]({{< relref "./docs/SQLReference/delimiter.md" >}}) + - [DROP AGGREGATE]({{< relref "./docs/SQLReference/drop-aggregate.md" >}}) - [DROP AUDIT POLICY]({{< relref "./docs/SQLReference/drop-audit-policy.md" >}}) + - [DROP CAST]({{< relref "./docs/SQLReference/drop-cast.md" >}}) - [DROP CLIENT MASTER KEY]({{< relref "./docs/SQLReference/drop-client-master-key.md" >}}) - [DROP COLUMN ENCRYPTION KEY]({{< relref "./docs/SQLReference/drop-column-encryption-key.md" >}}) - [DROP DATABASE]({{< relref "./docs/SQLReference/drop-database.md" >}}) - [DROP DATA SOURCE]({{< relref "./docs/SQLReference/drop-data-source.md" >}}) - [DROP DIRECTORY]({{< relref "./docs/SQLReference/drop-directory.md" >}}) + - [DROP EXTENSION]({{< relref "./docs/SQLReference/drop-extension.md" >}}) + - [DROP EVENT]({{< relref "./docs/SQLReference/drop-event.md" >}}) + - [DROP EVENT TRIGGER]({{< relref "./docs/SQLReference/drop-event-trigger.md" >}}) + - [DROP FOREIGN DATA WRAPPER]({{< relref "./docs/SQLReference/drop-foreign-data-wrapper.md" >}}) - [DROP FOREIGN TABLE]({{< relref "./docs/SQLReference/drop-foreign-table.md" >}}) - [DROP FUNCTION]({{< relref "./docs/SQLReference/drop-function.md" >}}) + - [DROP GLOBAL CONFIGURATION]({{< relref "./docs/SQLReference/drop-global-configuration.md" >}}) - [DROP GROUP]({{< relref "./docs/SQLReference/drop-group.md" >}}) - [DROP INDEX]({{< relref "./docs/SQLReference/drop-index.md" >}}) + - [DROP LANGUAGE]({{< relref "./docs/SQLReference/drop-language.md" >}}) - [DROP MASKING POLICY]({{< relref "./docs/SQLReference/drop-masking-policy.md" >}}) - [DROP MATERIALIZED VIEW]({{< relref "./docs/SQLReference/drop-materialized-view.md" >}}) - [DROP MODEL]({{< relref "./docs/SQLReference/drop-model.md" >}}) + - [DROP OPERATOR]({{< relref "./docs/SQLReference/drop-operator.md" >}}) - [DROP OWNED]({{< relref "./docs/SQLReference/drop-owned.md" >}}) - [DROP PACKAGE]({{< relref "./docs/SQLReference/drop-package.md" >}}) - [DROP PROCEDURE]({{< relref "./docs/SQLReference/drop-procedure.md" >}}) - [DROP RESOURCE LABEL]({{< relref "./docs/SQLReference/drop-resource-label.md" >}}) - [DROP RESOURCE POOL]({{< relref "./docs/SQLReference/drop-resource-pool.md" >}}) - - [DROP ROW LEVEL SECURITY POLICY]({{< relref "./docs/SQLReference/drop-row-level-security-policy.md" >}}) - [DROP ROLE]({{< relref "./docs/SQLReference/drop-role.md" >}}) + - [DROP ROW LEVEL SECURITY POLICY]({{< relref "./docs/SQLReference/drop-row-level-security-policy.md" >}}) - [DROP RULE]({{< relref "./docs/SQLReference/drop-rule.md" >}}) + - [DROP PUBLICATION]({{< relref "./docs/SQLReference/drop-publication.md" >}}) - [DROP SCHEMA]({{< relref "./docs/SQLReference/drop-schema.md" >}}) - [DROP SEQUENCE]({{< relref "./docs/SQLReference/drop-sequence.md" >}}) - [DROP SERVER]({{< relref "./docs/SQLReference/drop-server.md" >}}) + - [DROP SUBSCRIPTION]({{< relref "./docs/SQLReference/drop-subscription.md" >}}) - [DROP SYNONYM]({{< relref "./docs/SQLReference/drop-synonym.md" >}}) - [DROP TABLE]({{< relref "./docs/SQLReference/drop-table.md" >}}) - [DROP TABLESPACE]({{< relref "./docs/SQLReference/drop-tablespace.md" >}}) @@ -1049,28 +1057,29 @@ headless: true - [DROP VIEW]({{< relref "./docs/SQLReference/drop-view.md" >}}) - [DROP WEAK PASSWORD DICTIONARY]({{< relref "./docs/SQLReference/drop-weak-password-dictionary.md" >}}) - [EXECUTE]({{< relref "./docs/SQLReference/execute.md" >}}) + - [EXECUTE DIRECT]({{< relref "./docs/SQLReference/execute-direct.md" >}}) - [EXPLAIN]({{< relref "./docs/SQLReference/explain.md" >}}) - [EXPLAIN PLAN]({{< relref "./docs/SQLReference/explain-plan.md" >}}) - [FETCH]({{< relref "./docs/SQLReference/fetch.md" >}}) - [GRANT]({{< relref "./docs/SQLReference/grant.md" >}}) - [INSERT]({{< relref "./docs/SQLReference/insert.md" >}}) - [LOCK]({{< relref "./docs/SQLReference/lock.md" >}}) - - [MOVE]({{< relref "./docs/SQLReference/move.md" >}}) - [MERGE INTO]({{< relref "./docs/SQLReference/merge-into.md" >}}) - - [PURGE]({{< relref "./docs/SQLReference/purge.md" >}}) + - [MOVE]({{< relref "./docs/SQLReference/move.md" >}}) + - [PREDICT BY]({{< relref "./docs/SQLReference/predict-by.md" >}}) - [PREPARE]({{< relref "./docs/SQLReference/prepare.md" >}}) - [PREPARE TRANSACTION]({{< relref "./docs/SQLReference/prepare-transaction.md" >}}) + - [PURGE]({{< relref "./docs/SQLReference/purge.md" >}}) - [REASSIGN OWNED]({{< relref "./docs/SQLReference/reassign-owned.md" >}}) - - [REINDEX]({{< relref "./docs/SQLReference/reindex.md" >}}) - - [RELEASE SAVEPOINT]({{< relref "./docs/SQLReference/release-savepoint.md" >}}) - [REFRESH INCREMENTAL MATERIALIZED VIEW]({{< relref "./docs/SQLReference/refresh-incremental-materialized-view.md" >}}) - [REFRESH MATERIALIZED VIEW]({{< relref "./docs/SQLReference/refresh-materialized-view.md" >}}) + - [REINDEX]({{< relref "./docs/SQLReference/reindex.md" >}}) + - [RELEASE SAVEPOINT]({{< relref "./docs/SQLReference/release-savepoint.md" >}}) - [RESET]({{< relref "./docs/SQLReference/reset.md" >}}) - [REVOKE]({{< relref "./docs/SQLReference/revoke.md" >}}) - [ROLLBACK]({{< relref "./docs/SQLReference/rollback.md" >}}) - [ROLLBACK PREPARED]({{< relref "./docs/SQLReference/rollback-prepared.md" >}}) - [ROLLBACK TO SAVEPOINT]({{< relref "./docs/SQLReference/rollback-to-savepoint.md" >}}) - - [PREDICT BY]({{< relref "./docs/SQLReference/predict-by.md" >}}) - [SAVEPOINT]({{< relref "./docs/SQLReference/savepoint.md" >}}) - [SELECT]({{< relref "./docs/SQLReference/select.md" >}}) - [SELECT INTO]({{< relref "./docs/SQLReference/select-into.md" >}}) @@ -1090,13 +1099,6 @@ headless: true - [VACUUM]({{< relref "./docs/SQLReference/vacuum.md" >}}) - [VALUES]({{< relref "./docs/SQLReference/values.md" >}}) - [SHRINK]({{< relref "./docs/SQLReference/shrink.md" >}}) - - [EXECUTE DIRECT]({{< relref "./docs/SQLReference/execute-direct.md" >}}) - - [Create Subscription]({{< relref "./docs/SQLReference/create-subscription.md" >}}) - - [Drop Publication]({{< relref "./docs/SQLReference/drop-publication.md" >}}) - - [Drop Subscription]({{< relref "./docs/SQLReference/drop-subscription.md" >}}) - - [Alter Procedure]({{< relref "./docs/SQLReference/alter-procedure.md" >}}) - - [Alter GlobalConfiguration]({{< relref "./docs/SQLReference/alter-global-configuration.md" >}}) - - [Drop Global Configuration]({{< relref "./docs/SQLReference/drop-global-configuration.md" >}}) - [Data Types]({{< relref "./docs/SQLReference/data-types.md" >}}) - [Numeric Types]({{< relref "./docs/SQLReference/numeric-types.md" >}}) - [Monetary Types]({{< relref "./docs/SQLReference/monetary-types.md" >}}) @@ -1679,7 +1681,7 @@ headless: true - [Parameters Related to cm\_server]({{< relref "./docs/DatabaseReference/parameters-related-to-cm_server.md" >}}) - [Upgrade Parameters]({{< relref "./docs/DatabaseReference/upgrade-parameters.md" >}}) - [Miscellaneous Parameters]({{< relref "./docs/DatabaseReference/miscellaneous-parameters.md" >}}) - - [Wait Events]({{< relref "./docs/DatabaseReference/wait_events.md" >}}) + - [Wait Events]({{< relref "./docs/DatabaseReference/wait-events.md" >}}) - [Query]({{< relref "./docs/DatabaseReference/query-62.md" >}}) - [System Performance Snapshot]({{< relref "./docs/DatabaseReference/system-performance-snapshot.md" >}}) - [Security Configuration]({{< relref "./docs/DatabaseReference/security-configuration.md" >}}) @@ -1700,6 +1702,7 @@ headless: true - [Parameters Related to Efficient Data Compression Algorithms]({{< relref "./docs/DatabaseReference/parameters-related-to-efficient-data-compression-algorithms.md" >}}) - [System Catalogs and System Views]({{< relref "./docs/DatabaseReference/system-catalogs-and-system-views.md" >}}) - [Overview]({{< relref "./docs/DatabaseReference/overview-of-system-catalogs-and-system-views.md" >}}) + - [Querying a System Catalog]({{< relref "./docs/DatabaseReference/querying-a-system-catalog.md" >}}) - [System Catalogs]({{< relref "./docs/DatabaseReference/system-catalogs.md" >}}) -   [GS\_ASP]({{< relref "./docs/DatabaseReference/gs_asp.md" >}}) -   [GS\_AUDITING\_POLICY\_ACCESS]({{< relref "./docs/DatabaseReference/gs_auditing_policy_access.md" >}}) -- Gitee From b32e5eb2b122106bd84d5bab74d33495328b986f Mon Sep 17 00:00:00 2001 From: freyaqqianjin Date: Wed, 26 Apr 2023 17:53:42 +0800 Subject: [PATCH 5/7] fix index --- content/docs-lite/en/menu/index.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/content/docs-lite/en/menu/index.md b/content/docs-lite/en/menu/index.md index 52c6d3c90..dbd4402c8 100644 --- a/content/docs-lite/en/menu/index.md +++ b/content/docs-lite/en/menu/index.md @@ -124,11 +124,6 @@ headless: true - [Typical Networking]({{< relref "./docs/TechnicalWhitePaper/typical-networking.md" >}}) - [Hardware and Software Configuration Requirements]({{< relref "./docs/TechnicalWhitePaper/hardware-and-software-configuration-requirements.md" >}}) - [Core Database Technologies]({{< relref "./docs/TechnicalWhitePaper/core-database-technologies.md" >}}) - - [Basic Functions Oriented to Application Development]({{< relref "./docs/TechnicalWhitePaper/basic-functions-oriented-to-application-development.md" >}}) - - [High Performance]({{< relref "./docs/TechnicalWhitePaper/high-performance.md" >}}) - - [High Availability]({{< relref "./docs/TechnicalWhitePaper/high-availability.md" >}}) - - [Maintainability]({{< relref "./docs/TechnicalWhitePaper/maintainability.md" >}}) - - [Database Security]({{< relref "./docs/TechnicalWhitePaper/database-security.md" >}}) - [Technical Specifications]({{< relref "./docs/TechnicalWhitePaper/technical-specifications.md" >}}) - [Getting Started]({{< relref "./docs/GettingStarted/GettingStarted.md" >}}) -- Gitee From b9cf5990fbd1bb7de61210f9fb1ebfabd608138a Mon Sep 17 00:00:00 2001 From: freyaqqianjin Date: Wed, 26 Apr 2023 18:57:18 +0800 Subject: [PATCH 6/7] fix bugs --- content/docs-lite/en/docs/DataBaseReference/.keep | 0 content/docs-lite/en/docs/DatabaseAdministrationGuide/.keep | 0 content/docs-lite/en/docs/DatabaseOMGuide/.keep | 0 content/docs-lite/en/docs/Developerguide/.keep | 0 content/docs-lite/en/docs/GettingStarted/.keep | 0 content/docs-lite/en/docs/PerformanceTuningGuide/.keep | 0 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/docs-lite/en/docs/DataBaseReference/.keep delete mode 100644 content/docs-lite/en/docs/DatabaseAdministrationGuide/.keep delete mode 100644 content/docs-lite/en/docs/DatabaseOMGuide/.keep delete mode 100644 content/docs-lite/en/docs/Developerguide/.keep delete mode 100644 content/docs-lite/en/docs/GettingStarted/.keep delete mode 100644 content/docs-lite/en/docs/PerformanceTuningGuide/.keep diff --git a/content/docs-lite/en/docs/DataBaseReference/.keep b/content/docs-lite/en/docs/DataBaseReference/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/docs-lite/en/docs/DatabaseAdministrationGuide/.keep b/content/docs-lite/en/docs/DatabaseAdministrationGuide/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/docs-lite/en/docs/DatabaseOMGuide/.keep b/content/docs-lite/en/docs/DatabaseOMGuide/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/docs-lite/en/docs/Developerguide/.keep b/content/docs-lite/en/docs/Developerguide/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/docs-lite/en/docs/GettingStarted/.keep b/content/docs-lite/en/docs/GettingStarted/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/docs-lite/en/docs/PerformanceTuningGuide/.keep b/content/docs-lite/en/docs/PerformanceTuningGuide/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 994508eb3a1d5e3bbaad8ff5998973a7fdbfa89d Mon Sep 17 00:00:00 2001 From: freyaqqianjin Date: Thu, 27 Apr 2023 16:33:05 +0800 Subject: [PATCH 7/7] fix bug --- ci-test.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 ci-test.sh diff --git a/ci-test.sh b/ci-test.sh new file mode 100644 index 000000000..bf3a9b96b --- /dev/null +++ b/ci-test.sh @@ -0,0 +1,13 @@ +mkdir -p ./website/zh/docs/version +mkdir -p ./website/en/docs/version +cp -rf ./content/zh/* ./website/zh/docs/version +cp -rf ./content/en/* ./website/en/docs/version +if [ -d "./content/docs-lite" ]; then + mkdir -p ./website/zh/docs/version-lite + mkdir -p ./website/en/docs/version-lite + cp -rf ./content/docs-lite/zh/* ./website/zh/docs/version-lite + cp -rf ./content/docs-lite/en/* ./website/en/docs/version-lite +fi +rm -rf ./content +mv ./website ./content +hugo -D \ No newline at end of file -- Gitee