Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

openCypher conformance

mushroomdb runs the openCypher Technology Compatibility Kit (TCK) against every change. The TCK is a suite of scenarios, each a query with the result, error or graph change it must give. This page is generated from one run: every number on it is a count of scenarios.

  • TCK version: 2024.3, vendored unmodified in vendor/opencypher-tck/.
  • Generated: 2026-10-26 by cargo run --release -p tck-runner -- --report docs/site/conformance.md.
  • The pass rate is passed / (passed + failed). Skipped scenarios are in neither: a scenario is skipped only when it uses a feature this release deliberately does not have (listed under Skipped scenarios).
  • CI fails when the pass rate falls below tck-baseline.txt; the baseline is raised by an ordinary change when the rate rises.
  • Cypher function conformance breaks the same run down by function; a change that moves a TCK result regenerates it with bash scripts/gen-conformance-table.sh, and CI fails when it is stale.
  • The Cypher this release supports is documented in Cypher Query Reference.

Summary

Scenarios
Passed2416
Failed908
Skipped573
Total3897
Pass rate72.7% (0.7268)

A scenario that expects an error passes on any error, so the pass rate counts two kinds of pass. The strict rate counts only the passes that checked a result, plus the error passes whose error came from the phase the TCK names (compile time: the lexer, parser or planner; runtime: execution) and, when the engine’s error names its openCypher kind (VariableTypeConflict: …), is that kind. CI holds both rates to tck-baseline.txt.

PassScenarios
Checked a result or side effects1899
Raised an error the TCK expects517
… in the phase (and of the kind) the TCK names497
… in another phase or of another kind (any error accepted)20
Strict pass rate72.1% (0.7208)

By area

AreaPassedFailedSkippedPass rate
clauses/call2050100.0%
clauses/create3442244.7%
clauses/delete734017.1%
clauses/match30670581.4%
clauses/match-where2013160.6%
clauses/merge2945139.2%
clauses/remove1021232.3%
clauses/return2835044.4%
clauses/return-orderby2114060.0%
clauses/return-skip-limit283090.3%
clauses/set2226545.8%
clauses/union1200100.0%
clauses/unwind122085.7%
clauses/with1613055.2%
clauses/with-orderBy187792670.3%
clauses/with-skip-limit63066.7%
clauses/with-where612133.3%
expressions/aggregation1520042.9%
expressions/boolean40110026.7%
expressions/comparison3933054.2%
expressions/conditional11207.7%
expressions/existentialSubqueries0010—
expressions/graph38101379.2%
expressions/list14631882.5%
expressions/literals8348063.4%
expressions/map422095.5%
expressions/mathematical15016.7%
expressions/null386086.4%
expressions/path43057.1%
expressions/pattern2123614.3%
expressions/precedence5269043.0%
expressions/quantifier5968098.7%
expressions/string284087.5%
expressions/temporal5207141388.0%
expressions/typeConversion2522053.2%
useCases/countingSubgraphMatches01100.0%
useCases/triadicSelection01900.0%

Skipped scenarios

RuleScenariosReason
time-types439Time and LocalTime values, and DateTime with a named time zone, are not in 0.10 (Date, LocalDateTime, offset DateTime and Duration are, and run)
user-procedures50registers a test procedure (there exists a procedure); 0.10 has built-in procedures only and no way to declare one
pattern-predicate46pattern predicates (a relationship pattern used as an expression) are not in 0.10
multi-label27a node has one label in 0.10; more than one label (n:A:B, n:A|B, n:A&B) is not supported
subquery-expression10EXISTS { … }, COUNT { … } and COLLECT { … } subqueries are not in 0.10
ignore1tagged @ignore by the TCK itself

Failures by cause

Each failing scenario is counted once, under the first step that failed.

