+ Unreleased (2026-10-02)
- Add native .NET dlineage for a documented static subset of Oracle,
MSSQL, PostgreSQL and MySQL. Trace values and row/control influence
through SELECT, JOIN, CTE, subqueries, VIEW/CTAS and INSERT SELECT.
- Return detached immutable results with uncertainty/diagnostics.
Provide native JSON and Java legacy XML/SQLFlow display views.
- Add explicit MySQL identifier policies and backtick support.
ANSI_QUOTES=true remains explicitly unsupported pending certification.
- Keep unsupported DML, complex catalog changes, routines and advanced
query forms visible through diagnostics; see the MVP support matrix.
+ Unreleased (2026-10-01)
- Add opt-in IdentifierServices for Oracle, PostgreSQL, Snowflake and
MSSQL, with immutable rules, explicit lexical/stored input and typed
catalog/column identities. Legacy behavior remains the default.
- Preserve distinct CTE occurrences, duplicate output slots and
ambiguous sources in resolver2. DisplayEntry APIs keep different
identities even when their rendered names are identical.
- Preserve custom identifier rules when saving metadata. Use JSON v1
where stored names retain their keys, or v2 name values otherwise.
- [Oracle] Recognize RESTORE POINT; fix the misspelled command pattern.
+ dotnet version 4.1.0.18(2026-10-21)
- [MSSQL] Complete lineage for the 41 SQL Server inputs that 4.1.0.17
listed as deferred; they no longer report SyntaxError.
- [MSSQL] Accept CREATE COLUMN MASTER KEY, COLUMN ENCRYPTION KEY,
DATABASE ENCRYPTION KEY, EVENT SESSION, EXTERNAL LANGUAGE and
EVENT NOTIFICATION, security policy predicates and extended GRANT.
- [MSSQL] Accept FORCE DISTRIBUTED PLAN and FOR TIMESTAMP AS OF hints,
ALTER COLUMN ADD/DROP HIDDEN, PERSISTED and NOT FOR REPLICATION,
index REBUILD and columnstore ORDER variants, and --1 in expressions.
- [MSSQL] Split view bodies and DDL continuations into statements the
same way with and without lineage analysis.
- [MSSQL] Release lineage request metadata from a pooled worker after
a spill IO failure. Fix Boolean and repeated-element XML decoding.
- [PostgreSQL] Parse PREPARE into TPrepareStmt (Mantis 4868).
- [PostgreSQL] Support INSERT ... ON CONFLICT, TABLE t queries, a CTE
body that starts with WITH, and keyword-qualified type names.
+ dotnet version 4.1.0.17(2026-10-19)
- Add the Java-derived .NET SQL Server data lineage implementation,
using DataFlowAnalyzer, Option and generateDataFlow(). Preserve the
existing request-based Analyze API for compatibility.
- Support the validated SQL Server query, DML, procedure, view,
metadata and dynamic SQL scenarios, with XML and model output.
See the release notes for supported scenarios and known limitations.
- [MSSQL] Restore complete lineage for procedure scripts followed by
multiple views. Accept nested ALTER DATABASE, FORCESEEK index/column
hints, SELECT INTO ON filegroup and OPTION USE PLAN.
- Preserve published node enum values, ordinals and factory IDs,
existing CTE virtual properties and database-context properties.
- Avoid SQL Server metadata culture-initialization failures when
.NET globalization-invariant mode is enabled. Retain the existing
pinned Java identifier collation data.
- Full customer edition includes all 15 database parser resources.
New lineage certification in this release is scoped to SQL Server;
other database parsers retain their existing support.
+ dotnet version 4.1.0.16(2026-9-29)
- [DB2] Recognize the event monitor statements SET EVENT MONITOR
... STATE, CREATE EVENT MONITOR and ALTER EVENT MONITOR ... ADD
LOGICAL GROUP. For example, SET EVENT MONITOR m STATE 0 and
CREATE EVENT MONITOR m FOR ACTIVITIES WRITE TO TABLE ACTIVITY,
ACTIVITYSTMT (IN USERSPACE1 PCTDEACTIVATE 100) MANUALSTART
previously failed to parse. Like other Db2 administrative
statements, they are returned as TUnknownSqlStatement with
sqlstatementtype set to sstdb2seteventmonitorstate,
sstdb2createeventmonitor or the new sstdb2altereventmonitor.
+ dotnet version 4.1.0.15(2026-9-25)
- [DB2] Accept the CURRENT MEMBER special register, for example
SELECT ... FROM TABLE(SYSPROC.ENV_GET_SYSTEM_RESOURCES())
WHERE MEMBER = CURRENT MEMBER WITH UR. It previously failed with a
syntax error near MEMBER. CURRENT MEMBER is now accepted wherever
an expression is allowed and is parsed as a constant, like
CURRENT SCHEMA. MEMBER can still be used as a column name.
+ dotnet version 4.1.0.14(2026-8-27)
- [DB2] Support four Db2 12.1 constructs that previously failed to
parse:
* the EXISTS predicate used as a select-list expression, for
example SELECT EXISTS(SELECT c FROM t2) AS found FROM t1. Db2
lists search-condition as an alternative in its `expression`
diagram, so a predicate is legal wherever an expression is and
the result column is BOOLEAN. NOT EXISTS is accepted too.
* the SET TENANT statement, in every documented spelling:
SET [CURRENT] TENANT [=] value, SET CURRENT_TENANT [=] value,
and the ISO/ANSI alias SET [CURRENT] CATALOG [=] value. The
value may be an identifier, a delimited identifier, a string
constant, SYSTEM, or a parameter marker. TENANT, CURRENT_TENANT
and CATALOG are not Db2 reserved words and remain usable as
ordinary identifiers.
* the fetch-clause and order-by-clause on a searched DELETE or
UPDATE, for example
DELETE FROM t WHERE c = 1 FETCH FIRST 100 ROWS ONLY. The row
count is an expression, so an SQL variable or a parameter
marker works as well as a literal. Exposed as
TDeleteSqlStatement.FetchFirstClause and
TUpdateSqlStatement.FetchFirstClause;
TUpdateSqlStatement.OrderByClause is now populated as well.
* the FROM clause of a searched UPDATE, which sits between the SET
list and WHERE, for example
UPDATE t1 h SET (h.a, h.b) = (r.a, r.b)
FROM (SELECT a, b, k FROM t2) r WHERE h.k = r.k.
Plain tables, comma-separated lists, derived tables and JOIN /
LEFT JOIN forms are all accepted, with or without correlation
names, and the source tables appear in stmt.tables and
stmt.joins.
Db2 has no DELETE ... FROM source-table form, so that is still
rejected.
- [DB2] Distinguish the searched and positioned forms of UPDATE and
DELETE. The FROM, ORDER BY and FETCH FIRST clauses belong to the
searched form only, so a positioned statement such as
DELETE FROM t WHERE CURRENT OF c FETCH FIRST 5 ROWS ONLY is now
rejected rather than silently accepted.
- [DB2] Preserve the fetch-clause of a searched UPDATE or DELETE when
regenerating SQL from a modified parse tree. The script writer
emitted it for SELECT only, so a round trip previously turned
"delete at most 100 rows" into "delete every matching row".
+ dotnet version 4.1.0.13(2026-8-8)
- [DB2] Accept two more spellings of a condition declaration in a
procedure, trigger or function body:
* with the SQLSTATE keyword omitted, which is how IBM writes it,
for example DECLARE DUPEKEY CONDITION FOR '23505'
* with no SQLSTATE at all, for example DECLARE retryable CONDITION
The SQLSTATE association is optional in a compound SQL
(compiled) statement, which is what a routine body is; such a
condition can still be referenced from a handler and from
SIGNAL.
The forms that already worked, CONDITION FOR SQLSTATE '23505' and
CONDITION FOR SQLSTATE VALUE '23505', are unchanged.
+ dotnet version 4.1.0.12(2026-8-8)
- [DB2] Accept the sqlstate of SIGNAL and RESIGNAL given as a CHAR(5)
variable rather than a string literal, for example
SIGNAL SQLSTATE VALUE P_STATE, with or without the VALUE keyword.
The variable may be qualified, as a parameter by the routine name or
a local by its block label, for example SIGNAL SQLSTATE P1.P_STATE.
A handler condition is unaffected and still requires a constant,
which is what DB2 specifies.
Known limitation: a variable named literally VALUE cannot be used in
this position, because SQLSTATE VALUE x would then be ambiguous with
the VALUE keyword. Variables named after other unreserved keywords,
such as RESULT or DATA, work normally.
- [DB2] Accept a qualified condition name, both module.condition and
schema.module.condition, in a handler condition list and in SIGNAL
and RESIGNAL. The name in a condition declaration stays unqualified,
as DB2 requires.
+ dotnet version 4.1.0.11(2026-8-8)
- [DB2] Accept a comma-separated condition-value list after
DECLARE ... HANDLER FOR, mixing the specific forms (SQLSTATE,
condition name) with the general ones (SQLEXCEPTION, SQLWARNING,
NOT FOUND), for example
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING. Previously only
the specific forms could be listed. Applies to CONTINUE, EXIT and
UNDO handlers alike.
- [DB2] Accept RESIGNAL with no condition, which re-raises the
condition currently being handled and is the usual form inside a
handler. A bare SIGNAL is still rejected, since DB2 requires a
condition there.
Known limitation: a SQLSTATE given as a variable rather than a
string literal (SIGNAL SQLSTATE VALUE my_var) and a module-qualified
condition name (schema.condition) are still unsupported.
+ dotnet version 4.1.0.10(2026-8-8)
- [DB2] Accept an empty compound statement body, BEGIN END, and a body
made up only of DECLARE statements. This is what makes the common
idiom for swallowing an error legal, for example
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505' BEGIN END. Applies to
procedure bodies, trigger bodies, SQL function bodies and handler
blocks, with or without a label and with or without [NOT] ATOMIC.
- [DB2] Accept the AUTONOMOUS option in CREATE PROCEDURE, which runs
the procedure in its own transaction scope. AUTONOMOUS is not a
reserved word and stays usable as a column or table name.
- [DB2] Fix statement splitting inside routine bodies. A script whose
procedure, trigger or function contained any of the following was
split at the wrong place, so the statement that followed the routine
was merged into it and the results were wrong without any error
being reported:
* a nested block used as a statement, BEGIN ... END; inside the body
* a cursor declared FOR a select or FOR a prepared statement name
* a call to the scalar function REPEAT(), for example REPEAT('x',3)
* a loop closed with an end label, END WHILE L1 / END LOOP L1 /
END REPEAT L1
* a column labelled END, for example SELECT x AS END FROM t
Known remaining limitation: the bare alias form SELECT x END FROM t,
without AS, is still split incorrectly.
+ dotnet version 4.1.0.9(2026-8-7)
- [DB2] Accept a cursor declared for a prepared statement name, e.g.
DECLARE c1 CURSOR WITH RETURN TO CALLER FOR SQL_STATEMENT, used
together with PREPARE. All combinations of WITH HOLD and
WITH RETURN [TO CALLER | TO CLIENT] are supported. Previously only
a cursor declared directly over a SELECT statement was accepted.
The prepared statement name is available on the AST through the new
TDb2DeclareCursorStatement.CursorStatement property.
- [DB2] Accept the full set of declarations in the body of a compiled
CREATE TRIGGER, i.e. handler declarations
(DECLARE CONTINUE | EXIT | UNDO HANDLER FOR ...), SQLSTATE / SQLCODE
declarations, statement declarations and cursor declarations.
Previously a trigger body only accepted variable and condition
declarations, so a trigger with a CONTINUE HANDLER failed to parse.
+ dotnet version 4.1.0.8(2026-7-30)
- [Oracle] Accept the IGNORE NULLS and RESPECT NULLS null-treatment
clauses after the closing parenthesis of a value-based window
function, before OVER, e.g.
LAG(var1, 1, var1) IGNORE NULLS OVER (ORDER BY ROWNUM),
LEAD(var1) RESPECT NULLS OVER (...),
FIRST_VALUE(var1) IGNORE NULLS OVER (...),
LAST_VALUE(var1) RESPECT NULLS OVER (...) and
NTH_VALUE(var1, 3) IGNORE NULLS OVER (...). Previously only the
FIRST_VALUE/LAST_VALUE inside-parenthesis IGNORE NULLS form was
accepted. RESPECT, LAG, LEAD and NTH_VALUE are unreserved keywords and
stay usable as ordinary identifiers.
- [Oracle] Support JSON_TABLE in the FROM clause, including the
COLUMNS list with value / EXISTS / FORMAT JSON query / NESTED PATH /
FOR ORDINALITY columns, wrapper clauses, and ON ERROR / ON EMPTY
handlers (ERROR/NULL/DEFAULT expr/EMPTY [ARRAY|OBJECT]), with or
without a table alias. The new keywords (JSON_TABLE, PATH, FORMAT,
JSON, WRAPPER, CONDITIONAL, UNCONDITIONAL, ORDINALITY) remain usable
as ordinary identifiers.
- [DB2] Accept a decimal literal with no leading digit directly after
an operator, e.g. decimal(...)+.005 or a>=.5. The lexer previously
glued the operator and the dot into one token.
- [demos] The sample programs now live in their own public repository,
github.com/sqlparser/gsp_demo_dotnet, and consume the published
gudusoft.gsqlparser package from nuget.org. The release ZIP includes
a demos.md pointer instead of vendored demo sources.
+ dotnet version 4.1.0.7(2026-7-26)
- [build] The NuGet package now ships a README, which nuget.org renders
as the package page. It covers installation, a worked parsing example
with its real output, the EDbVendor constant for each of the 15
supported databases, and the target frameworks. The 4.1.0.6 package
had no readme, so its page showed only the one-line description.
No library code changed between 4.1.0.6 and 4.1.0.7.
+ dotnet version 4.1.0.6(2026-7-15)
- [PostgreSQL] Support LATERAL in the FROM clause, e.g.
SELECT * FROM t1 LEFT JOIN LATERAL (SELECT * FROM t2 WHERE
t1.a = t2.a) x ON true and the comma form
FROM t1, LATERAL (subquery) x, plus LATERAL over a
set-returning function such as generate_series(...). LATERAL is a
reserved keyword (as in PostgreSQL), but remains usable as a column
label / alias; a table literally named "lateral" must be quoted.
- [PostgreSQL] Accept a bind variable as the FETCH FIRST/NEXT row
count, e.g. FETCH FIRST $2 ROWS ONLY (previously only a literal
integer or a parenthesized expression was accepted). Also parses the
standalone form SELECT ... WHERE col = $1 FETCH FIRST $2 ROWS ONLY.
+ dotnet version 4.1.0.5(2026-7-8)
- [Oracle] Accept NO_COMMON_DATA(view) as a table reference in the
FROM clause, e.g.
SELECT count(*) FROM NO_COMMON_DATA(SYS.DBA_CONSTRAINTS). This is the
sibling Oracle CDB data-dictionary container-restriction prefix of
NO_CROSS_CONTAINER and is now handled like CONTAINERS(...).
- [Oracle] Accept NO_CROSS_CONTAINER(view) as a table reference in the
FROM clause, e.g.
SELECT count(*) FROM NO_CROSS_CONTAINER(SYS.DBA_CONSTRAINTS). This is
the Oracle CDB data-dictionary container-restriction prefix and is now
handled like the existing CONTAINERS(...) prefix.
+ dotnet version 4.1.0.4(2026-6-18)
- [PostgreSQL, Greenplum, Redshift] Accept EXISTS and NOT EXISTS
subqueries as scalar expressions in the SELECT list, e.g.
SELECT EXISTS (SELECT 1 FROM t). Previously EXISTS parsed only in
predicate positions such as WHERE.
- [Oracle] Accept a bind variable as the value of a TIMESTAMP or
INTERVAL datetime literal, e.g. order_time >= TIMESTAMP :p_ts and
SYSTIMESTAMP - INTERVAL :p_minutes MINUTE.
+ dotnet version 4.1.0.3(2026-6-16)
- [Oracle] Parse the SYSDATE@! local-database-link form inside
expressions, e.g. TRUNC(SYSDATE@!-:bind). The '@!' marker is now
tokenized correctly when followed by an operator or bind variable.
- [Oracle] Accept bind variables in data-type length, precision and
scale, so cursor-sharing rewrites such as
decimal(:"SYS_B_02",:"SYS_B_04") and varchar2(:"SYS_B_08") parse in
CAST and DDL.
- [Oracle] Parse a parenthesized table reference with its alias inside
the parentheses as a join operand, e.g. JOIN (schema.t alias) ON ...,
and keep the brackets when reformatting.
- [MSSQL, Sybase] Accept a floating-point TABLESAMPLE sample value,
e.g. TABLESAMPLE SYSTEM (1.476744e+000 PERCENT) emitted by the
internal _MS_UPDSTATS statistics queries.
+ dotnet version 4.1.0.2(2026-6-11)
- [Oracle] Fix a 4.1.0.1 regression: multi-part names and join trees
inside parentheses in FROM failed to parse, e.g.
SELECT * FROM (my.table2) t2 and
JOIN (my.t2 a LEFT OUTER JOIN my.t3 b ON ...) alias.
The parenthesized table-function form (schema.func(args)) alias
introduced in 4.1.0.1 continues to work.
+ dotnet version 4.1.0.1(2026-6-11)
- [PostgreSQL] Support MERGE statement (PostgreSQL 15+), including
WHEN [NOT] MATCHED [AND condition] THEN UPDATE/INSERT/DELETE/DO NOTHING,
INSERT DEFAULT VALUES, subquery sources in USING, the WITH [RECURSIVE]
CTE form, and the PostgreSQL 17 forms WHEN NOT MATCHED BY SOURCE|TARGET
and RETURNING. Exposed as TMergeSqlStatement.
- [Oracle] Accept parenthesized table-function in FROM
- [Oracle] Add CONTAINERS() cross-PDB table reference
- [Oracle] Accept alias after flashback query clause and harden
flashback/CONTAINERS grammar coverage
+ dotnet version 4.1.0.0
- [resolver2] Default resolver flipped to resolver2. A plain
`new TGSqlParser(vendor).parse()` now routes
EResolverType.DEFAULT through the scope-based resolver2
pipeline and populates TObjectName.Resolution /
TObjectName.ColumnSource on every column reference after
parse. Matches Java v4 semantics.
Legacy inline behaviour is unchanged — SourceTable /
SourceColumn / LinkedColumns still follow the right-or-null
contract, synced from resolver2's exact-match resolutions
via TSQLResolver2.LegacySync.cs.
Consumers that need the pre-flip behaviour can:
* Pin per parser:
var p = new TGSqlParser(vendor) {
ResolverType = EResolverType.RESOLVER,
...
};
* Pin globally (order matters — the setter throw now
fires the other way):
TBaseType.SetEnableResolver2(false);
TBaseType.SetEnableResolver(true);
TDdlSqlEnv keeps its explicit EResolverType.RESOLVER pin
to break DDL -> env parse recursion.
30-day rollback window opens at this tag. If widespread
regressions surface, the flip commit is reverted and
4.1.1 cut.
+ dotnet version 4.0.0.0
- [resolver2] YAML fixture parity harness (Phase P24 /
Group L1). The Java TestGetTableColumn2 YAML harness is
ported onto .NET so resolver2 parity work no longer relies
on hand-written MSTest methods. Six first-wave vendor
folders (Oracle, SqlServer, Snowflake, PostgreSql, MySql,
Teradata) ship with 71 imported YAML fixtures covering
SELECT, JOIN, CTE, DML, CTAS, CREATE VIEW / FUNCTION /
PROCEDURE / TRIGGER, MERGE, UPDATE, ALTER TABLE
constraints, COPY, LATERAL, window functions, and PIVOT/
UNPIVOT shapes. Per-vendor pass-floors are locked in at
the current state to catch regressions without forcing
every formatter divergence to be fixed in the same phase.
YamlDotNet 15.3.0 ships as a test-only PackageReference,
confirmed not to leak into the library dependency graph.
- [resolver2] Result formatter + result layer (Phase P23 /
Group I). TSQLResolver2ResultFormatter ships on .NET, split
across six partials (main + Config + Display + Common + Json
+ Xml) each under 500 LOC. The formatter renders the Java-
parity Tables:/Fields: text output via Format(), and adds two
.NET-specific output formats: FormatJson() built on
System.Text.Json (already carried for P11) and FormatXml()
built on System.Xml.Linq. The full fluent configuration
surface ships too: SetShowCte / SetShowDatatype /
SetShowColumnsOfCte / SetListStarColumn / SetShowTableEffect /
SetShowColumnLocation / SetOnlyPhysicalTables / SetShowUnnest /
SetShowPivotTable / SetShowLateralView /
SetLinkOrphanColumnToFirstTable / SetDisplayNameMode. The
formatter is strictly read-only — it consumes ScopeBuildResult
and never writes legacy AST fields, preserving the resolver2
one-writer invariant.
- [resolver2] Result-layer helpers ported to
resolver2/result/: IResolutionResult (statement-centric read
interface), ResolutionResultImpl (default impl backed by
ScopeBuildResult), ResolutionUtils (shared helpers), and
TableFilterOptions (DEFAULT / ALL / PHYSICAL_ONLY).
ScopeBuildResult gained parity accessors in a new
ScopeBuildResult.Result.cs partial: getScopeForStatement,
getCTENamespaces, getNamespaceForTable, isCTASTargetTable.
TGSqlParser gained a public Resolver2 accessor (replaces the
reflection probe used by existing resolver2 tests), and
TSQLResolver2 gained a public Statements accessor so the
formatter does not need to reflect over private fields.
- [Oracle] PL/SQL package + block resolution (Phase P22 / Group
H3–H9). Resolver2 now recognises Oracle CREATE PACKAGE, CREATE
PROCEDURE, CREATE FUNCTION, and labelled blocks and builds
dedicated scope + namespace classes for them:
* OraclePackageNamespace + PlsqlVariableNamespace — package
members and block-local variables / parameters surface on
the resolver's Resolution / column-source pipeline with
case-insensitive lookup.
* OraclePackageScope + PlsqlBlockScope — package / block
scopes route bare and qualified references through the
right namespace before delegating to parent scopes.
* ScopeBuilder.Oracle.cs dispatches the new AST cases and
pre-scans every CREATE PACKAGE statement into an
OraclePackageRegistry. The registry now builds a live
OraclePackageNamespace per package (replacing the P21
stub) so pkg.var / schema.pkg.var references resolve
across the batch — including cross-package references from
inside another package body, and top-level references
through the GlobalScope registry fallback.
* New TSQLResolverConfig.EnablePlsqlResolution (default
true) controls the feature master-switch; non-Oracle
batches short-circuit at the vendor check so there is no
cross-vendor cost.
* The diagnostic Oracle PL/SQL tests that V1 shipped as
[Ignore] placeholders (Oracle_package_body_diagnostic,
Oracle_package_constant_diagnostic) now carry real
assertions, and new coverage lands under
OraclePackageResolutionTests / PlsqlBlockScopeTests /
OraclePackageRegistryTests / PackageDdlTests.
- [Oracle] sqlenv package runtime model (Phase P21 / Group H1+H2+H7
metadata). Metadata-only phase; no resolver2 scope behaviour is
exposed yet.
* New TSqlOraclePackage schema-object type; TSqlSchema gains
CreateOraclePackage / SearchOraclePackage / GetPackageObjectList.
TSqlEnv.SearchOraclePackage walks catalog.schema.package
qualified names with the same defaults as SearchTable.
* TSqlProcedure / TSqlFunction / TSqlTrigger gain an
OraclePackage back-pointer so the schema-wide object list
can classify package-owned members without a separate map.
* TSqlEnvBuilder.AddOraclePackage(qualified, (member, kind)...)
builds up packages + declared routines programmatically.
* OraclePackageRegistry ships its real metadata-side build:
BuildFromStatements walks a TStatementList, registers each
TPlsqlCreatePackage under a new OraclePackageMetadata entry
(spec + body coalesce, variables + cursors lifted off
declareStatements), and exposes GetMetadata / AllPackages /
IsPackage / Size / Clear. The resolver-scope wiring
(OraclePackageScope / OraclePackageNamespace) remains a
P22 task; OraclePackageRegistry.lookupPackage keeps the
P21 null-returning contract so the public surface stays
additive.
+ dotnet version 3.9.0.0(2026-4-21)
- [resolver2] Inference + evidence engine (Phase P17 / Group D).
New resolver2/inference/ files: InferenceEngine, EvidenceCollector,
InferenceEvidence. EvidenceCollector walks each SelectScope's
SELECT-list + WHERE / GROUP / HAVING / ORDER expressions and
feeds the InferenceEngine backing every DynamicStarSource in
scope. ResolutionEvidence.fromInference(…) wires the inference
pieces into the Resolution surface; TSQLResolverConfig.Evidence-
CollectionEnabled defaults to true (diagnostic overhead is
O(expression nodes)).
- [resolver2] Vendor-path completion (Phase P18 / Group F).
Added EDbVendor.dbvdax (ordinal 22) after dbvhana; grammar-less
vendors (hana / bigquery / dax) now throw NotSupportedException
at TGSqlParser construction instead of a stray NullReferenceException.
TSqlEnv collation maps + IsAliasReferenceForbidden + DelimitedChar
now have a row for every .NET vendor. IdentifierService.Unquote
handles BigQuery backticks + DAX single quotes. New config flag
EnableBigQueryNestedColumns (default false) gates P19's struct-
field dispatch.
- [resolver2] Struct-field resolution (Phase P19 / Group E).
NameResolver now dispatches BigQuery / Snowflake struct paths:
isStructFieldVendor / isStructFieldHintVendor, tryStructField-
Fallback (2-part struct.field retry), trySetStructFieldHint
(3+-part no-alias side-channel annotation via new TObjectName.
StructFieldHint). processResolvedMatches uses the full
hasDefiniteCandidate / minConfidenceToGuess / AllowGuess-
WhenAllInferred ladder + sortCandidatesByTablePosition for
deterministic GUESS_COLUMN_STRATEGY behaviour.
- [MSSQL] Trigger INSERTED / DELETED pseudo-tables (Phase P20 /
Group G1). Resolver2 now recognises MSSQL CREATE TRIGGER bodies
and substitutes `deleted` / `inserted` FROM references with the
trigger's ON-target table; downstream column resolutions trace
to the target rather than a phantom `deleted` / `inserted`
table. Nested trigger targets are stacked. The original virtual
TTable objects are tracked in ScopeBuilder.VirtualTriggerTables
for downstream consumers that want to suppress them from
physical-table output.
- [Teradata] NAMED alias coverage (Phase P20 / Group G2). The
Teradata grammar already maps `col (NAMED alias)` to the
standard AliasClause at parse time — resolver2 inherits alias
behaviour unchanged. Dedicated test coverage verifies the
alias is exposed, no phantom table ref is created, and NAMED
around a richer expression still surfaces correctly.
- [Oracle] Bare `col(+)` retrofit (Phase P20 / Group G3).
Resolver2's Oracle (+) outer-join retrofit now handles
unqualified operands such as `label(+)` by consulting
TTable.LinkedColumns (populated by the legacy inline resolver)
to disambiguate the owning FROM child. Qualified (+) handling
is unchanged.
- [Oracle] (+) → ANSI-JOIN rewrite pass (Phase P20 / Group G4).
New resolver2/oracle/OracleOuterJoinRewriter.cs + opt-in
TSQLResolverConfig.RewriteOracleOuterJoin (default false). When
enabled, TSQLResolver2.RewrittenOuterJoins exposes the list of
rewrite decisions (LeftOuter / RightOuter / FullOuter) the
resolver processed. Idempotent; no AST mutation. The pre-
existing syntax-to-syntax helper in convert/joinConverter.cs
is unchanged.
+ dotnet version 3.8.0.0(2026-4-21)
- [resolver2] Advanced star expansion (Phase P13 / Group B).
Opt-in resolver2 now handles PIVOT / UNPIVOT tables, BigQuery-
style UNNEST arrays, dynamic star sources, CTE-chain star
push-down, and qualified-star detection inside subqueries.
New namespaces:
* PivotNamespace — derives output columns from the PIVOT IN
axis (or the AS alias column list when provided) and falls
through to the source namespace for pass-through columns,
excluding the FOR and aggregate-input columns.
* UnnestNamespace — exposes the implicit element column, the
optional WITH OFFSET column, and struct-field columns
when available. BigQuery / Presto UNNEST parsing is still
out of scope; the namespace is reachable via a hand-built
TTable + new TUnnestClause AST node.
* DynamicStarSource — lazy column inference for SELECT *
over tables with no available metadata.
* StarPushDownResolver — walks the scope tree and pushes
outer-query column refs onto star-bearing CTE / subquery
namespaces so multi-level lineage (e.g., `WITH cte AS
(SELECT * FROM emp) SELECT id, name FROM cte`) resolves.
* SubqueryNamespace.getFinalTable now consults the SELECT
list for a qualified `ta.*` prefix before falling back to
the single-table rule.
ScopeBuilder dispatches PIVOT / UNPIVOT (via
ETableSource.pivoted_table + TPivotedTable.PivotClause) and
UNNEST (via TTable.UnnestClause) into the new namespaces.
- [resolver2] Iterative strategy hierarchy (Phase P14 / Group C).
The opt-in iterative path (IterativePassesEnabled = true) now
consults a configurable IResolutionStrategy (default
StandardResolutionStrategy; AdaptiveResolutionStrategy
available) and records per-pass state through ResolutionPass +
ConvergenceDetector. Strategy hooks gate additive behaviour
(star push-down). Default single-pass behaviour is unchanged.
NamespaceEnhancer.enhance() now runs propagateThroughCTEChains
at the tail of each pass, so inferred columns trickle from an
outer namespace (CTE, subquery, UNION) into nested CTE bodies
and subqueries — multi-link chains now resolve correctly.
- [ci] Resolver2 one-writer invariant formalised (Phase P15 /
Group L4). Only TSQLResolver2.LegacySync.cs may write
SourceTable / SourceColumn / LinkedColumns from the resolver2
path; a CI step in unified_build.yml fails the build on any
violation. New self-test script covers both the clean-pass and
violation-detected paths.
- [sqlenv] Removed the pre-obsoleted ISqlEnv + NullSqlEnv shims
(Phase P16 / Group L5). TSqlEnv no longer implements ISqlEnv;
consumers use DefaultSqlEnv.Empty wherever NullSqlEnv.Instance
was previously required. This is a public-API removal
pre-announced in 3.7.0.0 via the [Obsolete] attribute.
- [resolver2] Scope-builder bug fix batch (Phase P12 / Group A).
Resolver2's opt-in pipeline is now more correct on shapes that
previously silently mis-resolved:
* Scalar subqueries in SELECT, WHERE, function args, IN lists,
CASE branches, CAST sources, BETWEEN operands each now get
their own SelectScope. Matches Java v4.
* GROUP BY / HAVING / ORDER BY column references are now
collected; ordinal ORDER BY (`ORDER BY 1,2`) intentionally
adds no new references.
* CREATE VIEW / CREATE MATERIALIZED VIEW bodies are dispatched
through ScopeBuilder, producing proper SelectScope instances
for the view body's FROM-clause subqueries and CTEs.
* CTE references with bracketed / quoted names (`[src]`,
`"src"`, `` `src` ``) and CTE references inside CREATE VIEW
bodies now resolve via CTENamespace even when the parser
did not set TTable.CTEName.
* MSSQL `[alias] = expr` CTE bodies no longer appear under
placeholder `col_N` names — the alias from the left operand
is used as the exposed column name.
* CTE explicit column lists over SELECT * emit the Java v4
evidence string `cte_explicit_column_via_star`; their
ColumnSource.getFinalTable returns null (metadata-free
positional mapping). Direct explicit-column mappings keep
`cte_explicit_column`.
Legacy inline resolver is unchanged; the one-writer invariant
still holds (only TSQLResolver2.LegacySync.cs writes
SourceTable / SourceColumn / LinkedColumns from resolver2).
+ dotnet version 3.7.1.0(2026-4-21)
- [sqlenv] Greenfield JSON loader for TSqlEnv shipped. New
gudusoft.gsqlparser.sqlenv.parser namespace adds TSqlEnvJsonLoader
plus Grabit / SQLDep / Sqlflow shape parsers ported from Java v4.
Static façades exposed on TSqlEnv:
TSqlEnv env = TSqlEnv.LoadFromJson(json, EDbVendor.dbvoracle);
TSqlEnv[] envs = TSqlEnv.LoadAllFromJson(jsonArray, EDbVendor.dbvoracle);
TSqlEnv fromFile = TSqlEnv.LoadFromFile(path, EDbVendor.dbvoracle);
string serialized = TSqlEnv.SaveToJson(env, indented: true);
The greenfield shape (docs/resolver2_implementation_plan.md
Appendix B) is accepted for both read and round-trip; the Java
Grabit / SQLDep / Sqlflow shapes are accepted for read only.
Unknown vendor fields in "sqlflow" servers throw
TSqlEnvLoadException; malformed JSON wraps the underlying
System.Text.Json exception.
- [ci] Resolver2 one-writer invariant now enforced in GitHub Actions.
Only TSQLResolver2.LegacySync.cs may write SourceTable /
SourceColumn / LinkedColumns from the resolver2 path; accidental
writes in other files fail the build before merge.
- [build] System.Text.Json 8.0.5 added as a netstandard2.0-conditional
PackageReference (transitive dep graph < 1 MB). net10.0 consumes
the BCL copy.
- [build] Library bumped to 3.7.1.0.
+ dotnet version 3.7.0.0(2026-4-18)
- [resolver2] TSQLEnv metadata catalog shipped. New
gudusoft.gsqlparser.sqlenv package + fluent TSqlEnvBuilder let
callers feed real schema metadata into resolver2. Matching table /
column references now resolve at confidence 1.0 with evidence
"tsqlenv_column" and populate legacy SourceTable / SourceColumn.
var env = new TSqlEnvBuilder(EDbVendor.dbvoracle)
.WithDefaultCatalog("DEFAULT").WithDefaultSchema("SCOTT")
.AddTable("SCOTT.EMP", ("NO","NUMBER"), ("NAME","VARCHAR2(100)"))
.AddTable("SCOTT.DEPT", ("NO","NUMBER"), ("LOCATION","VARCHAR2(100)"))
.BuildSealed();
parser.ResolverType = EResolverType.RESOLVER2;
parser.SqlEnv = env;
- [resolver2] TDdlSqlEnv builds metadata from a DDL script. Optional
TSQLResolverConfig.AutoCollectDdlMetadata flag (default off) makes
resolver2 auto-build a TDdlSqlEnv from any CREATE statements in the
batch when no explicit env is supplied.
- [resolver2] Migration note: ISqlEnv and NullSqlEnv are now
[Obsolete], use gudusoft.gsqlparser.sqlenv.TSqlEnv /
DefaultSqlEnv.Empty. Deletion scheduled for 3.8.
- [build] Library bumped to 3.7.0.0.
+ dotnet version 3.6.0.0(2026-4-18)
- [resolver2] Opt-in semantic resolver ported from Java v4. Legacy
inline resolver remains the default; enable per parser via
parser.ResolverType = EResolverType.RESOLVER2;
New accessors on TObjectName: Resolution (ResolutionResult),
ColumnSource. Covers SELECT/JOIN/USING, nested subqueries, single
and chained CTEs, UNION lineage, VALUES tables, UPDATE / DELETE /
MERGE / INSERT / CTAS, SELECT * / table.* expansion, opt-in
iterative column inference, and Oracle (+) outer join nullability.
- [resolver2] "Right-or-null" contract preserved: legacy SourceTable
is written only for exact, high-confidence resolutions. Ambiguous
and orphan references leave SourceTable untouched and surface via
Resolution.AmbiguousSource.
- [build] Library bumped to 3.6.0.0.
+ dotnet version 3.5.0.1(2026-4-12)
- [Hive] Accept top-level CTE in queries, CTAS, views
- [PostgreSQL] Fix TestPostgreSQLFiles and extend grammar
- [Teradata] Fix TestTeradataFiles and extend SPL support
- [Sybase] Accept parens around CREATE PROC parameter list
- [MSSQL] Fix string literal parsing with U+2019 smart quotes
- [PostgreSQL, Greenplum] Accept ALTER TABLE SET DATA TYPE, RENAME, SET SCHEMA
- [MDX] Accept standalone SCOPE ( ... ) ; statement
- [Impala] Accept NOT LIKE / NOT RLIKE / NOT REGEXP
- [Hive] Accept target column list on INSERT INTO
- [Greenplum] Accept CTE in CREATE VIEW body and % operator
- [build] Migrate repo to .NET 10, SDK-style csprojs, modern slnx
- [build] Vendor gsp_demo_dotnet into the repo
+ dotnet version 3.4.2.5(2023-1-25)
- [SQL Server] fix a bug doesn't support ;number used in exec statement that used to group procedures of the same name
+ dotnet version 3.4.2.4(2023-1-23)
- [SQL Server] fix a bug can't get raw statement correctly if create function is followed by create security policy statement without separated by go statement.
- [SQL Server] support multiple ADD [ FILTER | BLOCK ] } PREDICATE clauses in create security policy statement.
+ dotnet version 3.4.2.3(2023-12-25)
- [SQL Server/Oracle] support within group clause in aggregation function.
+ dotnet version 3.4.2.2(2023-12-14)
- [SQL Server] support INSERT DEFAULT VALUES in WHEN NOT MATCHED clause of merge statement.
- [SQL Server] support STRING_AGG function with WITHIN GROUP clause.
- [API] new class TMssqlAlterSecurityPolicy,TMssqlDropSecurityPolicy,TMssqlCreateSecurityPolicy
- [SQL Servre] support create/alter/drop security policy statement.
+ dotnet version 3.4.2.1(2023-12-8)
- [SQL Server] support module_name [ ;number ] in EXECUTE
- [sql server] fix a bug can't parse syntax like select TOP 2.i.object_id which is the same as: select TOP 2. i.object_id
+ dotnet version 3.4.2.1(2023-12-7)
- [sql server] fix a bug can't parse Unicode Character 'LEFT SINGLE QUOTATION MARK' used inside ''
- [SQL server] fix a bug can't parse revoke select statement.
- [SQL server] fix a bug can't recognize exec statement after insert statement.
- [SQL Server] support QUERYTRACEON option.
- [SQL Server] fix a bug next can't be used as table and column name.
+ dotnet version 3.4.2.1(2023-12-6)
- [SQL Server] support FOR JSON PATH, INCLUDE_NULL_VALUES clause.
- [SQL Server] support value() method against a subquery.
- [sql server] fix a bug can't process with on covert clause in EXECUTE AS
+ dotnet version 3.4.1.5(2023-1-17)
- [general] Unable to parse a query that contains character '’'
+ dotnet version 3.4.1.4(2022-10-21)
- [general] able to process unicode +200B e2 80 8b ZERO WIDTH SPACE
+ dotnet version 3.4.1.3(2022-09-08)
- [Oracle] able to parse model clause includes partition by clause.
- [general] able to process NO-BREAK SPACE (C2 A0) in sql query.
+ dotnet version 3.4.1.2(2022-08-26)
- [SQL Server] support STATIC LOCAL FORWARD_ONLY option in DECLARE CURSOR
+ dotnet version 3.4.1.1(2022-08-02)
- [Oracle] fix a bug can't process bind variable in fetch clause.
+ dotnet version 3.4.1.0(2022-07-22)
- [SQL Server] support deny statement.
+ dotnet version 3.4.0.9(2022-03-23)
- [Oracle] support listagg function.
+ dotnet version 3.4.0.9(2022-03-21)
- [snowflake/toScript] fix a bug can't output nulls first/last correctly.
- [sql server] fix a bug can't parse set clause in alter table statement.
- [sql server] fix a bug can't parse drop table statement when if exists clause is used.
+ dotnet version 3.4.0.8(2022-02-02)
- [snowflake, toScript] fix a bug can't rewrite boolean and TIMESTAMP_NTZ datatype used in cast function correctly.
+ dotnet version 3.4.0.7(2021-11-02)
- [snowflake] fix a bug can't recognize concatenation operator ||
+ dotnet version 3.4.0.6(2021-07-05)
- [general] Try to fix bug that parse sql query text in parallel
- [MySQL] fix a bug can't handle syntax like this: =.5
+ dotnet version 3.4.0.5(2021-06-10)
- [toScript] fix a bug missing parenthesis around CTE query.
+ dotnet version 3.4.0.3(2021-06-01)
- [Hana, BigQuery] Hana, BigQuery is not supported yet.
+ dotnet version 3.4.0.2(2021-05-26)
- [snowflake] support qualify clause.
+ dotnet version 3.4.0.1(2021-05-07)
- [general] new repo for this version.
+ dotnet version 3.3.3.1(2021-04-08)
- [PostgreSQL] fix a null exception while parsing create procedure.
+ dotnet version 3.3.3.1(2021-04-06)
- [Oracle] support expression operator in using clause of execute statement.
+ dotnet version 3.3.3.0(2021-03-04)
- [scriptWriter] fix a bug can't rewrite unsigned, time, binary datatype.
- [snowflake] support create stream statement.
- [snowflake] support varchar collate clause in data type.
+ dotnet version 3.3.2.6(2020-12-18)
- [MySQL] fix toScript() bug for cast function with decimal data type.
+ dotnet version 3.3.2.6(2020-11-26)
- [general] sign assembly with SHA-2 instead of SHA-1
+ dotnet version 3.3.2.5(2020-11-09)
- [Snowflake] fully support.
- [SQL Server] support OPENJSON.
- [PostgreSQL] support variable.
+ dotnet version 3.3.2.4(2020-08-25)
- [API] new class: TIdentityClause, TColumnDefinition.IdentityClause
- [Oracle] support identity column.
+ dotnet version 3.3.2.3(2020-08-21)
- [snowflake/API] TCreateFileFormatStmt.getFormatOptions() returns the text of the file format options.
- [Snowflake] support create materalized view.
- [Snowflake/API] TCreateTableOption.getCopyOptions() reprsents for STAGE_COPY_OPTIONS.
- [Snowflake/API] add TCreateTableOption to represents for the create table option.
+ dotnet version 3.3.2.2(2020-07-25)
- [snowflake] support WITH LOCAL TIME ZONE
- [snowflake] support datetime with length specified.
- [snowflake] fully support AUTOINCREMENT
+ dotnet version 3.3.2.1(2020-07-14)
- [scriptWriter/SQL Server] fix a bug can't output join hint.
- [API] add new enum: EJoinHint
+ dotnet version 3.3.2.0(2020-07-10)
- [scriptWriter] support nulls first/last.
- [scriptWriter] fix a bug can't rewrite group_concat/date_sub correctly.
- [Snowflake] fully support snowflake.
- [SQL Server] fix a bug can't parse FETCH clause in select statement.
+ dotnet version 3.3.1.3(2020-05-08)
- [Oracle] support GENERATED AS IDENTITY in column definition.
+ dotnet version 3.3.1.3(2020-05-07)
- [Oracle] fix a null exception when visit object access expression inside stored procedure.
+ dotnet version 3.3.1.3(2020-05-06)
- [Oracle] fix a bug can't parse varying after character type.
+ dotnet version 3.3.1.3(2020-04-30)
- [sqlformat] fix a bug XQuery .value() can be set to lowercase correctly by setting option.caseFuncname = gudusoft.gsqlparser.pp.para.styleenums.TCaseOption.CoLowercase;
+ dotnet version 3.3.1.3(2020-04-24)
- [API] TScriptGeneratorVisitor.visitNodeByToken() read all tokens of a node from TParseTreeNode.SourceTokenList
- [API] add new property: TParseTreeNode, public EDbVendor dbvendor
- [API] add new constructor: TParseTreeNode() and TParseTreeNode(EDbVendor dbvendor).
- [API] TParseTreeNode.String, when set value, it will be tokenlized into TParseTreeNode.SourceTokenList.
- [API] add new property: TParseTreeNode.SourceTokenList, includes all tokens of this node.
- [Oracle/scriptWriter] support GLOBAL/Local/TEMPORARY/Temp keyword in create table statement.
- [SQL Server/scriptWriter] fix duplicate begin/end in create procedure statement.
- [SQL Server/scriptWriter] add semicolon at the last statement in a block.
- [SQL Server/scriptWriter] Able to rewrite bit datatype correctly.
- [SQL Server] function name not parsed correctly.
- [scriptWriter/Oracle] fix a bug that missing MULTISET keyword.
- [scriptWriter/Oracle] fix a bug can't rewrite translate function.
- [scriptWriter/SQLServer] fix a bug can't rewrite values clause with multiple values.
+ dotnet version 3.3.1.3(2020-04-10)
- [general] typo in public class GFmtOpt, change opearateSourceToken to operateSourceToken
+ dotnet version 3.3.1.2(2020-03-03)
- [MySQL] fix a bug can't handle ROWS keyword in over clause.
- [API] add new property TSelectSqlStatement.Hint to replace TSelectSqlStatement.OracleHint
- [MySQL] support hint in select statement.
+ dotnet version 3.3.1.2(2020-02-15)
- [general/performance] performance improvement when there are lots of CTE used in statement.
+ dotnet version 3.3.1.2(2020-02-12)
- [SQL Server/scriptWriter] support money datatype.
- [PostgreSQL] fix a bug can't parse select statement with CTE in insert statement.
+ dotnet version 3.3.1.2(2020-02-06)
- [MySQL/ScriptWriter] support replace into set clause.
+ dotnet version 3.3.1.1(2020-02-05)
- [MySQL/ScriptWriter] support DELAYED/HIGH_PRIORITY/LOW_PRIORITY in insert statement.
- [MySQL] support CTE in update statement.
+ dotnet version 3.3.1.1(2020-02-04)
- [DB2/scriptWriter] support truncate table.
- [DB2] fully support drop table statement.
+ dotnet version 3.3.1.0(2019-12-04)
- [Oracle] able to detect sql statement after create index, truncate and analyze table even those sql is not ended with a semicolon.
+ dotnet version 3.3.1.0(2019-11-27)
- [formatter] improve sql formatter while there is a long oracle hint.
+ dotnet version 3.3.1.0(2019-11-12)
- [Oracle] fix a bug OUTER APPLY take high priority than LEFT OUTER JOIN
- [scriptWriter/Oracle] support bitmap keyword in create table statement.
- [scriptWriter/SQL Server] support table hint in select statement.
- [SQL Server] fix a bug doesn't recognize range keyword in window clause.
- [scriptWriter/MySQL] support index hint in select statement.
+ dotnet version 3.3.1.0(2019-11-09)
- [scriptWriter/MySQL] support distinctrow keyword in select statement.
- [scriptWriter/MySQL] support order by and limit clause in delete statement.
+ dotnet version 3.3.0.5(2019-11-06)
- [MySQL] support window function.
+ dotnet version 3.3.0.5(2019-10-31)
- [Oracle] able to separate create table and other statements even if no semicolon is used after create table.
+ dotnet version 3.3.0.5(2019-10-30)
- [MySQL] bug fix in sql lock of select statement.
+ dotnet version 3.3.0.5(2019-10-29)
- [MySQL] support CTE introduced in MySQL8.0
+ dotnet version 3.3.0.5(2019-10-28)
- [MySQL] support join specification in cross join.
- [MySQL] support update modifiers LOW_PRIORITY IGNORE
- [MySQL] support select modifiers HIGH_PRIORITY] [STRAIGHT_JOIN][SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT][SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
- [MySQL] support delete modifiers LOW_PRIORITY QUICK IGNORE
- [MySQL] support partition clause of from table in select/delete/insert/update.
+ dotnet version 3.3.0.5(2019-10-25)
- [getTableColumn] table in into clause will be picked up.
- [DB2] support limit clause.
+ dotnet version 3.3.0.5(2019-10-14)
- [general] table.EffectType set to tetAlter in alter table statement.
- [SQL Server/GetTableColumn] year/month/day/hour/minute/second keyword used as a column name can be picked up correctly.
- [SQL Server] support query hint syntax like: OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
+ dotnet version 3.3.0.5(2019-10-10)
- [lexer] fix a bug can't handle ?-- character of DB2/SQLServer/MySQL/PostgreSQL
+ dotnet version 3.3.0.4(2019-07-26)
- [PostgreSQL] fix no root node error when parse create table of typename statement.
- [PostgreSQL] fix a nullexception when parse collate clause.
- [PostgreSQL] support GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
- [PostgreSQL\SQL Server] support create schema statement.
+ dotnet version 3.3.0.4(2019-07-19)
- [Teradata] support qualify clause in select list.
+ dotnet version 3.3.0.3(2019-07-04)
- [redshift] fix a bug can't detect table.column name correct in select list.
+ dotnet version 3.3.0.2(2019-06-05)
- [MySQL,scriptWriter] FROM keyword used in delete statement is picked up.
+ dotnet version 3.3.0.2(2019-05-31)
- [scriptWriter] support declare cursor and SQL Server column alias.
+ dotnet version 3.3.0.2(2019-05-29)
- [SQL Server] row/rows keyword can be used as cursor name
- [SQL Server] support PERIOD FOR SYSTEM_TIME clause in create table.
- [SQL Server] support GENERATED ALWAYS in column definition.
- [MySQL] support not enforced clause in check constraint.
- [SQL Server] support NOT FOR REPLICATION in check constraint
+ dotnet version 3.3.0.1(2019-04-15)
- [netcore] improve the code to read database function and keyword resource file in a uniform way for both netcore and .net framework version.
+ dotnet version 3.2.8.7(2019-04-15)
- [netcore] improve the code to read resource file in a uniform way for both netcore and .net framework version.
+ dotnet version 3.2.8.7(2019-04-08)
- [SQL Server] fix null exception while iterate convert function.
+ dotnet version 3.2.8.6(2019-03-21)
- [MySQL] fix a bug can't fetch Collation Name when datatype is enum.
+ dotnet version 3.2.8.6(2019-02-21)
- [MDX] support variable in function call.
- [MDX] support VBA!round function.
- [API] TMdxAxisNode.getName_OR_Number() replaced by TMdxAxisNode.getAxis()
+ dotnet version 3.2.8.5(2019-02-13)
- [SQL Sever] support create cluster columnstore index statement.
+ dotnet version 3.2.8.5(2019-01-30)
- [API] add new property: TFunctionCall.StringExpr, TFunctionCall.SeparatorExpr for DB2 listagg function.
- [DB2] support listagg function.
+ dotnet version 3.2.8.4(2019-01-29)
- [API] add new property: TAlterTableOption.ConstraintName
- [MySQL] support key column constraint.
- [MySQL] be able to read schema default collate property when set with equal operator.
- [API] add new value of enum: EColumnStorage.csNotSpecified
- [MySQL] support table prefix in alter table add primary key clause.
+ dotnet version 3.2.8.4(2019-01-28)
- [Oracle] support case expression in using clause of execute immediate statement.
- [Oracle] support multiset union all in plsql expression.
- [Oracle] support IS A SET operator in plsql code.
- [general] fix a "Object reference not set to an instance of an object" bug when parsing set Content.write( substring(@Content, 1, @Length), @DataIndex, @Length ) clause in update statement.
- [API] add new static methods: TGSqlParser.parseExpression,parseFunctionCall,parseObjectName,parseSubquery
+ dotnet version 3.2.8.4(2019-01-25)
- [general] fix a NullReferenceException bug when get table name from FREETEXTTABLE/CONTAINSTABLE clause.
+ dotnet version 3.2.8.3(2019-01-14)
- [DB2] Able to handle $$ODS_LOB in this expr: p.SUBDIV_QUALIFIER=$$ODS_LOB
+ dotnet version 3.2.8.3(2018-12-26)
- [API] TUpdateSqlStatement.getReferenceJoins() replaced by TUpdateSqlStatement.joins
- [API] TDeleteSqlStatement.ReferenceJoins set to from clause in delete statement correctly.
+ dotnet version 3.2.8.3(2018-12-25)
- [API, SQL Server] add new property: TConstraint.DefaultForColumnName represents default column name in default constriant.
- [MySQL] able to get default value of alter column clause in alter table statement.
+ dotnet version 3.2.8.2(2018-12-19)
- [Oracle] labelName and endLabelName set correctly.
+ dotnet version 3.2.8.1(2018-12-13)
- [SQL Server] support Addition Assignment in set clause of udpate statement.
- [PostgreSQL] support grouping sets clause in group by clause.
+ dotnet version 3.2.8.0(2018-12-10)
- [general] move source code demo and test to a new project.
+ dotnet version 3.2.7.9(2018-12-06)
- [scriptWriter] support MySql: Column Datatype contains Collation And UNSIGNED ZEROFILL
+ dotnet version 3.2.7.9(2018-12-05)
- [SQL formatter] keep comment at the begin of SQL.
+ dotnet version 3.2.7.9(2018-12-04)
- [SQL Server] fix a null exception when value keyword used as a table alias
+ dotnet version 3.2.7.8(2018-12-04)
- [MySQL/API] tableConstraint.constraintComment replaced by tableConstraint.IndexOptionList which indexOptionType is EIndexOptionType.iotComment.
- [MySQL] support index option in table constraint
- [API] add new property: List IndexOptionList of class: TConstraint
- [API] new enum value: EConstraintType.fulltextKey, EConstraintType.spatialKey
+ dotnet version 3.2.7.8(2018-12-03)
- [MySQL] support REDUNDANT or COMPACT in Table.ROW_FORMAT option.
+ dotnet version 3.2.7.7(2018-11-29)
- [SQL Server] support offset fetch in order by clause.
+ dotnet version 3.2.7.6(2018-11-22)
- [API] add new enum: EGeneratedColumnStoreType
- [API] add new property: TColumnDefinition.generatedColumnStoreType
- [MySQL] support virtual and stored option of computed column.
+ dotnet version 3.2.7.6(2018-11-16)
- [scriptWriter] support OPTION clause in select statement.
- [demo\dataFlowAnalyzer] fix the Can't handle view column error.
- [Oracle] fix nullexception when parse statements inside create trigger timing point section.
- [Oracle] able to regonize compound trigger body during getting raw statement.
+ dotnet version 3.2.7.5(2018-11-01)
- [API] function TLexerDatabase.canBeColumnName(), iskeyword(), getkeywordvalue() change to static function.
+ dotnet version 3.2.7.3(2018-10-25)
- [MySQL] support compression/connection/key_block_size/row format compressed/STATS_AUTO_RECALC/STATS_PERSISTENT/STATS_SAMPLE_PAGES of create table option.
- [API] TMySQLCreateTableOption.OptionName is replaced by tableOption.
- [API] add new public enum ETableOption, used in MySQL create table statement.
- [SQL Server] support create fulltext index statement.
- [SQL Server] support create spatial index statement.
+ dotnet version 3.2.7.2(2018-10-21)
- [SQL Server] support NO_PERFORMANCE_SPOOL, MIN_GRANT_PERCENT, HINT_MAX_GRANT_PERCENT
- [API] add new enum elements: EQueryHint.E_QUERY_HINT_NO_PERFORMANCE_SPOOL, E_QUERY_HINT_MIN_GRANT_PERCENT, E_QUERY_HINT_MAX_GRANT_PERCENT
- [SQL Server/scriptWriter] support call target expression of function call.
- [Oracle] able to recognize create or repleace context statement.
- [DB2] able to link column in call statement to table of create trigger statement.
+ dotnet version 3.2.7.1(2018-10-09)
- [SQL Server] Doesn't treat [DATE] as a regular column name.
+ dotnet version 3.2.7.1(2018-10-08)
- [API] TTypeName.isCharUnit(), TTypeName.ByteUnit is no longer used, replaced by TTypeName.charUnitToken
- [Oracle] able to get label name after loop/while statement.
- [Oracle] support on null clause in default clause.
- [API] add new property: TColumnDefinition.onNull
+ dotnet version 3.2.7.0(2018-10-08)
- [sql formatter] Able to format subquery or CASE statement inside of CAST function.
+ dotnet version 3.2.6.9(2018-10-03)
- [API] add new property: TColumnDefinition.persistedColumn.
- [SQL Server] able to get persisted information from column definition.
- [API] add new property: TColumnDefinition.filestream.
- [SQL Server] support FILESTREAM keyword in create table.
- [API] add new property: TColumnDefinition.sparseColumn.
- [SQL Server] Able to get SPARSE column information from TColumnDefinition.
+ dotnet version 3.2.6.8(2018-09-28)
- [MySQL] Able to get comment/KEY_BLOCK_SIZE/parser name index option in MySQL create index statement.
- [API] TMySQLIndexOption.indexOptionType
- [API] add new enum: EIndexOptionType
- [API] add new property : TCreateIndexSqlStatement.IndexOptionList to access index option of MySQL create index statement.
- [SQL Server] able to fetch include column list from create index statement.
+ dotnet version 3.2.6.8(2018-09-27)
- [API] add new property TColumnDefinition.columnComment, TConstraint.constraintComment
- [API] add new property TColumnDefinition.calculatedExpr
- [MySQL] support calculated column such as data_type [GENERATED ALWAYS] AS (expression)
- [API] add new property TColumnDefinition.columnStorage
- [API] add new enum: public enum EColumnStorage
- [MySQL] support column storage type
+ dotnet version 3.2.6.8(2018-09-21)
- [API] add new property TColumnDefinition.columnFormat
- [API] add new enum: public enum EColumnFormat
- [MySQL] support column format attribute.
- [scriptWriter] typo: ncarchar2 should be correct to nvarchar2
- [scriptWriter] fix a bug oracle hint not after SELECT keyword.
+ dotnet version 3.2.6.7(2018-09-20)
- [MySQL, API] Able to get zerofill and signed/unsigned info from datatype in TTypeName class. TTypeName.zeroFillToken, TTypeName.signedToken
+ dotnet version 3.2.6.7(2018-09-19)
- [API] Able to get character set and collation name from create database statement. add new property: TCreateDatabaseSqlStatement.characterSet and collationName.
- [MySQL] fully support create database statement.
+ dotnet version 3.2.6.6(2018-09-12)
- [Oracle] support with ties clause and percent clause in row limiting clause.
- [Oracle/scriptWriter] support offset clause in scriptWriter
- [Oracle/scriptWriter] support fetch clause in scriptWriter
+ dotnet version 3.2.6.3(2018-09-11)
- [Oracle] fix a bug can't rewrite Lateral keyword in from clause.
+ dotnet version 3.2.6.2(2018-09-04)
- [API] TBaseType.versionid from public string versionid = Assembly.GetEntryAssembly().GetName().Version.ToString() to public const string versionId
+ dotnet version 3.2.6.1(2018-09-04)
- [dotnet core] release a version for net core 2.0
+ dotnet version 3.2.5.8(2018-08-23)
- [API] Add TRollbackStmt to represent rollback statement. Able to recognize rollback in EXCEPTION clause.
+ dotnet version 3.2.5.7(2018-08-16)
- [Oracle] fix a bug can't parse TABLE clause included in parenthesis.
+ dotnet version 3.2.5.7(2018-08-13)
- [getTableColumn] fix a bug can't recognize the column derived from CTE.
+ dotnet version 3.2.5.6(2018-08-01)
- [Oracle] fix a bug can't parse plsql block not ended by a semicolon.
- [general] avoid System.ArgumentNullException when call isvalidsqlpluscmd().
+ dotnet version 3.2.5.6(2018-07-27)
- [scriptWriter] fix a bug when new TObjectName with object and part source token.
- [API] add new method: TSourceToken.toScript()
+ dotnet version 3.2.5.6(2018-07-11)
- [SQL Server] support include clause before where condition in create index statement
- [SQL Server] support WITH (DATA_COMPRESSION = PAGE) in create table statement.
- [yacc,lex] Able to process rule from 2500 to 3000
- [SQL Server] fix a bug can't parse CTE in declare for cursor statement.
+ dotnet version 3.2.5.5(2018-07-07)
- [scriptWriter] fix a alias clause of pivot table not placed correct.
- [scriptWriter] fix a bug can't rewrite bigint datatype correctly.
+ dotnet version 3.2.5.5(2018-07-05)
- [scriptWriter] fix a bug can't rewrite datetime datatype correctly.
+ dotnet version 3.2.5.5(2018-06-04)
- [SQL Server] support if exists clause in drop procedure/table/index statement.
+ dotnet version 3.2.5.4(2018-05-29)
- [general] fix a null exception error raised when call TTable.getTableName() when tableType is subquery.
+ dotnet version 3.2.5.4(2018-05-25)
- [sql format] fix a problem is that the first SELECT is printed after the closing ) of the INSERT INTO statement.
+ dotnet version 3.2.5.1(2018-05-16)
- [general] upload Gudusoft.GeneralSQLParser package to nuget.org.
- [general] library .NET core 2.0 compatible.
+ dotnet version 3.2.5.1(2018-05-13)
- [demo\formatsql] move html output code to demo\formatsql, make this library .NET core 2.0 ready.
+ dotnet version 3.2.5.0(2018-05-10)
- [demo\toXML] fix a bug that subquery in then clause of case statement not generated correctly.
+ dotnet version 3.2.5.0(2018-04-27)
- [general] refine the code to remove unnecessary exception from the code.
+ dotnet version 3.2.4.6(2018-03-30)
- [demo/sqlformat] support rtf output.
- [general] Able to pickup oracle hint in delete/insert/update/merge statement.
- [scriptWriter] fix a bug miss where keyword in delete clause of merge statement.
+ dotnet version 3.2.4.5(2018-03-14)
- [scriptWriter] support for xml clause in scriptWriter
- [SQL Server] support create or alter procedure.
- [DB2] keyword IS can be used as table alias.
- [Oracle] [Oracle/plsql] support new keyword in create trigger statement.
+ dotnet version 3.2.4.4(2018-03-13)
- [demo/toXML] support for update clause in select statement.
- [demo/toXML] support into clause in select statement.
- [demo/toXML] support case statement in oracle plsql.
- [demo/toXML] list the DISTINCT clause in select statement.
- [demo/toXML] list return datatype in function declaration of a package.
- [demo/toXML] Able to recognize commit statement inside plsql block.
- [demo/toXML] Able to list CTE in subquery of insert statement.
- [demo/toXML] Able to list into clause in execute immedate statement.
+ dotnet version 3.2.4.3(2018-03-02)
- [API] add TExpression.OwnerStmt which points to the SQL statement which includes this expression.
- [scriptWriter] fix a bug can't rewrite Oracle into clause if more than one variable in the list.
+ dotnet version 3.2.4.2(2018-02-19)
- [demos/xmlvisitor] Able to fetch columns in primary key of MySQL create table statement.
+ dotnet version 3.2.4.1(2018-02-06)
- [SQL Server] support use hint clause.
+ dotnet version 3.2.4.1(2018-01-30)
- [DB2] fix a bug can't parse create trigger statement when there is no keyword RW_ATOMIC after BEGIN keyword in compound trigger body.
- [DB2] fix a bug can't parse BEFORE keyword in trigger option in create trigger statement.
+ dotnet version 3.2.4.0(2018-01-25)
- [scriptWriter] support Oracle hint in select/delete/insert/udpate/merge
- [API] Move OracleHint from TSelectSqlStatement to TCustomSqlStatement
+ dotnet version 3.2.3.9(2017-12-12)
- [general] convert function support parameter and style property, use the same property as Java version.
modify convert function code in TScriptGeneratorVisitor.cs as well.
+ dotnet version 3.2.3.8(2017-12-08)
- [DB2] fix a bug can't parse create procedure when there is no parameter.
- [DB2] support always as clause in alter table statement.
- [DB2] support alter table ADD VERSIONING USE HISTORY TABLE
- [DB2] support alter table drop versioning.
- [DB2] support drop columm cascade.
- [DB2] support drop not null clause in alter column.
- [DB2] able to recognize create variable statement.
+ dotnet version 3.2.3.8(2017-12-07)
- [scriptWriter] fix a bug sql server convert function not rewrite correctly.
- [DB2] supprt xmlserialize function.
+ dotnet version 3.2.3.7(2017-11-29)
- [Oracle] fix a bug can't detect column in over clause of analytic function.
- [SQL Server] keyword: xml, server,Catalog, Cube treated as column name correctly.
+ dotnet version 3.2.3.6(2017-11-01)
- [Oracle] fix a bug doesn't detect column name in create trigger like: :new.customer_id
+ dotnet version 3.2.3.5(2017-10-31)
- [Teradata] fix a bug can't detect table column in create macro statement.
+ dotnet version 3.2.3.4(2017-10-30)
- [Teradata] fix a bug treats variable in create macro statement as column.
+ dotnet version 3.2.3.3(2017-10-30)
- [Oralce] support include/exclude nulls clause in unpivot clause.
- [teradata] fix a bug can't parse is keyword in comment statement.
- [general] able to recognize sequence object in syntax like:SEQ_COPS_CORIMA_EXECUTE_QUEUE.nextval and put it into TCustomSqlStatement.DatabaseObjects
+ dotnet version 3.2.3.2(2017-10-26)
- [general] add TObjectName.coordinate() method return coordinate of the object in SQL script.
- [general] ESqlClause.resultColumn replaced by selectList, insertColumn, mergeInsert
+ dotnet version 3.2.3.1(2017-10-16)
- [Teradata] fix a bug treat built-in function CURRENT_DATE,CURRENT_TIME as column name.
+ dotnet version 3.2.3.0(2017-10-12)
- [Oracle] Fix a bug can't parse CONSTRAINT keyword used as a columm name.
+ dotnet version 3.2.3.0(2017-10-12)
- [general] Add TCustomSqlStatement.DatabaseObjects property which stores function/trigger/sequence and other database objects name which in the SQL query.
+ dotnet version 3.2.3.0(2017-10-11)
- [SQL SERVER] support window aggregation group clause in analytic function.
+ dotnet version 3.2.3.0(2017-10-10)
- [DB2] support alter column set not null
- [DB2] support alter column set data type decimal
- [Teradata] support comment on/create macro/drop macro/rename table statement.
+ dotnet version 3.2.2.5(2017-09-30)
- [DB2] support XMLTable function.
+ dotnet version 3.2.2.5(2017-09-12)
- [demo] add dataflowanalyzer demo.
+ dotnet version 3.2.2.4(2017-09-08)
- [general] fix a bug sub-select of select union statement points to the wrong parent.
+ dotnet version 3.2.2.3(2017-09-07)
- [SQL Server] Fix a bug treat table with nolock hint as a function.
+ dotnet version 3.2.2.2(2017-08-11)
- [general] TTable.getTableName() will return "rowlist" if table type is table value constructor.
- [general] TTable.getTableName() will return "openrowset" if table type is openrowset.
+ dotnet version 3.2.2.1(2017-08-08)
- [scriptWriter] fix test cases and removeCondition/joinConvert demo.
+ dotnet version 3.2.2.0(2017-08-04)
- [scriptWriter] add new method: TParseTreeNode.ToScript() which return String representation this parse tree node
- [scriptWriter] demos\scriptWriter was merged into core parser under: gudusoft.gsqlparser.scriptWriter
+ dotnet version 3.2.1.5(2017-07-28)
- [general] fix a bug can't detect CTE table in from clause if it original format is quoted ([Agency_cte]) while cte name in from clause is not quote('Agency_cte').
- [SQL Server] support rebuild clause in alter table statement.
- [SQL Server] fix a bug can't parse value keyword used as column name such as select b.value from b
+ dotnet version 3.2.1.4(2017-07-21)
- [general] fix a bug TWindowDef.includingOverClause not set to true when over clause is used.
+ dotnet version 3.2.1.3(2017-07-20)
- [general] replace class TAnalyticFunction by TWindowDef in DB2, Informix, SQL Server,Sybase
+ dotnet version 3.2.1.3(2017-07-19)
- [general] replace TAnalyticFunction with TWindowDef
- [general] use TFunctionCall.WindowDef instead of TFunctionCall.AnalyticFunction to fetch over clause information.
+ dotnet version 3.2.1.2(2017-07-02)
- [demo] bug fix of joinConvert demo, removeCondition demo, scriptWriter demo.
+ dotnet version 3.2.1.1(2017-06-28)
- [general] fix a bug: parent expr of and/or condition not set correctly.
+ dotnet version 3.2.1.0(2017-06-26)
- [General] set parent of arguments (expr) in function call to function call.
- [General] null checking in method: public virtual TSourceToken ComparisonOperator
+ dotnet version 3.2.0.9(2017-06-20)
- [general] fix a bug that treat table hint as column name.
+ dotnet version 3.2.0.8(2017-06-14)
- [DB2] able to recognize update command options.
- [general] fix a bug that TGSqlParser class getting a handle on a file and never releasing the lock.
- [DB2] fix a bug can't parse labeled-duration use seconds keyword.
- [DB2] fix a bug can't parse query when DATA used as table alias.
+ dotnet version 3.2.0.7(2017-06-12)
- [General] fix a bug can't detect TABLE keyword in syntax like this: TABLE(subquery)
- [General] add accept/acceptChildren method of TRestrictionClause.
+ dotnet version 3.2.0.6(2017-05-22)
- [SQL Server] support percentile_cont, percentile_disc, parse, try_parse function.
- [SQL Server] fix a bug can't handle opertors correctly if it is followed by # character.
+ dotnet version 3.2.0.6(2017-05-22)
- [DB2] support create or replace clause in create procedure/function.
+ dotnet version 3.2.0.6(2017-05-05)
- [DB2] fix a bug can't parse create function if use create or replace clause instead of create.
+ dotnet version 3.2.0.5(2017-04-17)
- [general] fix stack overflow exception when process AND/OR predicate nested more than 1000 times.
+ dotnet version 3.2.0.3(2017-04-13)
- [DB2] fix a bug can't link column to insert table in create trigger statement.
- [general] support IEnumerable interface for TParseTreeNodeList and
all descendant classes such as : TTableList, TConstraintList, TExpressionList,TFromTableList,TJoinItemList
TJoinList,TMultiTargetList,TObjectNameList,TTableElementList
- [general] support IEnumerable interface for TSourceTokenList
- [general] support IEnumerable interface for TStatementList.
+ dotnet version 3.2.0.2(2017-01-20)
- [general] fix a null exception error while get table column.
+ dotnet version 3.2.0.2(2017-01-18)
- [General] fix a bug link qualified column to table in the same level incorrectly without search up level.
+ dotnet version 3.2.0.1(2017-01-12)
- [general] release API document on: http://wangz.net/doc/Help
- [general] add indexer for TSourceTokenList, TStatementList,TConstraintList,TExpressionList,TFromTableList,
TJoinItemList,TJoinList,TMultiTargetList,TObjectNameList,TTableElementList,TTableList
+ dotnet version 3.2.0.0(2017-01-10)
- [general] This is the first public release version with the same functionality as General SQL Parser Java version 1.8.
- [general] APIs used to modify parse tree was temporary disabled in current version.
- [document] including the first APIs documentation in chm.
+ dotnet version 3.1.0.2(2017-01-05)
- [general] support TParseTreeNode.String property.
+ dotnet version 3.1.0.0(2016-12-28)
- [demos] include demos.
+ dotnet version 3.1.0.0(2016-12-26)
- [general] fix a bug raise null exception when init lexer of hive/db2/greenplum,
resolve this problem by remove resource file in project property and add table files again.
Not know why this happens
+ dotnet version 3.0.1.0(2016-11-14)
- [DB2] Migrate lex and yacc file.
+ dotnet version 3.0.0.2(2016-08-31)
- [general] add new fields: TSourceToken.nodesStartFromThisToken, TSourceToken.nodesEndWithThisToken
+ dotnet version 3.0.0.1(2016-08-26)
- [general] first release