Skip to content

Commit

Permalink
Merge pull request #1233 from partiql/type-subquery
Browse files Browse the repository at this point in the history
Adds support for subquery typing in inferencer
  • Loading branch information
johnedquinn authored Sep 29, 2023
2 parents acd74ab + f8811bd commit 316fe36
Show file tree
Hide file tree
Showing 6 changed files with 485 additions and 73 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,16 @@ Thank you to all who have contributed!
### Deprecated

### Fixed
- Fixes typing of scalar subqueries in the PartiQLSchemaInferencer. Note that usage of `SELECT *` in subqueries
is not fully supported. Please make sure to handle InferenceExceptions.

### Removed

### Security

### Contributors
Thank you to all who have contributed!
- @<your-username>
- @johnedquinn

## [0.13.1] - 2023-09-19

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ sealed class SemanticProblemDetails(override val severity: ProblemSeverity, val
}
)

data class CoercionError(val actualType: StaticType) : SemanticProblemDetails(
severity = ProblemSeverity.ERROR,
messageFormatter = {
"Unable to coerce $actualType into a single value."
}
)

object DuplicateAliasesInSelectListItem :
SemanticProblemDetails(
severity = ProblemSeverity.ERROR,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -334,12 +334,32 @@ internal object PlanTyper : PlanRewriter<PlanTyper.Context>() {

override fun visitRexQueryScalarSubquery(node: Rex.Query.Scalar.Subquery, ctx: Context): PlanNode {
val query = visitRex(node.query, ctx) as Rex.Query.Collection
when (val queryType = query.grabType() ?: handleMissingType(ctx)) {
// If it is SELECT VALUE, do not coerce.
if (query.constructor != null) {
val type = query.type as? CollectionType
return node.copy(query = query, type = type?.elementType?.flatten())
}
val type = when (val queryType = query.grabType() ?: handleMissingType(ctx)) {
is CollectionType -> queryType.elementType
else -> error("Query collection subqueries should always return a CollectionType.")
}
val resultType = when (type) {
is StructType -> {
if (StaticTypeUtils.isClosedSafe(type) == true && type.fields.size == 1) {
type.fields[0].value
} else {
handleCoercionError(ctx, type)
StaticType.ANY
}
}
else -> {
handleCoercionError(ctx, type)
StaticType.ANY
}
}
return node.copy(
query = query
query = query,
type = resultType.flatten()
)
}

Expand Down Expand Up @@ -1313,7 +1333,7 @@ internal object PlanTyper : PlanRewriter<PlanTyper.Context>() {
return requiredArgumentsMatch
}

private fun Rex.isProjectAll(): Boolean {
internal fun Rex.isProjectAll(): Boolean {
return when (this) {
is Rex.Path -> {
val step = this.steps.lastOrNull() ?: return false
Expand Down Expand Up @@ -1678,4 +1698,13 @@ internal object PlanTyper : PlanRewriter<PlanTyper.Context>() {
)
)
}

private fun handleCoercionError(ctx: Context, actualType: StaticType) {
ctx.problemHandler.handleProblem(
Problem(
sourceLocation = UNKNOWN_PROBLEM_LOCATION,
details = SemanticProblemDetails.CoercionError(actualType)
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ import org.partiql.lang.eval.builtins.ExprFunctionCurrentUser
import org.partiql.lang.eval.err
import org.partiql.lang.eval.errorContextFrom
import org.partiql.lang.planner.transforms.AstToPlan
import org.partiql.lang.planner.transforms.plan.PlanTyper.isProjectAll
import org.partiql.plan.Case
import org.partiql.plan.Plan
import org.partiql.plan.Rel
import org.partiql.plan.Rex
import org.partiql.types.StaticType
import java.util.Locale

/**
* Some workarounds for transforming a PIG tree without having to create another visitor:
Expand Down Expand Up @@ -109,7 +112,7 @@ internal object RexConverter : PartiqlAst.VisitorFold<RexConverter.Ctx>() {
}

override fun walkExprSessionAttribute(node: PartiqlAst.Expr.SessionAttribute, accumulator: Ctx) = visit(node) {
val functionName = when (node.value.text.toUpperCase()) {
val functionName = when (node.value.text.uppercase(Locale.getDefault())) {
EvaluationSession.Constants.CURRENT_USER_KEY -> ExprFunctionCurrentUser.FUNCTION_NAME
else -> err(
"Unsupported session attribute: ${node.value.text}",
Expand Down Expand Up @@ -262,59 +265,118 @@ internal object RexConverter : PartiqlAst.VisitorFold<RexConverter.Ctx>() {
}

override fun walkExprEq(node: PartiqlAst.Expr.Eq, ctx: Ctx) = visit(node) {
val (lhs, rhs) = walkComparisonOperands(node.operands)
Plan.rexBinary(
lhs = convert(node.operands[0]),
rhs = convert(node.operands[1]),
lhs = lhs,
rhs = rhs,
op = Rex.Binary.Op.EQ,
type = StaticType.BOOL,
)
}

override fun walkExprNe(node: PartiqlAst.Expr.Ne, ctx: Ctx) = visit(node) {
val (lhs, rhs) = walkComparisonOperands(node.operands)
Plan.rexBinary(
lhs = convert(node.operands[0]),
rhs = convert(node.operands[1]),
lhs = lhs,
rhs = rhs,
op = Rex.Binary.Op.NEQ,
type = StaticType.BOOL,
)
}

override fun walkExprGt(node: PartiqlAst.Expr.Gt, ctx: Ctx) = visit(node) {
val (lhs, rhs) = walkComparisonOperands(node.operands)
Plan.rexBinary(
lhs = convert(node.operands[0]),
rhs = convert(node.operands[1]),
lhs = lhs,
rhs = rhs,
op = Rex.Binary.Op.GT,
type = StaticType.BOOL,
)
}

override fun walkExprGte(node: PartiqlAst.Expr.Gte, ctx: Ctx) = visit(node) {
val (lhs, rhs) = walkComparisonOperands(node.operands)
Plan.rexBinary(
lhs = convert(node.operands[0]),
rhs = convert(node.operands[1]),
lhs = lhs,
rhs = rhs,
op = Rex.Binary.Op.GTE,
type = StaticType.BOOL,
)
}

override fun walkExprLt(node: PartiqlAst.Expr.Lt, ctx: Ctx) = visit(node) {
val (lhs, rhs) = walkComparisonOperands(node.operands)
Plan.rexBinary(
lhs = convert(node.operands[0]),
rhs = convert(node.operands[1]),
lhs = lhs,
rhs = rhs,
op = Rex.Binary.Op.LT,
type = StaticType.BOOL,
)
}

override fun walkExprLte(node: PartiqlAst.Expr.Lte, ctx: Ctx) = visit(node) {
val (lhs, rhs) = walkComparisonOperands(node.operands)
Plan.rexBinary(
lhs = convert(node.operands[0]),
rhs = convert(node.operands[1]),
lhs = lhs,
rhs = rhs,
op = Rex.Binary.Op.LTE,
type = StaticType.BOOL,
)
}

/**
* Converts Comparison Operands. Also coerces them if one of them is an array.
*/
private fun walkComparisonOperands(operands: List<PartiqlAst.Expr>): Pair<Rex, Rex> {
var lhs = convert(operands[0])
var rhs = convert(operands[1])
if (lhs is Rex.Collection.Array) { rhs = coercePotentialSubquery(rhs) }
if (rhs is Rex.Collection.Array) { lhs = coercePotentialSubquery(lhs) }
return lhs to rhs
}

/**
* We convert the scalar subquery of a SFW into a scalar subquery of a SELECT VALUE.
*/
private fun coercePotentialSubquery(rex: Rex): Rex {
var rhs = rex
if (rhs is Rex.Query.Scalar.Subquery) {
val sfw = rhs.query as? Rex.Query.Collection ?: error("Malformed plan, all scalar subqueries should hold collection queries")
val constructor = sfw.constructor ?: run {
val relProject = sfw.rel as? Rel.Project ?: error("Malformed plan, the top of a plan should be a projection")
getConstructorFromRelProject(relProject)
}
rhs = rhs.copy(
query = rhs.query.copy(
constructor = constructor
)
)
}
return rhs
}

private fun getConstructorFromRelProject(relProject: Rel.Project): Rex {
return when (relProject.bindings.size) {
0 -> error("The Projection should not have held empty bindings.")
1 -> {
val binding = relProject.bindings.first()
if (binding.value.isProjectAll()) {
error("Unimplemented feature: coercion of SELECT *.")
}
relProject.bindings.first().value
}
else -> {
if (relProject.bindings.any { it.value.isProjectAll() }) {
error("Unimplemented feature: coercion of SELECT *.")
}
Plan.rexCollectionArray(
relProject.bindings.map { it.value },
type = StaticType.LIST
)
}
}
}

override fun walkExprLike(node: PartiqlAst.Expr.Like, ctx: Ctx) = visit(node) {
when (val escape = node.escape) {
null -> Plan.rexCall(
Expand Down Expand Up @@ -345,12 +407,14 @@ internal object RexConverter : PartiqlAst.VisitorFold<RexConverter.Ctx>() {
)
}

/**
* Here, we must visit the RHS. If it is a scalar subquery, we need to grab the underlying collection.
*/
override fun walkExprInCollection(node: PartiqlAst.Expr.InCollection, ctx: Ctx) = visit(node) {
val lhs = convert(node.operands[0])
var rhs = convert(node.operands[1])
if (rhs is Rex.Query.Scalar.Subquery) {
rhs = rhs.query // unpack a scalar subquery coercion
}
val potentialSubqueryRex = convert(node.operands[1])
val potentialSubquery = coercePotentialSubquery(potentialSubqueryRex)
val rhs = (potentialSubquery as? Rex.Query.Scalar.Subquery)?.query ?: potentialSubquery
Plan.rexCall(
id = Constants.inCollection,
args = listOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,22 @@ public object StaticTypeUtils {
//
//

internal fun isClosedSafe(type: StructType): Boolean? = try {
isClosed(type)
} catch (_: StructClosedMismatch) {
null
}

@kotlin.jvm.Throws(StructClosedMismatch::class)
internal fun isClosed(type: StructType): Boolean {
val contentClosed = type.contentClosed
val constraintClosed = type.constraints.contains(TupleConstraint.Open(false))
if (contentClosed != constraintClosed) { throw StructClosedMismatch }
return contentClosed
}

internal object StructClosedMismatch : Exception()

/**
* By far, structs have the most complicated logic behind their instance check.
*
Expand Down
Loading

1 comment on commit 316fe36

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JMH Benchmark

Benchmark suite Current: 316fe36 Previous: acd74ab Ratio
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.compileCrossJoinAggFuncGroupingWithInterruptible 577.8098733361851 us/op 382.12119688891636 us/op 1.51
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.compileCrossJoinAggFuncGroupingWithoutInterruptible 543.9402479334356 us/op 392.3519980690888 us/op 1.39
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.compileCrossJoinAggFuncWithInterruptible 477.1744785423983 us/op 328.6922523840265 us/op 1.45
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.compileCrossJoinAggFuncWithoutInterruptible 481.1758287603178 us/op 347.3716346967661 us/op 1.39
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.compileCrossJoinWithInterruptible 345.62261454909765 us/op 246.0062856125872 us/op 1.40
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.compileCrossJoinWithoutInterruptible 359.3555819460761 us/op 244.2936090192943 us/op 1.47
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.evalCrossJoinAggWithInterruptible 10723998.077650001 us/op 7834230.1458 us/op 1.37
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.evalCrossJoinAggWithoutInterruptible 10910423.615199998 us/op 7666112.15245 us/op 1.42
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.evalCrossJoinWithInterruptible 83.60116283343227 us/op 60.94840838016745 us/op 1.37
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.evalCrossJoinWithoutInterruptible 87.83260645439518 us/op 65.6668636313175 us/op 1.34
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.iterCrossJoinAggWithInterruptible 10639614.73645 us/op 7760324.5854 us/op 1.37
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.iterCrossJoinAggWithoutInterruptible 11088775.37455 us/op 7519458.6478 us/op 1.47
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.iterCrossJoinWithInterruptible 176351.632075 us/op 130421.39095 us/op 1.35
org.partiql.jmh.benchmarks.CompilerInterruptionBenchmark.iterCrossJoinWithoutInterruptible 176065.158025 us/op 128521.73259375 us/op 1.37
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLCompiler15 183.11916407445054 us/op 124.91578202156272 us/op 1.47
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLCompiler30 335.96778405276507 us/op 228.07585957364932 us/op 1.47
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator15 638908.581725 us/op 542491.2025 us/op 1.18
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator30 1265467.5007000002 us/op 1089913.46085 us/op 1.16
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator30WithData10 12420455.441700004 us/op 9169107.753099998 us/op 1.35
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLParser15 258.8210157759367 us/op 190.33258187881376 us/op 1.36
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLParser30 490.07588901081044 us/op 365.4623738231737 us/op 1.34
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameCaseWhenThen 80.84287537516794 us/op 45.824861000094145 us/op 1.76
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery 99.08779753654291 us/op 62.80762067278236 us/op 1.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery01 473.767773901882 us/op 327.7666918481925 us/op 1.45
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery02 784.8107922015397 us/op 561.3503832803597 us/op 1.40
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameExceptUnionIntersectSixty 301.10656497809924 us/op 215.60355466502293 us/op 1.40
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameExec20Expressions 101.22330340140684 us/op 72.51323189344842 us/op 1.40
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameFromLet 83.53803715192508 us/op 50.205637093161414 us/op 1.66
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGraphPattern 81.23458065444396 us/op 49.434683038334065 us/op 1.64
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGraphPreFilters 133.46058288255784 us/op 74.22924336968615 us/op 1.80
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGroupLimit 91.45902538578218 us/op 49.974450989712764 us/op 1.83
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameLongFromSourceOrderBy 107.54581771276739 us/op 73.34680320930049 us/op 1.47
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameManyJoins 130.50156009429026 us/op 68.54935958963918 us/op 1.90
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameNestedAggregates 182.29853538448668 us/op 117.28064110349021 us/op 1.55
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameNestedParen 34.651161687570045 us/op 21.984086452333578 us/op 1.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNamePivot 119.06723278150926 us/op 73.48607578687063 us/op 1.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuery15OrsAndLikes 373.15459020811556 us/op 218.06703177038875 us/op 1.71
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuery30Plus 177.1935787874308 us/op 121.91695842557938 us/op 1.45
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryFunc 89.66431493784911 us/op 57.63010292638152 us/op 1.56
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryFuncInProjection 188.91081456116606 us/op 128.70945766697292 us/op 1.47
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryList 128.8454499454017 us/op 86.47052726207801 us/op 1.49
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryNestedSelect 1049.460745543333 us/op 751.9737956411111 us/op 1.40
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuerySimple 31.19171628059892 us/op 19.749776553747587 us/op 1.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralJoins 46.5313631013197 us/op 26.13114413952731 us/op 1.78
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralProjections 116.80876643050719 us/op 79.86678467755118 us/op 1.46
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralSelect 333.97180605983533 us/op 221.70820521870968 us/op 1.51
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSimpleInsert 60.71267748514911 us/op 34.09524926234913 us/op 1.78
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeJoins 45.32743841168469 us/op 26.891999381917554 us/op 1.69
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeProjections 56.50946249142504 us/op 34.593058571164164 us/op 1.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeSelect 97.03213109117296 us/op 57.65228441963616 us/op 1.68
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameTimeZone 49.168605313177316 us/op 29.446681074542568 us/op 1.67
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameVeryLongQuery 526.5703987619071 us/op 366.2323250459336 us/op 1.44
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameVeryLongQuery01 1615.1108952504035 us/op 1077.9499207976182 us/op 1.50
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameCaseWhenThen 43.80110126136175 us/op 28.945182353099757 us/op 1.51
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameComplexQuery 372.84956541876244 us/op 246.91641904054023 us/op 1.51
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameComplexQuery01 173.454141933256 us/op 119.48064224116331 us/op 1.45
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameExceptUnionIntersectSixty 311.8027694371126 us/op 237.70121984862334 us/op 1.31
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameExec20Expressions 96.60564772441711 us/op 73.1065639126262 us/op 1.32
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameFromLet 65.51464388819369 us/op 39.77050591559147 us/op 1.65
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGraphPattern 71.41232973520994 us/op 44.13007585810279 us/op 1.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGraphPreFilters 114.0810637652673 us/op 74.82783971317892 us/op 1.52
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGroupLimit 60.09772954255584 us/op 37.234583792411414 us/op 1.61
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameLongFromSourceOrderBy 196.56055945037352 us/op 136.10327803191598 us/op 1.44
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameManyJoins 74.1910159899002 us/op 48.333784258899904 us/op 1.53
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameNestedAggregates 147.8226684367247 us/op 104.10043120129164 us/op 1.42
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameNestedParen 118.01102223583159 us/op 89.2636396193917 us/op 1.32
org.partiql.jmh.benchmarks.ParserBenchmark.parseNamePivot 107.60208988654321 us/op 72.61135841803286 us/op 1.48
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuery15OrsAndLikes 257.081190297246 us/op 191.3193758210371 us/op 1.34
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuery30Plus 87.70375349556187 us/op 65.31487891095622 us/op 1.34
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryFunc 213.13875722460858 us/op 138.41076543391932 us/op 1.54
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryFuncInProjection 138.6140429081383 us/op 98.4274676948555 us/op 1.41
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryList 116.26574555540003 us/op 87.96158411694728 us/op 1.32
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryNestedSelect 214.23994611462135 us/op 142.553229374776 us/op 1.50
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuerySimple 22.677051417877216 us/op 14.673911069296915 us/op 1.55
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralJoins 107.39643483343211 us/op 79.09011347471001 us/op 1.36
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralProjections 86.54423035057705 us/op 61.66279381350877 us/op 1.40
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralSelect 160.5876843267661 us/op 122.2080953103592 us/op 1.31
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSimpleInsert 37.040401538109975 us/op 24.191576436454472 us/op 1.53
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeJoins 34.65208472800599 us/op 22.752370910434514 us/op 1.52
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeProjections 30.953102872965776 us/op 21.62078719752899 us/op 1.43
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeSelect 55.08231643432758 us/op 37.83900464050047 us/op 1.46
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameTimeZone 18.71411785372883 us/op 10.385651792848705 us/op 1.80
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameVeryLongQuery 586.3720588341728 us/op 450.30120823372454 us/op 1.30
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameVeryLongQuery01 1617.1239902005698 us/op 1263.1944751581673 us/op 1.28
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLCompiler 14.48512554399151 us/op 9.887778282688156 us/op 1.46
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLEvaluator 3.2674335479331917 us/op 2.7081749580536103 us/op 1.21
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLParser 21.110938921694828 us/op 13.306115091699724 us/op 1.59

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.