diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9d042118c..e79696ec8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,28 +1,41 @@ --- -name: SQL Parser Error +name: @ SQL Parser Error about: Create a report to help us improve -title: 'JSQLParser Version : RDBMS : failing feature description' +title: '[BUG] JSQLParser Version : RDBMS : failing feature description' labels: 'Parser Error', 'Feature Request', 'Documentation', 'Java API', 'RDBMS support' assignees: '' --- -**Failing SQL Feature** + + +### Failing SQL Feature: + -**SQL Example** +### SQL Example: + -**Software Information** +### Software Information: + -**Tips** +### Tips: + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..9003b51e1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,31 @@ +--- +name: Feature request +about: Suggest an unsupported Statement or Expression +title: "[FEATURE] missing feature description" +labels: '' +assignees: '' + +--- + +### Grammar or Syntax Description +- Brief description of the failing SQL feature and the EBNF +- Example: `WITH ROLLUP` clause is not supported yet + +### SQL Example +- Simplified Query Example, focusing on the failing feature + ```sql + -- Replace with your ACTUAL example + select 1 + from dual + ``` +- Please don't send screen shots + +### Additional context +The used JSQLParser Version (please test the latest SNAPSHOT version before submitting). +State the applicable RDBMS and version +Links to the reference documentation + +### Tips: + diff --git a/.github/ISSUE_TEMPLATE/sql-parser-error.md b/.github/ISSUE_TEMPLATE/sql-parser-error.md new file mode 100644 index 000000000..7edb1a456 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/sql-parser-error.md @@ -0,0 +1,31 @@ +--- +name: SQL Parser Error +about: Report a Parser Error +title: "[BUG] JSQLParser Version : RDBMS : failing feature description" +labels: '' +assignees: '' + +--- + +Always check against the **Latest SNAPSHOT of JSQLParser** and the [Syntax Diagram](https://jsqlparser.github.io/JSqlParser/syntax.html) + +### Failing SQL Feature: +- Brief description of the failing SQL feature +- Example: `WITH ROLLUP` can't be parsed + +### SQL Example: +- Simplified Query Example, focusing on the failing feature + ```sql + -- Replace with your ACTUAL example + select 1 + from dual + ``` + +### Software Information: +- JSqlParser version +- Database (e. g. Oracle, MS SQL Server, H2, PostgreSQL, IBM DB2 ) + +### Tips: +Please write in English and avoid Screenshots (as we can't copy and paste content from it). +[Try your example online with the latest JSQLParser](http://217.160.215.75:8080/jsqlformatter/demo.html) and share the link in the error report. +Do provide Links or References to the specific Grammar and Syntax you are trying to use. diff --git a/README.md b/README.md index 07479a539..7d8d0e68e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# JSqlParser +# [JSqlParser (4.5 Stable or 4.6 Snapshot)](https://jsqlparser.github.io/JSqlParser) drawing ![Build Status](https://github.com/JSQLParser/JSqlParser/actions/workflows/maven.yml/badge.svg) @@ -9,127 +9,63 @@ [![Gitter](https://badges.gitter.im/JSQLParser/JSqlParser.svg)](https://gitter.im/JSQLParser/JSqlParser?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -Look here for more information and examples: https://github.com/JSQLParser/JSqlParser/wiki. - -## License - -JSqlParser is dual licensed under **LGPL V2.1** or **Apache Software License, Version 2.0**. - -## Discussion - -Please provide feedback on: - -* API changes: extend visitor with return values (https://github.com/JSQLParser/JSqlParser/issues/901) - -## News -* Released version **4.5** of JSqlParser -* The array parsing is the default behaviour. Square bracket quotation has to be enabled using - a parser flag (**CCJSqlParser.withSquareBracketQuotation**). -* due to an API change the version will be 3.0 -* JSqlParser uses now Java 8 at the minimum - -More news can be found here: https://github.com/JSQLParser/JSqlParser/wiki/News. - -## Alternatives to JSqlParser? -[**General SQL Parser**](http://www.sqlparser.com/features/introduce.php?utm_source=github-jsqlparser&utm_medium=text-general) looks pretty good, with extended SQL syntax (like PL/SQL and T-SQL) and java + .NET APIs. The tool is commercial (license available online), with a free download option. - -## JSqlParser - -JSqlParser is a SQL statement parser. It translates SQLs in a traversable hierarchy of Java classes. JSqlParser is not limited to one database but provides support for a lot of specials of Oracle, SqlServer, MySQL, PostgreSQL ... To name some, it has support for Oracles join syntax using (+), PostgreSQLs cast syntax using ::, relational operators like != and so on. - -## Support -If you need help using JSqlParser feel free to file an issue or contact me. - -## Contributions -To help JSqlParser's development you are encouraged to provide -* feedback -* bugreports -* pull requests for new features -* improvement requests -* fund new features or sponsor JSqlParser ([**Sponsor**](https://www.paypal.me/wumpz)) - -**Please write in English, since it's the language most of the dev team knows.** +## Summary -Any requests for examples or any particular documentation will be most welcome. +Please visit the [WebSite](https://jsqlparser.github.io/JSqlParser). **JSqlParser** is a RDBMS agnostic SQL statement parser. It translates SQL statements into a traversable hierarchy of Java classes (see [Samples](https://jsqlparser.github.io/JSqlParser/usage.html#parse-a-sql-statements)): -## Extensions in the latest SNAPSHOT version 4.6 - -* support for named windows in window expressions: `SELECT sum(c) OVER winName FROM mytable WINDOW winName AS (PARTITION BY pcol)` +```sql +SELECT 1 FROM dual WHERE a = b +``` -Additionally, we have fixed many errors and improved the code quality and the test coverage. +```text + SQL Text + └─Statements: net.sf.jsqlparser.statement.select.Select + └─selectBody: net.sf.jsqlparser.statement.select.PlainSelect + ├─selectItems -> Collection + │ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem + │ └─LongValue: 1 + ├─Table: dual + └─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo + ├─Column: a + └─Column: b +``` -## Extensions of JSqlParser releases +```java +Statement statement = CCJSqlParserUtil.parse(sqlStr); +if (statement instanceof Select) { + Select select = (Select) statement; + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); -* [Release Notes](https://github.com/JSQLParser/JSqlParser/releases) -* Modifications before GitHub's release tagging are listed in the [Older Releases](https://github.com/JSQLParser/JSqlParser/wiki/Older-Releases) page. + SelectExpressionItem selectExpressionItem = + (SelectExpressionItem) plainSelect.getSelectItems().get(0); -## Building from the sources + Table table = (Table) plainSelect.getFromItem(); -As the project is a Maven project, building is rather simple by running: -```shell -mvn package + EqualsTo equalsTo = (EqualsTo) plainSelect.getWhere(); + Column a = (Column) equalsTo.getLeftExpression(); + Column b = (Column) equalsTo.getRightExpression(); +} ``` -Since 4.2, alternatively Gradle can be used -```shell -gradle build -``` - -The project requires the following to build: -- Maven (or Gradle) -- JDK 8 or later. The JAR will target JDK 8, but the version of the maven-compiler-plugin that JSqlParser uses requires JDK 8+ +## [Supported Grammar and Syntax](https://jsqlparser.github.io/JSqlParser/syntax.html) -This will produce the jsqlparser-VERSION.jar file in the `target/` directory (`build/libs/jsqlparser-VERSION.jar` in case of Gradle). +**JSqlParser** aims to support the SQL standard as well as all major RDBMS. Any missing syntax or features can be added on demand. -**To build this project without using Maven or Gradle, one has to build the parser by JavaCC using the CLI options it provides.** +| RDBMS | Statements | +|------------------------------------|-----------------------------------------| +| Oracle
MS SQL Server and Sybase
PostgreSQL
MySQL and MariaDB
DB2
H2 and HSQLDB and Derby
SQLite| `SELECT`
`INSERT`, `UPDATE`, `UPSERT`, `MERGE`
`DELETE`, `TRUNCATE TABLE`
`CREATE ...`, `ALTER ....`, `DROP ...`
`WITH ...` | -## Debugging through problems -Refer to the [Visualize Parsing](https://github.com/JSQLParser/JSqlParser/wiki/Examples-of-SQL-parsing#visualize-parsing) section to learn how to run the parser in debug mode. +**JSqlParser** can also be used to create SQL Statements from Java Code with a fluent API (see [Samples](https://jsqlparser.github.io/JSqlParser/usage.html#build-a-sql-statements)). -## Source Code conventions +## [Documentation](https://jsqlparser.github.io/JSqlParser) -Recently a checkstyle process was integrated into the build process. JSqlParser follows the sun java format convention. There are no TABs allowed. Use spaces. +### [Samples](https://jsqlparser.github.io/JSqlParser/usage.html#parse-a-sql-statements) +### [Build Instructions](https://jsqlparser.github.io/JSqlParser/usage.html) +### [Contribution](https://jsqlparser.github.io/JSqlParser/contribution.html) +### [Change Log](https://jsqlparser.github.io/JSqlParser/changelog.html#latest-changes-since-jsqlparser-version) +### [Issues](https://github.com/JSQLParser/JSqlParser/issues) -```java -public void setUsingSelect(SubSelect usingSelect) { - this.usingSelect = usingSelect; - if (this.usingSelect != null) { - this.usingSelect.setUseBrackets(false); - } -} -``` - -This is a valid piece of source code: -* blocks without braces are not allowed -* after control statements (if, while, for) a whitespace is expected -* the opening brace should be in the same line as the control statement - -## Maven Repository - -JSQLParser is deployed at Sonatype open source maven repository. -Starting from now I will deploy there. The first snapshot version there will be 0.8.5-SNAPSHOT. -To use it this is the repository configuration: - -```xml - - - jsqlparser-snapshots - - true - - https://oss.sonatype.org/content/groups/public/ - - -``` -These repository releases will be synchronised to Maven Central. Snapshots remain at Sonatype. - -And this is the dependency declaration in your pom: -```xml - - com.github.jsqlparser - jsqlparser - 4.5 - -``` +## License +**JSqlParser** is dual licensed under **LGPL V2.1** or **Apache Software License, Version 2.0**. diff --git a/build.gradle b/build.gradle index 032a90e43..7a678bab7 100644 --- a/build.gradle +++ b/build.gradle @@ -8,9 +8,10 @@ plugins { id "ca.coglinc2.javacc" version "latest.release" id 'jacoco' id "com.github.spotbugs" version "latest.release" + id "com.diffplug.spotless" version "latest.release" id 'pmd' id 'checkstyle' - + // download the RR tools which have no Maven Repository id "de.undercouch.download" version "latest.release" @@ -48,7 +49,7 @@ def getVersion = { boolean considerSnapshot -> patch = matcher[0][3] commit = matcher[0][4] - if (considerSnapshot && os.toString().trim().endsWith("-SNAPSHOT")) { + if (considerSnapshot) { minor++ snapshot = "-SNAPSHOT" } @@ -98,6 +99,7 @@ java { } test { + environment = [ 'EXPORT_TEST_TO_FILE': 'True' ] useJUnitPlatform() // set heap size for the test JVM(s) @@ -200,23 +202,23 @@ spotbugsMain { spotbugs { // fail only on P1 and without the net.sf.jsqlparser.parser.* excludeFilter = file("config/spotbugs/spotBugsExcludeFilter.xml") - + // do not run over the test, although we should do that eventually - spotbugsTest.enabled = false + spotbugsTest.enabled = false } pmd { consoleOutput = false //toolVersion = "6.46.0" - + sourceSets = [sourceSets.main] - + // clear the ruleset in order to use configured rules only ruleSets = [] - + //rulesMinimumPriority = 1 ruleSetFiles = files("config/pmd/ruleset.xml") - + pmdMain { excludes = [ "build/generated/*" @@ -229,6 +231,25 @@ checkstyle { configFile =rootProject.file('config/checkstyle/checkstyle.xml') } +spotless { + // optional: limit format enforcement to just the files changed by this feature branch + ratchetFrom 'origin/master' + + format 'misc', { + // define the files to apply `misc` to + target '*.gradle', '*.md', '.gitignore' + + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces(4) // or spaces. Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + indentWithSpaces(4) + eclipse().configFile('config/formatter/eclipse-java-google-style.xml') + } +} + tasks.withType(Checkstyle) { reports { xml.required = false @@ -239,7 +260,7 @@ tasks.withType(Checkstyle) { task renderRR() { dependsOn(compileJavacc) doLast { - // these WAR files have been provided as a courtesy by Gunther Rademacher + // these WAR files have been provided as a courtesy by Gunther Rademacher // and belong to the RR - Railroad Diagram Generator Project // https://github.com/GuntherRademacher/rr // @@ -293,6 +314,9 @@ task gitChangelogTask(type: GitChangelogTask) { file = new File("${projectDir}/src/site/sphinx/changelog.rst") fromRef = "4.0" //toRef = "1.1"; + + // switch off the formatter since the indentation matters for Mark-down + // @formatter:off templateContent =""" ************************ Changelog @@ -321,6 +345,7 @@ Version {{name}} {{/issues}} {{/tags}} """ + // @formatter:on } task updateKeywords(type: JavaExec) { @@ -340,8 +365,8 @@ task sphinx(type: Exec) { dependsOn(gitChangelogTask, renderRR, updateKeywords) String PROLOG = """ -.. |_| unicode:: U+00A0 - :trim: +.. |_| unicode:: U+00A0 + :trim: .. |JSQLPARSER_EMAIL| replace:: support@manticore-projects.com .. |JSQLPARSER_VERSION| replace:: ${getVersion(false)} diff --git a/config/formatter/eclipse-java-google-style.xml b/config/formatter/eclipse-java-google-style.xml index 39ada243e..bb335f000 100644 --- a/config/formatter/eclipse-java-google-style.xml +++ b/config/formatter/eclipse-java-google-style.xml @@ -167,7 +167,7 @@ - + @@ -241,7 +241,7 @@ - + diff --git a/pom.xml b/pom.xml index 59b02568e..cde3a08c9 100644 --- a/pom.xml +++ b/pom.xml @@ -391,6 +391,50 @@ + + com.diffplug.spotless + spotless-maven-plugin + 2.28.0 + + + origin/master + + + + + + *.md + .gitignore + + + + + + true + 4 + + + + + + + + src/main/java/**/*.java + src/test/java/**/*.java + + + + + + + + config/formatter/eclipse-java-google-style.xml + + + + + + diff --git a/src/main/java/net/sf/jsqlparser/expression/StringValue.java b/src/main/java/net/sf/jsqlparser/expression/StringValue.java index 6c8c2f401..743efea46 100644 --- a/src/main/java/net/sf/jsqlparser/expression/StringValue.java +++ b/src/main/java/net/sf/jsqlparser/expression/StringValue.java @@ -23,7 +23,8 @@ public final class StringValue extends ASTNodeAccessImpl implements Expression { private String value = ""; private String prefix = null; - public static final List ALLOWED_PREFIXES = Arrays.asList("N", "U", "E", "R", "B", "RB", "_utf8"); + public static final List ALLOWED_PREFIXES = + Arrays.asList("N", "U", "E", "R", "B", "RB", "_utf8", "Q"); public StringValue() { // empty constructor @@ -31,14 +32,16 @@ public StringValue() { public StringValue(String escapedValue) { // removing "'" at the start and at the end - if (escapedValue.length() >= 2 && escapedValue.startsWith("'") && escapedValue.endsWith("'")) { + if (escapedValue.length() >= 2 && escapedValue.startsWith("'") + && escapedValue.endsWith("'")) { value = escapedValue.substring(1, escapedValue.length() - 1); return; } if (escapedValue.length() > 2) { for (String p : ALLOWED_PREFIXES) { - if (escapedValue.length() > p.length() && escapedValue.substring(0, p.length()).equalsIgnoreCase(p) + if (escapedValue.length() > p.length() + && escapedValue.substring(0, p.length()).equalsIgnoreCase(p) && escapedValue.charAt(p.length()) == '\'') { this.prefix = p; value = escapedValue.substring(p.length() + 1, escapedValue.length() - 1); diff --git a/src/main/java/net/sf/jsqlparser/statement/create/view/AutoRefreshOption.java b/src/main/java/net/sf/jsqlparser/statement/create/view/AutoRefreshOption.java new file mode 100644 index 000000000..ba33f18c9 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/create/view/AutoRefreshOption.java @@ -0,0 +1,18 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.create.view; + +public enum AutoRefreshOption { + NONE, + + YES, + + NO +} diff --git a/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java b/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java index 9926cd008..a623beb41 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java @@ -29,6 +29,7 @@ public class CreateView implements Statement { private boolean materialized = false; private ForceOption force = ForceOption.NONE; private TemporaryOption temp = TemporaryOption.NONE; + private AutoRefreshOption autoRefresh = AutoRefreshOption.NONE; private boolean withReadOnly = false; private boolean ifNotExists = false; @@ -96,6 +97,14 @@ public void setTemporary(TemporaryOption temp) { this.temp = temp; } + public AutoRefreshOption getAutoRefresh() { + return autoRefresh; + } + + public void setAutoRefresh(AutoRefreshOption autoRefresh) { + this.autoRefresh = autoRefresh; + } + public boolean isWithReadOnly() { return withReadOnly; } @@ -118,16 +127,7 @@ public String toString() { if (isOrReplace()) { sql.append("OR REPLACE "); } - switch (force) { - case FORCE: - sql.append("FORCE "); - break; - case NO_FORCE: - sql.append("NO FORCE "); - break; - default: - // nothing - } + appendForceOptionIfApplicable(sql); if (temp != TemporaryOption.NONE) { sql.append(temp.name()).append(" "); @@ -141,6 +141,9 @@ public String toString() { if (ifNotExists) { sql.append(" IF NOT EXISTS"); } + if (autoRefresh != AutoRefreshOption.NONE) { + sql.append(" AUTO REFRESH ").append(autoRefresh.name()); + } if (columnNames != null) { sql.append(PlainSelect.getStringList(columnNames, true, true)); } @@ -151,6 +154,19 @@ public String toString() { return sql.toString(); } + private void appendForceOptionIfApplicable(StringBuilder sql) { + switch (force) { + case FORCE: + sql.append("FORCE "); + break; + case NO_FORCE: + sql.append("NO FORCE "); + break; + default: + // nothing + } + } + public CreateView withView(Table view) { this.setView(view); return this; diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java index c731ba9f8..8eb03ae53 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateViewDeParser.java @@ -11,6 +11,7 @@ import net.sf.jsqlparser.statement.create.view.CreateView; import net.sf.jsqlparser.statement.create.view.TemporaryOption; +import net.sf.jsqlparser.statement.create.view.AutoRefreshOption; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectVisitor; @@ -42,16 +43,16 @@ public void deParse(CreateView createView) { buffer.append("OR REPLACE "); } switch (createView.getForce()) { - case FORCE: - buffer.append("FORCE "); - break; - case NO_FORCE: - buffer.append("NO FORCE "); - break; - case NONE: - break; - default: - // nothing + case FORCE: + buffer.append("FORCE "); + break; + case NO_FORCE: + buffer.append("NO FORCE "); + break; + case NONE: + break; + default: + // nothing } if (createView.getTemporary() != TemporaryOption.NONE) { buffer.append(createView.getTemporary().name()).append(" "); @@ -63,6 +64,9 @@ public void deParse(CreateView createView) { if (createView.isIfNotExists()) { buffer.append(" IF NOT EXISTS"); } + if (createView.getAutoRefresh() != AutoRefreshOption.NONE) { + buffer.append(" AUTO REFRESH ").append(createView.getAutoRefresh().name()); + } if (createView.getColumnNames() != null) { buffer.append(PlainSelect.getStringList(createView.getColumnNames(), true, true)); } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 1b4bbf833..f9dc5e7f4 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -149,6 +149,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -346,6 +347,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -444,12 +446,13 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | } -TOKEN : /* Stuff */ +TOKEN : /* Statement Separators */ { - + } TOKEN : /* Operators */ @@ -518,7 +521,16 @@ TOKEN: | < #SPECIAL_ESC: "\\'" > /* Allowing this will break LIKE ... ESCAPE ... */ | < #ESC: "\\" ["n","t","b","r","f","\\","\""] > -| < S_CHAR_LITERAL: (["U","E","N","R","B"]|"RB"|"_utf8")? (("'" ( | | ~["'", "\\"] )* "'") | ("'" ("''" | ~["'"])* "'")) > +| < S_CHAR_LITERAL: (["U","E","N","R","B"]|"RB"|"_utf8")? + ( + ("'" ( | | ~["'", "\\"] )* "'") | ("'" ("''" | ~["'"])* "'") + // Alternative Oracle Escape Modes + | ("q'{" (~[])* "}'") + | ("q'(" (~[])* ")'") + | ("q'[" (~[])* "]'") + | ("q''" (~[])* "''") + // | ("q'\\" (~[])* "\\'") <--- Does not work + ) > { // contains the token and always the longest match is returned // So when Backslash is explicitly not allowed as an Escape Character and a is found @@ -1837,7 +1849,7 @@ String RelObjectNameWithoutValue() : { Token tk = null; } { ( tk= | tk= | tk= | tk= | tk= | tk= | tk= - | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="BEGIN" | tk="BINARY" | tk="BIT" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONFLICT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GLOBAL" | tk="GRANT" | tk="GUARD" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REGISTER" | tk="RENAME" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RLIKE" | tk="ROLLBACK" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLTEXT" | tk="YAML" | tk="ZONE" ) + | tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BEGIN" | tk="BINARY" | tk="BIT" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONFLICT" | tk="COSTS" | tk="CS" | tk="CYCLE" | tk="DATABASE" | tk="DDL" | tk="DECLARE" | tk="DEFAULT" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GLOBAL" | tk="GRANT" | tk="GUARD" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="ISNULL" | tk="JSON" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LINK" | tk="LOCAL" | tk="LOCKED" | tk="LOG" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAXVALUE" | tk="MERGE" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PRECEDING" | tk="PRECISION" | tk="PRIMARY" | tk="PRIOR" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="READ" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGISTER" | tk="RENAME" | tk="REPLACE" | tk="RESET" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RLIKE" | tk="ROLLBACK" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TO" | tk="TRUE" | tk="TRUNCATE" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLTEXT" | tk="YAML" | tk="YES" | tk="ZONE" ) { return tk.image; } } @@ -5483,6 +5495,7 @@ CreateView CreateView(): Table view = null; Select select = null; List columnNames = null; + Token tk = null; } { @@ -5497,7 +5510,8 @@ CreateView CreateView(): ] [ { createView.setMaterialized(true);} ] view=Table() { createView.setView(view); } - [ LOOKAHEAD(3) {createView.setIfNotExists(true);} ] + [LOOKAHEAD(3) (tk= | tk=) { createView.setAutoRefresh(AutoRefreshOption.valueOf(tk.image)); } ] + [LOOKAHEAD(3) {createView.setIfNotExists(true);}] [ columnNames = ColumnsNamesList() { createView.setColumnNames(columnNames); } ] select=SelectWithWithItems( ) { createView.setSelect(select); } @@ -6234,7 +6248,7 @@ AlterExpression AlterExpression(): int i=0; for (String s: tokens) - if (!s.equals(";")) { + if (! (s.equals(";") || s.equals("\n\n\n")) ) { if (i>0) optionalSpecifier.append( " " ); optionalSpecifier.append( s ); diff --git a/src/main/resources/rr/xhtml2rst.xsl b/src/main/resources/rr/xhtml2rst.xsl index a1fbc840d..621ca66f6 100644 --- a/src/main/resources/rr/xhtml2rst.xsl +++ b/src/main/resources/rr/xhtml2rst.xsl @@ -1,4 +1,14 @@ + + - \ No newline at end of file + diff --git a/src/site/sphinx/_images/favicon.svg b/src/site/sphinx/_images/favicon.svg new file mode 100644 index 000000000..5a86c120b --- /dev/null +++ b/src/site/sphinx/_images/favicon.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + + diff --git a/src/site/sphinx/_images/logo-no-background.svg b/src/site/sphinx/_images/logo-no-background.svg new file mode 100644 index 000000000..3289bc15e --- /dev/null +++ b/src/site/sphinx/_images/logo-no-background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/site/sphinx/changelog.rst b/src/site/sphinx/changelog.rst index de298411c..899d66cdd 100644 --- a/src/site/sphinx/changelog.rst +++ b/src/site/sphinx/changelog.rst @@ -8,917 +8,779 @@ Latest Changes since |JSQLPARSER_VERSION| ============================================================= - * **style: Avoid throwing raw exception types.** - - Andreas Reichel, 2022-12-27 - * **style: Avoid throwing raw exception types.** - - Andreas Reichel, 2022-12-27 - * **doc: Fix Maven Artifact Version** - - Andreas Reichel, 2022-12-27 - * **Update README.md** - +* **doc: Better integration of the RR diagrams** + + Andreas Reichel, 2023-01-21 +* **feat: make important Classes Serializable** + + Andreas Reichel, 2023-01-21 +* **chore: Make Serializable** + + Andreas Reichel, 2023-01-21 +* **doc: request for `Conventional Commit` messages** + + Andreas Reichel, 2023-01-21 +* **Sphinx Documentation** + + Andreas Reichel, 2023-01-21 +* **Define Reserved Keywords explicitly** + + Andreas Reichel, 2023-01-21 +* **Adjust Gradle to JUnit 5** + + Andreas Reichel, 2023-01-21 +* **Enhanced Keywords** + + Andreas Reichel, 2023-01-21 +* **Remove unused imports** + + Andreas Reichel, 2023-01-21 +* **Fix test resources** + + Andreas Reichel, 2023-01-21 +* **Do not mark SpeedTest for concurrent execution** + + Andreas Reichel, 2023-01-21 +* **Fix incorrect tests** + + Andreas Reichel, 2023-01-21 +* **Remove unused imports** + + Andreas Reichel, 2023-01-21 +* **Adjust Gradle to JUnit 5** + + Andreas Reichel, 2023-01-21 +* **Do not mark SpeedTest for concurrent execution** + + Andreas Reichel, 2023-01-21 +* **Sphinx Website (#1624)** + + manticore-projects, 2023-01-20 +* **Assorted Fixes #5 (#1715)** + + manticore-projects, 2023-01-20 +* **Support DROP MATERIALIZED VIEW statements (#1711)** + + Tomasz Zarna, 2023-01-12 +* **corrected readme** + + Tobias Warneke, 2023-01-04 +* **Update README.md** + Tobias, 2022-12-27 - * **choir: Merge Master and resolve conflict** - - Andreas Reichel, 2022-12-23 - * **Fix #1686: add support for creating views with "IF NOT EXISTS" clause (#1690)** - +* **Fix #1686: add support for creating views with "IF NOT EXISTS" clause (#1690)** + Tomasz Zarna, 2022-12-22 - * **Assorted Fixes #4 (#1676)** - +* **Assorted Fixes #4 (#1676)** + manticore-projects, 2022-12-22 - * **fix: remove JavaCC dependency** - - Andreas Reichel, 2022-12-17 - * **fix: fix a merge error, brackets** - - Andreas Reichel, 2022-12-12 - * **Choir: Merge Master and resolve conflict** - - Andreas Reichel, 2022-12-11 - * **Choir: Merge Master and resolve conflict** - - Andreas Reichel, 2022-12-11 - * **build: Add Sphinx GitHub Action** - - Andreas Reichel, 2022-12-11 - * **Fixed download war script in the renderRR task (#1659)** - +* **Fixed download war script in the renderRR task (#1659)** + haha1903, 2022-12-10 - * **Assorted fixes (#1666)** - +* **Assorted fixes (#1666)** + manticore-projects, 2022-11-20 - * **Fix parsing statements with multidimensional array PR2 (#1665)** - +* **Fix parsing statements with multidimensional array PR2 (#1665)** + manticore-projects, 2022-11-20 - * **update Changelog** - - Andreas Reichel, 2022-11-14 - * **build: avoid PMD/Codacy for Sphinx Documentation** - - Andreas Reichel, 2022-11-07 - * **doc: add a page about actually Reserved Keywords** - - Andreas Reichel, 2022-11-07 - * **build: add the Keywords Documentation file to the task** - - Andreas Reichel, 2022-11-07 - * **build: various fixes to the Maven build file** - - Andreas Reichel, 2022-11-07 - * **fix: Non-serializable field in serializable class** - - Andreas Reichel, 2022-11-06 - * **chore: Merge Main Branch** - - Andreas Reichel, 2022-11-06 - * **removed disabled from Keyword tests and imports** - +* **removed disabled from Keyword tests and imports** + Tobias Warneke, 2022-11-02 - * **removed disabled from Keyword tests** - +* **removed disabled from Keyword tests** + Tobias Warneke, 2022-11-02 - * **Keywords2: Update whitelisted Keywords (#1653)** - +* **Keywords2: Update whitelisted Keywords (#1653)** + manticore-projects, 2022-11-02 - * **Enhanced Keywords (#1382)** - +* **Enhanced Keywords (#1382)** + manticore-projects, 2022-10-25 - * **#1610 Support for SKIP LOCKED tokens on SELECT statements (#1649)** - +* **#1610 Support for SKIP LOCKED tokens on SELECT statements (#1649)** + Lucas Dillmann, 2022-10-25 - * **Assorted fixes (#1646)** - +* **Assorted fixes (#1646)** + manticore-projects, 2022-10-16 - * **chore: Make Serializable** - - Andreas Reichel, 2022-10-14 - * **doc: Add the "How to Use" java code** - - Andreas Reichel, 2022-10-14 - * **actualized multiple dependencies** - +* **actualized multiple dependencies** + Tobias Warneke, 2022-09-28 - * **Bump h2 from 1.4.200 to 2.1.210 (#1639)** - +* **Bump h2 from 1.4.200 to 2.1.210 (#1639)** + dependabot[bot], 2022-09-28 - * **Support BigQuery SAFE_CAST (#1622) (#1634)** - +* **Support BigQuery SAFE_CAST (#1622) (#1634)** + dequn, 2022-09-20 - * **fix: add missing public Getter (#1632)** - +* **fix: add missing public Getter (#1632)** + manticore-projects, 2022-09-20 - * **feat: make important Classes Serializable** - - Andreas Reichel, 2022-09-15 - * **doc: pronounce the OVERLAPS example more** - - Andreas Reichel, 2022-09-08 - * **doc: write the correct Git Repository** - - Andreas Reichel, 2022-09-08 - * **doc: Add an example on Token White-listing** - - Andreas Reichel, 2022-09-06 - * **build: upload the built files via Excec/SFTP** - - Andreas Reichel, 2022-09-06 - * **doc: correctly refer to `RelObjectNameWithoutValue()`** - - Andreas Reichel, 2022-09-06 - * **doc: request for `Conventional Commit` messages** - - Andreas Reichel, 2022-09-06 - * **doc: Properly un-escape the Git Commit message** - - Andreas Reichel, 2022-09-05 - * **doc: Cleanup** - - Andreas Reichel, 2022-09-05 - * **build: Un-escape the Unicode on the changelog file** - - Andreas Reichel, 2022-09-05 - * **build: Un-escape the Unicode on the changelog file** - - Andreas Reichel, 2022-09-05 - * **doc: Explain the ``updateKeywords`` Gradle Task** - - Andreas Reichel, 2022-09-05 - * **build: Clean-up the Gradle Build** - - Andreas Reichel, 2022-09-05 - * **build: temporarily reduce the Code Coverage requirements** - - Andreas Reichel, 2022-09-02 - * **doc: ignore the autogenerated changelog.rst in GIT** - - Andreas Reichel, 2022-09-02 - * **test: Document an additional Special Oracle test success** - - Andreas Reichel, 2022-09-02 - * **Sphinx Documentation** - - Andreas Reichel, 2022-09-02 - * **Support timestamptz dateliteral (#1621)** - +* **Support timestamptz dateliteral (#1621)** + Todd Pollak, 2022-08-31 - * **fixes #1617** - +* **fixes #1617** + Tobias Warneke, 2022-08-31 - * **fixes #419** - +* **fixes #419** + Tobias Warneke, 2022-08-31 - * **Add AST Visualization** - - Andreas Reichel, 2022-08-18 - * **Closes #1604, added simple OVERLAPS support (#1611)** - +* **Closes #1604, added simple OVERLAPS support (#1611)** + Rob Audenaerde, 2022-08-16 - * **Fixes PR #1524 support hive alter sql (#1609)** - +* **Fixes PR #1524 support hive alter sql (#1609)** + manticore-projects, 2022-08-14 - * **Fixes broken PR #1524 and Commit fb6e950ce0e62ebcd7a44ba9eea679da2b04b2ed** - - Andreas Reichel, 2022-08-04 - * **#1524 support hive alter sql : ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) (#1605)** - +* **#1524 support hive alter sql : ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) (#1605)** + Zhumin-lv-wn, 2022-08-03 - * **fixes #1581** - +* **fixes #1581** + Tobias Warneke, 2022-07-25 - * **Using own Feature - constant for "delete with returning" #1597 (#1598)** - +* **Using own Feature - constant for "delete with returning" #1597 (#1598)** + gitmotte, 2022-07-25 - * **[maven-release-plugin] prepare for next development iteration** - +* **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2022-07-22 - * **Add JavaCC dependency to Maven for building ParserKeywordsUtils** - - Andreas Reichel, 2022-05-16 - * **Add JavaCC dependency to Maven for building ParserKeywordsUtils** - - Andreas Reichel, 2022-05-16 - * **Clean-up the imports** - - Andreas Reichel, 2022-05-16 - * **Separate UpdateKeywords Task again** - - Andreas Reichel, 2022-05-16 - * **Appease Codacy/PMD** - - Andreas Reichel, 2022-05-13 - * **Extract the Keywords from the Grammar by using JTRee (instead of Regex)** - - Andreas Reichel, 2022-05-13 - * **Appease PMD/Codacy** - - Andreas Reichel, 2022-04-23 - * **Read Tokens directly from the Grammar File without invoking JTREE** - - Andreas Reichel, 2022-04-23 - * **Fix Merge Issues** - - Andreas Reichel, 2022-04-15 - * **Force Changes** - - Andreas Reichel, 2022-04-15 - * **Remove broken rule warning about perfectly fine switch-case statements** - - Andreas Reichel, 2022-04-09 - * **Appease Codacy** - - Andreas Reichel, 2022-04-09 - * **Rewrite test expected to fail** - - Andreas Reichel, 2022-04-09 - * **Update PMD and rules** - - Andreas Reichel, 2022-04-09 - * **Automate the `updateKeywords` Step** - - Andreas Reichel, 2022-04-07 - * **Add Jupiter Parameters dependency again** - - Andreas Reichel, 2022-04-04 - * **CheckStyle sanitation of method names** - - Andreas Reichel, 2021-11-29 - * **Keyword test adopt JUnit5** - - Andreas Reichel, 2021-11-28 - * **Do not mark SpeedTest for concurrent execution** - - Andreas Reichel, 2021-11-28 - * **Adjust Gradle to JUnit 5** - - Andreas Reichel, 2021-11-28 - * **Remove unused imports** - - Andreas Reichel, 2021-11-28 - * **Remove unused imports** - - Andreas Reichel, 2021-11-28 - * **Do not mark SpeedTest for concurrent execution** - - Andreas Reichel, 2021-11-24 - * **Adjust Gradle to JUnit 5** - - Andreas Reichel, 2021-11-22 - * **Fix test resources** - - Andreas Reichel, 2021-10-24 - * **Define Reserved Keywords explicitly** - - Andreas Reichel, 2021-10-24 - * **Fix incorrect tests** - - Andreas Reichel, 2021-10-18 - * **Enhanced Keywords** - - Andreas Reichel, 2021-10-18 Version jsqlparser-4.5 ============================================================= - * **[maven-release-plugin] prepare release jsqlparser-4.5** - +* **[maven-release-plugin] prepare release jsqlparser-4.5** + Tobias Warneke, 2022-07-22 - * **introduced changelog generator** - +* **introduced changelog generator** + Tobias Warneke, 2022-07-22 - * **fixes #1596** - +* **fixes #1596** + Tobias Warneke, 2022-07-22 - * **integrated test for #1595** - +* **integrated test for #1595** + Tobias Warneke, 2022-07-19 - * **reduced time to parse exception to minimize impact on building time** - +* **reduced time to parse exception to minimize impact on building time** + Tobias Warneke, 2022-07-19 - * **add support for drop column if exists (#1594)** - +* **add support for drop column if exists (#1594)** + rrrship, 2022-07-19 - * **PostgreSQL INSERT ... ON CONFLICT Issue #1551 (#1552)** - +* **PostgreSQL INSERT ... ON CONFLICT Issue #1551 (#1552)** + manticore-projects, 2022-07-19 - * **Configurable Parser Timeout via Feature (#1592)** - +* **Configurable Parser Timeout via Feature (#1592)** + manticore-projects, 2022-07-19 - * **fixes #1590** - +* **fixes #1590** + Tobias Warneke, 2022-07-19 - * **fixes #1590** - +* **fixes #1590** + Tobias Warneke, 2022-07-19 - * **extended support Postgres' `Extract( field FROM source)` where `field` is a String instead of a Keyword (#1591)** - +* **extended support Postgres' `Extract( field FROM source)` where `field` is a String instead of a Keyword (#1591)** + manticore-projects, 2022-07-19 - * **Closes #1579. Added ANALYZE support. (#1587)** - +* **Closes #1579. Added ANALYZE
support. (#1587)** + Rob Audenaerde, 2022-07-14 - * **Closes #1583:: Implement Postgresql optional TABLE in TRUNCATE (#1585)** - +* **Closes #1583:: Implement Postgresql optional TABLE in TRUNCATE (#1585)** + Rob Audenaerde, 2022-07-14 - * **Support table option character set and index options (#1586)** - +* **Support table option character set and index options (#1586)** + luofei, 2022-07-14 - * **corrected a last minute bug** - +* **corrected a last minute bug** + Tobias Warneke, 2022-07-09 - * **corrected a last minute bug** - +* **corrected a last minute bug** + Tobias Warneke, 2022-07-09 - * **corrected a last minute bug** - +* **corrected a last minute bug** + Tobias Warneke, 2022-07-09 - * **fixes #1576** - +* **fixes #1576** + Tobias Warneke, 2022-07-09 - * **added simple test for #1580** - +* **added simple test for #1580** + Tobias Warneke, 2022-07-07 - * **disabled test for large cnf expansion and stack overflow problem** - +* **disabled test for large cnf expansion and stack overflow problem** + Tobias Warneke, 2022-07-07 - * **Add test for LikeExpression.setEscape and LikeExpression.getStringExpression (#1568)** - +* **Add test for LikeExpression.setEscape and LikeExpression.getStringExpression (#1568)** + Caro, 2022-07-07 - * **add support for postgres drop function statement (#1557)** - +* **add support for postgres drop function statement (#1557)** + rrrship, 2022-07-06 - * **Add support for Hive dialect GROUPING SETS. (#1539)** - +* **Add support for Hive dialect GROUPING SETS. (#1539)** + chenwl, 2022-07-06 - * **fixes #1566** - +* **fixes #1566** + Tobias Warneke, 2022-06-28 - * **Postgres NATURAL LEFT/RIGHT joins (#1560)** - +* **Postgres NATURAL LEFT/RIGHT joins (#1560)** + manticore-projects, 2022-06-28 - * **compound statement tests (#1545)** - +* **compound statement tests (#1545)** + Matthew Rathbone, 2022-06-08 - * **Allow isolation keywords as column name and aliases (#1534)** - +* **Allow isolation keywords as column name and aliases (#1534)** + Tomer Shay (Shimshi), 2022-05-19 - * **added github action badge** - +* **added github action badge** + Tobias, 2022-05-16 - * **Create maven.yml** - +* **Create maven.yml** + Tobias, 2022-05-16 - * **introduced deparser and toString correction for insert output clause** - +* **introduced deparser and toString correction for insert output clause** + Tobias Warneke, 2022-05-15 - * **revived compilable status after merge** - +* **revived compilable status after merge** + Tobias Warneke, 2022-05-15 - * **INSERT with SetOperations (#1531)** - +* **INSERT with SetOperations (#1531)** + manticore-projects, 2022-05-15 - * **#1516 rename without column keyword (#1533)** - +* **#1516 rename without column keyword (#1533)** + manticore-projects, 2022-05-11 - * **Add support for `... ALTER COLUMN ... DROP DEFAULT` (#1532)** - +* **Add support for `... ALTER COLUMN ... DROP DEFAULT` (#1532)** + manticore-projects, 2022-05-11 - * **#1527 DELETE ... RETURNING ... (#1528)** - +* **#1527 DELETE ... RETURNING ... (#1528)** + manticore-projects, 2022-05-11 - * **fixs #1520 (#1521)** - +* **fixs #1520 (#1521)** + chiangcho, 2022-05-11 - * **Unsupported statement (#1519)** - +* **Unsupported statement (#1519)** + manticore-projects, 2022-05-11 - * **fixes #1518** - +* **fixes #1518** + Tobias Warneke, 2022-04-26 - * **Update bug_report.md (#1512)** - +* **Update bug_report.md (#1512)** + manticore-projects, 2022-04-22 - * **changed to allow #1481** - +* **changed to allow #1481** + Tobias Warneke, 2022-04-22 - * **Performance Improvements (#1439)** - +* **Performance Improvements (#1439)** + manticore-projects, 2022-04-14 - * **[maven-release-plugin] prepare for next development iteration** - +* **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2022-04-10 Version jsqlparser-4.4 ============================================================= - * **[maven-release-plugin] prepare release jsqlparser-4.4** - +* **[maven-release-plugin] prepare release jsqlparser-4.4** + Tobias Warneke, 2022-04-10 - * **Json function Improvements (#1506)** - +* **Json function Improvements (#1506)** + manticore-projects, 2022-04-09 - * **fixes #1505** - +* **fixes #1505** + Tobias Warneke, 2022-04-09 - * **fixes #1502** - +* **fixes #1502** + Tobias Warneke, 2022-04-09 - * **Issue1500 - Circular References in `AllColumns` and `AllTableColumns` (#1501)** - +* **Issue1500 - Circular References in `AllColumns` and `AllTableColumns` (#1501)** + manticore-projects, 2022-04-03 - * **Optimize assertCanBeParsedAndDeparsed (#1389)** - +* **Optimize assertCanBeParsedAndDeparsed (#1389)** + manticore-projects, 2022-04-02 - * **Add geometry distance operator (#1493)** - +* **Add geometry distance operator (#1493)** + Thomas Powell, 2022-04-02 - * **Support WITH TIES option in TOP #1435 (#1479)** - +* **Support WITH TIES option in TOP #1435 (#1479)** + Olivier Cavadenti, 2022-04-02 - * **https://github.com/JSQLParser/JSqlParser/issues/1483 (#1485)** - +* **https://github.com/JSQLParser/JSqlParser/issues/1483 (#1485)** + gitmotte, 2022-04-02 - * **fixes #1482** - +* **fixes #1482** + Tobias Warneke, 2022-03-15 - * **fixes #1482** - +* **fixes #1482** + Tobias Warneke, 2022-03-15 - * **Extending CaseExpression, covering #1458 (#1459)** - +* **Extending CaseExpression, covering #1458 (#1459)** + Mathieu Goeminne, 2022-03-15 - * **fixes #1471** - +* **fixes #1471** + Tobias Warneke, 2022-02-18 - * **fixes #1471** - +* **fixes #1471** + Tobias Warneke, 2022-02-18 - * **fixes #1470** - +* **fixes #1470** + Tobias Warneke, 2022-02-06 - * **Add support for IS DISTINCT FROM clause (#1457)** - +* **Add support for IS DISTINCT FROM clause (#1457)** + Tomer Shay (Shimshi), 2022-01-18 - * **fix fetch present in the end of union query (#1456)** - +* **fix fetch present in the end of union query (#1456)** + chiangcho, 2022-01-18 - * **added SQL_CACHE implementation and changed** - +* **added SQL_CACHE implementation and changed** + Tobias Warneke, 2022-01-09 - * **support for db2 with ru (#1446)** - +* **support for db2 with ru (#1446)** + chiangcho, 2021-12-20 - * **[maven-release-plugin] prepare for next development iteration** - +* **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-12-12 Version jsqlparser-4.3 ============================================================= - * **[maven-release-plugin] prepare release jsqlparser-4.3** - +* **[maven-release-plugin] prepare release jsqlparser-4.3** + Tobias Warneke, 2021-12-12 - * **updated readme.md to show all changes for version 4.3** - +* **updated readme.md to show all changes for version 4.3** + Tobias Warneke, 2021-12-12 - * **Adjust Gradle to JUnit 5 (#1428)** - +* **Adjust Gradle to JUnit 5 (#1428)** + manticore-projects, 2021-11-28 - * **corrected some maven plugin versions** - +* **corrected some maven plugin versions** + Tobias Warneke, 2021-11-28 - * **fixes #1429** - +* **fixes #1429** + Tobias Warneke, 2021-11-23 - * **closes #1427** - +* **closes #1427** + Tobias Warneke, 2021-11-21 - * **CreateTableTest** - +* **CreateTableTest** + Tobias Warneke, 2021-11-21 - * **Support EMIT CHANGES for KSQL (#1426)** - +* **Support EMIT CHANGES for KSQL (#1426)** + Olivier Cavadenti, 2021-11-21 - * **SelectTest.testMultiPartColumnNameWithDatabaseNameAndSchemaName** - +* **SelectTest.testMultiPartColumnNameWithDatabaseNameAndSchemaName** + Tobias Warneke, 2021-11-21 - * **reformatted test source code** - +* **reformatted test source code** + Tobias Warneke, 2021-11-21 - * **organize imports** - +* **organize imports** + Tobias Warneke, 2021-11-21 - * **replaced all junit 3 and 4 with junit 5 stuff** - +* **replaced all junit 3 and 4 with junit 5 stuff** + Tobias Warneke, 2021-11-21 - * **Support RESTART without value (#1425)** - +* **Support RESTART without value (#1425)** + Olivier Cavadenti, 2021-11-20 - * **Add support for oracle UnPivot when use multi columns at once. (#1419)** - +* **Add support for oracle UnPivot when use multi columns at once. (#1419)** + LeiJun, 2021-11-19 - * **Fix issue in parsing TRY_CAST() function (#1391)** - +* **Fix issue in parsing TRY_CAST() function (#1391)** + Prashant Sutar, 2021-11-19 - * **fixes #1414** - +* **fixes #1414** + Tobias Warneke, 2021-11-19 - * **Add support for expressions (such as columns) in AT TIME ZONE expressions (#1413)** - +* **Add support for expressions (such as columns) in AT TIME ZONE expressions (#1413)** + Tomer Shay (Shimshi), 2021-11-19 - * **Add supported for quoted cast expressions for PostgreSQL (#1411)** - +* **Add supported for quoted cast expressions for PostgreSQL (#1411)** + Tomer Shay (Shimshi), 2021-11-19 - * **added USE SCHEMA and CREATE OR REPLACE
support; things that are allowed in Snowflake SQL (#1409)** - +* **added USE SCHEMA and CREATE OR REPLACE
support; things that are allowed in Snowflake SQL (#1409)** + Richard Kooijman, 2021-11-19 - * **Issue #420 Like Expression with Escape Expression (#1406)** - +* **Issue #420 Like Expression with Escape Expression (#1406)** + manticore-projects, 2021-11-19 - * **fixes #1405 and some junit.jupiter stuff** - +* **fixes #1405 and some junit.jupiter stuff** + Tobias Warneke, 2021-11-19 - * **#1401 add junit-jupiter-api (#1403)** - +* **#1401 add junit-jupiter-api (#1403)** + gitmotte, 2021-11-19 - * **Support Postgres Dollar Quotes #1372 (#1395)** - +* **Support Postgres Dollar Quotes #1372 (#1395)** + Olivier Cavadenti, 2021-11-19 - * **Add Delete / Update modifiers for MySQL #1254 (#1396)** - +* **Add Delete / Update modifiers for MySQL #1254 (#1396)** + Olivier Cavadenti, 2021-11-19 - * **Fixes #1381 (#1383)** - +* **Fixes #1381 (#1383)** + manticore-projects, 2021-11-19 - * **Allows CASE ... ELSE ComplexExpression (#1388)** - +* **Allows CASE ... ELSE ComplexExpression (#1388)** + manticore-projects, 2021-11-02 - * **IN() with complex expressions (#1384)** - +* **IN() with complex expressions (#1384)** + manticore-projects, 2021-11-01 - * **Fixes #1385 and PR#1380 (#1386)** - +* **Fixes #1385 and PR#1380 (#1386)** + manticore-projects, 2021-10-22 - * **Fixes #1369 (#1370)** - +* **Fixes #1369 (#1370)** + Ben Grabham, 2021-10-20 - * **Fixes #1371 (#1377)** - +* **Fixes #1371 (#1377)** + manticore-projects, 2021-10-20 - * **LIMIT OFFSET with Expressions (#1378)** - +* **LIMIT OFFSET with Expressions (#1378)** + manticore-projects, 2021-10-20 - * **Oracle Multi Column Drop (#1379)** - +* **Oracle Multi Column Drop (#1379)** + manticore-projects, 2021-10-20 - * **Support alias for UnPivot statement (see discussion #1374) (#1380)** - +* **Support alias for UnPivot statement (see discussion #1374) (#1380)** + fabriziodelfranco, 2021-10-20 - * **Issue1352 (#1353)** - +* **Issue1352 (#1353)** + manticore-projects, 2021-10-09 - * **Enhance ALTER TABLE ... DROP CONSTRAINTS ... (#1351)** - +* **Enhance ALTER TABLE ... DROP CONSTRAINTS ... (#1351)** + manticore-projects, 2021-10-08 - * **Function to use AllColumns or AllTableColumns Expression (#1350)** - +* **Function to use AllColumns or AllTableColumns Expression (#1350)** + manticore-projects, 2021-10-08 - * **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** - +* **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** + manticore-projects, 2021-09-18 - * **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** - +* **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** + manticore-projects, 2021-09-18 - * **corrected readme to the new snapshot version** - +* **corrected readme to the new snapshot version** + Tobias Warneke, 2021-09-08 - * **[maven-release-plugin] prepare for next development iteration** - +* **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-09-08 Version jsqlparser-4.2 ============================================================= - * **[maven-release-plugin] prepare release jsqlparser-4.2** - +* **[maven-release-plugin] prepare release jsqlparser-4.2** + Tobias Warneke, 2021-09-08 - * **introducing test for issue #1328** - +* **introducing test for issue #1328** + Tobias Warneke, 2021-09-07 - * **included some distinct check** - +* **included some distinct check** + Tobias Warneke, 2021-09-07 - * **corrected a merge bug** - +* **corrected a merge bug** + Tobias Warneke, 2021-09-07 - * **Prepare4.2 (#1329)** - +* **Prepare4.2 (#1329)** + manticore-projects, 2021-09-07 - * **CREATE TABLE AS (...) UNION (...) fails (#1309)** - +* **CREATE TABLE AS (...) UNION (...) fails (#1309)** + François Sécherre, 2021-09-07 - * **Fixes #1325 (#1327)** - +* **Fixes #1325 (#1327)** + manticore-projects, 2021-09-06 - * **Implement Joins with multiple trailing ON Expressions (#1303)** - +* **Implement Joins with multiple trailing ON Expressions (#1303)** + manticore-projects, 2021-09-06 - * **Fix Gradle PMD and Checkstyle (#1318)** - +* **Fix Gradle PMD and Checkstyle (#1318)** + manticore-projects, 2021-09-01 - * **Fixes #1306 (#1311)** - +* **Fixes #1306 (#1311)** + manticore-projects, 2021-08-28 - * **Update sets (#1317)** - +* **Update sets (#1317)** + manticore-projects, 2021-08-27 - * **Special oracle tests (#1279)** - +* **Special oracle tests (#1279)** + manticore-projects, 2021-08-09 - * **Implements Hierarchical CONNECT_BY_ROOT Operator (#1282)** - +* **Implements Hierarchical CONNECT_BY_ROOT Operator (#1282)** + manticore-projects, 2021-08-09 - * **Implement Transact-SQL IF ELSE Statement Control Flows. (#1275)** - +* **Implement Transact-SQL IF ELSE Statement Control Flows. (#1275)** + manticore-projects, 2021-08-09 - * **Add some flexibility to the Alter Statement (#1293)** - +* **Add some flexibility to the Alter Statement (#1293)** + manticore-projects, 2021-08-02 - * **Implement Oracle's Alter System (#1288)** - +* **Implement Oracle's Alter System (#1288)** + manticore-projects, 2021-08-02 - * **Implement Oracle Named Function Parameters Func( param1 => arg1, ...) (#1283)** - +* **Implement Oracle Named Function Parameters Func( param1 => arg1, ...) (#1283)** + manticore-projects, 2021-08-02 - * **Implement Gradle Buildsystem (#1271)** - +* **Implement Gradle Buildsystem (#1271)** + manticore-projects, 2021-08-02 - * **fixes #1272** - +* **fixes #1272** + Tobias Warneke, 2021-07-26 - * **Allowes JdbcParameter or JdbcNamedParameter for MySQL FullTextSearch (#1278)** - +* **Allowes JdbcParameter or JdbcNamedParameter for MySQL FullTextSearch (#1278)** + manticore-projects, 2021-07-26 - * **Fixes #1267 Cast into RowConstructor (#1274)** - +* **Fixes #1267 Cast into RowConstructor (#1274)** + manticore-projects, 2021-07-26 - * **Separate MySQL Special String Functions accepting Named Argument Separation as this could collide with ComplexExpressionList when InExpression is involved (#1285)** - +* **Separate MySQL Special String Functions accepting Named Argument Separation as this could collide with ComplexExpressionList when InExpression is involved (#1285)** + manticore-projects, 2021-07-26 - * **Implements Oracle RENAME oldTable TO newTable Statement (#1286)** - +* **Implements Oracle RENAME oldTable TO newTable Statement (#1286)** + manticore-projects, 2021-07-26 - * **Implement Oracle Purge Statement (#1287)** - +* **Implement Oracle Purge Statement (#1287)** + manticore-projects, 2021-07-26 - * **included jacoco to allow code coverage for netbeans** - +* **included jacoco to allow code coverage for netbeans** + Tobias Warneke, 2021-07-18 - * **corrected a Lookahead problem** - +* **corrected a Lookahead problem** + Tobias Warneke, 2021-07-16 - * **Json functions (#1263)** - +* **Json functions (#1263)** + manticore-projects, 2021-07-16 - * **fixes #1255** - +* **fixes #1255** + Tobias Warneke, 2021-07-16 - * **Active JJDoc and let it create the Grammar BNF documentation (#1256)** - +* **Active JJDoc and let it create the Grammar BNF documentation (#1256)** + manticore-projects, 2021-07-16 - * **Bump commons-io from 2.6 to 2.7 (#1265)** - +* **Bump commons-io from 2.6 to 2.7 (#1265)** + dependabot[bot], 2021-07-14 - * **Update README.md** - +* **Update README.md** + Tobias, 2021-07-13 - * **Implement DB2 Special Register Date Time CURRENT DATE and CURRENT TIME (#1252)** - +* **Implement DB2 Special Register Date Time CURRENT DATE and CURRENT TIME (#1252)** + manticore-projects, 2021-07-13 - * **Rename the PMD ruleset configuration file hoping for automatic synchronization with Codacy (#1251)** - +* **Rename the PMD ruleset configuration file hoping for automatic synchronization with Codacy (#1251)** + manticore-projects, 2021-07-13 - * **corrected .travis.yml** - +* **corrected .travis.yml** + Tobias Warneke, 2021-07-05 - * **corrected .travis.yml** - +* **corrected .travis.yml** + Tobias Warneke, 2021-07-05 - * **Update README.md** - +* **Update README.md** + Tobias, 2021-07-05 - * **fixes #1250** - +* **fixes #1250** + Tobias Warneke, 2021-07-01 - * **[maven-release-plugin] prepare for next development iteration** - +* **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-06-30 Version jsqlparser-4.1 ============================================================= - * **[maven-release-plugin] prepare release jsqlparser-4.1** - +* **[maven-release-plugin] prepare release jsqlparser-4.1** + Tobias Warneke, 2021-06-30 - * **fixes #1140** - +* **fixes #1140** + Tobias Warneke, 2021-06-30 - * **introduced #1248 halfway** - +* **introduced #1248 halfway** + Tobias Warneke, 2021-06-30 - * **Savepoint rollback (#1236)** - +* **Savepoint rollback (#1236)** + manticore-projects, 2021-06-30 - * **Fixes Function Parameter List Brackets issue #1239 (#1240)** - +* **Fixes Function Parameter List Brackets issue #1239 (#1240)** + manticore-projects, 2021-06-30 - * **corrected javadoc problem** - +* **corrected javadoc problem** + Tobias Warneke, 2021-06-27 - * **corrected some lookahead problem** - +* **corrected some lookahead problem** + Tobias Warneke, 2021-06-26 - * **RESET statement, SET PostgreSQL compatibility (#1104)** - +* **RESET statement, SET PostgreSQL compatibility (#1104)** + Роман Зотов, 2021-06-26 - * **corrected some lookahead problem** - +* **corrected some lookahead problem** + Tobias Warneke, 2021-06-26 - * **Implement Oracle Alter Session Statements (#1234)** - +* **Implement Oracle Alter Session Statements (#1234)** + manticore-projects, 2021-06-26 - * **fixes #1230** - +* **fixes #1230** + Tobias Warneke, 2021-06-26 - * **Support DELETE FROM T1 USING T2 WHERE ... (#1228)** - +* **Support DELETE FROM T1 USING T2 WHERE ... (#1228)** + francois-secherre, 2021-06-16 - * **Row access support (#1181)** - +* **Row access support (#1181)** + Роман Зотов, 2021-06-16 - * **corrected lookahead problem of PR #1225** - +* **corrected lookahead problem of PR #1225** + Tobias Warneke, 2021-06-14 - * **Delete queries without from, with a schema identifier fails (#1224)** - +* **Delete queries without from, with a schema identifier fails (#1224)** + François Sécherre, 2021-06-14 - * **Create temporary table t(c1, c2) as select ... (#1225)** - +* **Create temporary table t(c1, c2) as select ... (#1225)** + francois-secherre, 2021-06-14 - * **Nested with items (#1221)** - +* **Nested with items (#1221)** + manticore-projects, 2021-06-10 - * **Implement GROUP BY () without columns (#1218)** - +* **Implement GROUP BY () without columns (#1218)** + manticore-projects, 2021-06-03 - * **TSQL Compliant NEXT VALUE FOR sequence_id (but keeping the spurious NEXTVAL FOR expression) (#1216)** - +* **TSQL Compliant NEXT VALUE FOR sequence_id (but keeping the spurious NEXTVAL FOR expression) (#1216)** + manticore-projects, 2021-06-02 - * **Pmd clean up (#1215)** - +* **Pmd clean up (#1215)** + manticore-projects, 2021-06-02 - * **Add support for boolean 'XOR' operator (#1193)** - +* **Add support for boolean 'XOR' operator (#1193)** + Adaptive Recognition, 2021-06-02 - * **Update README.md** - +* **Update README.md** + Tobias, 2021-05-31 - * **Implement WITH for DELETE, UPDATE and MERGE statements (#1217)** - +* **Implement WITH for DELETE, UPDATE and MERGE statements (#1217)** + manticore-projects, 2021-05-31 - * **increases complex scanning range** - +* **increases complex scanning range** + Tobias Warneke, 2021-05-26 - * **Allow Complex Parsing of Functions (#1200)** - +* **Allow Complex Parsing of Functions (#1200)** + manticore-projects, 2021-05-26 - * **Add support for AT TIME ZONE expressions (#1196)** - +* **Add support for AT TIME ZONE expressions (#1196)** + Tomer Shay (Shimshi), 2021-05-25 - * **fixes #1211** - +* **fixes #1211** + Tobias Warneke, 2021-05-25 - * **fixes #1212** - +* **fixes #1212** + Tobias Warneke, 2021-05-25 - * **Fix Nested CASE WHEN performance, fixes issue #1162 (#1208)** - +* **Fix Nested CASE WHEN performance, fixes issue #1162 (#1208)** + manticore-projects, 2021-05-25 - * **Add support for casts in json expressions (#1189)** - +* **Add support for casts in json expressions (#1189)** + Tomer Shay (Shimshi), 2021-05-10 - * **fixes #1185** - +* **fixes #1185** + Tobias Warneke, 2021-05-04 - * **supporting/fixing unique inside sql function such as count eg - SELECT count(UNIQUE col2) FROM mytable (#1184)** - +* **supporting/fixing unique inside sql function such as count eg - SELECT count(UNIQUE col2) FROM mytable (#1184)** + RajaSudharsan Adhikesavan, 2021-05-01 - * **Oracle compliant ALTER TABLE ADD/MODIFY deparser (#1163)** - +* **Oracle compliant ALTER TABLE ADD/MODIFY deparser (#1163)** + manticore-projects, 2021-04-21 - * **Pmd (#1165)** - +* **Pmd (#1165)** + manticore-projects, 2021-04-20 - * **function order by support (#1108)** - +* **function order by support (#1108)** + Роман Зотов, 2021-04-20 - * **fixes #1159** - +* **fixes #1159** + Tobias Warneke, 2021-04-16 - * **added improvements of pr to readme** - +* **added improvements of pr to readme** + Tobias Warneke, 2021-04-16 - * **Assorted fixes to the Java CC Parser definition (#1153)** - +* **Assorted fixes to the Java CC Parser definition (#1153)** + manticore-projects, 2021-04-16 - * **fixes #1138** - +* **fixes #1138** + Tobias Warneke, 2021-04-10 - * **fixes #1138** - +* **fixes #1138** + Tobias Warneke, 2021-04-10 - * **fixes #1137** - +* **fixes #1137** + Tobias Warneke, 2021-04-10 - * **fixes #1136** - +* **fixes #1136** + Tobias Warneke, 2021-04-10 - * **issue #1134 adressed** - +* **issue #1134 adressed** + Tobias Warneke, 2021-03-20 - * **Add support for union_with_brackets_and_orderby (#1131)** - +* **Add support for union_with_brackets_and_orderby (#1131)** + Tomer Shay (Shimshi), 2021-03-14 - * **Add support for union without brackets and with limit (#1132)** - +* **Add support for union without brackets and with limit (#1132)** + Tomer Shay (Shimshi), 2021-03-14 - * **Add support for functions in an interval expression (#1099)** - +* **Add support for functions in an interval expression (#1099)** + Tomer Shay (Shimshi), 2021-03-14 - * **subArray support arr[1:3] (#1109)** - +* **subArray support arr[1:3] (#1109)** + Роман Зотов, 2021-02-05 - * **bug fix (#769)** - +* **bug fix (#769)** + Kunal jha, 2021-02-05 - * **Array contructor support (#1105)** - +* **Array contructor support (#1105)** + Роман Зотов, 2021-02-04 - * **Partial support construct tuple as simple expression (#1107)** - +* **Partial support construct tuple as simple expression (#1107)** + Роман Зотов, 2021-01-31 - * **support create table parameters without columns, parameter values any names (#1106)** - +* **support create table parameters without columns, parameter values any names (#1106)** + Роман Зотов, 2021-01-31 - * **fixes #995** - +* **fixes #995** + Tobias Warneke, 2021-01-13 - * **fixes #1100** - +* **fixes #1100** + Tobias Warneke, 2021-01-13 - * **next correction of parenthesis around unions** - +* **next correction of parenthesis around unions** + Tobias Warneke, 2021-01-11 - * **fixes #992** - +* **fixes #992** + Tobias Warneke, 2021-01-07 - * **corrected patch for case as table name** - +* **corrected patch for case as table name** + Tobias Warneke, 2021-01-07 - * **Added support for the Case keyword in table names (#1093)** - +* **Added support for the Case keyword in table names (#1093)** + Tomer Shay (Shimshi), 2021-01-07 - * **corrected some javadoc parameter** - +* **corrected some javadoc parameter** + Tobias Warneke, 2021-01-03 - * **added missing pivot test files** - +* **added missing pivot test files** + Tobias Warneke, 2021-01-03 - * **fixes #282 - first refactoring to allow with clause as a start in insert and update** - +* **fixes #282 - first refactoring to allow with clause as a start in insert and update** + Tobias Warneke, 2021-01-02 - * **fixes #282 - first refactoring to allow with clause as a start in insert and update** - +* **fixes #282 - first refactoring to allow with clause as a start in insert and update** + Tobias Warneke, 2021-01-02 - * **Update README.md** - +* **Update README.md** + Tobias, 2021-01-02 - * **fixes #887** - +* **fixes #887** + Tobias Warneke, 2021-01-02 - * **fixes #1091 - added H2 casewhen function with conditional parameters** - +* **fixes #1091 - added H2 casewhen function with conditional parameters** + Tobias Warneke, 2021-01-01 - * **fixes #1091 - added H2 casewhen function with conditional parameters** - +* **fixes #1091 - added H2 casewhen function with conditional parameters** + Tobias Warneke, 2021-01-01 - * **[maven-release-plugin] prepare for next development iteration** - +* **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-01-01 diff --git a/src/site/sphinx/conf.py b/src/site/sphinx/conf.py index 3b1ef96d0..b757400c7 100644 --- a/src/site/sphinx/conf.py +++ b/src/site/sphinx/conf.py @@ -13,6 +13,7 @@ show_sphinx = False master_doc = 'index' exclude_patterns = ['_themes', '_static/css'] +logo_only = True # HTML options html_theme = "sphinx_book_theme" @@ -22,7 +23,8 @@ html_use_index = True html_show_sourcelink = False html_static_path = ['_static'] -#html_logo = '_static/logo.svg' +html_logo = '_images/logo-no-background.svg' +html_favicon = '_images/favicon.svg' html_css_files = ["svg.css"] diff --git a/src/site/sphinx/contribution.rst b/src/site/sphinx/contribution.rst index 5d5f5ed56..4309b23b0 100644 --- a/src/site/sphinx/contribution.rst +++ b/src/site/sphinx/contribution.rst @@ -106,6 +106,7 @@ There is a task ``updateKeywords`` for Gradle and Maven, which will: mvn exec:java + Without this Gradle Task, any new Token or Production will become a ``Reserved Keyword`` automatically and can't be used for Object Names without quoting. diff --git a/src/site/sphinx/syntax.rst b/src/site/sphinx/syntax.rst index bc85ca60a..cf3f92f40 100644 --- a/src/site/sphinx/syntax.rst +++ b/src/site/sphinx/syntax.rst @@ -54,7 +54,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -77,72 +77,70 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. Merge - Upsert - - Replace - - AlterTable - - AlterSession - - CreateFunctionStatement - - CreateIndex - - CreateSchema - - CreateSequence - - CreateSynonym - - CreateTable - - CreateView - - AlterView - - AlterSequence - - Drop - - Analyze - - Truncate - - Execute - - Set - - RenameTableStatement - - Reset - - ShowColumns - - ShowTables - - Show - - Use - - SavepointStatement - - RollbackStatement - COMMIT - - Comment - - Describe - - Explain - - Declare - - Grant - - PurgeStatement - - AlterSystemStatement + Upsert + + AlterTable + + AlterSession + + CreateFunctionStatement + + CreateIndex + + CreateSchema + + CreateSequence + + CreateSynonym + + CreateTable + + CreateView + + AlterView + + AlterSequence + + Drop + + Analyze + + Truncate + + Execute + + Set + + RenameTableStatement + + Reset + + ShowColumns + + ShowTables + + Show + + Use + + SavepointStatement + + RollbackStatement + COMMIT + + Comment + + Describe + + Explain + + Declare + + Grant + + PurgeStatement + + AlterSystemStatement
@@ -150,7 +148,6 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= '(' WithList Select ')'
           | WithList? ( Select | Insert | Update | Delete | Merge )
           | Upsert
-
           | Replace
           | AlterTable
           | AlterSession
           | CreateFunctionStatement
@@ -834,65 +831,6 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
-====================================================================================================================== - Replace -====================================================================================================================== - - -.. raw:: html - - - - - - REPLACE - - INTO - - Table - SET - - Column - = - - SimpleExpression - , - - ( - - Column - , - - ) - - VALUES - - VALUE - - ( - - PrimaryExpression - , - - ) - - SimpleExpression - , - - ( - - , - - SubSelect - -
- -
Replace  ::= 'REPLACE' 'INTO'? Table ( 'SET' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | ( '(' Column ( ',' Column )* ')' )? ( ( 'VALUES' | 'VALUE' )? '(' PrimaryExpression ( ',' PrimaryExpression )* ')' ( ',' '(' SimpleExpression ( ',' SimpleExpression )* ')' )* | SubSelect ) )
-
- Referenced by: -
- - ====================================================================================================================== ListExpressionItem ====================================================================================================================== @@ -1120,59 +1058,73 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - UPSERT - - INTO - - Table - ( - - Column - , - - ) - - VALUES - - VALUE - - ( - - SimpleExpression - , - - , - - ) - - ( - - SelectWithWithItems - ) - - SelectWithWithItems - ON - - DUPLICATE - - KEY - - UPDATE - - Column - = - - SimpleExpression - , - - -
- -
Upsert   ::= 'UPSERT' 'INTO'? Table ( '(' Column ( ',' Column )* ')' )? ( ( ( 'VALUES' | 'VALUE' )? '(' SimpleExpression ( ',' SimpleExpression )* ( ')' ',' '(' SimpleExpression ( ',' SimpleExpression )* )* | '(' SelectWithWithItems ) ')' | SelectWithWithItems ) ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* )?
+ + + + + UPSERT + + INSERT + + OR + + REPLACE + + INTO + + Table + ( + + Column + , + + ) + + SET + + Column + = + + SimpleExpression + , + + VALUES + + VALUE + + ( + + SimpleExpression + , + + , + + ) + + ( + + SelectWithWithItems + ) + + SelectWithWithItems + ON + + DUPLICATE + + KEY + + UPDATE + + Column + = + + SimpleExpression + , + + +
+ +
Upsert   ::= ( 'UPSERT' | ( 'INSERT' 'OR' )? 'REPLACE' ) 'INTO'? Table ( '(' Column ( ',' Column )* ')' )? ( 'SET' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | ( ( 'VALUES' | 'VALUE' )? '(' SimpleExpression ( ',' SimpleExpression )* ( ')' ',' '(' SimpleExpression ( ',' SimpleExpression )* )* | '(' SelectWithWithItems ) ')' | SelectWithWithItems ) ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* )?
Referenced by:
@@ -1418,7 +1370,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
+ ====================================================================================================================== @@ -2295,7 +2247,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. + ====================================================================================================================== @@ -4526,7 +4478,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -4537,14 +4489,16 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. ILIKE SimpleExpression - ESCAPE - - Expression - -
+ ESCAPE + + S_CHAR_LITERAL + + Expression + +
-
         ::= 'NOT'? ( 'LIKE' | 'ILIKE' ) SimpleExpression ( 'ESCAPE' Expression )?
+
         ::= 'NOT'? ( 'LIKE' | 'ILIKE' ) SimpleExpression ( 'ESCAPE' ( S_CHAR_LITERAL | Expression ) )?
Referenced by:
@@ -4959,7 +4913,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= ( UserVariable ( '=' | ':=' ) )? ConcatExpression
+ ====================================================================================================================== @@ -5251,7 +5205,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= ( 'NOT' | '!' )? ( '+' | '-' | '~' )? ( 'NULL' | CaseWhenExpression | SimpleJdbcParameter | JdbcNamedParameter | UserVariable | NumericBind | ExtractExpression | MySQLGroupConcat | XMLSerializeExpr | JsonExpression | JsonFunction | JsonAggregateFunction | FullTextSearch | Function AnalyticExpression? | IntervalExpression | S_DOUBLE | S_LONG | S_HEX | CastExpression | TryCastExpression | SafeCastExpression | K_TIME_KEY_EXPR | 'CURRENT' | DateTimeLiteralExpression | 'ARRAY' ArrayConstructor | NextValExpression | ConnectByRootOperator | 'ALL' | Column | S_CHAR_LITERAL | ( '{d' | '{t' | '{ts' ) S_CHAR_LITERAL '}' | '(' ( SubSelect ')' | ( ComplexExpressionList | SimpleExpressionList ) ')' ( '.' RelObjectNameExt )? ) ) ( 'COLLATE' S_IDENTIFIER )? IntervalExpressionWithoutInterval? ArrayExpression? ( '::' ColDataType )* ( 'AT' K_DATETIMELITERAL 'ZONE' PrimaryExpression )*
+ ====================================================================================================================== @@ -6622,7 +6576,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= WithList? SelectBody
+ ====================================================================================================================== @@ -7618,45 +7572,49 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - DROP - - S_IDENTIFIER - TABLE - - INDEX - - VIEW - - SCHEMA - - SEQUENCE - - FUNCTION - - IF - - EXISTS - - Table - - FuncArgsList - - S_IDENTIFIER - CASCADE - - RESTRICT - - ON - - -
- -
Drop     ::= 'DROP' ( S_IDENTIFIER | 'TABLE' | 'INDEX' | 'VIEW' | 'SCHEMA' | 'SEQUENCE' | 'FUNCTION' ) ( 'IF' 'EXISTS' - )? Table FuncArgsList? ( S_IDENTIFIER | 'CASCADE' | 'RESTRICT' | 'ON' )*
+ DROP + + MATERIALIZED + + S_IDENTIFIER + TEMPORARY + + TABLE + + INDEX + + VIEW + + SCHEMA + + SEQUENCE + + FUNCTION + + IF + + EXISTS + + Table + + FuncArgsList + + S_IDENTIFIER + CASCADE + + RESTRICT + + ON + + +
+ +
Drop     ::= 'DROP' 'MATERIALIZED'? ( S_IDENTIFIER | 'TEMPORARY'? 'TABLE' | 'INDEX' | 'VIEW' | 'SCHEMA' | 'SEQUENCE' | 'FUNCTION' ) + ( 'IF' 'EXISTS' )? Table FuncArgsList? ( S_IDENTIFIER | 'CASCADE' | 'RESTRICT' | 'ON' )*
Referenced by:
@@ -9389,1310 +9347,4324 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - - - $ - - [A-Z] - - _ - - [a-z] + + + UnicodeIdentifierStart + + Nd + $ + + _ [#x23] - - [#xA2-#xA5] - - [#xAA] - - [#xB5] - - [#xBA] - - [#xC0-#xD6] - - [#xD8-#xF6] - - [#xF8-#x21F] - - [#x222-#x233] - - [#x250-#x2AD] - - [#x2B0-#x2B8] - - [#x2BB-#x2C1] - - [#x2D0-#x2D1] - - [#x2E0-#x2E4] + + +
+ + +
           | Nd
+
           | [$_#x23]
+
+ Referenced by: +
+ + +====================================================================================================================== + PART_LETTER +====================================================================================================================== + + +.. raw:: html + + + + + + UnicodeIdentifierStart + + UnicodeIdentifierExtend + $ + + _ + + @ + + [#x23] + + +
+ + +
         ::= UnicodeIdentifierStart
+
           | UnicodeIdentifierExtend
+
           | [$_@#x23]
+
+ Referenced by: +
+ + +====================================================================================================================== + UnicodeIdentifierStart +====================================================================================================================== + + +.. raw:: html + + + + + + [#xB7] + + Ll + + Lm + + Lo + + Lt + + Lu + + Nl + +
+ + +
         ::= #xB7
+
           | Ll
+
           | Lm
+
           | Lo
+
           | Lt
+
           | Lu
+
           | Nl
+
+ Referenced by: +
+ + +====================================================================================================================== + Ll +====================================================================================================================== + + +.. raw:: html + + + + + + [a-z] + + [#xB5] + + [#xDF-#xF6] + + [#xF8-#xFF] + + [#x101] + + [#x103] + + [#x105] + + [#x107] + + [#x109] + + [#x10B] + + [#x10D] + + [#x10F] + + [#x111] + + [#x113] + + [#x115] + + [#x117] + + [#x119] + + [#x11B] - [#x2EE] - - [#x37A] + [#x11D] + + [#x11F] - [#x386] - - [#x388-#x38A] + [#x121] + + [#x123] - [#x38C] + [#x125] + + [#x127] + + [#x129] + + [#x12B] + + [#x12D] + + [#x12F] + + [#x131] + + [#x133] + + [#x135] + + [#x137-#x138] + + [#x13A] + + [#x13C] + + [#x13E] + + [#x140] + + [#x142] + + [#x144] + + [#x146] + + [#x148-#x149] + + [#x14B] + + [#x14D] + + [#x14F] + + [#x151] + + [#x153] + + [#x155] + + [#x157] + + [#x159] + + [#x15B] + + [#x15D] + + [#x15F] + + [#x161] + + [#x163] + + [#x165] + + [#x167] + + [#x169] + + [#x16B] + + [#x16D] + + [#x16F] + + [#x171] + + [#x173] + + [#x175] + + [#x177] + + [#x17A] + + [#x17C] + + [#x17E-#x180] + + [#x183] + + [#x185] + + [#x188] + + [#x18C-#x18D] + + [#x192] + + [#x195] + + [#x199-#x19B] + + [#x19E] + + [#x1A1] + + [#x1A3] + + [#x1A5] + + [#x1A8] + + [#x1AA-#x1AB] + + [#x1AD] + + [#x1B0] + + [#x1B4] + + [#x1B6] + + [#x1B9-#x1BA] + + [#x1BD-#x1BF] + + [#x1C6] + + [#x1C9] + + [#x1CC] + + [#x1CE] + + [#x1D0] + + [#x1D2] + + [#x1D4] + + [#x1D6] + + [#x1D8] + + [#x1DA] + + [#x1DC-#x1DD] + + [#x1DF] + + [#x1E1] + + [#x1E3] + + [#x1E5] + + [#x1E7] + + [#x1E9] + + [#x1EB] + + [#x1ED] + + [#x1EF-#x1F0] + + [#x1F3] + + [#x1F5] + + [#x1F9] + + [#x1FB] + + [#x1FD] + + [#x1FF] + + [#x201] + + [#x203] + + [#x205] + + [#x207] + + [#x209] + + [#x20B] + + [#x20D] + + [#x20F] + + [#x211] + + [#x213] + + [#x215] + + [#x217] + + [#x219] + + [#x21B] + + [#x21D] + + [#x21F] + + [#x221] + + [#x223] + + [#x225] + + [#x227] + + [#x229] + + [#x22B] + + [#x22D] + + [#x22F] + + [#x231] + + [#x233-#x239] + + [#x23C] + + [#x23F-#x240] + + [#x242] + + [#x247] + + [#x249] + + [#x24B] + + [#x24D] + + [#x24F-#x293] + + [#x295-#x2AF] + + [#x371] + + [#x373] + + [#x377] + + [#x37B-#x37D] + + [#x390] + + [#x3AC-#x3CE] + + [#x3D0-#x3D1] + + [#x3D5-#x3D7] + + [#x3D9] + + [#x3DB] + + [#x3DD] + + [#x3DF] + + [#x3E1] + + [#x3E3] + + [#x3E5] + + [#x3E7] + + [#x3E9] + + [#x3EB] + + [#x3ED] + + [#x3EF-#x3F3] + + [#x3F5] + + [#x3F8] + + [#x3FB-#x3FC] + + [#x430-#x45F] + + [#x461] + + [#x463] + + [#x465] + + [#x467] + + [#x469] + + [#x46B] + + [#x46D] + + [#x46F] + + [#x471] + + [#x473] + + [#x475] + + [#x477] + + [#x479] + + [#x47B] + + [#x47D] + + [#x47F] + + [#x481] + + [#x48B] + + [#x48D] + + [#x48F] + + [#x491] + + [#x493] + + [#x495] + + [#x497] + + [#x499] + + [#x49B] + + [#x49D] + + [#x49F] + + [#x4A1] + + [#x4A3] + + [#x4A5] + + [#x4A7] + + [#x4A9] + + [#x4AB] + + [#x4AD] + + [#x4AF] + + [#x4B1] + + [#x4B3] + + [#x4B5] + + [#x4B7] + + [#x4B9] + + [#x4BB] + + [#x4BD] + + [#x4BF] + + [#x4C2] + + [#x4C4] + + [#x4C6] + + [#x4C8] + + [#x4CA] + + [#x4CC] + + [#x4CE-#x4CF] + + [#x4D1] + + [#x4D3] + + [#x4D5] + + [#x4D7] + + [#x4D9] + + [#x4DB] + + [#x4DD] + + [#x4DF] + + [#x4E1] + + [#x4E3] + + [#x4E5] + + [#x4E7] + + [#x4E9] + + [#x4EB] + + [#x4ED] + + [#x4EF] + + [#x4F1] + + [#x4F3] + + [#x4F5] + + [#x4F7] + + [#x4F9] + + [#x4FB] + + [#x4FD] + + [#x4FF] + + [#x501] + + [#x503] + + [#x505] + + [#x507] + + [#x509] + + [#x50B] + + [#x50D] + + [#x50F] + + [#x511] + + [#x513] + + [#x515] + + [#x517] + + [#x519] + + [#x51B] + + [#x51D] + + [#x51F] + + [#x521] + + [#x523] + + [#x525] + + [#x527] + + [#x529] + + [#x52B] + + [#x52D] + + [#x52F] + + [#x560-#x588] + + [#x10D0-#x10FA] + + [#x10FD-#x10FF] + + [#x13F8-#x13FD] + + [#x1C80-#x1C88] + + [#x1D00-#x1D2B] + + [#x1D6B-#x1D77] + + [#x1D79-#x1D9A] + + [#x1E01] + + [#x1E03] + + [#x1E05] + + [#x1E07] + + [#x1E09] + + [#x1E0B] + + [#x1E0D] + + [#x1E0F] + + [#x1E11] + + [#x1E13] + + [#x1E15] + + [#x1E17] + + [#x1E19] + + [#x1E1B] + + [#x1E1D] + + [#x1E1F] + + [#x1E21] + + [#x1E23] + + [#x1E25] + + [#x1E27] + + [#x1E29] + + [#x1E2B] + + [#x1E2D] + + [#x1E2F] + + [#x1E31] + + [#x1E33] + + [#x1E35] + + [#x1E37] + + [#x1E39] + + [#x1E3B] + + [#x1E3D] + + [#x1E3F] + + [#x1E41] + + [#x1E43] + + [#x1E45] + + [#x1E47] + + [#x1E49] + + [#x1E4B] + + [#x1E4D] + + [#x1E4F] + + [#x1E51] + + [#x1E53] + + [#x1E55] + + [#x1E57] + + [#x1E59] + + [#x1E5B] + + [#x1E5D] + + [#x1E5F] + + [#x1E61] + + [#x1E63] + + [#x1E65] + + [#x1E67] + + [#x1E69] + + [#x1E6B] + + [#x1E6D] + + [#x1E6F] + + [#x1E71] + + [#x1E73] + + [#x1E75] + + [#x1E77] + + [#x1E79] + + [#x1E7B] + + [#x1E7D] + + [#x1E7F] + + [#x1E81] + + [#x1E83] + + [#x1E85] + + [#x1E87] + + [#x1E89] + + [#x1E8B] + + [#x1E8D] + + [#x1E8F] + + [#x1E91] + + [#x1E93] + + [#x1E95-#x1E9D] + + [#x1E9F] + + [#x1EA1] + + [#x1EA3] + + [#x1EA5] + + [#x1EA7] + + [#x1EA9] + + [#x1EAB] + + [#x1EAD] + + [#x1EAF] + + [#x1EB1] + + [#x1EB3] + + [#x1EB5] + + [#x1EB7] + + [#x1EB9] + + [#x1EBB] + + [#x1EBD] + + [#x1EBF] + + [#x1EC1] + + [#x1EC3] + + [#x1EC5] + + [#x1EC7] + + [#x1EC9] + + [#x1ECB] + + [#x1ECD] + + [#x1ECF] + + [#x1ED1] + + [#x1ED3] + + [#x1ED5] + + [#x1ED7] + + [#x1ED9] + + [#x1EDB] + + [#x1EDD] + + [#x1EDF] + + [#x1EE1] + + [#x1EE3] + + [#x1EE5] + + [#x1EE7] + + [#x1EE9] + + [#x1EEB] + + [#x1EED] + + [#x1EEF] + + [#x1EF1] + + [#x1EF3] + + [#x1EF5] + + [#x1EF7] + + [#x1EF9] + + [#x1EFB] + + [#x1EFD] + + [#x1EFF-#x1F07] + + [#x1F10-#x1F15] + + [#x1F20-#x1F27] + + [#x1F30-#x1F37] + + [#x1F40-#x1F45] + + [#x1F50-#x1F57] + + [#x1F60-#x1F67] + + [#x1F70-#x1F7D] + + [#x1F80-#x1F87] + + [#x1F90-#x1F97] + + [#x1FA0-#x1FA7] + + [#x1FB0-#x1FB4] + + [#x1FB6-#x1FB7] + + [#x1FBE] + + [#x1FC2-#x1FC4] + + [#x1FC6-#x1FC7] + + [#x1FD0-#x1FD3] + + [#x1FD6-#x1FD7] + + [#x1FE0-#x1FE7] + + [#x1FF2-#x1FF4] + + [#x1FF6-#x1FF7] + + [#x210A] + + [#x210E-#x210F] + + [#x2113] + + [#x212F] + + [#x2134] + + [#x2139] + + [#x213C-#x213D] + + [#x2146-#x2149] + + [#x214E] + + [#x2184] + + [#x2C30-#x2C5F] + + [#x2C61] + + [#x2C65-#x2C66] + + [#x2C68] + + [#x2C6A] + + [#x2C6C] + + [#x2C71] + + [#x2C73-#x2C74] + + [#x2C76-#x2C7B] + + [#x2C81] + + [#x2C83] + + [#x2C85] + + [#x2C87] + + [#x2C89] + + [#x2C8B] + + [#x2C8D] + + [#x2C8F] + + [#x2C91] + + [#x2C93] + + [#x2C95] + + [#x2C97] + + [#x2C99] + + [#x2C9B] + + [#x2C9D] + + [#x2C9F] + + [#x2CA1] + + [#x2CA3] + + [#x2CA5] + + [#x2CA7] + + [#x2CA9] + + [#x2CAB] + + [#x2CAD] + + [#x2CAF] + + [#x2CB1] + + [#x2CB3] + + [#x2CB5] + + [#x2CB7] + + [#x2CB9] + + [#x2CBB] + + [#x2CBD] + + [#x2CBF] + + [#x2CC1] + + [#x2CC3] + + [#x2CC5] + + [#x2CC7] + + [#x2CC9] + + [#x2CCB] + + [#x2CCD] + + [#x2CCF] + + [#x2CD1] + + [#x2CD3] + + [#x2CD5] + + [#x2CD7] + + [#x2CD9] + + [#x2CDB] + + [#x2CDD] + + [#x2CDF] + + [#x2CE1] + + [#x2CE3-#x2CE4] + + [#x2CEC] + + [#x2CEE] + + [#x2CF3] + + [#x2D00-#x2D25] + + [#x2D27] + + [#x2D2D] + + [#xA641] + + [#xA643] + + [#xA645] + + [#xA647] + + [#xA649] + + [#xA64B] + + [#xA64D] + + [#xA64F] + + [#xA651] + + [#xA653] + + [#xA655] + + [#xA657] + + [#xA659] + + [#xA65B] + + [#xA65D] + + [#xA65F] + + [#xA661] + + [#xA663] + + [#xA665] + + [#xA667] + + [#xA669] + + [#xA66B] + + [#xA66D] + + [#xA681] + + [#xA683] + + [#xA685] + + [#xA687] + + [#xA689] + + [#xA68B] + + [#xA68D] + + [#xA68F] + + [#xA691] + + [#xA693] + + [#xA695] + + [#xA697] + + [#xA699] + + [#xA69B] + + [#xA723] + + [#xA725] + + [#xA727] + + [#xA729] + + [#xA72B] + + [#xA72D] + + [#xA72F-#xA731] + + [#xA733] + + [#xA735] + + [#xA737] + + [#xA739] + + [#xA73B] + + [#xA73D] + + [#xA73F] + + [#xA741] + + [#xA743] + + [#xA745] + + [#xA747] + + [#xA749] + + [#xA74B] + + [#xA74D] + + [#xA74F] + + [#xA751] + + [#xA753] + + [#xA755] + + [#xA757] + + [#xA759] + + [#xA75B] + + [#xA75D] + + [#xA75F] + + [#xA761] + + [#xA763] + + [#xA765] + + [#xA767] + + [#xA769] + + [#xA76B] + + [#xA76D] + + [#xA76F] + + [#xA771-#xA778] + + [#xA77A] + + [#xA77C] + + [#xA77F] + + [#xA781] + + [#xA783] + + [#xA785] + + [#xA787] + + [#xA78C] + + [#xA78E] + + [#xA791] + + [#xA793-#xA795] + + [#xA797] + + [#xA799] + + [#xA79B] + + [#xA79D] + + [#xA79F] + + [#xA7A1] + + [#xA7A3] + + [#xA7A5] + + [#xA7A7] + + [#xA7A9] + + [#xA7AF] + + [#xA7B5] + + [#xA7B7] + + [#xA7B9] + + [#xA7BB] + + [#xA7BD] + + [#xA7BF] + + [#xA7C1] + + [#xA7C3] + + [#xA7C8] + + [#xA7CA] + + [#xA7D1] + + [#xA7D3] + + [#xA7D5] + + [#xA7D7] + + [#xA7D9] + + [#xA7F6] + + [#xA7FA] + + [#xAB30-#xAB5A] + + [#xAB60-#xAB68] + + [#xAB70-#xABBF] + + [#xFB00-#xFB06] + + [#xFB13-#xFB17] + + [#xFF41-#xFF5A] + + +
+ +
Ll       ::= [a-z#xB5#xDF-#xF6#xF8-#xFF#x101#x103#x105#x107#x109#x10B#x10D#x10F#x111#x113#x115#x117#x119#x11B#x11D#x11F#x121#x123#x125#x127#x129#x12B#x12D#x12F#x131#x133#x135#x137-#x138#x13A#x13C#x13E#x140#x142#x144#x146#x148-#x149#x14B#x14D#x14F#x151#x153#x155#x157#x159#x15B#x15D#x15F#x161#x163#x165#x167#x169#x16B#x16D#x16F#x171#x173#x175#x177#x17A#x17C#x17E-#x180#x183#x185#x188#x18C-#x18D#x192#x195#x199-#x19B#x19E#x1A1#x1A3#x1A5#x1A8#x1AA-#x1AB#x1AD#x1B0#x1B4#x1B6#x1B9-#x1BA#x1BD-#x1BF#x1C6#x1C9#x1CC#x1CE#x1D0#x1D2#x1D4#x1D6#x1D8#x1DA#x1DC-#x1DD#x1DF#x1E1#x1E3#x1E5#x1E7#x1E9#x1EB#x1ED#x1EF-#x1F0#x1F3#x1F5#x1F9#x1FB#x1FD#x1FF#x201#x203#x205#x207#x209#x20B#x20D#x20F#x211#x213#x215#x217#x219#x21B#x21D#x21F#x221#x223#x225#x227#x229#x22B#x22D#x22F#x231#x233-#x239#x23C#x23F-#x240#x242#x247#x249#x24B#x24D#x24F-#x293#x295-#x2AF#x371#x373#x377#x37B-#x37D#x390#x3AC-#x3CE#x3D0-#x3D1#x3D5-#x3D7#x3D9#x3DB#x3DD#x3DF#x3E1#x3E3#x3E5#x3E7#x3E9#x3EB#x3ED#x3EF-#x3F3#x3F5#x3F8#x3FB-#x3FC#x430-#x45F#x461#x463#x465#x467#x469#x46B#x46D#x46F#x471#x473#x475#x477#x479#x47B#x47D#x47F#x481#x48B#x48D#x48F#x491#x493#x495#x497#x499#x49B#x49D#x49F#x4A1#x4A3#x4A5#x4A7#x4A9#x4AB#x4AD#x4AF#x4B1#x4B3#x4B5#x4B7#x4B9#x4BB#x4BD#x4BF#x4C2#x4C4#x4C6#x4C8#x4CA#x4CC#x4CE-#x4CF#x4D1#x4D3#x4D5#x4D7#x4D9#x4DB#x4DD#x4DF#x4E1#x4E3#x4E5#x4E7#x4E9#x4EB#x4ED#x4EF#x4F1#x4F3#x4F5#x4F7#x4F9#x4FB#x4FD#x4FF#x501#x503#x505#x507#x509#x50B#x50D#x50F#x511#x513#x515#x517#x519#x51B#x51D#x51F#x521#x523#x525#x527#x529#x52B#x52D#x52F#x560-#x588#x10D0-#x10FA#x10FD-#x10FF#x13F8-#x13FD#x1C80-#x1C88#x1D00-#x1D2B#x1D6B-#x1D77#x1D79-#x1D9A#x1E01#x1E03#x1E05#x1E07#x1E09#x1E0B#x1E0D#x1E0F#x1E11#x1E13#x1E15#x1E17#x1E19#x1E1B#x1E1D#x1E1F#x1E21#x1E23#x1E25#x1E27#x1E29#x1E2B#x1E2D#x1E2F#x1E31#x1E33#x1E35#x1E37#x1E39#x1E3B#x1E3D#x1E3F#x1E41#x1E43#x1E45#x1E47#x1E49#x1E4B#x1E4D#x1E4F#x1E51#x1E53#x1E55#x1E57#x1E59#x1E5B#x1E5D#x1E5F#x1E61#x1E63#x1E65#x1E67#x1E69#x1E6B#x1E6D#x1E6F#x1E71#x1E73#x1E75#x1E77#x1E79#x1E7B#x1E7D#x1E7F#x1E81#x1E83#x1E85#x1E87#x1E89#x1E8B#x1E8D#x1E8F#x1E91#x1E93#x1E95-#x1E9D#x1E9F#x1EA1#x1EA3#x1EA5#x1EA7#x1EA9#x1EAB#x1EAD#x1EAF#x1EB1#x1EB3#x1EB5#x1EB7#x1EB9#x1EBB#x1EBD#x1EBF#x1EC1#x1EC3#x1EC5#x1EC7#x1EC9#x1ECB#x1ECD#x1ECF#x1ED1#x1ED3#x1ED5#x1ED7#x1ED9#x1EDB#x1EDD#x1EDF#x1EE1#x1EE3#x1EE5#x1EE7#x1EE9#x1EEB#x1EED#x1EEF#x1EF1#x1EF3#x1EF5#x1EF7#x1EF9#x1EFB#x1EFD#x1EFF-#x1F07#x1F10-#x1F15#x1F20-#x1F27#x1F30-#x1F37#x1F40-#x1F45#x1F50-#x1F57#x1F60-#x1F67#x1F70-#x1F7D#x1F80-#x1F87#x1F90-#x1F97#x1FA0-#x1FA7#x1FB0-#x1FB4#x1FB6-#x1FB7#x1FBE#x1FC2-#x1FC4#x1FC6-#x1FC7#x1FD0-#x1FD3#x1FD6-#x1FD7#x1FE0-#x1FE7#x1FF2-#x1FF4#x1FF6-#x1FF7#x210A#x210E-#x210F#x2113#x212F#x2134#x2139#x213C-#x213D#x2146-#x2149#x214E#x2184#x2C30-#x2C5F#x2C61#x2C65-#x2C66#x2C68#x2C6A#x2C6C#x2C71#x2C73-#x2C74#x2C76-#x2C7B#x2C81#x2C83#x2C85#x2C87#x2C89#x2C8B#x2C8D#x2C8F#x2C91#x2C93#x2C95#x2C97#x2C99#x2C9B#x2C9D#x2C9F#x2CA1#x2CA3#x2CA5#x2CA7#x2CA9#x2CAB#x2CAD#x2CAF#x2CB1#x2CB3#x2CB5#x2CB7#x2CB9#x2CBB#x2CBD#x2CBF#x2CC1#x2CC3#x2CC5#x2CC7#x2CC9#x2CCB#x2CCD#x2CCF#x2CD1#x2CD3#x2CD5#x2CD7#x2CD9#x2CDB#x2CDD#x2CDF#x2CE1#x2CE3-#x2CE4#x2CEC#x2CEE#x2CF3#x2D00-#x2D25#x2D27#x2D2D#xA641#xA643#xA645#xA647#xA649#xA64B#xA64D#xA64F#xA651#xA653#xA655#xA657#xA659#xA65B#xA65D#xA65F#xA661#xA663#xA665#xA667#xA669#xA66B#xA66D#xA681#xA683#xA685#xA687#xA689#xA68B#xA68D#xA68F#xA691#xA693#xA695#xA697#xA699#xA69B#xA723#xA725#xA727#xA729#xA72B#xA72D#xA72F-#xA731#xA733#xA735#xA737#xA739#xA73B#xA73D#xA73F#xA741#xA743#xA745#xA747#xA749#xA74B#xA74D#xA74F#xA751#xA753#xA755#xA757#xA759#xA75B#xA75D#xA75F#xA761#xA763#xA765#xA767#xA769#xA76B#xA76D#xA76F#xA771-#xA778#xA77A#xA77C#xA77F#xA781#xA783#xA785#xA787#xA78C#xA78E#xA791#xA793-#xA795#xA797#xA799#xA79B#xA79D#xA79F#xA7A1#xA7A3#xA7A5#xA7A7#xA7A9#xA7AF#xA7B5#xA7B7#xA7B9#xA7BB#xA7BD#xA7BF#xA7C1#xA7C3#xA7C8#xA7CA#xA7D1#xA7D3#xA7D5#xA7D7#xA7D9#xA7F6#xA7FA#xAB30-#xAB5A#xAB60-#xAB68#xAB70-#xABBF#xFB00-#xFB06#xFB13-#xFB17#xFF41-#xFF5A]
+
+ Referenced by: +
+ + +====================================================================================================================== + Lm +====================================================================================================================== + + +.. raw:: html + + + + + + [#x2B0-#x2C1] + + [#x2C6-#x2D1] + + [#x2E0-#x2E4] + + [#x2EC] + + [#x2EE] + + [#x374] + + [#x37A] + + [#x559] + + [#x640] + + [#x6E5-#x6E6] + + [#x7F4-#x7F5] + + [#x7FA] + + [#x81A] + + [#x824] + + [#x828] + + [#x8C9] + + [#x971] + + [#xE46] + + [#xEC6] + + [#x10FC] + + [#x17D7] + + [#x1843] + + [#x1AA7] + + [#x1C78-#x1C7D] + + [#x1D2C-#x1D6A] + + [#x1D78] + + [#x1D9B-#x1DBF] + + [#x2071] + + [#x207F] + + [#x2090-#x209C] + + [#x2C7C-#x2C7D] + + [#x2D6F] + + [#x2E2F] + + [#x3005] + + [#x3031-#x3035] + + [#x303B] + + [#x309D-#x309E] + + [#x30FC-#x30FE] + + [#xA015] + + [#xA4F8-#xA4FD] + + [#xA60C] + + [#xA67F] + + [#xA69C-#xA69D] + + [#xA717-#xA71F] + + [#xA770] + + [#xA788] + + [#xA7F2-#xA7F4] + + [#xA7F8-#xA7F9] + + [#xA9CF] + + [#xA9E6] + + [#xAA70] + + [#xAADD] + + [#xAAF3-#xAAF4] + + [#xAB5C-#xAB5F] + + [#xAB69] + + [#xFF70] + + [#xFF9E-#xFF9F] + + +
+ +
Lm       ::= [#x2B0-#x2C1#x2C6-#x2D1#x2E0-#x2E4#x2EC#x2EE#x374#x37A#x559#x640#x6E5-#x6E6#x7F4-#x7F5#x7FA#x81A#x824#x828#x8C9#x971#xE46#xEC6#x10FC#x17D7#x1843#x1AA7#x1C78-#x1C7D#x1D2C-#x1D6A#x1D78#x1D9B-#x1DBF#x2071#x207F#x2090-#x209C#x2C7C-#x2C7D#x2D6F#x2E2F#x3005#x3031-#x3035#x303B#x309D-#x309E#x30FC-#x30FE#xA015#xA4F8-#xA4FD#xA60C#xA67F#xA69C-#xA69D#xA717-#xA71F#xA770#xA788#xA7F2-#xA7F4#xA7F8-#xA7F9#xA9CF#xA9E6#xAA70#xAADD#xAAF3-#xAAF4#xAB5C-#xAB5F#xAB69#xFF70#xFF9E-#xFF9F]
+
+ Referenced by: +
+ + +====================================================================================================================== + Lo +====================================================================================================================== + + +.. raw:: html + + + + + + [#xAA] + + [#xBA] + + [#x1BB] + + [#x1C0-#x1C3] + + [#x294] + + [#x5D0-#x5EA] + + [#x5EF-#x5F2] + + [#x620-#x63F] + + [#x641-#x64A] + + [#x66E-#x66F] + + [#x671-#x6D3] + + [#x6D5] + + [#x6EE-#x6EF] + + [#x6FA-#x6FC] + + [#x6FF] + + [#x710] + + [#x712-#x72F] + + [#x74D-#x7A5] + + [#x7B1] + + [#x7CA-#x7EA] + + [#x800-#x815] + + [#x840-#x858] + + [#x860-#x86A] - [#x38E-#x3A1] + [#x870-#x887] - [#x3A3-#x3CE] - - [#x3D0-#x3D7] + [#x889-#x88E] + + [#x8A0-#x8C8] - [#x3DA-#x3F3] - - [#x400-#x481] - - [#x48C-#x4C4] - - [#x4C7-#x4C8] - - [#x4CB-#x4CC] + [#x904-#x939] + + [#x93D] + + [#x950] + + [#x958-#x961] + + [#x972-#x980] - [#x4D0-#x4F5] + [#x985-#x98C] - [#x4F8-#x4F9] + [#x98F-#x990] - [#x531-#x556] - - [#x559] - - [#x561-#x587] + [#x993-#x9A8] + + [#x9AA-#x9B0] + + [#x9B2] - [#x5D0-#x5EA] - - [#x5F0-#x5F2] - - [#x621-#x63A] - - [#x640-#x64A] + [#x9B6-#x9B9] + + [#x9BD] + + [#x9CE] + + [#x9DC-#x9DD] - [#x671-#x6D3] - - [#x6D5] - - [#x6E5-#x6E6] - - [#x6FA-#x6FC] - - [#x710] + [#x9DF-#x9E1] + + [#x9F0-#x9F1] + + [#x9FC] + + [#xA05-#xA0A] + + [#xA0F-#xA10] - [#x712-#x72C] + [#xA13-#xA28] - [#x780-#x7A5] + [#xA2A-#xA30] - [#x905-#x939] - - [#x93D] - - [#x950] + [#xA32-#xA33] + + [#xA35-#xA36] + + [#xA38-#xA39] - [#x958-#x961] - - [#x985-#x98C] - - [#x98F-#x990] - - [#x993-#x9A8] - - [#x9AA-#x9B0] - - [#x9B2] + [#xA59-#xA5C] + + [#xA5E] + + [#xA72-#xA74] + + [#xA85-#xA8D] + + [#xA8F-#xA91] + + [#xA93-#xAA8] - [#x9B6-#x9B9] - - [#x9DC-#x9DD] + [#xAAA-#xAB0] + + [#xAB2-#xAB3] - [#x9DF-#x9E1] - - [#x9F0-#x9F3] - - [#xA05-#xA0A] - - [#xA0F-#xA10] - - [#xA13-#xA28] + [#xAB5-#xAB9] + + [#xABD] + + [#xAD0] + + [#xAE0-#xAE1] + + [#xAF9] - [#xA2A-#xA30] - - [#xA32-#xA33] + [#xB05-#xB0C] + + [#xB0F-#xB10] - [#xA35-#xA36] + [#xB13-#xB28] - [#xA38-#xA39] + [#xB2A-#xB30] - [#xA59-#xA5C] - - [#xA5E] - - [#xA72-#xA74] - - [#xA85-#xA8B] - - [#xA8D] - - [#xA8F-#xA91] - - [#xA93-#xAA8] + [#xB32-#xB33] + + [#xB35-#xB39] + + [#xB3D] + + [#xB5C-#xB5D] + + [#xB5F-#xB61] + + [#xB71] + + [#xB83] - [#xAAA-#xAB0] + [#xB85-#xB8A] - [#xAB2-#xAB3] + [#xB8E-#xB90] - [#xAB5-#xAB9] - - [#xABD] + [#xB92-#xB95] + + [#xB99-#xB9A] - [#xAD0] - - [#xAE0] + [#xB9C] + + [#xB9E-#xB9F] - [#xB05-#xB0C] - - [#xB0F-#xB10] + [#xBA3-#xBA4] + + [#xBA8-#xBAA] - [#xB13-#xB28] - - [#xB2A-#xB30] - - [#xB32-#xB33] - - [#xB36-#xB39] - - [#xB3D] + [#xBAE-#xBB9] + + [#xBD0] + + [#xC05-#xC0C] + + [#xC0E-#xC10] + + [#xC12-#xC28] - [#xB5C-#xB5D] - - [#xB5F-#xB61] - - [#xB85-#xB8A] - - [#xB8E-#xB90] - - [#xB92-#xB95] - - [#xB99-#xB9A] - - [#xB9C] - - [#xB9E-#xB9F] - - [#xBA3-#xBA4] - - [#xBA8-#xBAA] - - [#xBAE-#xBB5] - - [#xBB7-#xBB9] - - [#xC05-#xC0C] + [#xC2A-#xC39] + + [#xC3D] + + [#xC58-#xC5A] + + [#xC5D] + + [#xC60-#xC61] + + [#xC80] + + [#xC85-#xC8C] + + [#xC8E-#xC90] + + [#xC92-#xCA8] + + [#xCAA-#xCB3] + + [#xCB5-#xCB9] + + [#xCBD] + + [#xCDD-#xCDE] - [#xC0E-#xC10] - - [#xC12-#xC28] + [#xCE0-#xCE1] + + [#xCF1-#xCF2] - [#xC2A-#xC33] + [#xD04-#xD0C] - [#xC35-#xC39] + [#xD0E-#xD10] - [#xC60-#xC61] - - [#xC85-#xC8C] - - [#xC8E-#xC90] + [#xD12-#xD3A] + + [#xD3D] + + [#xD4E] - [#xC92-#xCA8] - - [#xCAA-#xCB3] + [#xD54-#xD56] + + [#xD5F-#xD61] - [#xCB5-#xCB9] - - [#xCDE] + [#xD7A-#xD7F] + + [#xD85-#xD96] - [#xCE0-#xCE1] + [#xD9A-#xDB1] - [#xD05-#xD0C] - - [#xD0E-#xD10] - - [#xD12-#xD28] - - [#xD2A-#xD39] - - [#xD60-#xD61] - - [#xD85-#xD96] - - [#xD9A-#xDB1] - - [#xDB3-#xDBB] - - [#xDBD] - - [#xDC0-#xDC6] - - [#xE01-#xE30] + [#xDB3-#xDBB] + + [#xDBD] + + [#xDC0-#xDC6] + + [#xE01-#xE30] + + [#xE32-#xE33] + + [#xE40-#xE45] + + [#xE81-#xE82] + + [#xE84] + + [#xE86-#xE8A] + + [#xE8C-#xEA3] + + [#xEA5] - [#xE32-#xE33] - - [#xE3F-#xE46] - - [#xE81-#xE82] - - [#xE84] - - [#xE87-#xE88] - - [#xE8A] - - [#xE8D] - - [#xE94-#xE97] + [#xEA7-#xEB0] + + [#xEB2-#xEB3] + + [#xEBD] + + [#xEC0-#xEC4] + + [#xEDC-#xEDF] + + [#xF00] + + [#xF40-#xF47] + + [#xF49-#xF6C] - [#xE99-#xE9F] - - [#xEA1-#xEA3] - - [#xEA5] - - [#xEA7] - - [#xEAA-#xEAB] - - [#xEAD-#xEB0] - - [#xEB2-#xEB3] - - [#xEBD] - - [#xEC0-#xEC4] - - [#xEC6] - - [#xEDC-#xEDD] - - [#xF00] - - [#xF40-#xF47] - - [#xF49-#xF6A] - - [#xF88-#xF8B] + [#xF88-#xF8C] + + [#x1000-#x102A] + + [#x103F] + + [#x1050-#x1055] + + [#x105A-#x105D] + + [#x1061] + + [#x1065-#x1066] + + [#x106E-#x1070] + + [#x1075-#x1081] + + [#x108E] + + [#x1100-#x1248] + + [#x124A-#x124D] + + [#x1250-#x1256] + + [#x1258] + + [#x125A-#x125D] - [#x1000-#x1021] + [#x1260-#x1288] - [#x1023-#x1027] + [#x128A-#x128D] - [#x1029-#x102A] + [#x1290-#x12B0] - [#x1050-#x1055] + [#x12B2-#x12B5] - [#x10A0-#x10C5] - - [#x10D0-#x10F6] - - [#x1100-#x1159] - - [#x115F-#x11A2] - - [#x11A8-#x11F9] + [#x12B8-#x12BE] + + [#x12C0] + + [#x12C2-#x12C5] + + [#x12C8-#x12D6] + + [#x12D8-#x1310] - [#x1200-#x1206] + [#x1312-#x1315] - [#x1208-#x1246] - - [#x1248] + [#x1318-#x135A] + + [#x1380-#x138F] - [#x124A-#x124D] - - [#x1250-#x1256] - - [#x1258] + [#x1401-#x166C] + + [#x166F-#x167F] + + [#x1681-#x169A] - [#x125A-#x125D] - - [#x1260-#x1286] - - [#x1288] - - [#x128A-#x128D] + [#x16A0-#x16EA] + + [#x16F1-#x16F8] + + [#x1700-#x1711] + + [#x171F-#x1731] - [#x1290-#x12AE] - - [#x12B0] + [#x1740-#x1751] + + [#x1760-#x176C] - [#x12B2-#x12B5] + [#x176E-#x1770] - [#x12B8-#x12BE] - - [#x12C0] - - [#x12C2-#x12C5] - - [#x12C8-#x12CE] - - [#x12D0-#x12D6] + [#x1780-#x17B3] + + [#x17DC] + + [#x1820-#x1842] + + [#x1844-#x1878] + + [#x1880-#x1884] - [#x12D8-#x12EE] - - [#x12F0-#x130E] - - [#x1310] + [#x1887-#x18A8] + + [#x18AA] + + [#x18B0-#x18F5] - [#x1312-#x1315] + [#x1900-#x191E] - [#x1318-#x131E] + [#x1950-#x196D] - [#x1320-#x1346] + [#x1970-#x1974] - [#x1348-#x135A] - - [#x13A0-#x13F4] + [#x1980-#x19AB] + + [#x19B0-#x19C9] - [#x1401-#x166C] - - [#x166F-#x1676] + [#x1A00-#x1A16] + + [#x1A20-#x1A54] - [#x1681-#x169A] + [#x1B05-#x1B33] - [#x16A0-#x16EA] + [#x1B45-#x1B4C] - [#x1780-#x17B3] - - [#x17DB] + [#x1B83-#x1BA0] + + [#x1BAE-#x1BAF] - [#x1820-#x1877] - - [#x1880-#x18A8] - - [#x1E00-#x1E9B] - - [#x1EA0-#x1EF9] - - [#x1F00-#x1F15] - - [#x1F18-#x1F1D] - - [#x1F20-#x1F45] - - [#x1F48-#x1F4D] - - [#x1F50-#x1F57] - - [#x1F59] - - [#x1F5B] - - [#x1F5D] - - [#x1F5F-#x1F7D] - - [#x1F80-#x1FB4] - - [#x1FB6-#x1FBC] - - [#x1FBE] - - [#x1FC2-#x1FC4] - - [#x1FC6-#x1FCC] - - [#x1FD0-#x1FD3] - - [#x1FD6-#x1FDB] - - [#x1FE0-#x1FEC] - - [#x1FF2-#x1FF4] - - [#x1FF6-#x1FFC] + [#x1BBA-#x1BE5] + + [#x1C00-#x1C23] + + [#x1C4D-#x1C4F] + + [#x1C5A-#x1C77] + + [#x1CE9-#x1CEC] + + [#x1CEE-#x1CF3] + + [#x1CF5-#x1CF6] + + [#x1CFA] + + [#x2135-#x2138] + + [#x2D30-#x2D67] + + [#x2D80-#x2D96] + + [#x2DA0-#x2DA6] + + [#x2DA8-#x2DAE] + + [#x2DB0-#x2DB6] + + [#x2DB8-#x2DBE] + + [#x2DC0-#x2DC6] + + [#x2DC8-#x2DCE] + + [#x2DD0-#x2DD6] + + [#x2DD8-#x2DDE] + + [#x3006] + + [#x303C] + + [#x3041-#x3096] + + [#x309F] - [#x203F-#x2040] + [#x30A1-#x30FA] - [#x207F] + [#x30FF] - [#x20A0-#x20AF] - - [#x2102] - - [#x2107] - - [#x210A-#x2113] + [#x3105-#x312F] + + [#x3131-#x318E] + + [#x31A0-#x31BF] + + [#x31F0-#x31FF] - [#x2115] - - [#x2119-#x211D] - - [#x2124] - - [#x2126] - - [#x2128] - - [#x212A-#x212D] - - [#x212F-#x2131] - - [#x2133-#x2139] + [#x4DBF] + + [#x9FFF-#xA014] + + [#xA016-#xA48C] + + [#xA4D0-#xA4F7] + + [#xA500-#xA60B] + + [#xA610-#xA61F] + + [#xA62A-#xA62B] + + [#xA66E] - [#x2160-#x2183] - - [#x3005-#x3007] - - [#x3021-#x3029] + [#xA6A0-#xA6E5] + + [#xA78F] + + [#xA7F7] - [#x3031-#x3035] + [#xA7FB-#xA801] - [#x3038-#x303A] + [#xA803-#xA805] - [#x3041-#x3094] + [#xA807-#xA80A] - [#x309D-#x309E] - - [#x30A1-#x30FE] + [#xA80C-#xA822] + + [#xA840-#xA873] - [#x3105-#x312C] - - [#x3131-#x318E] - - [#x31A0-#x31B7] + [#xA882-#xA8B3] + + [#xA8F2-#xA8F7] + + [#xA8FB] - [#x3400-#x4DB5] - - [#x4E00-#x9FA5] + [#xA8FD-#xA8FE] + + [#xA90A-#xA925] - [#xA000-#xA48C] - - [#xAC00-#xD7A3] - - [#xF900-#xFA2D] - - [#xFB00-#xFB06] + [#xA930-#xA946] + + [#xA960-#xA97C] + + [#xA984-#xA9B2] + + [#xA9E0-#xA9E4] - [#xFB13-#xFB17] - - [#xFB1D] - - [#xFB1F-#xFB28] - - [#xFB2A-#xFB36] - - [#xFB38-#xFB3C] - - [#xFB3E] - - [#xFB40-#xFB41] - - [#xFB43-#xFB44] - - [#xFB46-#xFBB1] - - [#xFBD3-#xFD3D] - - [#xFD50-#xFD8F] - - [#xFD92-#xFDC7] - - [#xFDF0-#xFDFB] - - [#xFE33-#xFE34] - - [#xFE4D-#xFE4F] - - [#xFE69] - - [#xFE70-#xFE72] - - [#xFE74] - - [#xFE76-#xFEFC] - - [#xFF04] - - [#xFF21-#xFF3A] - - [#xFF3F] - - [#xFF41-#xFF5A] - - [#xFF65-#xFFBE] - - [#xFFC2-#xFFC7] - - [#xFFCA-#xFFCF] + [#xA9E7-#xA9EF] + + [#xA9FA-#xA9FE] + + [#xAA00-#xAA28] + + [#xAA40-#xAA42] + + [#xAA44-#xAA4B] + + [#xAA60-#xAA6F] + + [#xAA71-#xAA76] + + [#xAA7A] + + [#xAA7E-#xAAAF] + + [#xAAB1] + + [#xAAB5-#xAAB6] + + [#xAAB9-#xAABD] + + [#xAAC0] + + [#xAAC2] + + [#xAADB-#xAADC] + + [#xAAE0-#xAAEA] + + [#xAAF2] + + [#xAB01-#xAB06] + + [#xAB09-#xAB0E] + + [#xAB11-#xAB16] + + [#xAB20-#xAB26] + + [#xAB28-#xAB2E] + + [#xABC0-#xABE2] + + [#xD7A3] + + [#xD7B0-#xD7C6] + + [#xD7CB-#xD7FB] - [#xFFD2-#xFFD7] + [#xF900-#xFA6D] - [#xFFDA-#xFFDC] - - [#xFFE0-#xFFE1] + [#xFA70-#xFAD9] + + [#xFB1D] - [#xFFE5-#xFFE6] - - -
+ [#xFB1F-#xFB28] + + [#xFB2A-#xFB36] + + [#xFB38-#xFB3C] + + [#xFB3E] + + [#xFB40-#xFB41] + + [#xFB43-#xFB44] + + [#xFB46-#xFBB1] + + [#xFBD3-#xFD3D] + + [#xFD50-#xFD8F] + + [#xFD92-#xFDC7] + + [#xFDF0-#xFDFB] + + [#xFE70-#xFE74] + + [#xFE76-#xFEFC] + + [#xFF66-#xFF6F] + + [#xFF71-#xFF9D] + + [#xFFA0-#xFFBE] + + [#xFFC2-#xFFC7] + + [#xFFCA-#xFFCF] + + [#xFFD2-#xFFD7] + + [#xFFDA-#xFFDC] + + +
-
LETTER   ::= [$A-Z_a-z#x23#xA2-#xA5#xAA#xB5#xBA#xC0-#xD6#xD8-#xF6#xF8-#x21F#x222-#x233#x250-#x2AD#x2B0-#x2B8#x2BB-#x2C1#x2D0-#x2D1#x2E0-#x2E4#x2EE#x37A#x386#x388-#x38A#x38C#x38E-#x3A1#x3A3-#x3CE#x3D0-#x3D7#x3DA-#x3F3#x400-#x481#x48C-#x4C4#x4C7-#x4C8#x4CB-#x4CC#x4D0-#x4F5#x4F8-#x4F9#x531-#x556#x559#x561-#x587#x5D0-#x5EA#x5F0-#x5F2#x621-#x63A#x640-#x64A#x671-#x6D3#x6D5#x6E5-#x6E6#x6FA-#x6FC#x710#x712-#x72C#x780-#x7A5#x905-#x939#x93D#x950#x958-#x961#x985-#x98C#x98F-#x990#x993-#x9A8#x9AA-#x9B0#x9B2#x9B6-#x9B9#x9DC-#x9DD#x9DF-#x9E1#x9F0-#x9F3#xA05-#xA0A#xA0F-#xA10#xA13-#xA28#xA2A-#xA30#xA32-#xA33#xA35-#xA36#xA38-#xA39#xA59-#xA5C#xA5E#xA72-#xA74#xA85-#xA8B#xA8D#xA8F-#xA91#xA93-#xAA8#xAAA-#xAB0#xAB2-#xAB3#xAB5-#xAB9#xABD#xAD0#xAE0#xB05-#xB0C#xB0F-#xB10#xB13-#xB28#xB2A-#xB30#xB32-#xB33#xB36-#xB39#xB3D#xB5C-#xB5D#xB5F-#xB61#xB85-#xB8A#xB8E-#xB90#xB92-#xB95#xB99-#xB9A#xB9C#xB9E-#xB9F#xBA3-#xBA4#xBA8-#xBAA#xBAE-#xBB5#xBB7-#xBB9#xC05-#xC0C#xC0E-#xC10#xC12-#xC28#xC2A-#xC33#xC35-#xC39#xC60-#xC61#xC85-#xC8C#xC8E-#xC90#xC92-#xCA8#xCAA-#xCB3#xCB5-#xCB9#xCDE#xCE0-#xCE1#xD05-#xD0C#xD0E-#xD10#xD12-#xD28#xD2A-#xD39#xD60-#xD61#xD85-#xD96#xD9A-#xDB1#xDB3-#xDBB#xDBD#xDC0-#xDC6#xE01-#xE30#xE32-#xE33#xE3F-#xE46#xE81-#xE82#xE84#xE87-#xE88#xE8A#xE8D#xE94-#xE97#xE99-#xE9F#xEA1-#xEA3#xEA5#xEA7#xEAA-#xEAB#xEAD-#xEB0#xEB2-#xEB3#xEBD#xEC0-#xEC4#xEC6#xEDC-#xEDD#xF00#xF40-#xF47#xF49-#xF6A#xF88-#xF8B#x1000-#x1021#x1023-#x1027#x1029-#x102A#x1050-#x1055#x10A0-#x10C5#x10D0-#x10F6#x1100-#x1159#x115F-#x11A2#x11A8-#x11F9#x1200-#x1206#x1208-#x1246#x1248#x124A-#x124D#x1250-#x1256#x1258#x125A-#x125D#x1260-#x1286#x1288#x128A-#x128D#x1290-#x12AE#x12B0#x12B2-#x12B5#x12B8-#x12BE#x12C0#x12C2-#x12C5#x12C8-#x12CE#x12D0-#x12D6#x12D8-#x12EE#x12F0-#x130E#x1310#x1312-#x1315#x1318-#x131E#x1320-#x1346#x1348-#x135A#x13A0-#x13F4#x1401-#x166C#x166F-#x1676#x1681-#x169A#x16A0-#x16EA#x1780-#x17B3#x17DB#x1820-#x1877#x1880-#x18A8#x1E00-#x1E9B#x1EA0-#x1EF9#x1F00-#x1F15#x1F18-#x1F1D#x1F20-#x1F45#x1F48-#x1F4D#x1F50-#x1F57#x1F59#x1F5B#x1F5D#x1F5F-#x1F7D#x1F80-#x1FB4#x1FB6-#x1FBC#x1FBE#x1FC2-#x1FC4#x1FC6-#x1FCC#x1FD0-#x1FD3#x1FD6-#x1FDB#x1FE0-#x1FEC#x1FF2-#x1FF4#x1FF6-#x1FFC#x203F-#x2040#x207F#x20A0-#x20AF#x2102#x2107#x210A-#x2113#x2115#x2119-#x211D#x2124#x2126#x2128#x212A-#x212D#x212F-#x2131#x2133-#x2139#x2160-#x2183#x3005-#x3007#x3021-#x3029#x3031-#x3035#x3038-#x303A#x3041-#x3094#x309D-#x309E#x30A1-#x30FE#x3105-#x312C#x3131-#x318E#x31A0-#x31B7#x3400-#x4DB5#x4E00-#x9FA5#xA000-#xA48C#xAC00-#xD7A3#xF900-#xFA2D#xFB00-#xFB06#xFB13-#xFB17#xFB1D#xFB1F-#xFB28#xFB2A-#xFB36#xFB38-#xFB3C#xFB3E#xFB40-#xFB41#xFB43-#xFB44#xFB46-#xFBB1#xFBD3-#xFD3D#xFD50-#xFD8F#xFD92-#xFDC7#xFDF0-#xFDFB#xFE33-#xFE34#xFE4D-#xFE4F#xFE69#xFE70-#xFE72#xFE74#xFE76-#xFEFC#xFF04#xFF21-#xFF3A#xFF3F#xFF41-#xFF5A#xFF65-#xFFBE#xFFC2-#xFFC7#xFFCA-#xFFCF#xFFD2-#xFFD7#xFFDA-#xFFDC#xFFE0-#xFFE1#xFFE5-#xFFE6]
+
Lo       ::= [#xAA#xBA#x1BB#x1C0-#x1C3#x294#x5D0-#x5EA#x5EF-#x5F2#x620-#x63F#x641-#x64A#x66E-#x66F#x671-#x6D3#x6D5#x6EE-#x6EF#x6FA-#x6FC#x6FF#x710#x712-#x72F#x74D-#x7A5#x7B1#x7CA-#x7EA#x800-#x815#x840-#x858#x860-#x86A#x870-#x887#x889-#x88E#x8A0-#x8C8#x904-#x939#x93D#x950#x958-#x961#x972-#x980#x985-#x98C#x98F-#x990#x993-#x9A8#x9AA-#x9B0#x9B2#x9B6-#x9B9#x9BD#x9CE#x9DC-#x9DD#x9DF-#x9E1#x9F0-#x9F1#x9FC#xA05-#xA0A#xA0F-#xA10#xA13-#xA28#xA2A-#xA30#xA32-#xA33#xA35-#xA36#xA38-#xA39#xA59-#xA5C#xA5E#xA72-#xA74#xA85-#xA8D#xA8F-#xA91#xA93-#xAA8#xAAA-#xAB0#xAB2-#xAB3#xAB5-#xAB9#xABD#xAD0#xAE0-#xAE1#xAF9#xB05-#xB0C#xB0F-#xB10#xB13-#xB28#xB2A-#xB30#xB32-#xB33#xB35-#xB39#xB3D#xB5C-#xB5D#xB5F-#xB61#xB71#xB83#xB85-#xB8A#xB8E-#xB90#xB92-#xB95#xB99-#xB9A#xB9C#xB9E-#xB9F#xBA3-#xBA4#xBA8-#xBAA#xBAE-#xBB9#xBD0#xC05-#xC0C#xC0E-#xC10#xC12-#xC28#xC2A-#xC39#xC3D#xC58-#xC5A#xC5D#xC60-#xC61#xC80#xC85-#xC8C#xC8E-#xC90#xC92-#xCA8#xCAA-#xCB3#xCB5-#xCB9#xCBD#xCDD-#xCDE#xCE0-#xCE1#xCF1-#xCF2#xD04-#xD0C#xD0E-#xD10#xD12-#xD3A#xD3D#xD4E#xD54-#xD56#xD5F-#xD61#xD7A-#xD7F#xD85-#xD96#xD9A-#xDB1#xDB3-#xDBB#xDBD#xDC0-#xDC6#xE01-#xE30#xE32-#xE33#xE40-#xE45#xE81-#xE82#xE84#xE86-#xE8A#xE8C-#xEA3#xEA5#xEA7-#xEB0#xEB2-#xEB3#xEBD#xEC0-#xEC4#xEDC-#xEDF#xF00#xF40-#xF47#xF49-#xF6C#xF88-#xF8C#x1000-#x102A#x103F#x1050-#x1055#x105A-#x105D#x1061#x1065-#x1066#x106E-#x1070#x1075-#x1081#x108E#x1100-#x1248#x124A-#x124D#x1250-#x1256#x1258#x125A-#x125D#x1260-#x1288#x128A-#x128D#x1290-#x12B0#x12B2-#x12B5#x12B8-#x12BE#x12C0#x12C2-#x12C5#x12C8-#x12D6#x12D8-#x1310#x1312-#x1315#x1318-#x135A#x1380-#x138F#x1401-#x166C#x166F-#x167F#x1681-#x169A#x16A0-#x16EA#x16F1-#x16F8#x1700-#x1711#x171F-#x1731#x1740-#x1751#x1760-#x176C#x176E-#x1770#x1780-#x17B3#x17DC#x1820-#x1842#x1844-#x1878#x1880-#x1884#x1887-#x18A8#x18AA#x18B0-#x18F5#x1900-#x191E#x1950-#x196D#x1970-#x1974#x1980-#x19AB#x19B0-#x19C9#x1A00-#x1A16#x1A20-#x1A54#x1B05-#x1B33#x1B45-#x1B4C#x1B83-#x1BA0#x1BAE-#x1BAF#x1BBA-#x1BE5#x1C00-#x1C23#x1C4D-#x1C4F#x1C5A-#x1C77#x1CE9-#x1CEC#x1CEE-#x1CF3#x1CF5-#x1CF6#x1CFA#x2135-#x2138#x2D30-#x2D67#x2D80-#x2D96#x2DA0-#x2DA6#x2DA8-#x2DAE#x2DB0-#x2DB6#x2DB8-#x2DBE#x2DC0-#x2DC6#x2DC8-#x2DCE#x2DD0-#x2DD6#x2DD8-#x2DDE#x3006#x303C#x3041-#x3096#x309F#x30A1-#x30FA#x30FF#x3105-#x312F#x3131-#x318E#x31A0-#x31BF#x31F0-#x31FF#x4DBF#x9FFF-#xA014#xA016-#xA48C#xA4D0-#xA4F7#xA500-#xA60B#xA610-#xA61F#xA62A-#xA62B#xA66E#xA6A0-#xA6E5#xA78F#xA7F7#xA7FB-#xA801#xA803-#xA805#xA807-#xA80A#xA80C-#xA822#xA840-#xA873#xA882-#xA8B3#xA8F2-#xA8F7#xA8FB#xA8FD-#xA8FE#xA90A-#xA925#xA930-#xA946#xA960-#xA97C#xA984-#xA9B2#xA9E0-#xA9E4#xA9E7-#xA9EF#xA9FA-#xA9FE#xAA00-#xAA28#xAA40-#xAA42#xAA44-#xAA4B#xAA60-#xAA6F#xAA71-#xAA76#xAA7A#xAA7E-#xAAAF#xAAB1#xAAB5-#xAAB6#xAAB9-#xAABD#xAAC0#xAAC2#xAADB-#xAADC#xAAE0-#xAAEA#xAAF2#xAB01-#xAB06#xAB09-#xAB0E#xAB11-#xAB16#xAB20-#xAB26#xAB28-#xAB2E#xABC0-#xABE2#xD7A3#xD7B0-#xD7C6#xD7CB-#xD7FB#xF900-#xFA6D#xFA70-#xFAD9#xFB1D#xFB1F-#xFB28#xFB2A-#xFB36#xFB38-#xFB3C#xFB3E#xFB40-#xFB41#xFB43-#xFB44#xFB46-#xFBB1#xFBD3-#xFD3D#xFD50-#xFD8F#xFD92-#xFDC7#xFDF0-#xFDFB#xFE70-#xFE74#xFE76-#xFEFC#xFF66-#xFF6F#xFF71-#xFF9D#xFFA0-#xFFBE#xFFC2-#xFFC7#xFFCA-#xFFCF#xFFD2-#xFFD7#xFFDA-#xFFDC]
Referenced by: -
+
====================================================================================================================== - PART_LETTER + Lt ====================================================================================================================== .. raw:: html - + - - $ - - @ - - [0-9] - - [A-Z] - - _ - - [a-z] - - [#x23] - - [#x0-#x8] - - [#xE-#x1B] - - [#x7F-#x9F] - - [#xA2-#xA5] - - [#xAA] - - [#xB5] - - [#xBA] - - [#xC0-#xD6] - - [#xD8-#xF6] - - [#xF8-#x21F] - - [#x222-#x233] - - [#x250-#x2AD] - - [#x2B0-#x2B8] - - [#x2BB-#x2C1] - - [#x2D0-#x2D1] - - [#x2E0-#x2E4] + + [#x1C5] + + [#x1C8] + + [#x1CB] + + [#x1F2] + + [#x1F88-#x1F8F] + + [#x1F98-#x1F9F] + + [#x1FA8-#x1FAF] + + [#x1FBC] + + [#x1FCC] + + [#x1FFC] + + +
+ +
Lt       ::= [#x1C5#x1C8#x1CB#x1F2#x1F88-#x1F8F#x1F98-#x1F9F#x1FA8-#x1FAF#x1FBC#x1FCC#x1FFC]
+
+ Referenced by: +
+ + +====================================================================================================================== + Lu +====================================================================================================================== + + +.. raw:: html + + + + + + [A-Z] + + [#xC0-#xD6] + + [#xD8-#xDE] + + [#x100] + + [#x102] + + [#x104] + + [#x106] + + [#x108] + + [#x10A] + + [#x10C] + + [#x10E] + + [#x110] + + [#x112] + + [#x114] + + [#x116] + + [#x118] + + [#x11A] + + [#x11C] + + [#x11E] + + [#x120] + + [#x122] + + [#x124] + + [#x126] - [#x2EE] - - [#x300-#x34E] - - [#x360-#x362] + [#x128] + + [#x12A] + + [#x12C] - [#x37A] + [#x12E] - [#x386] - - [#x388-#x38A] + [#x130] + + [#x132] - [#x38C] - - [#x38E-#x3A1] - - [#x3A3-#x3CE] - - [#x3D0-#x3D7] - - [#x3DA-#x3F3] - - [#x400-#x481] - - [#x483-#x486] - - [#x48C-#x4C4] - - [#x4C7-#x4C8] - - [#x4CB-#x4CC] - - [#x4D0-#x4F5] - - [#x4F8-#x4F9] - - [#x531-#x556] + [#x134] + + [#x136] + + [#x139] + + [#x13B] + + [#x13D] + + [#x13F] + + [#x141] + + [#x143] + + [#x145] + + [#x147] + + [#x14A] + + [#x14C] + + [#x14E] - [#x559] - - [#x561-#x587] - - [#x591-#x5A1] - - [#x5A3-#x5B9] - - [#x5BB-#x5BD] - - [#x5BF] - - [#x5C1-#x5C2] + [#x150] + + [#x152] + + [#x154] + + [#x156] + + [#x158] + + [#x15A] + + [#x15C] - [#x5C4] - - [#x5D0-#x5EA] - - [#x5F0-#x5F2] - - [#x621-#x63A] - - [#x640-#x655] - - [#x660-#x669] - - [#x670-#x6D3] - - [#x6D5-#x6DC] - - [#x6DF-#x6E8] - - [#x6EA-#x6ED] - - [#x6F0-#x6FC] - - [#x70F-#x72C] - - [#x730-#x74A] + [#x15E] + + [#x160] + + [#x162] + + [#x164] + + [#x166] + + [#x168] + + [#x16A] + + [#x16C] + + [#x16E] + + [#x170] + + [#x172] + + [#x174] + + [#x176] - [#x780-#x7B0] - - [#x901-#x903] - - [#x905-#x939] - - [#x93C-#x94D] - - [#x950-#x954] + [#x178-#x179] + + [#x17B] + + [#x17D] + + [#x181-#x182] + + [#x184] - [#x958-#x963] - - [#x966-#x96F] + [#x186-#x187] + + [#x189-#x18B] - [#x981-#x983] + [#x18E-#x191] - [#x985-#x98C] - - [#x98F-#x990] - - [#x993-#x9A8] - - [#x9AA-#x9B0] + [#x193-#x194] + + [#x196-#x198] + + [#x19C-#x19D] + + [#x19F-#x1A0] - [#x9B2] - - [#x9B6-#x9B9] - - [#x9BC] - - [#x9BE-#x9C4] - - [#x9C7-#x9C8] - - [#x9CB-#x9CD] - - [#x9D7] - - [#x9DC-#x9DD] + [#x1A2] + + [#x1A4] + + [#x1A6-#x1A7] + + [#x1A9] + + [#x1AC] + + [#x1AE-#x1AF] + + [#x1B1-#x1B3] + + [#x1B5] - [#x9DF-#x9E3] - - [#x9E6-#x9F3] + [#x1B7-#x1B8] + + [#x1BC] - [#xA02] - - [#xA05-#xA0A] - - [#xA0F-#xA10] - - [#xA13-#xA28] - - [#xA2A-#xA30] - - [#xA32-#xA33] - - [#xA35-#xA36] - - [#xA38-#xA39] + [#x1C4] + + [#x1C7] + + [#x1CA] + + [#x1CD] + + [#x1CF] + + [#x1D1] + + [#x1D3] + + [#x1D5] - [#xA3C] - - [#xA3E-#xA42] - - [#xA47-#xA48] - - [#xA4B-#xA4D] - - [#xA59-#xA5C] + [#x1D7] + + [#x1D9] + + [#x1DB] + + [#x1DE] + + [#x1E0] - [#xA5E] - - [#xA66-#xA74] - - [#xA81-#xA83] - - [#xA85-#xA8B] + [#x1E2] + + [#x1E4] + + [#x1E6] + + [#x1E8] - [#xA8D] - - [#xA8F-#xA91] - - [#xA93-#xAA8] - - [#xAAA-#xAB0] - - [#xAB2-#xAB3] - - [#xAB5-#xAB9] - - [#xABC-#xAC5] - - [#xAC7-#xAC9] - - [#xACB-#xACD] + [#x1EA] + + [#x1EC] + + [#x1EE] + + [#x1F1] + + [#x1F4] + + [#x1F6-#x1F8] + + [#x1FA] + + [#x1FC] + + [#x1FE] - [#xAD0] + [#x200] - [#xAE0] - - [#xAE6-#xAEF] - - [#xB01-#xB03] - - [#xB05-#xB0C] - - [#xB0F-#xB10] - - [#xB13-#xB28] - - [#xB2A-#xB30] - - [#xB32-#xB33] - - [#xB36-#xB39] - - [#xB3C-#xB43] - - [#xB47-#xB48] - - [#xB4B-#xB4D] - - [#xB56-#xB57] - - [#xB5C-#xB5D] - - [#xB5F-#xB61] - - [#xB66-#xB6F] - - [#xB82-#xB83] - - [#xB85-#xB8A] - - [#xB8E-#xB90] - - [#xB92-#xB95] - - [#xB99-#xB9A] + [#x202] + + [#x204] + + [#x206] + + [#x208] + + [#x20A] + + [#x20C] + + [#x20E] + + [#x210] + + [#x212] + + [#x214] + + [#x216] + + [#x218] + + [#x21A] + + [#x21C] + + [#x21E] + + [#x220] + + [#x222] + + [#x224] + + [#x226] + + [#x228] + + [#x22A] - [#xB9C] - - [#xB9E-#xB9F] - - [#xBA3-#xBA4] - - [#xBA8-#xBAA] + [#x22C] + + [#x22E] + + [#x230] + + [#x232] - [#xBAE-#xBB5] + [#x23A-#x23B] - [#xBB7-#xBB9] - - [#xBBE-#xBC2] - - [#xBC6-#xBC8] - - [#xBCA-#xBCD] + [#x23D-#x23E] + + [#x241] + + [#x243-#x246] + + [#x248] - [#xBD7] - - [#xBE7-#xBEF] - - [#xC01-#xC03] - - [#xC05-#xC0C] - - [#xC0E-#xC10] - - [#xC12-#xC28] - - [#xC2A-#xC33] - - [#xC35-#xC39] - - [#xC3E-#xC44] - - [#xC46-#xC48] - - [#xC4A-#xC4D] - - [#xC55-#xC56] - - [#xC60-#xC61] - - [#xC66-#xC6F] + [#x24A] + + [#x24C] + + [#x24E] + + [#x370] + + [#x372] + + [#x376] + + [#x37F] + + [#x386] + + [#x388-#x38A] + + [#x38C] + + [#x38E-#x38F] + + [#x391-#x3A1] + + [#x3A3-#x3AB] + + [#x3CF] - [#xC82-#xC83] - - [#xC85-#xC8C] - - [#xC8E-#xC90] - - [#xC92-#xCA8] - - [#xCAA-#xCB3] - - [#xCB5-#xCB9] - - [#xCBE-#xCC4] - - [#xCC6-#xCC8] - - [#xCCA-#xCCD] - - [#xCD5-#xCD6] - - [#xCDE] - - [#xCE0-#xCE1] - - [#xCE6-#xCEF] - - [#xD02-#xD03] - - [#xD05-#xD0C] - - [#xD0E-#xD10] - - [#xD12-#xD28] - - [#xD2A-#xD39] - - [#xD3E-#xD43] - - [#xD46-#xD48] - - [#xD4A-#xD4D] + [#x3D2-#x3D4] + + [#x3D8] + + [#x3DA] + + [#x3DC] + + [#x3DE] + + [#x3E0] + + [#x3E2] + + [#x3E4] + + [#x3E6] + + [#x3E8] + + [#x3EA] + + [#x3EC] + + [#x3EE] + + [#x3F4] + + [#x3F7] + + [#x3F9-#x3FA] + + [#x3FD-#x42F] + + [#x460] + + [#x462] + + [#x464] + + [#x466] - [#xD57] - - [#xD60-#xD61] - - [#xD66-#xD6F] - - [#xD82-#xD83] - - [#xD85-#xD96] - - [#xD9A-#xDB1] - - [#xDB3-#xDBB] - - [#xDBD] - - [#xDC0-#xDC6] - - [#xDCA] - - [#xDCF-#xDD4] - - [#xDD6] - - [#xDD8-#xDDF] - - [#xDF2-#xDF3] - - [#xE01-#xE3A] - - [#xE3F-#xE4E] - - [#xE50-#xE59] - - [#xE81-#xE82] + [#x468] + + [#x46A] + + [#x46C] + + [#x46E] + + [#x470] + + [#x472] + + [#x474] + + [#x476] + + [#x478] + + [#x47A] + + [#x47C] + + [#x47E] + + [#x480] + + [#x48A] + + [#x48C] + + [#x48E] + + [#x490] + + [#x492] - [#xE84] - - [#xE87-#xE88] + [#x494] + + [#x496] - [#xE8A] + [#x498] - [#xE8D] - - [#xE94-#xE97] - - [#xE99-#xE9F] - - [#xEA1-#xEA3] + [#x49A] + + [#x49C] + + [#x49E] + + [#x4A0] - [#xEA5] + [#x4A2] - [#xEA7] - - [#xEAA-#xEAB] - - [#xEAD-#xEB9] - - [#xEBB-#xEBD] - - [#xEC0-#xEC4] + [#x4A4] + + [#x4A6] + + [#x4A8] + + [#x4AA] + + [#x4AC] - [#xEC6] - - [#xEC8-#xECD] - - [#xED0-#xED9] - - [#xEDC-#xEDD] - - [#xF00] - - [#xF18-#xF19] - - [#xF20-#xF29] - - [#xF35] - - [#xF37] - - [#xF39] - - [#xF3E-#xF47] - - [#xF49-#xF6A] - - [#xF71-#xF84] - - [#xF86-#xF8B] - - [#xF90-#xF97] - - [#xF99-#xFBC] + [#x4AE] + + [#x4B0] + + [#x4B2] + + [#x4B4] + + [#x4B6] + + [#x4B8] + + [#x4BA] + + [#x4BC] + + [#x4BE] + + [#x4C0-#x4C1] + + [#x4C3] + + [#x4C5] + + [#x4C7] + + [#x4C9] + + [#x4CB] + + [#x4CD] - [#xFC6] - - [#x1000-#x1021] - - [#x1023-#x1027] - - [#x1029-#x102A] - - [#x102C-#x1032] - - [#x1036-#x1039] - - [#x1040-#x1049] - - [#x1050-#x1059] - - [#x10A0-#x10C5] - - [#x10D0-#x10F6] - - [#x1100-#x1159] - - [#x115F-#x11A2] - - [#x11A8-#x11F9] - - [#x1200-#x1206] - - [#x1208-#x1246] - - [#x1248] - - [#x124A-#x124D] - - [#x1250-#x1256] - - [#x1258] - - [#x125A-#x125D] - - [#x1260-#x1286] - - [#x1288] - - [#x128A-#x128D] - - [#x1290-#x12AE] - - [#x12B0] - - [#x12B2-#x12B5] - - [#x12B8-#x12BE] - - [#x12C0] - - [#x12C2-#x12C5] - - [#x12C8-#x12CE] - - [#x12D0-#x12D6] - - [#x12D8-#x12EE] - - [#x12F0-#x130E] - - [#x1310] - - [#x1312-#x1315] - - [#x1318-#x131E] - - [#x1320-#x1346] - - [#x1348-#x135A] - - [#x1369-#x1371] - - [#x13A0-#x13F4] - - [#x1401-#x166C] - - [#x166F-#x1676] - - [#x1681-#x169A] - - [#x16A0-#x16EA] - - [#x1780-#x17D3] - - [#x17DB] - - [#x17E0-#x17E9] - - [#x180B-#x180E] - - [#x1810-#x1819] + [#x4D0] + + [#x4D2] + + [#x4D4] + + [#x4D6] + + [#x4D8] + + [#x4DA] + + [#x4DC] + + [#x4DE] + + [#x4E0] + + [#x4E2] + + [#x4E4] + + [#x4E6] + + [#x4E8] + + [#x4EA] + + [#x4EC] + + [#x4EE] + + [#x4F0] + + [#x4F2] + + [#x4F4] + + [#x4F6] + + [#x4F8] + + [#x4FA] + + [#x4FC] + + [#x4FE] + + [#x500] + + [#x502] + + [#x504] + + [#x506] + + [#x508] + + [#x50A] + + [#x50C] + + [#x50E] + + [#x510] + + [#x512] + + [#x514] + + [#x516] + + [#x518] + + [#x51A] + + [#x51C] + + [#x51E] + + [#x520] + + [#x522] + + [#x524] + + [#x526] + + [#x528] + + [#x52A] + + [#x52C] + + [#x52E] + + [#x531-#x556] - [#x1820-#x1877] - - [#x1880-#x18A9] - - [#x1E00-#x1E9B] + [#x10A0-#x10C5] + + [#x10C7] + + [#x10CD] - [#x1EA0-#x1EF9] - - [#x1F00-#x1F15] - - [#x1F18-#x1F1D] - - [#x1F20-#x1F45] - - [#x1F48-#x1F4D] - - [#x1F50-#x1F57] - - [#x1F59] - - [#x1F5B] + [#x13A0-#x13F5] + + [#x1C90-#x1CBA] + + [#x1CBD-#x1CBF] + + [#x1E00] + + [#x1E02] + + [#x1E04] + + [#x1E06] + + [#x1E08] - [#x1F5D] - - [#x1F5F-#x1F7D] - - [#x1F80-#x1FB4] - - [#x1FB6-#x1FBC] - - [#x1FBE] - - [#x1FC2-#x1FC4] - - [#x1FC6-#x1FCC] - - [#x1FD0-#x1FD3] - - [#x1FD6-#x1FDB] - - [#x1FE0-#x1FEC] - - [#x1FF2-#x1FF4] - - [#x1FF6-#x1FFC] - - [#x200C-#x200F] - - [#x202A-#x202E] - - [#x203F-#x2040] - - [#x206A-#x206F] - - [#x207F] - - [#x20A0-#x20AF] - - [#x20D0-#x20DC] + [#x1E0A] + + [#x1E0C] + + [#x1E0E] + + [#x1E10] + + [#x1E12] + + [#x1E14] + + [#x1E16] + + [#x1E18] + + [#x1E1A] + + [#x1E1C] + + [#x1E1E] + + [#x1E20] + + [#x1E22] + + [#x1E24] + + [#x1E26] + + [#x1E28] + + [#x1E2A] + + [#x1E2C] + + [#x1E2E] - [#x20E1] + [#x1E30] - [#x2102] + [#x1E32] - [#x2107] - - [#x210A-#x2113] + [#x1E34] + + [#x1E36] - [#x2115] - - [#x2119-#x211D] + [#x1E38] + + [#x1E3A] - [#x2124] + [#x1E3C] - [#x2126] + [#x1E3E] - [#x2128] - - [#x212A-#x212D] - - [#x212F-#x2131] - - [#x2133-#x2139] - - [#x2160-#x2183] - - [#x3005-#x3007] - - [#x3021-#x302F] - - [#x3031-#x3035] - - [#x3038-#x303A] - - [#x3041-#x3094] - - [#x3099-#x309A] - - [#x309D-#x309E] - - [#x30A1-#x30FE] - - [#x3105-#x312C] - - [#x3131-#x318E] - - [#x31A0-#x31B7] - - [#x3400-#x4DB5] - - [#x4E00-#x9FA5] - - [#xA000-#xA48C] - - [#xAC00-#xD7A3] - - [#xF900-#xFA2D] - - [#xFB00-#xFB06] - - [#xFB13-#xFB17] - - [#xFB1D-#xFB28] - - [#xFB2A-#xFB36] - - [#xFB38-#xFB3C] - - [#xFB3E] - - [#xFB40-#xFB41] - - [#xFB43-#xFB44] - - [#xFB46-#xFBB1] - - [#xFBD3-#xFD3D] - - [#xFD50-#xFD8F] - - [#xFD92-#xFDC7] - - [#xFDF0-#xFDFB] - - [#xFE20-#xFE23] - - [#xFE33-#xFE34] - - [#xFE4D-#xFE4F] - - [#xFE69] - - [#xFE70-#xFE72] - - [#xFE74] - - [#xFE76-#xFEFC] - - [#xFEFF] - - [#xFF04] - - [#xFF10-#xFF19] - - [#xFF21-#xFF3A] - - [#xFF3F] - - [#xFF41-#xFF5A] - - [#xFF65-#xFFBE] - - [#xFFC2-#xFFC7] - - [#xFFCA-#xFFCF] - - [#xFFD2-#xFFD7] - - [#xFFDA-#xFFDC] - - [#xFFE0-#xFFE1] - - [#xFFE5-#xFFE6] - - [#xFFF9-#xFFFB] - + [#x1E40] + + [#x1E42] + + [#x1E44] + + [#x1E46] + + [#x1E48] + + [#x1E4A] + + [#x1E4C] + + [#x1E4E] + + [#x1E50] + + [#x1E52] + + [#x1E54] + + [#x1E56] + + [#x1E58] + + [#x1E5A] + + [#x1E5C] + + [#x1E5E] + + [#x1E60] + + [#x1E62] + + [#x1E64] + + [#x1E66] + + [#x1E68] + + [#x1E6A] + + [#x1E6C] + + [#x1E6E] + + [#x1E70] + + [#x1E72] + + [#x1E74] + + [#x1E76] + + [#x1E78] + + [#x1E7A] + + [#x1E7C] + + [#x1E7E] + + [#x1E80] + + [#x1E82] + + [#x1E84] + + [#x1E86] + + [#x1E88] + + [#x1E8A] + + [#x1E8C] + + [#x1E8E] + + [#x1E90] + + [#x1E92] + + [#x1E94] + + [#x1E9E] + + [#x1EA0] + + [#x1EA2] + + [#x1EA4] + + [#x1EA6] + + [#x1EA8] + + [#x1EAA] + + [#x1EAC] + + [#x1EAE] + + [#x1EB0] + + [#x1EB2] + + [#x1EB4] + + [#x1EB6] + + [#x1EB8] + + [#x1EBA] + + [#x1EBC] + + [#x1EBE] + + [#x1EC0] + + [#x1EC2] + + [#x1EC4] + + [#x1EC6] + + [#x1EC8] + + [#x1ECA] + + [#x1ECC] + + [#x1ECE] + + [#x1ED0] + + [#x1ED2] + + [#x1ED4] + + [#x1ED6] + + [#x1ED8] + + [#x1EDA] + + [#x1EDC] + + [#x1EDE] + + [#x1EE0] + + [#x1EE2] + + [#x1EE4] + + [#x1EE6] + + [#x1EE8] + + [#x1EEA] + + [#x1EEC] + + [#x1EEE] + + [#x1EF0] + + [#x1EF2] + + [#x1EF4] + + [#x1EF6] + + [#x1EF8] + + [#x1EFA] + + [#x1EFC] + + [#x1EFE] + + [#x1F08-#x1F0F] + + [#x1F18-#x1F1D] + + [#x1F28-#x1F2F] + + [#x1F38-#x1F3F] + + [#x1F48-#x1F4D] + + [#x1F59] + + [#x1F5B] + + [#x1F5D] + + [#x1F5F] + + [#x1F68-#x1F6F] + + [#x1FB8-#x1FBB] + + [#x1FC8-#x1FCB] + + [#x1FD8-#x1FDB] + + [#x1FE8-#x1FEC] + + [#x1FF8-#x1FFB] + + [#x2102] + + [#x2107] + + [#x210B-#x210D] + + [#x2110-#x2112] + + [#x2115] + + [#x2119-#x211D] + + [#x2124] + + [#x2126] + + [#x2128] + + [#x212A-#x212D] + + [#x2130-#x2133] + + [#x213E-#x213F] + + [#x2145] + + [#x2183] + + [#x2C00-#x2C2F] + + [#x2C60] + + [#x2C62-#x2C64] + + [#x2C67] + + [#x2C69] + + [#x2C6B] + + [#x2C6D-#x2C70] + + [#x2C72] + + [#x2C75] + + [#x2C7E-#x2C80] + + [#x2C82] + + [#x2C84] + + [#x2C86] + + [#x2C88] + + [#x2C8A] + + [#x2C8C] + + [#x2C8E] + + [#x2C90] + + [#x2C92] + + [#x2C94] + + [#x2C96] + + [#x2C98] + + [#x2C9A] + + [#x2C9C] + + [#x2C9E] + + [#x2CA0] + + [#x2CA2] + + [#x2CA4] + + [#x2CA6] + + [#x2CA8] + + [#x2CAA] + + [#x2CAC] + + [#x2CAE] + + [#x2CB0] + + [#x2CB2] + + [#x2CB4] + + [#x2CB6] + + [#x2CB8] + + [#x2CBA] + + [#x2CBC] + + [#x2CBE] + + [#x2CC0] + + [#x2CC2] + + [#x2CC4] + + [#x2CC6] + + [#x2CC8] + + [#x2CCA] + + [#x2CCC] + + [#x2CCE] + + [#x2CD0] + + [#x2CD2] + + [#x2CD4] + + [#x2CD6] + + [#x2CD8] + + [#x2CDA] + + [#x2CDC] + + [#x2CDE] + + [#x2CE0] + + [#x2CE2] + + [#x2CEB] + + [#x2CED] + + [#x2CF2] + + [#xA640] + + [#xA642] + + [#xA644] + + [#xA646] + + [#xA648] + + [#xA64A] + + [#xA64C] + + [#xA64E] + + [#xA650] + + [#xA652] + + [#xA654] + + [#xA656] + + [#xA658] + + [#xA65A] + + [#xA65C] + + [#xA65E] + + [#xA660] + + [#xA662] + + [#xA664] + + [#xA666] + + [#xA668] + + [#xA66A] + + [#xA66C] + + [#xA680] + + [#xA682] + + [#xA684] + + [#xA686] + + [#xA688] + + [#xA68A] + + [#xA68C] + + [#xA68E] + + [#xA690] + + [#xA692] + + [#xA694] + + [#xA696] + + [#xA698] + + [#xA69A] + + [#xA722] + + [#xA724] + + [#xA726] + + [#xA728] + + [#xA72A] + + [#xA72C] + + [#xA72E] + + [#xA732] + + [#xA734] + + [#xA736] + + [#xA738] + + [#xA73A] + + [#xA73C] + + [#xA73E] + + [#xA740] + + [#xA742] + + [#xA744] + + [#xA746] + + [#xA748] + + [#xA74A] + + [#xA74C] + + [#xA74E] + + [#xA750] + + [#xA752] + + [#xA754] + + [#xA756] + + [#xA758] + + [#xA75A] + + [#xA75C] + + [#xA75E] + + [#xA760] + + [#xA762] + + [#xA764] + + [#xA766] + + [#xA768] + + [#xA76A] + + [#xA76C] + + [#xA76E] + + [#xA779] + + [#xA77B] + + [#xA77D-#xA77E] + + [#xA780] + + [#xA782] + + [#xA784] + + [#xA786] + + [#xA78B] + + [#xA78D] + + [#xA790] + + [#xA792] + + [#xA796] + + [#xA798] + + [#xA79A] + + [#xA79C] + + [#xA79E] + + [#xA7A0] + + [#xA7A2] + + [#xA7A4] + + [#xA7A6] + + [#xA7A8] + + [#xA7AA-#xA7AE] + + [#xA7B0-#xA7B4] + + [#xA7B6] + + [#xA7B8] + + [#xA7BA] + + [#xA7BC] + + [#xA7BE] + + [#xA7C0] + + [#xA7C2] + + [#xA7C4-#xA7C7] + + [#xA7C9] + + [#xA7D0] + + [#xA7D6] + + [#xA7D8] + + [#xA7F5] + + [#xFF21-#xFF3A] +
- -
         ::= [$@0-9A-Z_a-z#x23#x0-#x8#xE-#x1B#x7F-#x9F#xA2-#xA5#xAA#xB5#xBA#xC0-#xD6#xD8-#xF6#xF8-#x21F#x222-#x233#x250-#x2AD#x2B0-#x2B8#x2BB-#x2C1#x2D0-#x2D1#x2E0-#x2E4#x2EE#x300-#x34E#x360-#x362#x37A#x386#x388-#x38A#x38C#x38E-#x3A1#x3A3-#x3CE#x3D0-#x3D7#x3DA-#x3F3#x400-#x481#x483-#x486#x48C-#x4C4#x4C7-#x4C8#x4CB-#x4CC#x4D0-#x4F5#x4F8-#x4F9#x531-#x556#x559#x561-#x587#x591-#x5A1#x5A3-#x5B9#x5BB-#x5BD#x5BF#x5C1-#x5C2#x5C4#x5D0-#x5EA#x5F0-#x5F2#x621-#x63A#x640-#x655#x660-#x669#x670-#x6D3#x6D5-#x6DC#x6DF-#x6E8#x6EA-#x6ED#x6F0-#x6FC#x70F-#x72C#x730-#x74A#x780-#x7B0#x901-#x903#x905-#x939#x93C-#x94D#x950-#x954#x958-#x963#x966-#x96F#x981-#x983#x985-#x98C#x98F-#x990#x993-#x9A8#x9AA-#x9B0#x9B2#x9B6-#x9B9#x9BC#x9BE-#x9C4#x9C7-#x9C8#x9CB-#x9CD#x9D7#x9DC-#x9DD#x9DF-#x9E3#x9E6-#x9F3#xA02#xA05-#xA0A#xA0F-#xA10#xA13-#xA28#xA2A-#xA30#xA32-#xA33#xA35-#xA36#xA38-#xA39#xA3C#xA3E-#xA42#xA47-#xA48#xA4B-#xA4D#xA59-#xA5C#xA5E#xA66-#xA74#xA81-#xA83#xA85-#xA8B#xA8D#xA8F-#xA91#xA93-#xAA8#xAAA-#xAB0#xAB2-#xAB3#xAB5-#xAB9#xABC-#xAC5#xAC7-#xAC9#xACB-#xACD#xAD0#xAE0#xAE6-#xAEF#xB01-#xB03#xB05-#xB0C#xB0F-#xB10#xB13-#xB28#xB2A-#xB30#xB32-#xB33#xB36-#xB39#xB3C-#xB43#xB47-#xB48#xB4B-#xB4D#xB56-#xB57#xB5C-#xB5D#xB5F-#xB61#xB66-#xB6F#xB82-#xB83#xB85-#xB8A#xB8E-#xB90#xB92-#xB95#xB99-#xB9A#xB9C#xB9E-#xB9F#xBA3-#xBA4#xBA8-#xBAA#xBAE-#xBB5#xBB7-#xBB9#xBBE-#xBC2#xBC6-#xBC8#xBCA-#xBCD#xBD7#xBE7-#xBEF#xC01-#xC03#xC05-#xC0C#xC0E-#xC10#xC12-#xC28#xC2A-#xC33#xC35-#xC39#xC3E-#xC44#xC46-#xC48#xC4A-#xC4D#xC55-#xC56#xC60-#xC61#xC66-#xC6F#xC82-#xC83#xC85-#xC8C#xC8E-#xC90#xC92-#xCA8#xCAA-#xCB3#xCB5-#xCB9#xCBE-#xCC4#xCC6-#xCC8#xCCA-#xCCD#xCD5-#xCD6#xCDE#xCE0-#xCE1#xCE6-#xCEF#xD02-#xD03#xD05-#xD0C#xD0E-#xD10#xD12-#xD28#xD2A-#xD39#xD3E-#xD43#xD46-#xD48#xD4A-#xD4D#xD57#xD60-#xD61#xD66-#xD6F#xD82-#xD83#xD85-#xD96#xD9A-#xDB1#xDB3-#xDBB#xDBD#xDC0-#xDC6#xDCA#xDCF-#xDD4#xDD6#xDD8-#xDDF#xDF2-#xDF3#xE01-#xE3A#xE3F-#xE4E#xE50-#xE59#xE81-#xE82#xE84#xE87-#xE88#xE8A#xE8D#xE94-#xE97#xE99-#xE9F#xEA1-#xEA3#xEA5#xEA7#xEAA-#xEAB#xEAD-#xEB9#xEBB-#xEBD#xEC0-#xEC4#xEC6#xEC8-#xECD#xED0-#xED9#xEDC-#xEDD#xF00#xF18-#xF19#xF20-#xF29#xF35#xF37#xF39#xF3E-#xF47#xF49-#xF6A#xF71-#xF84#xF86-#xF8B#xF90-#xF97#xF99-#xFBC#xFC6#x1000-#x1021#x1023-#x1027#x1029-#x102A#x102C-#x1032#x1036-#x1039#x1040-#x1049#x1050-#x1059#x10A0-#x10C5#x10D0-#x10F6#x1100-#x1159#x115F-#x11A2#x11A8-#x11F9#x1200-#x1206#x1208-#x1246#x1248#x124A-#x124D#x1250-#x1256#x1258#x125A-#x125D#x1260-#x1286#x1288#x128A-#x128D#x1290-#x12AE#x12B0#x12B2-#x12B5#x12B8-#x12BE#x12C0#x12C2-#x12C5#x12C8-#x12CE#x12D0-#x12D6#x12D8-#x12EE#x12F0-#x130E#x1310#x1312-#x1315#x1318-#x131E#x1320-#x1346#x1348-#x135A#x1369-#x1371#x13A0-#x13F4#x1401-#x166C#x166F-#x1676#x1681-#x169A#x16A0-#x16EA#x1780-#x17D3#x17DB#x17E0-#x17E9#x180B-#x180E#x1810-#x1819#x1820-#x1877#x1880-#x18A9#x1E00-#x1E9B#x1EA0-#x1EF9#x1F00-#x1F15#x1F18-#x1F1D#x1F20-#x1F45#x1F48-#x1F4D#x1F50-#x1F57#x1F59#x1F5B#x1F5D#x1F5F-#x1F7D#x1F80-#x1FB4#x1FB6-#x1FBC#x1FBE#x1FC2-#x1FC4#x1FC6-#x1FCC#x1FD0-#x1FD3#x1FD6-#x1FDB#x1FE0-#x1FEC#x1FF2-#x1FF4#x1FF6-#x1FFC#x200C-#x200F#x202A-#x202E#x203F-#x2040#x206A-#x206F#x207F#x20A0-#x20AF#x20D0-#x20DC#x20E1#x2102#x2107#x210A-#x2113#x2115#x2119-#x211D#x2124#x2126#x2128#x212A-#x212D#x212F-#x2131#x2133-#x2139#x2160-#x2183#x3005-#x3007#x3021-#x302F#x3031-#x3035#x3038-#x303A#x3041-#x3094#x3099-#x309A#x309D-#x309E#x30A1-#x30FE#x3105-#x312C#x3131-#x318E#x31A0-#x31B7#x3400-#x4DB5#x4E00-#x9FA5#xA000-#xA48C#xAC00-#xD7A3#xF900-#xFA2D#xFB00-#xFB06#xFB13-#xFB17#xFB1D-#xFB28#xFB2A-#xFB36#xFB38-#xFB3C#xFB3E#xFB40-#xFB41#xFB43-#xFB44#xFB46-#xFBB1#xFBD3-#xFD3D#xFD50-#xFD8F#xFD92-#xFDC7#xFDF0-#xFDFB#xFE20-#xFE23#xFE33-#xFE34#xFE4D-#xFE4F#xFE69#xFE70-#xFE72#xFE74#xFE76-#xFEFC#xFEFF#xFF04#xFF10-#xFF19#xFF21-#xFF3A#xFF3F#xFF41-#xFF5A#xFF65-#xFFBE#xFFC2-#xFFC7#xFFCA-#xFFCF#xFFD2-#xFFD7#xFFDA-#xFFDC#xFFE0-#xFFE1#xFFE5-#xFFE6#xFFF9-#xFFFB]
+
Lu       ::= [A-Z#xC0-#xD6#xD8-#xDE#x100#x102#x104#x106#x108#x10A#x10C#x10E#x110#x112#x114#x116#x118#x11A#x11C#x11E#x120#x122#x124#x126#x128#x12A#x12C#x12E#x130#x132#x134#x136#x139#x13B#x13D#x13F#x141#x143#x145#x147#x14A#x14C#x14E#x150#x152#x154#x156#x158#x15A#x15C#x15E#x160#x162#x164#x166#x168#x16A#x16C#x16E#x170#x172#x174#x176#x178-#x179#x17B#x17D#x181-#x182#x184#x186-#x187#x189-#x18B#x18E-#x191#x193-#x194#x196-#x198#x19C-#x19D#x19F-#x1A0#x1A2#x1A4#x1A6-#x1A7#x1A9#x1AC#x1AE-#x1AF#x1B1-#x1B3#x1B5#x1B7-#x1B8#x1BC#x1C4#x1C7#x1CA#x1CD#x1CF#x1D1#x1D3#x1D5#x1D7#x1D9#x1DB#x1DE#x1E0#x1E2#x1E4#x1E6#x1E8#x1EA#x1EC#x1EE#x1F1#x1F4#x1F6-#x1F8#x1FA#x1FC#x1FE#x200#x202#x204#x206#x208#x20A#x20C#x20E#x210#x212#x214#x216#x218#x21A#x21C#x21E#x220#x222#x224#x226#x228#x22A#x22C#x22E#x230#x232#x23A-#x23B#x23D-#x23E#x241#x243-#x246#x248#x24A#x24C#x24E#x370#x372#x376#x37F#x386#x388-#x38A#x38C#x38E-#x38F#x391-#x3A1#x3A3-#x3AB#x3CF#x3D2-#x3D4#x3D8#x3DA#x3DC#x3DE#x3E0#x3E2#x3E4#x3E6#x3E8#x3EA#x3EC#x3EE#x3F4#x3F7#x3F9-#x3FA#x3FD-#x42F#x460#x462#x464#x466#x468#x46A#x46C#x46E#x470#x472#x474#x476#x478#x47A#x47C#x47E#x480#x48A#x48C#x48E#x490#x492#x494#x496#x498#x49A#x49C#x49E#x4A0#x4A2#x4A4#x4A6#x4A8#x4AA#x4AC#x4AE#x4B0#x4B2#x4B4#x4B6#x4B8#x4BA#x4BC#x4BE#x4C0-#x4C1#x4C3#x4C5#x4C7#x4C9#x4CB#x4CD#x4D0#x4D2#x4D4#x4D6#x4D8#x4DA#x4DC#x4DE#x4E0#x4E2#x4E4#x4E6#x4E8#x4EA#x4EC#x4EE#x4F0#x4F2#x4F4#x4F6#x4F8#x4FA#x4FC#x4FE#x500#x502#x504#x506#x508#x50A#x50C#x50E#x510#x512#x514#x516#x518#x51A#x51C#x51E#x520#x522#x524#x526#x528#x52A#x52C#x52E#x531-#x556#x10A0-#x10C5#x10C7#x10CD#x13A0-#x13F5#x1C90-#x1CBA#x1CBD-#x1CBF#x1E00#x1E02#x1E04#x1E06#x1E08#x1E0A#x1E0C#x1E0E#x1E10#x1E12#x1E14#x1E16#x1E18#x1E1A#x1E1C#x1E1E#x1E20#x1E22#x1E24#x1E26#x1E28#x1E2A#x1E2C#x1E2E#x1E30#x1E32#x1E34#x1E36#x1E38#x1E3A#x1E3C#x1E3E#x1E40#x1E42#x1E44#x1E46#x1E48#x1E4A#x1E4C#x1E4E#x1E50#x1E52#x1E54#x1E56#x1E58#x1E5A#x1E5C#x1E5E#x1E60#x1E62#x1E64#x1E66#x1E68#x1E6A#x1E6C#x1E6E#x1E70#x1E72#x1E74#x1E76#x1E78#x1E7A#x1E7C#x1E7E#x1E80#x1E82#x1E84#x1E86#x1E88#x1E8A#x1E8C#x1E8E#x1E90#x1E92#x1E94#x1E9E#x1EA0#x1EA2#x1EA4#x1EA6#x1EA8#x1EAA#x1EAC#x1EAE#x1EB0#x1EB2#x1EB4#x1EB6#x1EB8#x1EBA#x1EBC#x1EBE#x1EC0#x1EC2#x1EC4#x1EC6#x1EC8#x1ECA#x1ECC#x1ECE#x1ED0#x1ED2#x1ED4#x1ED6#x1ED8#x1EDA#x1EDC#x1EDE#x1EE0#x1EE2#x1EE4#x1EE6#x1EE8#x1EEA#x1EEC#x1EEE#x1EF0#x1EF2#x1EF4#x1EF6#x1EF8#x1EFA#x1EFC#x1EFE#x1F08-#x1F0F#x1F18-#x1F1D#x1F28-#x1F2F#x1F38-#x1F3F#x1F48-#x1F4D#x1F59#x1F5B#x1F5D#x1F5F#x1F68-#x1F6F#x1FB8-#x1FBB#x1FC8-#x1FCB#x1FD8-#x1FDB#x1FE8-#x1FEC#x1FF8-#x1FFB#x2102#x2107#x210B-#x210D#x2110-#x2112#x2115#x2119-#x211D#x2124#x2126#x2128#x212A-#x212D#x2130-#x2133#x213E-#x213F#x2145#x2183#x2C00-#x2C2F#x2C60#x2C62-#x2C64#x2C67#x2C69#x2C6B#x2C6D-#x2C70#x2C72#x2C75#x2C7E-#x2C80#x2C82#x2C84#x2C86#x2C88#x2C8A#x2C8C#x2C8E#x2C90#x2C92#x2C94#x2C96#x2C98#x2C9A#x2C9C#x2C9E#x2CA0#x2CA2#x2CA4#x2CA6#x2CA8#x2CAA#x2CAC#x2CAE#x2CB0#x2CB2#x2CB4#x2CB6#x2CB8#x2CBA#x2CBC#x2CBE#x2CC0#x2CC2#x2CC4#x2CC6#x2CC8#x2CCA#x2CCC#x2CCE#x2CD0#x2CD2#x2CD4#x2CD6#x2CD8#x2CDA#x2CDC#x2CDE#x2CE0#x2CE2#x2CEB#x2CED#x2CF2#xA640#xA642#xA644#xA646#xA648#xA64A#xA64C#xA64E#xA650#xA652#xA654#xA656#xA658#xA65A#xA65C#xA65E#xA660#xA662#xA664#xA666#xA668#xA66A#xA66C#xA680#xA682#xA684#xA686#xA688#xA68A#xA68C#xA68E#xA690#xA692#xA694#xA696#xA698#xA69A#xA722#xA724#xA726#xA728#xA72A#xA72C#xA72E#xA732#xA734#xA736#xA738#xA73A#xA73C#xA73E#xA740#xA742#xA744#xA746#xA748#xA74A#xA74C#xA74E#xA750#xA752#xA754#xA756#xA758#xA75A#xA75C#xA75E#xA760#xA762#xA764#xA766#xA768#xA76A#xA76C#xA76E#xA779#xA77B#xA77D-#xA77E#xA780#xA782#xA784#xA786#xA78B#xA78D#xA790#xA792#xA796#xA798#xA79A#xA79C#xA79E#xA7A0#xA7A2#xA7A4#xA7A6#xA7A8#xA7AA-#xA7AE#xA7B0-#xA7B4#xA7B6#xA7B8#xA7BA#xA7BC#xA7BE#xA7C0#xA7C2#xA7C4-#xA7C7#xA7C9#xA7D0#xA7D6#xA7D8#xA7F5#xFF21-#xFF3A]
Referenced by: -
+
+ + +====================================================================================================================== + Nl +====================================================================================================================== + + +.. raw:: html + + + + + + [#x16EE-#x16F0] + + [#x2160-#x2182] + + [#x2185-#x2188] + + [#x3007] + + [#x3021-#x3029] + + [#x3038-#x303A] + + [#xA6E6-#xA6EF] + + +
+ +
Nl       ::= [#x16EE-#x16F0#x2160-#x2182#x2185-#x2188#x3007#x3021-#x3029#x3038-#x303A#xA6E6-#xA6EF]
+
+ Referenced by: +
+ + +====================================================================================================================== + UnicodeIdentifierExtend +====================================================================================================================== + + +.. raw:: html + + + + + + Mn + + Mc + + Nd + + Pc + + Cf + +
+ + +
         ::= Mn
+
           | Mc
+
           | Nd
+
           | Pc
+
           | Cf
+
+ Referenced by: +
+ + +====================================================================================================================== + Cf +====================================================================================================================== + + +.. raw:: html + + + + + + [#xAD] + + [#x600-#x605] + + [#x61C] + + [#x6DD] + + [#x70F] + + [#x890-#x891] + + [#x8E2] + + [#x180E] + + [#x200B-#x200F] + + [#x202A-#x202E] + + [#x2060-#x2064] + + [#x2066-#x206F] + + [#xFEFF] + + [#xFFF9-#xFFFB] + + +
+ +
Cf       ::= [#xAD#x600-#x605#x61C#x6DD#x70F#x890-#x891#x8E2#x180E#x200B-#x200F#x202A-#x202E#x2060-#x2064#x2066-#x206F#xFEFF#xFFF9-#xFFFB]
+
+ Referenced by: +
+ + +====================================================================================================================== + Mc +====================================================================================================================== + + +.. raw:: html + + + + + + [#x903] + + [#x93B] + + [#x93E-#x940] + + [#x949-#x94C] + + [#x94E-#x94F] + + [#x982-#x983] + + [#x9BE-#x9C0] + + [#x9C7-#x9C8] + + [#x9CB-#x9CC] + + [#x9D7] + + [#xA03] + + [#xA3E-#xA40] + + [#xA83] + + [#xABE-#xAC0] + + [#xAC9] + + [#xACB-#xACC] + + [#xB02-#xB03] + + [#xB3E] + + [#xB40] + + [#xB47-#xB48] + + [#xB4B-#xB4C] + + [#xB57] + + [#xBBE-#xBBF] + + [#xBC1-#xBC2] + + [#xBC6-#xBC8] + + [#xBCA-#xBCC] + + [#xBD7] + + [#xC01-#xC03] + + [#xC41-#xC44] + + [#xC82-#xC83] + + [#xCBE] + + [#xCC0-#xCC4] + + [#xCC7-#xCC8] + + [#xCCA-#xCCB] + + [#xCD5-#xCD6] + + [#xCF3] + + [#xD02-#xD03] + + [#xD3E-#xD40] + + [#xD46-#xD48] + + [#xD4A-#xD4C] + + [#xD57] + + [#xD82-#xD83] + + [#xDCF-#xDD1] + + [#xDD8-#xDDF] + + [#xDF2-#xDF3] + + [#xF3E-#xF3F] + + [#xF7F] + + [#x102B-#x102C] + + [#x1031] + + [#x1038] + + [#x103B-#x103C] + + [#x1056-#x1057] + + [#x1062-#x1064] + + [#x1067-#x106D] + + [#x1083-#x1084] + + [#x1087-#x108C] + + [#x108F] + + [#x109A-#x109C] + + [#x1715] + + [#x1734] + + [#x17B6] + + [#x17BE-#x17C5] + + [#x17C7-#x17C8] + + [#x1923-#x1926] + + [#x1929-#x192B] + + [#x1930-#x1931] + + [#x1933-#x1938] + + [#x1A19-#x1A1A] + + [#x1A55] + + [#x1A57] + + [#x1A61] + + [#x1A63-#x1A64] + + [#x1A6D-#x1A72] + + [#x1B04] + + [#x1B35] + + [#x1B3B] + + [#x1B3D-#x1B41] + + [#x1B43-#x1B44] + + [#x1B82] + + [#x1BA1] + + [#x1BA6-#x1BA7] + + [#x1BAA] + + [#x1BE7] + + [#x1BEA-#x1BEC] + + [#x1BEE] + + [#x1BF2-#x1BF3] + + [#x1C24-#x1C2B] + + [#x1C34-#x1C35] + + [#x1CE1] + + [#x1CF7] + + [#x302E-#x302F] + + [#xA823-#xA824] + + [#xA827] + + [#xA880-#xA881] + + [#xA8B4-#xA8C3] + + [#xA952-#xA953] + + [#xA983] + + [#xA9B4-#xA9B5] + + [#xA9BA-#xA9BB] + + [#xA9BE-#xA9C0] + + [#xAA2F-#xAA30] + + [#xAA33-#xAA34] + + [#xAA4D] + + [#xAA7B] + + [#xAA7D] + + [#xAAEB] + + [#xAAEE-#xAAEF] + + [#xAAF5] + + [#xABE3-#xABE4] + + [#xABE6-#xABE7] + + [#xABE9-#xABEA] + + [#xABEC] + + +
+ +
Mc       ::= [#x903#x93B#x93E-#x940#x949-#x94C#x94E-#x94F#x982-#x983#x9BE-#x9C0#x9C7-#x9C8#x9CB-#x9CC#x9D7#xA03#xA3E-#xA40#xA83#xABE-#xAC0#xAC9#xACB-#xACC#xB02-#xB03#xB3E#xB40#xB47-#xB48#xB4B-#xB4C#xB57#xBBE-#xBBF#xBC1-#xBC2#xBC6-#xBC8#xBCA-#xBCC#xBD7#xC01-#xC03#xC41-#xC44#xC82-#xC83#xCBE#xCC0-#xCC4#xCC7-#xCC8#xCCA-#xCCB#xCD5-#xCD6#xCF3#xD02-#xD03#xD3E-#xD40#xD46-#xD48#xD4A-#xD4C#xD57#xD82-#xD83#xDCF-#xDD1#xDD8-#xDDF#xDF2-#xDF3#xF3E-#xF3F#xF7F#x102B-#x102C#x1031#x1038#x103B-#x103C#x1056-#x1057#x1062-#x1064#x1067-#x106D#x1083-#x1084#x1087-#x108C#x108F#x109A-#x109C#x1715#x1734#x17B6#x17BE-#x17C5#x17C7-#x17C8#x1923-#x1926#x1929-#x192B#x1930-#x1931#x1933-#x1938#x1A19-#x1A1A#x1A55#x1A57#x1A61#x1A63-#x1A64#x1A6D-#x1A72#x1B04#x1B35#x1B3B#x1B3D-#x1B41#x1B43-#x1B44#x1B82#x1BA1#x1BA6-#x1BA7#x1BAA#x1BE7#x1BEA-#x1BEC#x1BEE#x1BF2-#x1BF3#x1C24-#x1C2B#x1C34-#x1C35#x1CE1#x1CF7#x302E-#x302F#xA823-#xA824#xA827#xA880-#xA881#xA8B4-#xA8C3#xA952-#xA953#xA983#xA9B4-#xA9B5#xA9BA-#xA9BB#xA9BE-#xA9C0#xAA2F-#xAA30#xAA33-#xAA34#xAA4D#xAA7B#xAA7D#xAAEB#xAAEE-#xAAEF#xAAF5#xABE3-#xABE4#xABE6-#xABE7#xABE9-#xABEA#xABEC]
+
+ Referenced by: +
+ + +====================================================================================================================== + Mn +====================================================================================================================== + + +.. raw:: html + + + + + + [#x300-#x36F] + + [#x483-#x487] + + [#x591-#x5BD] + + [#x5BF] + + [#x5C1-#x5C2] + + [#x5C4-#x5C5] + + [#x5C7] + + [#x610-#x61A] + + [#x64B-#x65F] + + [#x670] + + [#x6D6-#x6DC] + + [#x6DF-#x6E4] + + [#x6E7-#x6E8] + + [#x6EA-#x6ED] + + [#x711] + + [#x730-#x74A] + + [#x7A6-#x7B0] + + [#x7EB-#x7F3] + + [#x7FD] + + [#x816-#x819] + + [#x81B-#x823] + + [#x825-#x827] + + [#x829-#x82D] + + [#x859-#x85B] + + [#x898-#x89F] + + [#x8CA-#x8E1] + + [#x8E3-#x902] + + [#x93A] + + [#x93C] + + [#x941-#x948] + + [#x94D] + + [#x951-#x957] + + [#x962-#x963] + + [#x981] + + [#x9BC] + + [#x9C1-#x9C4] + + [#x9CD] + + [#x9E2-#x9E3] + + [#x9FE] + + [#xA01-#xA02] + + [#xA3C] + + [#xA41-#xA42] + + [#xA47-#xA48] + + [#xA4B-#xA4D] + + [#xA51] + + [#xA70-#xA71] + + [#xA75] + + [#xA81-#xA82] + + [#xABC] + + [#xAC1-#xAC5] + + [#xAC7-#xAC8] + + [#xACD] + + [#xAE2-#xAE3] + + [#xAFA-#xAFF] + + [#xB01] + + [#xB3C] + + [#xB3F] + + [#xB41-#xB44] + + [#xB4D] + + [#xB55-#xB56] + + [#xB62-#xB63] + + [#xB82] + + [#xBC0] + + [#xBCD] + + [#xC00] + + [#xC04] + + [#xC3C] + + [#xC3E-#xC40] + + [#xC46-#xC48] + + [#xC4A-#xC4D] + + [#xC55-#xC56] + + [#xC62-#xC63] + + [#xC81] + + [#xCBC] + + [#xCBF] + + [#xCC6] + + [#xCCC-#xCCD] + + [#xCE2-#xCE3] + + [#xD00-#xD01] + + [#xD3B-#xD3C] + + [#xD41-#xD44] + + [#xD4D] + + [#xD62-#xD63] + + [#xD81] + + [#xDCA] + + [#xDD2-#xDD4] + + [#xDD6] + + [#xE31] + + [#xE34-#xE3A] + + [#xE47-#xE4E] + + [#xEB1] + + [#xEB4-#xEBC] + + [#xEC8-#xECE] + + [#xF18-#xF19] + + [#xF35] + + [#xF37] + + [#xF39] + + [#xF71-#xF7E] + + [#xF80-#xF84] + + [#xF86-#xF87] + + [#xF8D-#xF97] + + [#xF99-#xFBC] + + [#xFC6] + + [#x102D-#x1030] + + [#x1032-#x1037] + + [#x1039-#x103A] + + [#x103D-#x103E] + + [#x1058-#x1059] + + [#x105E-#x1060] + + [#x1071-#x1074] + + [#x1082] + + [#x1085-#x1086] + + [#x108D] + + [#x109D] + + [#x135D-#x135F] + + [#x1712-#x1714] + + [#x1732-#x1733] + + [#x1752-#x1753] + + [#x1772-#x1773] + + [#x17B4-#x17B5] + + [#x17B7-#x17BD] + + [#x17C6] + + [#x17C9-#x17D3] + + [#x17DD] + + [#x180B-#x180D] + + [#x180F] + + [#x1885-#x1886] + + [#x18A9] + + [#x1920-#x1922] + + [#x1927-#x1928] + + [#x1932] + + [#x1939-#x193B] + + [#x1A17-#x1A18] + + [#x1A1B] + + [#x1A56] + + [#x1A58-#x1A5E] + + [#x1A60] + + [#x1A62] + + [#x1A65-#x1A6C] + + [#x1A73-#x1A7C] + + [#x1A7F] + + [#x1AB0-#x1ABD] + + [#x1ABF-#x1ACE] + + [#x1B00-#x1B03] + + [#x1B34] + + [#x1B36-#x1B3A] + + [#x1B3C] + + [#x1B42] + + [#x1B6B-#x1B73] + + [#x1B80-#x1B81] + + [#x1BA2-#x1BA5] + + [#x1BA8-#x1BA9] + + [#x1BAB-#x1BAD] + + [#x1BE6] + + [#x1BE8-#x1BE9] + + [#x1BED] + + [#x1BEF-#x1BF1] + + [#x1C2C-#x1C33] + + [#x1C36-#x1C37] + + [#x1CD0-#x1CD2] + + [#x1CD4-#x1CE0] + + [#x1CE2-#x1CE8] + + [#x1CED] + + [#x1CF4] + + [#x1CF8-#x1CF9] + + [#x1DC0-#x1DFF] + + [#x20D0-#x20DC] + + [#x20E1] + + [#x20E5-#x20F0] + + [#x2CEF-#x2CF1] + + [#x2D7F] + + [#x2DE0-#x2DFF] + + [#x302A-#x302D] + + [#x3099-#x309A] + + [#xA66F] + + [#xA674-#xA67D] + + [#xA69E-#xA69F] + + [#xA6F0-#xA6F1] + + [#xA802] + + [#xA806] + + [#xA80B] + + [#xA825-#xA826] + + [#xA82C] + + [#xA8C4-#xA8C5] + + [#xA8E0-#xA8F1] + + [#xA8FF] + + [#xA926-#xA92D] + + [#xA947-#xA951] + + [#xA980-#xA982] + + [#xA9B3] + + [#xA9B6-#xA9B9] + + [#xA9BC-#xA9BD] + + [#xA9E5] + + [#xAA29-#xAA2E] + + [#xAA31-#xAA32] + + [#xAA35-#xAA36] + + [#xAA43] + + [#xAA4C] + + [#xAA7C] + + [#xAAB0] + + [#xAAB2-#xAAB4] + + [#xAAB7-#xAAB8] + + [#xAABE-#xAABF] + + [#xAAC1] + + [#xAAEC-#xAAED] + + [#xAAF6] + + [#xABE5] + + [#xABE8] + + [#xABED] + + [#xFB1E] + + [#xFE00-#xFE0F] + + [#xFE20-#xFE2F] + + +
+ +
Mn       ::= [#x300-#x36F#x483-#x487#x591-#x5BD#x5BF#x5C1-#x5C2#x5C4-#x5C5#x5C7#x610-#x61A#x64B-#x65F#x670#x6D6-#x6DC#x6DF-#x6E4#x6E7-#x6E8#x6EA-#x6ED#x711#x730-#x74A#x7A6-#x7B0#x7EB-#x7F3#x7FD#x816-#x819#x81B-#x823#x825-#x827#x829-#x82D#x859-#x85B#x898-#x89F#x8CA-#x8E1#x8E3-#x902#x93A#x93C#x941-#x948#x94D#x951-#x957#x962-#x963#x981#x9BC#x9C1-#x9C4#x9CD#x9E2-#x9E3#x9FE#xA01-#xA02#xA3C#xA41-#xA42#xA47-#xA48#xA4B-#xA4D#xA51#xA70-#xA71#xA75#xA81-#xA82#xABC#xAC1-#xAC5#xAC7-#xAC8#xACD#xAE2-#xAE3#xAFA-#xAFF#xB01#xB3C#xB3F#xB41-#xB44#xB4D#xB55-#xB56#xB62-#xB63#xB82#xBC0#xBCD#xC00#xC04#xC3C#xC3E-#xC40#xC46-#xC48#xC4A-#xC4D#xC55-#xC56#xC62-#xC63#xC81#xCBC#xCBF#xCC6#xCCC-#xCCD#xCE2-#xCE3#xD00-#xD01#xD3B-#xD3C#xD41-#xD44#xD4D#xD62-#xD63#xD81#xDCA#xDD2-#xDD4#xDD6#xE31#xE34-#xE3A#xE47-#xE4E#xEB1#xEB4-#xEBC#xEC8-#xECE#xF18-#xF19#xF35#xF37#xF39#xF71-#xF7E#xF80-#xF84#xF86-#xF87#xF8D-#xF97#xF99-#xFBC#xFC6#x102D-#x1030#x1032-#x1037#x1039-#x103A#x103D-#x103E#x1058-#x1059#x105E-#x1060#x1071-#x1074#x1082#x1085-#x1086#x108D#x109D#x135D-#x135F#x1712-#x1714#x1732-#x1733#x1752-#x1753#x1772-#x1773#x17B4-#x17B5#x17B7-#x17BD#x17C6#x17C9-#x17D3#x17DD#x180B-#x180D#x180F#x1885-#x1886#x18A9#x1920-#x1922#x1927-#x1928#x1932#x1939-#x193B#x1A17-#x1A18#x1A1B#x1A56#x1A58-#x1A5E#x1A60#x1A62#x1A65-#x1A6C#x1A73-#x1A7C#x1A7F#x1AB0-#x1ABD#x1ABF-#x1ACE#x1B00-#x1B03#x1B34#x1B36-#x1B3A#x1B3C#x1B42#x1B6B-#x1B73#x1B80-#x1B81#x1BA2-#x1BA5#x1BA8-#x1BA9#x1BAB-#x1BAD#x1BE6#x1BE8-#x1BE9#x1BED#x1BEF-#x1BF1#x1C2C-#x1C33#x1C36-#x1C37#x1CD0-#x1CD2#x1CD4-#x1CE0#x1CE2-#x1CE8#x1CED#x1CF4#x1CF8-#x1CF9#x1DC0-#x1DFF#x20D0-#x20DC#x20E1#x20E5-#x20F0#x2CEF-#x2CF1#x2D7F#x2DE0-#x2DFF#x302A-#x302D#x3099-#x309A#xA66F#xA674-#xA67D#xA69E-#xA69F#xA6F0-#xA6F1#xA802#xA806#xA80B#xA825-#xA826#xA82C#xA8C4-#xA8C5#xA8E0-#xA8F1#xA8FF#xA926-#xA92D#xA947-#xA951#xA980-#xA982#xA9B3#xA9B6-#xA9B9#xA9BC-#xA9BD#xA9E5#xAA29-#xAA2E#xAA31-#xAA32#xAA35-#xAA36#xAA43#xAA4C#xAA7C#xAAB0#xAAB2-#xAAB4#xAAB7-#xAAB8#xAABE-#xAABF#xAAC1#xAAEC-#xAAED#xAAF6#xABE5#xABE8#xABED#xFB1E#xFE00-#xFE0F#xFE20-#xFE2F]
+
+ Referenced by: +
+ + +====================================================================================================================== + Nd +====================================================================================================================== + + +.. raw:: html + + + + + + [0-9] + + [#x660-#x669] + + [#x6F0-#x6F9] + + [#x7C0-#x7C9] + + [#x966-#x96F] + + [#x9E6-#x9EF] + + [#xA66-#xA6F] + + [#xAE6-#xAEF] + + [#xB66-#xB6F] + + [#xBE6-#xBEF] + + [#xC66-#xC6F] + + [#xCE6-#xCEF] + + [#xD66-#xD6F] + + [#xDE6-#xDEF] + + [#xE50-#xE59] + + [#xED0-#xED9] + + [#xF20-#xF29] + + [#x1040-#x1049] + + [#x1090-#x1099] + + [#x17E0-#x17E9] + + [#x1810-#x1819] + + [#x1946-#x194F] + + [#x19D0-#x19D9] + + [#x1A80-#x1A89] + + [#x1A90-#x1A99] + + [#x1B50-#x1B59] + + [#x1BB0-#x1BB9] + + [#x1C40-#x1C49] + + [#x1C50-#x1C59] + + [#xA620-#xA629] + + [#xA8D0-#xA8D9] + + [#xA900-#xA909] + + [#xA9D0-#xA9D9] + + [#xA9F0-#xA9F9] + + [#xAA50-#xAA59] + + [#xABF0-#xABF9] + + [#xFF10-#xFF19] + + +
+ +
Nd       ::= [0-9#x660-#x669#x6F0-#x6F9#x7C0-#x7C9#x966-#x96F#x9E6-#x9EF#xA66-#xA6F#xAE6-#xAEF#xB66-#xB6F#xBE6-#xBEF#xC66-#xC6F#xCE6-#xCEF#xD66-#xD6F#xDE6-#xDEF#xE50-#xE59#xED0-#xED9#xF20-#xF29#x1040-#x1049#x1090-#x1099#x17E0-#x17E9#x1810-#x1819#x1946-#x194F#x19D0-#x19D9#x1A80-#x1A89#x1A90-#x1A99#x1B50-#x1B59#x1BB0-#x1BB9#x1C40-#x1C49#x1C50-#x1C59#xA620-#xA629#xA8D0-#xA8D9#xA900-#xA909#xA9D0-#xA9D9#xA9F0-#xA9F9#xAA50-#xAA59#xABF0-#xABF9#xFF10-#xFF19]
+
+ Referenced by: +
+ + +====================================================================================================================== + Pc +====================================================================================================================== + + +.. raw:: html + + + + + + [#x203F-#x2040] + + [#x2054] + + [#xFE33-#xFE34] + + [#xFE4D-#xFE4F] + + [#xFF3F] + + +
+ +
Pc       ::= [#x203F-#x2040#x2054#xFE33-#xFE34#xFE4D-#xFE4F#xFF3F]
+
+ Referenced by: +
+ + +====================================================================================================================== + ESC +====================================================================================================================== + + +.. raw:: html + + + + + + \ + + n + + t + + b + + r + + f + + \ + + " + + +
+ +
ESC      ::= '\' [ntbrf\"]
+
+ Referenced by: +
====================================================================================================================== @@ -10702,7 +13674,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -10722,23 +13694,25 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. ' - ESC - [^'\#xA#xD] - - '' - - [^'] - - ' - - -
+ ESC + \' + + [^'\] + + '' + + [^'] + + ' + + +
-
         ::= ( [UENRB] | 'RB' | '_utf8' )? "'" ( ( ESC | [^'\#xA#xD] )* | ( "''" | [^'] )+ ) "'"
+
         ::= ( [UENRB] | 'RB' | '_utf8' )? "'" ( ( ESC | "\'" | [^'\] )* | ( "''" | [^'] )+ ) "'"
+
====================================================================================================================== @@ -10789,44 +13763,6 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. -====================================================================================================================== - ESC -====================================================================================================================== - - -.. raw:: html - - - - - - \ - - n - - t - - b - - r - - f - - \ - - ' - - " - - -
- -
ESC      ::= '\' [ntbrf\'"]
-
- Referenced by: -
- - ====================================================================================================================== EOF ====================================================================================================================== diff --git a/src/site/sphinx/usage.rst b/src/site/sphinx/usage.rst index b3895b0e3..6a54b4e62 100644 --- a/src/site/sphinx/usage.rst +++ b/src/site/sphinx/usage.rst @@ -2,12 +2,17 @@ How to use it ****************************** -.. warning:: +.. hint:: - 1) Parsing **T-SQL on MS SQL Server** or Sybase depends on ``Squared Bracket Quotation`` as shown in section :ref:`Define the Parser Features` below. + 1) **Quoting:** Double Quotes ``".."`` are used for quoting identifiers. Parsing T-SQL on **MS SQL Server** or **Sybase** with Squared Brackets ``[..]`` depends on ``Squared Bracket Quotation`` as shown in section :ref:`Define the Parser Features` below. 2) JSQLParser uses a more restrictive list of ``Reserved Keywords`` and such keywords will **need to be quoted**. + 3) **Escaping:** JSQLParser pre-defines standard compliant **Single Quote** ``'..`` **Escape Character**. Additional Back-slash ``\..`` Escaping needs to be activated by setting the ``BackSlashEscapeCharacter`` parser feature. See section :ref:`Define the Parser Features` below for details. + + 4) Oracle Alternative Quoting is partially supported for common brackets such as ``q'{...}'``, ``q'[...]'``, ``q'(...)'`` and ``q''...''``. + + 5) Supported Statement Separators are Semicolon ``\;``, ``GO``, Slash ``\/`` or 2 empty lines. Compile from Source Code @@ -190,11 +195,48 @@ Traverse the Java Object Tree using the Visitor Patterns: stmt.accept(statementVisitor); +Build a SQL Statements +============================== + +Build any SQL Statement from Java Code using a fluent API: + +.. code-block:: java + + String expectedSQLStr = "SELECT 1 FROM dual t WHERE a = b"; + + // Step 1: generate the Java Object Hierarchy for + SelectExpressionItem selectExpressionItem = + new SelectExpressionItem().withExpression(new LongValue().withValue(1)); + + Table table = new Table().withName("dual").withAlias(new Alias("t", false)); + + Column columnA = new Column().withColumnName("a"); + Column columnB = new Column().withColumnName("b"); + Expression whereExpression = + new EqualsTo().withLeftExpression(columnA).withRightExpression(columnB); + + PlainSelect plainSelect = new PlainSelect().addSelectItems(selectExpressionItem) + .withFromItem(table).withWhere(whereExpression); + Select select = new Select().withSelectBody(plainSelect); + + // Step 2a: Print into a SQL Statement + Assertions.assertEquals(expectedSQLStr, select.toString()); + + // Step 2b: De-Parse into a SQL Statement + StringBuilder builder = new StringBuilder(); + StatementDeParser deParser = new StatementDeParser(builder); + deParser.visit(select); + + Assertions.assertEquals(expectedSQLStr, builder.toString()); + + Define the Parser Features ============================== JSQLParser interprets Squared Brackets ``[..]`` as Arrays, which does not work with MS SQL Server and T-SQL. Please use the Parser Features to instruct JSQLParser to read Squared Brackets as Quotes instead. +JSQLParser allows for standard compliant Single Quote ``'..`` Escaping. Additional Back-slash ``\..`` Escaping needs to be activated by setting the ``BackSlashEscapeCharacter`` parser feature. + Additionally there are Features to control the Parser's effort at the cost of the performance. .. code-block:: java @@ -224,3 +266,11 @@ Additionally there are Features to control the Parser's effort at the cost of th .withAllowComplexParsing(true) .withTimeOut(6000) ); + + // Allow Back-slash escaping + sqlStr="SELECT ('\\'Clark\\'', 'Kent')"; + Statement stmt2 = CCJSqlParserUtil.parse( + sqlStr + , parser -> parser + .withBackslashEscapeCharacter(true) + ); diff --git a/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java b/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java index 7eb59fbf4..c103916bc 100644 --- a/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/StringValueTest.java @@ -10,6 +10,9 @@ package net.sf.jsqlparser.expression; import static org.junit.jupiter.api.Assertions.assertEquals; + +import net.sf.jsqlparser.*; +import net.sf.jsqlparser.test.*; import org.junit.jupiter.api.Test; /** @@ -57,10 +60,31 @@ private void checkStringValue(String original, String expectedValue, String expe assertEquals(expectedValue, v.getValue()); assertEquals(expectedPrefix, v.getPrefix()); } - + @Test public void testIssue1566EmptyStringValue() { StringValue v = new StringValue("'"); assertEquals("'", v.getValue()); } + + @Test + public void testOracleAlternativeQuoting() throws JSQLParserException { + String sqlStr = "COMMENT ON COLUMN EMP.NAME IS q'{Na'm\\e}'"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "COMMENT ON COLUMN EMP.NAME IS q'(Na'm\\e)'"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "COMMENT ON COLUMN EMP.NAME IS q'[Na'm\\e]'"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "COMMENT ON COLUMN EMP.NAME IS q''Na'm\\e]''"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "select q'{Its good!}' from dual"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "select q'{It's good!}' from dual"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java b/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java new file mode 100644 index 000000000..89ba838a8 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java @@ -0,0 +1,48 @@ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.*; +import net.sf.jsqlparser.parser.*; +import net.sf.jsqlparser.test.*; +import org.junit.jupiter.api.*; + +public class StatementSeparatorTest { + + @Test + void testDoubleNewLine() throws JSQLParserException { + String sqlStr = + "SELECT * FROM DUAL\n\n\nSELECT * FROM DUAL\n\n\n\nSELECT * FROM dual\n\n\n\n\nSELECT * FROM dual"; + Statements statements = CCJSqlParserUtil.parseStatements(sqlStr); + Assertions.assertEquals(4, statements.getStatements().size()); + } + + @Test + void testNewLineSlash() throws JSQLParserException { + String sqlStr = + "SELECT * FROM DUAL\n\n\nSELECT * FROM DUAL\n/\nSELECT * FROM dual\n/\n\nSELECT * FROM dual"; + Statements statements = CCJSqlParserUtil.parseStatements(sqlStr); + Assertions.assertEquals(4, statements.getStatements().size()); + } + + @Test + void testNewLineGo() throws JSQLParserException { + String sqlStr = + "SELECT * FROM DUAL\n\n\nSELECT * FROM DUAL\nGO\nSELECT * FROM dual\ngo\n\nSELECT * FROM dual\ngo"; + Statements statements = CCJSqlParserUtil.parseStatements(sqlStr); + Assertions.assertEquals(4, statements.getStatements().size()); + } + + @Test + void testOracleBlock() throws JSQLParserException { + String sqlStr = "BEGIN\n" + "\n" + "SELECT * FROM TABLE;\n" + "\n" + "END\n" + "/\n"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + System.out.println(statement); + } + + @Test + void testMSSQLBlock() throws JSQLParserException { + String sqlStr = "create view MyView1 as\n" + "select Id,Name from table1\n" + "go\n" + + "create view MyView2 as\n" + "select Id,Name from table1\n" + "go"; + Statements statements = CCJSqlParserUtil.parseStatements(sqlStr); + Assertions.assertEquals(2, statements.getStatements().size()); + } +} diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java index f6552ff4e..ace507091 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java @@ -10,14 +10,21 @@ package net.sf.jsqlparser.statement.create; import java.io.StringReader; + import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserManager; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.parser.ParseException; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.create.view.AutoRefreshOption; import net.sf.jsqlparser.statement.create.view.CreateView; import net.sf.jsqlparser.statement.select.PlainSelect; import static net.sf.jsqlparser.test.TestUtils.*; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; @@ -32,7 +39,9 @@ public void testCreateView() throws JSQLParserException { CreateView createView = (CreateView) parserManager.parse(new StringReader(statement)); assertFalse(createView.isOrReplace()); assertEquals("myview", createView.getView().getName()); - assertEquals("mytab", ((Table) ((PlainSelect) createView.getSelect().getSelectBody()).getFromItem()).getName()); + assertEquals("mytab", + ((Table) ((PlainSelect) createView.getSelect().getSelectBody()).getFromItem()) + .getName()); assertEquals(statement, createView.toString()); } @@ -50,7 +59,8 @@ public void testCreateView3() throws JSQLParserException { @Test public void testCreateView4() throws JSQLParserException { - String stmt = "CREATE OR REPLACE VIEW view2 AS SELECT a, b, c FROM testtab INNER JOIN testtab2 ON testtab.col1 = testtab2.col2"; + String stmt = + "CREATE OR REPLACE VIEW view2 AS SELECT a, b, c FROM testtab INNER JOIN testtab2 ON testtab.col1 = testtab2.col2"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -67,14 +77,16 @@ public void testCreateView5() throws JSQLParserException { CreateView createView = (CreateView) parserManager.parse(new StringReader(statement)); assertFalse(createView.isOrReplace()); assertEquals("myview", createView.getView().getName()); - assertEquals("mytab", ((Table) ((PlainSelect) createView.getSelect().getSelectBody()).getFromItem()). - getName()); + assertEquals("mytab", + ((Table) ((PlainSelect) createView.getSelect().getSelectBody()).getFromItem()) + .getName()); assertEquals(statement2, createView.toString()); } @Test public void testCreateViewUnion() throws JSQLParserException { - String stmt = "CREATE VIEW view1 AS (SELECT a, b FROM testtab) UNION (SELECT b, c FROM testtab2)"; + String stmt = + "CREATE VIEW view1 AS (SELECT a, b FROM testtab) UNION (SELECT b, c FROM testtab2)"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -96,12 +108,14 @@ public void testCreateForceView1() throws JSQLParserException { @Test public void testCreateForceView2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE OR REPLACE FORCE VIEW view1 AS SELECT a, b FROM testtab"); + assertSqlCanBeParsedAndDeparsed( + "CREATE OR REPLACE FORCE VIEW view1 AS SELECT a, b FROM testtab"); } @Test public void testCreateForceView3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE OR REPLACE NO FORCE VIEW view1 AS SELECT a, b FROM testtab"); + assertSqlCanBeParsedAndDeparsed( + "CREATE OR REPLACE NO FORCE VIEW view1 AS SELECT a, b FROM testtab"); } @Test @@ -116,12 +130,68 @@ public void testCreateTemporaryViewIssue604_2() throws JSQLParserException { @Test public void testCreateTemporaryViewIssue665() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE VIEW foo(\"BAR\") AS WITH temp AS (SELECT temp_bar FROM foobar) SELECT bar FROM temp"); + assertSqlCanBeParsedAndDeparsed( + "CREATE VIEW foo(\"BAR\") AS WITH temp AS (SELECT temp_bar FROM foobar) SELECT bar FROM temp"); } @Test public void testCreateWithReadOnlyViewIssue838() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE VIEW v14(c1, c2) AS SELECT c1, C2 FROM t1 WITH READ ONLY"); + assertSqlCanBeParsedAndDeparsed( + "CREATE VIEW v14(c1, c2) AS SELECT c1, C2 FROM t1 WITH READ ONLY"); + } + + @Test + public void testCreateViewAutoRefreshNone() throws JSQLParserException { + String stmt = "CREATE VIEW myview AS SELECT * FROM mytab"; + CreateView createView = (CreateView) assertSqlCanBeParsedAndDeparsed(stmt); + assertEquals(createView.getAutoRefresh(), AutoRefreshOption.NONE); + } + + @Test + public void testCreateViewAutoRefreshYes() throws JSQLParserException { + String stmt = "CREATE VIEW myview AUTO REFRESH YES AS SELECT * FROM mytab"; + CreateView createView = (CreateView) assertSqlCanBeParsedAndDeparsed(stmt); + assertEquals(createView.getAutoRefresh(), AutoRefreshOption.YES); + } + + @Test + public void testCreateViewAutoRefreshNo() throws JSQLParserException { + String stmt = "CREATE VIEW myview AUTO REFRESH NO AS SELECT * FROM mytab"; + CreateView createView = (CreateView) assertSqlCanBeParsedAndDeparsed(stmt); + assertEquals(createView.getAutoRefresh(), AutoRefreshOption.NO); + } + + @Test + public void testCreateViewAutoFails() throws JSQLParserException { + String stmt = "CREATE VIEW myview AUTO AS SELECT * FROM mytab"; + + ThrowingCallable throwingCallable = () -> CCJSqlParserUtil.parse(stmt); + + assertThatThrownBy(throwingCallable).isInstanceOf(JSQLParserException.class) + .hasRootCauseInstanceOf(ParseException.class).rootCause() + .hasMessageStartingWith("Encountered unexpected token"); + } + + @Test + public void testCreateViewRefreshFails() throws JSQLParserException { + String stmt = "CREATE VIEW myview REFRESH AS SELECT * FROM mytab"; + + ThrowingCallable throwingCallable = () -> CCJSqlParserUtil.parse(stmt); + + assertThatThrownBy(throwingCallable).isInstanceOf(JSQLParserException.class) + .hasRootCauseInstanceOf(ParseException.class).rootCause() + .hasMessageStartingWith("Encountered unexpected token"); + } + + @Test + public void testCreateViewAutoRefreshFails() throws JSQLParserException { + String stmt = "CREATE VIEW myview AUTO REFRESH AS SELECT * FROM mytab"; + + ThrowingCallable throwingCallable = () -> CCJSqlParserUtil.parse(stmt); + + assertThatThrownBy(throwingCallable).isInstanceOf(JSQLParserException.class) + .hasRootCauseInstanceOf(ParseException.class).rootCause() + .hasMessageStartingWith("Encountered unexpected token"); } @Test @@ -130,7 +200,7 @@ public void testCreateViewIfNotExists() throws JSQLParserException { CreateView createView = (CreateView) assertSqlCanBeParsedAndDeparsed(stmt); assertTrue(createView.isIfNotExists()); } - + @Test public void testCreateMaterializedViewIfNotExists() throws JSQLParserException { String stmt = "CREATE MATERIALIZED VIEW myview IF NOT EXISTS AS SELECT * FROM mytab"; @@ -138,4 +208,5 @@ public void testCreateMaterializedViewIfNotExists() throws JSQLParserException { assertTrue(createView.isMaterialized()); assertTrue(createView.isIfNotExists()); } + } diff --git a/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java b/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java index c2e6a71c9..a86aa782b 100644 --- a/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java +++ b/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java @@ -10,8 +10,7 @@ package net.sf.jsqlparser.test; import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; -import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.*; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; @@ -22,11 +21,13 @@ import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectExpressionItem; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; +import net.sf.jsqlparser.util.deparser.*; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @SuppressWarnings("PMD") public class HowToUseSample { + //@formatter:off /* SQL Text └─Statements: net.sf.jsqlparser.statement.select.Select @@ -39,18 +40,50 @@ public class HowToUseSample { ├─Column: a └─Column: b */ + //@formatter:on + + @Test + void writeSQL() { + String expectedSQLStr = "SELECT 1 FROM dual t WHERE a = b"; + + // Step 1: generate the Java Object Hierarchy for + SelectExpressionItem selectExpressionItem = + new SelectExpressionItem().withExpression(new LongValue().withValue(1)); + + Table table = new Table().withName("dual").withAlias(new Alias("t", false)); + + Column columnA = new Column().withColumnName("a"); + Column columnB = new Column().withColumnName("b"); + Expression whereExpression = + new EqualsTo().withLeftExpression(columnA).withRightExpression(columnB); + + PlainSelect plainSelect = new PlainSelect().addSelectItems(selectExpressionItem) + .withFromItem(table).withWhere(whereExpression); + Select select = new Select().withSelectBody(plainSelect); + + // Step 2a: Print into a SQL Statement + Assertions.assertEquals(expectedSQLStr, select.toString()); + + // Step 2b: De-Parse into a SQL Statement + StringBuilder builder = new StringBuilder(); + StatementDeParser deParser = new StatementDeParser(builder); + deParser.visit(select); + + Assertions.assertEquals(expectedSQLStr, builder.toString()); + } @Test public void howToParseStatement() throws JSQLParserException { - String sqlStr="select 1 from dual where a=b"; + String sqlStr = "select 1 from dual where a=b"; Statement statement = CCJSqlParserUtil.parse(sqlStr); if (statement instanceof Select) { Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); - SelectExpressionItem selectExpressionItem = (SelectExpressionItem) plainSelect.getSelectItems().get(0); - Assertions.assertEquals( new LongValue(1), selectExpressionItem.getExpression()); + SelectExpressionItem selectExpressionItem = + (SelectExpressionItem) plainSelect.getSelectItems().get(0); + Assertions.assertEquals(new LongValue(1), selectExpressionItem.getExpression()); Table table = (Table) plainSelect.getFromItem(); Assertions.assertEquals("dual", table.getName()); @@ -73,12 +106,14 @@ public void visit(EqualsTo equalsTo) { equalsTo.getLeftExpression().accept(this); equalsTo.getRightExpression().accept(this); } + public void visit(Column column) { System.out.println("Found a Column " + column.getColumnName()); } }; - // Define a Select Visitor reacting on a Plain Select invoking the Expression Visitor on the Where Clause + // Define a Select Visitor reacting on a Plain Select invoking the Expression Visitor on the + // Where Clause SelectVisitorAdapter selectVisitorAdapter = new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { @@ -93,7 +128,7 @@ public void visit(Select select) { } }; - String sqlStr="select 1 from dual where a=b"; + String sqlStr = "select 1 from dual where a=b"; Statement stmt = CCJSqlParserUtil.parse(sqlStr); // Invoke the Statement Visitor @@ -103,30 +138,18 @@ public void visit(Select select) { @Test public void howToUseFeatures() throws JSQLParserException { - String sqlStr="select 1 from [sample_table] where [a]=[b]"; + String sqlStr = "select 1 from [sample_table] where [a]=[b]"; // T-SQL Square Bracket Quotation - Statement stmt = CCJSqlParserUtil.parse( - sqlStr - , parser -> parser - .withSquareBracketQuotation(true) - ); + Statement stmt = + CCJSqlParserUtil.parse(sqlStr, parser -> parser.withSquareBracketQuotation(true)); // Set Parser Timeout to 6000 ms - Statement stmt1 = CCJSqlParserUtil.parse( - sqlStr - , parser -> parser - .withSquareBracketQuotation(true) - .withTimeOut(6000) - ); + Statement stmt1 = CCJSqlParserUtil.parse(sqlStr, + parser -> parser.withSquareBracketQuotation(true).withTimeOut(6000)); // Allow Complex Parsing (which allows nested Expressions, but is much slower) - Statement stmt2 = CCJSqlParserUtil.parse( - sqlStr - , parser -> parser - .withSquareBracketQuotation(true) - .withAllowComplexParsing(true) - .withTimeOut(6000) - ); + Statement stmt2 = CCJSqlParserUtil.parse(sqlStr, parser -> parser + .withSquareBracketQuotation(true).withAllowComplexParsing(true).withTimeOut(6000)); } } diff --git a/src/test/java/net/sf/jsqlparser/test/TestUtils.java b/src/test/java/net/sf/jsqlparser/test/TestUtils.java index 322250559..3d871aa68 100644 --- a/src/test/java/net/sf/jsqlparser/test/TestUtils.java +++ b/src/test/java/net/sf/jsqlparser/test/TestUtils.java @@ -9,12 +9,16 @@ */ package net.sf.jsqlparser.test; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Consumer; +import java.util.logging.*; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,36 +38,37 @@ import net.sf.jsqlparser.util.deparser.ExpressionDeParser; import net.sf.jsqlparser.util.deparser.SelectDeParser; import net.sf.jsqlparser.util.deparser.StatementDeParser; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.builder.MultilineRecursiveToStringStyle; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + /** * * @author toben */ public class TestUtils { - private static final Pattern SQL_COMMENT_PATTERN = Pattern. - compile("(--.*$)|(/\\*.*?\\*/)", Pattern.MULTILINE); + private static final Pattern SQL_COMMENT_PATTERN = + Pattern.compile("(--.*$)|(/\\*.*?\\*/)", Pattern.MULTILINE); - private static final Pattern SQL_SANITATION_PATTERN - = Pattern.compile("(\\s+)", Pattern.MULTILINE); + private static final Pattern SQL_SANITATION_PATTERN = + Pattern.compile("(\\s+)", Pattern.MULTILINE); // Assure SPACE around Syntax Characters - private static final Pattern SQL_SANITATION_PATTERN2 - = Pattern.compile("\\s*([!/,()=+\\-*|\\]<>:])\\s*", Pattern.MULTILINE); + private static final Pattern SQL_SANITATION_PATTERN2 = + Pattern.compile("\\s*([!/,()=+\\-*|\\]<>:])\\s*", Pattern.MULTILINE); /** * @param statement * @return the parsed {@link Statement} * @throws JSQLParserException */ - public static Statement assertSqlCanBeParsedAndDeparsed(String statement) throws JSQLParserException { + public static Statement assertSqlCanBeParsedAndDeparsed(String statement) + throws JSQLParserException { return assertSqlCanBeParsedAndDeparsed(statement, false); } @@ -71,26 +76,26 @@ public static Statement assertSqlCanBeParsedAndDeparsed(String statement) throws * Tries to parse and deparse the given statement. * * @param statement - * @param laxDeparsingCheck removes all linefeeds from the original and removes all double spaces. The check is - * caseinsensitive. + * @param laxDeparsingCheck removes all linefeeds from the original and removes all double + * spaces. The check is caseinsensitive. * @return the parsed {@link Statement} * @throws JSQLParserException */ - public static Statement assertSqlCanBeParsedAndDeparsed(String statement, boolean laxDeparsingCheck) - throws JSQLParserException { + public static Statement assertSqlCanBeParsedAndDeparsed(String statement, + boolean laxDeparsingCheck) throws JSQLParserException { return assertSqlCanBeParsedAndDeparsed(statement, laxDeparsingCheck, null); } /** * @param statement - * @param laxDeparsingCheck removes all linefeeds from the original and removes all double spaces. The check is - * caseinsensitive. + * @param laxDeparsingCheck removes all linefeeds from the original and removes all double + * spaces. The check is caseinsensitive. * @param consumer - a parser-consumer for parser-configurations from outside * @return the parsed {@link Statement} * @throws JSQLParserException */ - public static Statement assertSqlCanBeParsedAndDeparsed(String statement, boolean laxDeparsingCheck, - Consumer consumer) throws JSQLParserException { + public static Statement assertSqlCanBeParsedAndDeparsed(String statement, + boolean laxDeparsingCheck, Consumer consumer) throws JSQLParserException { Statement parsed = CCJSqlParserUtil.parse(statement, consumer); assertStatementCanBeDeparsedAs(parsed, statement, laxDeparsingCheck); return parsed; @@ -100,20 +105,62 @@ public static void assertStatementCanBeDeparsedAs(Statement parsed, String state assertStatementCanBeDeparsedAs(parsed, statement, false); } - public static void assertStatementCanBeDeparsedAs(Statement parsed, String statement, boolean laxDeparsingCheck) { + public static void assertStatementCanBeDeparsedAs(Statement parsed, String statement, + boolean laxDeparsingCheck) { String sanitizedInputSqlStr = buildSqlString(parsed.toString(), laxDeparsingCheck); String sanitizedStatementStr = buildSqlString(statement, laxDeparsingCheck); assertEquals(sanitizedStatementStr, sanitizedInputSqlStr); + // Export all the Test SQLs to /tmp/net/sf/jsqlparser + boolean exportToFile = Boolean.parseBoolean(System.getenv("EXPORT_TEST_TO_FILE")); + if (exportToFile) { + writeTestToFile(sanitizedInputSqlStr); + } + StringBuilder builder = new StringBuilder(); - parsed.accept( new StatementDeParser(builder) ); + parsed.accept(new StatementDeParser(builder)); String sanitizedDeparsedStr = buildSqlString(builder.toString(), laxDeparsingCheck); assertEquals(sanitizedStatementStr, sanitizedDeparsedStr); } + private static void writeTestToFile(String sanitizedInputSqlStr) { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + String testMethodName; + String testClassName; + int i = 1; + do { + testMethodName = stackTrace[i].getMethodName(); + testClassName = stackTrace[i].getClassName(); + i++; + } while (testMethodName.equals("writeTestToFile") || testMethodName.startsWith("assert")); + + if (!testMethodName.equals("testRelObjectNameExt")) { + int classNameSeparator = testClassName.lastIndexOf("."); + String simpleClassName = testClassName.substring(classNameSeparator + 1); + String packageName = testClassName.substring(0, classNameSeparator).replace(".", + System.getProperty("file.separator")); + + File file = new File(System.getProperty("java.io.tmpdir") + + System.getProperty("file.separator") + packageName); + file.mkdirs(); + file = new File(file, simpleClassName + ".sql"); + try (FileWriter fileWriter = new FileWriter(file, true)) { + IOUtils.write("-- " + testMethodName + "\n", fileWriter); + IOUtils.write(sanitizedInputSqlStr, fileWriter); + if (!sanitizedInputSqlStr.trim().endsWith(";")) { + IOUtils.write("\n;", fileWriter); + } + IOUtils.write("\n\n", fileWriter); + } catch (IOException ex) { + Logger.getLogger(TestUtils.class.getName()).log(Level.SEVERE, + "Writing SQL to file failed.", ex); + } + } + } + /** * Asserts that the {@link Statement} can be deparsed and deparsing results in given #statement * @@ -136,7 +183,8 @@ public static void assertEqualsObjectTree(Statement parsed, Statement created) { /** * @param stmt - * @return a {@link String} build by {@link ToStringBuilder} and {@link ObjectTreeToStringStyle#INSTANCE} + * @return a {@link String} build by {@link ToStringBuilder} and + * {@link ObjectTreeToStringStyle#INSTANCE} */ public static String toReflectionString(Statement stmt) { return toReflectionString(stmt, false); @@ -144,17 +192,20 @@ public static String toReflectionString(Statement stmt) { /** * @param stmt - * @return a {@link String} build by {@link ToStringBuilder} and {@link ObjectTreeToStringStyle#INSTANCE} + * @return a {@link String} build by {@link ToStringBuilder} and + * {@link ObjectTreeToStringStyle#INSTANCE} */ public static String toReflectionString(Statement stmt, boolean includingASTNode) { ReflectionToStringBuilder strb = new ReflectionToStringBuilder(stmt, - includingASTNode ? ObjectTreeToStringStyle.INSTANCE_INCLUDING_AST : ObjectTreeToStringStyle.INSTANCE); + includingASTNode ? ObjectTreeToStringStyle.INSTANCE_INCLUDING_AST + : ObjectTreeToStringStyle.INSTANCE); return strb.build(); } /** - * Replacement of {@link Arrays#asList(Object...)} which returns java.util.Arrays$ArrayList not java.util.ArrayList, - * the internal model uses java.util.ArrayList by default, which supports modification + * Replacement of {@link Arrays#asList(Object...)} which returns java.util.Arrays$ArrayList not + * java.util.ArrayList, the internal model uses java.util.ArrayList by default, which supports + * modification * * @param * @param obj @@ -175,7 +226,8 @@ private static final class ObjectTreeToStringStyle extends MultilineRecursiveToS private static final long serialVersionUID = 1L; public static final ObjectTreeToStringStyle INSTANCE = new ObjectTreeToStringStyle(false); - public static final ObjectTreeToStringStyle INSTANCE_INCLUDING_AST = new ObjectTreeToStringStyle(true); + public static final ObjectTreeToStringStyle INSTANCE_INCLUDING_AST = + new ObjectTreeToStringStyle(true); private boolean includingASTNode; @@ -205,10 +257,12 @@ public void append(final StringBuffer buffer, final String fieldName, final Obje } /** - * empty {@link Collection}'s should be printed as null, otherwise the outcome cannot be compared + * empty {@link Collection}'s should be printed as null, otherwise the outcome + * cannot be compared */ @Override - protected void appendDetail(final StringBuffer buffer, final String fieldName, final Collection coll) { + protected void appendDetail(final StringBuffer buffer, final String fieldName, + final Collection coll) { if (coll.isEmpty()) { appendNullText(buffer, fieldName); } else { @@ -217,10 +271,12 @@ protected void appendDetail(final StringBuffer buffer, final String fieldName, f } /** - * empty {@link Map}'s should be printed as null, otherwise the outcome cannot be compared + * empty {@link Map}'s should be printed as null, otherwise the outcome cannot + * be compared */ @Override - protected void appendDetail(final StringBuffer buffer, final String fieldName, final Map coll) { + protected void appendDetail(final StringBuffer buffer, final String fieldName, + final Map coll) { if (coll.isEmpty()) { appendNullText(buffer, fieldName); } else { @@ -248,8 +304,8 @@ public boolean isNotANode(Class clazz) { * * @param stmt * @param statement - * @param laxDeparsingCheck removes all linefeeds from the original and removes all double spaces. The check is - * caseinsensitive. + * @param laxDeparsingCheck removes all line feeds from the original and removes all double + * spaces. The check is case-insensitive. */ public static void assertDeparse(Statement stmt, String statement, boolean laxDeparsingCheck) { StatementDeParser deParser = new StatementDeParser(new StringBuilder()); @@ -268,7 +324,18 @@ public static String buildSqlString(final String originalSql, boolean laxDeparsi // assure spacing around Syntax Characters sanitizedSqlStr = SQL_SANITATION_PATTERN2.matcher(sanitizedSqlStr).replaceAll("$1"); - return sanitizedSqlStr.trim().toLowerCase(); + + sanitizedSqlStr = sanitizedSqlStr.trim().toLowerCase(); + + // Rewrite statement separators "/" and "GO" + if (sanitizedSqlStr.endsWith("/")) { + sanitizedSqlStr = sanitizedSqlStr.substring(0, sanitizedSqlStr.length() - 1) + ";"; + } else if (sanitizedSqlStr.endsWith("go")) { + sanitizedSqlStr = sanitizedSqlStr.substring(0, sanitizedSqlStr.length() - 2) + ";"; + } + + return sanitizedSqlStr; + } else { // remove comments only return SQL_COMMENT_PATTERN.matcher(originalSql).replaceAll(""); @@ -277,7 +344,8 @@ public static String buildSqlString(final String originalSql, boolean laxDeparsi @Test public void testBuildSqlString() { - assertEquals("select col from test", buildSqlString(" SELECT col FROM \r\n \t TEST \n", true)); + assertEquals("select col from test", + buildSqlString(" SELECT col FROM \r\n \t TEST \n", true)); assertEquals("select col from test", buildSqlString("select col from test", false)); } @@ -292,7 +360,8 @@ public static void assertExpressionCanBeDeparsedAs(final Expression parsed, Stri assertEquals(expression, stringBuilder.toString()); } - public static void assertExpressionCanBeParsedAndDeparsed(String expressionStr, boolean laxDeparsingCheck) throws JSQLParserException { + public static void assertExpressionCanBeParsedAndDeparsed(String expressionStr, + boolean laxDeparsingCheck) throws JSQLParserException { Expression expression = CCJSqlParserUtil.parseExpression(expressionStr); assertEquals(buildSqlString(expressionStr, laxDeparsingCheck), buildSqlString(expression.toString(), laxDeparsingCheck)); diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/large-sql-issue-923-2.txt b/src/test/resources/net/sf/jsqlparser/statement/select/large-sql-issue-923-2.txt index 080412b8f..45f061cb5 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/large-sql-issue-923-2.txt +++ b/src/test/resources/net/sf/jsqlparser/statement/select/large-sql-issue-923-2.txt @@ -292,7 +292,6 @@ AP_CLAIMS AS --MAIN QUERY SELECT STARTS HERE - SELECT --ORIGINAL @@ -349,7 +348,6 @@ ALL_KINAL_NET_PENALTY, ALL_KINAL_NET_INTEREST, ALL_KINAL_STATUS, - -- DUP 5 CASE WHEN ALL_KINAL_STATUS = 'CLEAN' THEN NULL ELSE TRIM(REPLACE(ALL_KINAL_EOB,',',''))END AS ALL_KINAL_EOB, @@ -368,8 +366,6 @@ CRM_SUBTOPIC ,INFO_CODE3 ,INFO_CODE3_ENTRY_DATE - - FROM --MAIN QUERY TABLE BEGINS TEST3