KindScenarios
parser gap409
semantics difference174
ruled deviation111
runtime error (semantics difference)92
named unsupported feature60
setup: parser gap33
error not raised (missing validation)23
setup: named unsupported feature4
setup: runtime error2
CauseKindScenariosFirst scenario
ruled deviation: 0.10 keeps boolean coercion (AND/OR/XOR/NOT accept non-booleans)ruled deviation110expressions/boolean/Boolean1.feature: [8] Fail on conjunction of at least one non-booleans (example 1)
unexpected error: parse: expected … in a relationship pattern (found Dash)parser gap89clauses/delete/Delete3.feature: [1] Detach deleting paths
wrong result: column names differsemantics difference67clauses/match/Match9.feature: [5] Variable length pattern with label predicate on both sides
a write without RETURN returns its counter row (the TCK expects no rows)semantics difference61clauses/create/Create1.feature: [1] Create a single node
unexpected error: parse: expected variable or … in aggregate argument (found LParen)parser gap60clauses/return/Return6.feature: [16] Aggregation on complex expressions
unexpected error: parse: expected RETURN (found Ident(…))parser gap54clauses/with/With5.feature: [1] DISTINCT on an expression
wrong result: values differsemantics difference34clauses/return/Return2.feature: [12] Projecting a list of nodes and relationships
unexpected error: parse: unexpected tokens after UNION query (found Ident(…))parser gap27expressions/literals/Literals3.feature: [1] Return a short positive hexadecimal integer
expected TypeError not raisederror not raised (missing validation)23clauses/set/Set1.feature: [10] Failing when setting a list of maps as a property
unexpected error: refused as not supported: a MATCH, UNWIND or WITH clause after a write clause in the same statementnamed unsupported feature21clauses/create/Create3.feature: [2] WITH-CREATE
setup failed: lex: illegal character … at position #setup: parser gap19useCases/triadicSelection/TriadicSelection1.feature: [1] Handling triadic friend of a friend
unexpected error: parse: zero-length variable-length paths are not supported; minimum hop count is # (found RBracket)parser gap18clauses/match/Match4.feature: [3] Zero-length variable length pattern in the middle of the pattern
unexpected error: parse: expected SET, REMOVE or DELETE after MATCH [WHERE]; combined MATCH…RETURN is a read query, not a write …parser gap15clauses/delete/Delete5.feature: [1] Delete node from a list
setup failed: parse: expected … in CREATE node pattern (found Slash)setup: parser gap14clauses/with-orderBy/WithOrderBy4.feature: [1] Sort by a projected expression
unexpected error: refused as not supported: SET n:Labelnamed unsupported feature14clauses/merge/Merge2.feature: [1] Merge node with label add label on create
unexpected error: parse: expected … to close a list subscript (found Dot)parser gap13expressions/list/List2.feature: [1] List slice
unexpected error: execute: division by zeroruntime error (semantics difference)12clauses/return-orderby/ReturnOrderBy1.feature: [11] ORDER BY should order distinct types in the expected order
unexpected error: execute: date(): cannot read … as a Dateruntime error (semantics difference)11expressions/temporal/Temporal10.feature: [9] Should handle large durations
unexpected error: plan: duplicate RETURN column …runtime error (semantics difference)10expressions/null/Null1.feature: [1] Property null check on non-null node
unexpected error: refused as not supported: REMOVE n:Labelnamed unsupported feature10clauses/remove/Remove2.feature: [1] Remove a single label from a node with a single label
wrong result: row count differssemantics difference10clauses/match/Match6.feature: [14] Named path with undirected fixed variable length pattern
unexpected error: parse: expected operand (property, literal, or parameter) (found Dot)parser gap9expressions/list/List2.feature: [3] List slice with implicit start
unexpected error: parse: unexpected tokens after DELETE (found Return)parser gap8clauses/delete/Delete6.feature: [1] Limiting to zero results after deleting nodes affects the result set but not the side effects
unexpected error: execute: datetime(): cannot read … as a DateTimeruntime error (semantics difference)7expressions/temporal/Temporal2.feature: [5] Should parse date time from string (example 2)
unexpected error: execute: localdatetime(): cannot read … as a LocalDateTimeruntime error (semantics difference)7expressions/temporal/Temporal10.feature: [10] Should handle large durations in seconds
unexpected error: parse: CASE requires at least one WHEN … THEN branch (found Int(#))parser gap7expressions/conditional/Conditional2.feature: [1] Simple cases over integers (example 2)
unexpected error: parse: unary minus only applies to numeric literals (found Dot)parser gap7expressions/literals/Literals5.feature: [10] Return a negative zero float without integer digits
unexpected error: execute: unbound variable …runtime error (semantics difference)6clauses/match/Match7.feature: [15] Variable length patterns and nulls
unexpected error: plan: cannot return variable-length relationship variable … bare; return r.length, or name the path (p = …) an…runtime error (semantics difference)6clauses/match/Match4.feature: [1] Handling fixed-length variable length pattern
unexpected error: refused as not supported: pattern comprehension [named unsupported feature6expressions/list/List6.feature: [7] Using size of pattern comprehension to test existence
unexpected error: refused as not supported: pattern predicatenamed unsupported feature6expressions/pattern/Pattern2.feature: [1] Return a pattern comprehension
unexpected error: execute: duration(): cannot read … as a Durationruntime error (semantics difference)5expressions/temporal/Temporal2.feature: [7] Should parse duration from string (example 2)
unexpected error: parse: expected RETURN (found Le)parser gap5expressions/comparison/Comparison3.feature: [2] Handling numerical ranges 2
unexpected error: parse: variable-length paths are capped at # hopsparser gap5clauses/match/Match5.feature: [16] Handling lower bounded variable length match 1
unexpected error: plan: unbound variable … in ORDER BY in aggregate WITHruntime error (semantics difference)5clauses/with-orderBy/WithOrderBy2.feature: [22] Sort by an expression that is only partially orderable on a non-distinct binding table, but used as a grouping key (example 1)
unexpected error: parse: DELETE …: variable is not bound as a relationship or node in any MATCH patternparser gap4clauses/delete/Delete2.feature: [1] Delete relationships
unexpected error: parse: collect() is only supported as a top-level RETURN/WITH aggregateparser gap4clauses/return/Return6.feature: [5] Aggregates inside normal functions
unexpected error: parse: expected RETURN (found Lt)parser gap4expressions/comparison/Comparison3.feature: [1] Handling numerical ranges 1
unexpected error: parse: expected variable or … in aggregate argument (found LBracket)parser gap4expressions/comparison/Comparison1.feature: [1] Number-typed integer comparison
unexpected error: parse: expected … or … in a list literal (found Ident(…))parser gap4expressions/literals/Literals7.feature: [5] Return a list containing a hexadecimal integer

Scenarios that ran and failed one check

A scenario whose query ran is checked to the end even after a check fails. These failed exactly one check (a failed setup or a query that raised an error leaves the rest unchecked, so those are not counted here).

CauseScenarios
ruled deviation: 0.10 keeps boolean coercion (AND/OR/XOR/NOT accept non-booleans)110
wrong result: column names differ62
a write without RETURN returns its counter row (the TCK expects no rows)57
wrong result: values differ34
expected TypeError not raised23
wrong result: row count differs10
wrong result: row order differs2
ruled deviation: 0.10 keeps boolean coercion (a node as a WHERE predicate reads as true)1

Expected errors

A scenario that expects an error passes on any error. This table shows, for the ones that passed that way, the stage the engine’s error came from: a TCK SyntaxError met by an execute: error, or a runtime error met by a parse: error, passed for a different reason than the TCK names.

TCK errorPhasePassedEngine lex: / parse:Engine plan: / execute:Other
ArgumentErrorruntime320320
ConstraintVerificationFailedruntime1001
EntityNotFoundruntime3300
ProcedureErrorcompile time2020
SemanticErrorruntime2101
SyntaxErrorcompile time433376570
SyntaxErrorruntime6060
TypeErrorany time180180
TypeErrorcompile time121200
TypeErrorruntime8080

Functions

Every function a TCK query calls. Supported means the engine knows the name (a call of it does not fail as an unknown function); the counts are the scenarios whose queries call it.

FunctionSupportedTCK scenarios passed / runSkipped
absyes2 / 40
avgyes1 / 60
ceilyes0 / 10
coalesceyes28 / 300
collectyes11 / 962
countyes95 / 1833
dateyes153 / 17745
date.realtimeyes1 / 10
date.statementyes1 / 10
date.transactionyes1 / 10
date.truncateyes51 / 510
datetimeyes231 / 251169
datetime.fromepochyes1 / 10
datetime.fromepochmillisyes1 / 10
datetime.realtimeyes1 / 10
datetime.statementyes1 / 10
datetime.transactionyes1 / 10
datetime.truncateyes74 / 7431
durationyes46 / 7418
duration.betweenyes10 / 1518
duration.indaysyes10 / 1012
duration.inmonthsyes15 / 1512
duration.insecondsyes14 / 1534
endnodeyes0 / 10
foono1 / 10
headyes1 / 50
keysyes19 / 280
labelsyes5 / 1210
lastyes0 / 10
lengthyes2 / 80
localdatetimeyes209 / 23496
localdatetime.realtimeyes1 / 10
localdatetime.statementyes1 / 10
localdatetime.transactionyes1 / 10
localdatetime.truncateyes74 / 740
localtimeyes0 / 0144
localtime.realtimeyes0 / 01
localtime.statementyes0 / 01
localtime.transactionyes0 / 01
localtime.truncateyes0 / 044
maxyes22 / 290
minyes0 / 90
nodesyes2 / 120
percentilecontyes6 / 60
percentilediscyes6 / 70
propertiesyes6 / 70
randyes64 / 650
rangeyes77 / 932
relationshipsyes2 / 70
reverseyes63 / 640
signyes0 / 10
sizeyes132 / 15110
splityes1 / 20
sqrtyes0 / 10
startnodeyes0 / 10
substringyes1 / 10
sumyes6 / 310
tailyes0 / 90
timeyes0 / 0149
time.realtimeyes0 / 01
time.statementyes0 / 01
time.transactionyes0 / 01
time.truncateyes0 / 048
tobooleanyes4 / 100
tofloatyes5 / 110
tointegeryes8 / 180
toloweryes0 / 10
tostringyes22 / 293
typeyes13 / 161

By feature file

FeaturePassedFailedSkipped
clauses/call/Call1.feature2014
clauses/call/Call2.feature006
clauses/call/Call3.feature006
clauses/call/Call4.feature002
clauses/call/Call5.feature0019
clauses/call/Call6.feature003
clauses/create/Create1.feature1262
clauses/create/Create2.feature10140
clauses/create/Create3.feature2110
clauses/create/Create4.feature020
clauses/create/Create5.feature050
clauses/create/Create6.feature1040
clauses/delete/Delete1.feature350
clauses/delete/Delete2.feature230
clauses/delete/Delete3.feature020
clauses/delete/Delete4.feature030
clauses/delete/Delete5.feature270
clauses/delete/Delete6.feature0140
clauses/match-where/MatchWhere1.feature1140
clauses/match-where/MatchWhere2.feature020
clauses/match-where/MatchWhere3.feature300
clauses/match-where/MatchWhere4.feature101
clauses/match-where/MatchWhere5.feature040
clauses/match-where/MatchWhere6.feature530
clauses/match/Match1.feature8501
clauses/match/Match2.feature8510
clauses/match/Match3.feature17112
clauses/match/Match4.feature361
clauses/match/Match5.feature15140
clauses/match/Match6.feature81160
clauses/match/Match7.feature18121
clauses/match/Match8.feature120
clauses/match/Match9.feature180
clauses/merge/Merge1.feature1151
clauses/merge/Merge2.feature420
clauses/merge/Merge3.feature320
clauses/merge/Merge4.feature110
clauses/merge/Merge5.feature10190
clauses/merge/Merge6.feature060
clauses/merge/Merge7.feature050
clauses/merge/Merge8.feature010
clauses/merge/Merge9.feature040
clauses/remove/Remove1.feature520
clauses/remove/Remove2.feature032
clauses/remove/Remove3.feature5160
clauses/return-orderby/ReturnOrderBy1.feature840
clauses/return-orderby/ReturnOrderBy2.feature770
clauses/return-orderby/ReturnOrderBy3.feature010
clauses/return-orderby/ReturnOrderBy4.feature200
clauses/return-orderby/ReturnOrderBy5.feature100
clauses/return-orderby/ReturnOrderBy6.feature320
clauses/return-skip-limit/ReturnSkipLimit1.feature1010
clauses/return-skip-limit/ReturnSkipLimit2.feature1520
clauses/return-skip-limit/ReturnSkipLimit3.feature300
clauses/return/Return1.feature200
clauses/return/Return2.feature1260
clauses/return/Return3.feature210
clauses/return/Return4.feature560
clauses/return/Return5.feature140
clauses/return/Return6.feature5160
clauses/return/Return7.feature110
clauses/return/Return8.feature010
clauses/set/Set1.feature740
clauses/set/Set2.feature030
clauses/set/Set3.feature035
clauses/set/Set4.feature500
clauses/set/Set5.feature500
clauses/set/Set6.feature5160
clauses/union/Union1.feature500
clauses/union/Union2.feature500
clauses/union/Union3.feature200
clauses/unwind/Unwind1.feature1220
clauses/with-orderBy/WithOrderBy1.feature572316
clauses/with-orderBy/WithOrderBy2.feature512210
clauses/with-orderBy/WithOrderBy3.feature77160
clauses/with-orderBy/WithOrderBy4.feature2180
clauses/with-skip-limit/WithSkipLimit1.feature200
clauses/with-skip-limit/WithSkipLimit2.feature220
clauses/with-skip-limit/WithSkipLimit3.feature210
clauses/with-where/WithWhere1.feature130
clauses/with-where/WithWhere2.feature020
clauses/with-where/WithWhere3.feature300
clauses/with-where/WithWhere4.feature101
clauses/with-where/WithWhere5.feature040
clauses/with-where/WithWhere6.feature010
clauses/with-where/WithWhere7.feature120
clauses/with/With1.feature330
clauses/with/With2.feature110
clauses/with/With3.feature010
clauses/with/With4.feature520
clauses/with/With5.feature020
clauses/with/With6.feature630
clauses/with/With7.feature110
expressions/aggregation/Aggregation1.feature020
expressions/aggregation/Aggregation2.feature0120
expressions/aggregation/Aggregation3.feature020
expressions/aggregation/Aggregation5.feature110
expressions/aggregation/Aggregation6.feature1210
expressions/aggregation/Aggregation8.feature220
expressions/boolean/Boolean1.feature7230
expressions/boolean/Boolean2.feature7230
expressions/boolean/Boolean3.feature7230
expressions/boolean/Boolean4.feature11410
expressions/boolean/Boolean5.feature800
expressions/comparison/Comparison1.feature33100
expressions/comparison/Comparison2.feature6130
expressions/comparison/Comparison3.feature090
expressions/comparison/Comparison4.feature010
expressions/conditional/Conditional1.feature100
expressions/conditional/Conditional2.feature0120
expressions/existentialSubqueries/ExistentialSubquery1.feature004
expressions/existentialSubqueries/ExistentialSubquery2.feature003
expressions/existentialSubqueries/ExistentialSubquery3.feature003
expressions/graph/Graph3.feature315
expressions/graph/Graph4.feature920
expressions/graph/Graph5.feature018
expressions/graph/Graph6.feature1220
expressions/graph/Graph7.feature030
expressions/graph/Graph8.feature800
expressions/graph/Graph9.feature610
expressions/list/List1.feature2210
expressions/list/List11.feature6610
expressions/list/List12.feature160
expressions/list/List2.feature0150
expressions/list/List3.feature700
expressions/list/List4.feature200
expressions/list/List5.feature4420
expressions/list/List6.feature458
expressions/list/List9.feature010
expressions/literals/Literals1.feature600
expressions/literals/Literals2.feature1110
expressions/literals/Literals3.feature5110
expressions/literals/Literals4.feature280
expressions/literals/Literals5.feature7200
expressions/literals/Literals6.feature1300
expressions/literals/Literals7.feature1550
expressions/literals/Literals8.feature2430
expressions/map/Map1.feature1810
expressions/map/Map2.feature1400
expressions/map/Map3.feature1010
expressions/mathematical/Mathematical11.feature010
expressions/mathematical/Mathematical13.feature010
expressions/mathematical/Mathematical2.feature010
expressions/mathematical/Mathematical3.feature100
expressions/mathematical/Mathematical8.feature020
expressions/null/Null1.feature1430
expressions/null/Null2.feature1430
expressions/null/Null3.feature1000
expressions/path/Path1.feature010
expressions/path/Path2.feature210
expressions/path/Path3.feature210
expressions/pattern/Pattern1.feature2136
expressions/pattern/Pattern2.feature0110
expressions/precedence/Precedence1.feature13590
expressions/precedence/Precedence2.feature2330
expressions/precedence/Precedence3.feature470
expressions/precedence/Precedence4.feature1200
expressions/quantifier/Quantifier1.feature10320
expressions/quantifier/Quantifier10.feature800
expressions/quantifier/Quantifier11.feature2200
expressions/quantifier/Quantifier12.feature1700
expressions/quantifier/Quantifier2.feature10420
expressions/quantifier/Quantifier3.feature10320
expressions/quantifier/Quantifier4.feature10320
expressions/quantifier/Quantifier5.feature3100
expressions/quantifier/Quantifier6.feature2100
expressions/quantifier/Quantifier7.feature3600
expressions/quantifier/Quantifier8.feature3100
expressions/quantifier/Quantifier9.feature1700
expressions/string/String1.feature100
expressions/string/String10.feature810
expressions/string/String11.feature200
expressions/string/String3.feature010
expressions/string/String4.feature100
expressions/string/String8.feature810
expressions/string/String9.feature810
expressions/temporal/Temporal1.feature154053
expressions/temporal/Temporal10.feature49676
expressions/temporal/Temporal2.feature52820
expressions/temporal/Temporal3.feature740109
expressions/temporal/Temporal4.feature131214
expressions/temporal/Temporal5.feature043
expressions/temporal/Temporal6.feature1223
expressions/temporal/Temporal7.feature0126
expressions/temporal/Temporal8.feature1476
expressions/temporal/Temporal9.feature1990123
expressions/typeConversion/TypeConversion1.feature460
expressions/typeConversion/TypeConversion2.feature750
expressions/typeConversion/TypeConversion3.feature560
expressions/typeConversion/TypeConversion4.feature950
useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature0110
useCases/triadicSelection/TriadicSelection1.feature0190