Repository: mirumee/ariadne
Pull request #1205 (2024-11-19 16:35:33)

Bump starlette from 0.37.1 to 0.40.0 in /tests_integrations/starlette
Bumps [starlette](https://github.com/encode/starlette) from 0.37.1 to 0.40.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/encode/starlette/releases">starlette's releases</a>.</em></p>
<blockquote>
<h2>Version 0.40.0</h2>
<p>This release fixes a Denial of service (DoS) via <code>multipart/form-data</code> requests.</p>
<p>You can view the full security advisory:
<a href="https://github.com/encode/starlette/security/advisories/GHSA-f96h-pmfr-66vw">GHSA-f96h-pmfr-66vw</a></p>
<h2>Fixed</h2>
<ul>
<li>Add <code>max_part_size</code> to <code>MultiPartParser</code> to limit the size of parts in <code>multipart/form-data</code>
requests <a href="https://github.com/encode/starlette/commit/fd038f3070c302bff17ef7d173dbb0b007617733">fd038f3</a>.</li>
</ul>
<h2>Version 0.39.2</h2>
<h2>Fixed</h2>
<ul>
<li>Allow use of <code>request.url_for</code> when only &quot;app&quot; scope is available <a href="https://redirect.github.com/encode/starlette/pull/2672">#2672</a>.</li>
<li>Fix internal type hints to support <code>python-multipart==0.0.12</code> <a href="https://redirect.github.com/encode/starlette/pull/2708">#2708</a>.</li>
</ul>
<hr />
<p><strong>Full Changelog</strong>: <a href="https://github.com/encode/starlette/compare/0.39.1...0.39.2">https://github.com/encode/starlette/compare/0.39.1...0.39.2</a></p>
<h2>Version 0.39.1</h2>
<h2>Fixed</h2>
<ul>
<li>Avoid regex re-compilation in <code>responses.py</code> and <code>schemas.py</code> <a href="https://redirect.github.com/encode/starlette/pull/2700">#2700</a>.</li>
<li>Improve performance of <code>get_route_path</code> by removing regular expression usage <a href="https://redirect.github.com/encode/starlette/pull/2701">#2701</a>.</li>
<li>Consider <code>FileResponse.chunk_size</code> when handling multiple ranges <a href="https://redirect.github.com/encode/starlette/pull/2703">#2703</a>.</li>
<li>Use <code>token_hex</code> for generating multipart boundary strings <a href="https://redirect.github.com/encode/starlette/pull/2702">#2702</a>.</li>
</ul>
<hr />
<p><strong>Full Changelog</strong>: <a href="https://github.com/encode/starlette/compare/0.39.0...0.39.1">https://github.com/encode/starlette/compare/0.39.0...0.39.1</a></p>
<h2>Version 0.39.0</h2>
<h2>Added</h2>
<ul>
<li>Add support for HTTP Range to <code>FileResponse</code> <a href="https://redirect.github.com/encode/starlette/pull/2697">#2697</a></li>
</ul>
<hr />
<p><strong>Full Changelog</strong>: <a href="https://github.com/encode/starlette/compare/0.38.6...0.39.0">https://github.com/encode/starlette/compare/0.38.6...0.39.0</a></p>
<h2>Version 0.38.6</h2>
<h2>Fixed</h2>
<ul>
<li>Close unclosed <code>MemoryObjectReceiveStream</code> in <code>TestClient</code> <a href="https://redirect.github.com/encode/starlette/pull/2693">#2693</a>.</li>
</ul>
<hr />
<p><strong>Full Changelog</strong>: <a href="https://github.com/encode/starlette/compare/0.38.5...0.38.6">https://github.com/encode/starlette/compare/0.38.5...0.38.6</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/encode/starlette/blob/master/docs/release-notes.md">starlette's changelog</a>.</em></p>
<blockquote>
<h2>0.40.0 (October 15, 2024)</h2>
<p>This release fixes a Denial of service (DoS) via <code>multipart/form-data</code> requests.</p>
<p>You can view the full security advisory:
<a href="https://github.com/encode/starlette/security/advisories/GHSA-f96h-pmfr-66vw">GHSA-f96h-pmfr-66vw</a></p>
<h4>Fixed</h4>
<ul>
<li>Add <code>max_part_size</code> to <code>MultiPartParser</code> to limit the size of parts in <code>multipart/form-data</code>
requests <a href="https://github.com/encode/starlette/commit/fd038f3070c302bff17ef7d173dbb0b007617733">fd038f3</a>.</li>
</ul>
<h2>0.39.2 (September 29, 2024)</h2>
<h4>Fixed</h4>
<ul>
<li>Allow use of <code>request.url_for</code> when only &quot;app&quot; scope is available <a href="https://redirect.github.com/encode/starlette/pull/2672">#2672</a>.</li>
<li>Fix internal type hints to support <code>python-multipart==0.0.12</code> <a href="https://redirect.github.com/encode/starlette/pull/2708">#2708</a>.</li>
</ul>
<h2>0.39.1 (September 25, 2024)</h2>
<h4>Fixed</h4>
<ul>
<li>Avoid regex re-compilation in <code>responses.py</code> and <code>schemas.py</code> <a href="https://redirect.github.com/encode/starlette/pull/2700">#2700</a>.</li>
<li>Improve performance of <code>get_route_path</code> by removing regular expression usage
<a href="https://redirect.github.com/encode/starlette/pull/2701">#2701</a>.</li>
<li>Consider <code>FileResponse.chunk_size</code> when handling multiple ranges <a href="https://redirect.github.com/encode/starlette/pull/2703">#2703</a>.</li>
<li>Use <code>token_hex</code> for generating multipart boundary strings <a href="https://redirect.github.com/encode/starlette/pull/2702">#2702</a>.</li>
</ul>
<h2>0.39.0 (September 23, 2024)</h2>
<h4>Added</h4>
<ul>
<li>Add support for <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests">HTTP Range</a> to
<code>FileResponse</code> <a href="https://redirect.github.com/encode/starlette/pull/2697">#2697</a>.</li>
</ul>
<h2>0.38.6 (September 22, 2024)</h2>
<h4>Fixed</h4>
<ul>
<li>Close unclosed <code>MemoryObjectReceiveStream</code> in <code>TestClient</code> <a href="https://redirect.github.com/encode/starlette/pull/2693">#2693</a>.</li>
</ul>
<h2>0.38.5 (September 7, 2024)</h2>
<h4>Fixed</h4>
<ul>
<li>Schedule <code>BackgroundTasks</code> from within <code>BaseHTTPMiddleware</code> <a href="https://redirect.github.com/encode/starlette/pull/2688">#2688</a>.
This behavior was removed in 0.38.3, and is now restored.</li>
</ul>
<h2>0.38.4 (September 1, 2024)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/encode/starlette/commit/4ded4b7ac517bd301cee69f5c189b1cb48c069b6"><code>4ded4b7</code></a> Version 0.40.0 (<a href="https://redirect.github.com/encode/starlette/issues/2728">#2728</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/fd038f3070c302bff17ef7d173dbb0b007617733"><code>fd038f3</code></a> Merge commit from fork</li>
<li><a href="https://github.com/encode/starlette/commit/e11684013fe5ca084f5bd4e54830512a4dff9618"><code>e116840</code></a> Bump the python-packages group with 6 updates (<a href="https://redirect.github.com/encode/starlette/issues/2713">#2713</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/0b50b9c4abd992a39d6e32148cc6f577ac3b1c44"><code>0b50b9c</code></a> Version 0.39.2 (<a href="https://redirect.github.com/encode/starlette/issues/2710">#2710</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/fe46d99d92da17efe1827f96ad29d748aac870d2"><code>fe46d99</code></a> Support <code>request.url_for</code> when only &quot;app&quot; scope is avaialable (<a href="https://redirect.github.com/encode/starlette/issues/2672">#2672</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/1a6018e08a994c78f5c169b8535408259af0f249"><code>1a6018e</code></a> Support python-multipart 0.0.12 (<a href="https://redirect.github.com/encode/starlette/issues/2708">#2708</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/fa7b382a66cd99e3dc18f3baa44dae5ec68be76b"><code>fa7b382</code></a> Version 0.39.1 (<a href="https://redirect.github.com/encode/starlette/issues/2706">#2706</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/075efd0c5c9f5e49a4416f3b4a24e24efab135f8"><code>075efd0</code></a> generate boundary with token_hex (<a href="https://redirect.github.com/encode/starlette/issues/2702">#2702</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/b8139f9fe3b1acb34ddbe38dc6472a60b621540e"><code>b8139f9</code></a> Consider <code>FileResponse.chunk_size</code> when handling multiple ranges (<a href="https://redirect.github.com/encode/starlette/issues/2703">#2703</a>)</li>
<li><a href="https://github.com/encode/starlette/commit/4fbf766b3eac4146b86175682cec88d266fd8470"><code>4fbf766</code></a> test: add tests in <code>test_requests</code> (<a href="https://redirect.github.com/encode/starlette/issues/2677">#2677</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/encode/starlette/compare/0.37.1...0.40.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=starlette&package-manager=pip&previous-version=0.37.1&new-version=0.40.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/mirumee/ariadne/network/alerts).

</details>


Patch:
diff --git a/ariadne/contrib/federation/utils.py b/ariadne/contrib/federation/utils.py
index bb6bc1d..a93acc4 100644
--- a/ariadne/contrib/federation/utils.py
+++ b/ariadne/contrib/federation/utils.py
@@ -1,9 +1,14 @@
 # pylint: disable=cell-var-from-loop
 
-import re
 from inspect import isawaitable
-from typing import Any, List
+from typing import Any, List, Tuple, cast
 
+from graphql import (
+    DirectiveDefinitionNode,
+    Node,
+    parse,
+    print_ast,
+)
 from graphql.language import DirectiveNode
 from graphql.type import (
     GraphQLNamedType,
@@ -14,36 +19,6 @@ from graphql.type import (
 )
 
 
-_i_token_delimiter = r"(?:^|[\s]+|$)"
-_i_token_name = "[_A-Za-z][_0-9A-Za-z]*"
-_i_token_arguments = r"\([^)]*\)"
-_i_token_location = "[_A-Za-z][_0-9A-Za-z]*"
-_i_token_description_block_string = r"(?:\"{3}(?:[^\"]{1,}|[\s])\"{3})"
-_i_token_description_single_line = r"(?:\"(?:[^\"\n\r])*?\")"
-
-_r_directive_definition = re.compile(
-    "("
-    f"(?:{_i_token_delimiter}(?:"
-    f"{_i_token_description_block_string}|{_i_token_description_single_line}"
-    "))??"
-    f"{_i_token_delimiter}directive"
-    f"(?:{_i_token_delimiter})?@({_i_token_name})"
-    f"(?:(?:{_i_token_delimiter})?{_i_token_arguments})?"
-    f"{_i_token_delimiter}on"
-    f"{_i_token_delimiter}(?:[|]{_i_token_delimiter})?{_i_token_location}"
-    f"(?:{_i_token_delimiter}[|]{_i_token_delimiter}{_i_token_location})*"
-    ")"
-    f"(?={_i_token_delimiter})",
-)
-
-_r_directive = re.compile(
-    "("
-    f"(?:{_i_token_delimiter})?@({_i_token_name})"
-    f"(?:(?:{_i_token_delimiter})?{_i_token_arguments})?"
-    ")"
-    f"(?={_i_token_delimiter})",
-)
-
 _allowed_directives = [
     "skip",  # Default directive as per specs.
     "include",  # Default directive as per specs.
@@ -66,14 +41,39 @@ _allowed_directives = [
 ]
 
 
+def _purge_directive_nodes(nodes: Tuple[Node, ...]) -> Tuple[Node, ...]:
+    return tuple(
+        node
+        for node in nodes
+        if not isinstance(node, (DirectiveNode, DirectiveDefinitionNode))
+        or node.name.value in _allowed_directives
+    )
+
+
+def _purge_type_directives(definition: Node):
+    # Recursively check every field defined on the Node definition
+    # and remove any directives found.
+    for key in definition.keys:
+        value = getattr(definition, key, None)
+        if isinstance(value, tuple):
+            # Remove directive nodes from the tuple
+            # e.g. doc -> definitions [DirectiveDefinitionNode]
+            next_value = _purge_directive_nodes(cast(Tuple[Node, ...], value))
+            for item in next_value:
+                if isinstance(item, Node):
+                    # Look for directive nodes on sub-nodes
+                    # e.g. doc -> definitions [ObjectTypeDefinitionNode] -> fields -> directives
+                    _purge_type_directives(item)
+            setattr(definition, key, next_value)
+        elif isinstance(value, Node):
+            _purge_type_directives(value)
+
+
 def purge_schema_directives(joined_type_defs: str) -> str:
     """Remove custom schema directives from federation."""
-    joined_type_defs = _r_directive_definition.sub("", joined_type_defs)
-    joined_type_defs = _r_directive.sub(
-        lambda m: m.group(1) if m.group(2) in _allowed_directives else "",
-        joined_type_defs,
-    )
-    return joined_type_defs
+    ast_document = parse(joined_type_defs)
+    _purge_type_directives(ast_document)
+    return print_ast(ast_document)
 
 
 def resolve_entities(_: Any, info: GraphQLResolveInfo, **kwargs) -> Any:
diff --git a/benchmark/results/Linux-CPython-3.11-64bit/0024_bdee375af62971084fc3175d1af56a99e048bdf4_20231025_153201.json b/benchmark/results/Linux-CPython-3.10-64bit/0052_4a1d80732930742ad09a3c193c308ce202a4166e_20241119_164843.json
similarity index 57%
rename from benchmark/results/Linux-CPython-3.11-64bit/0024_bdee375af62971084fc3175d1af56a99e048bdf4_20231025_153201.json
rename to benchmark/results/Linux-CPython-3.10-64bit/0052_4a1d80732930742ad09a3c193c308ce202a4166e_20241119_164843.json
index 101e957..ebb5e08 100644
--- a/benchmark/results/Linux-CPython-3.11-64bit/0024_bdee375af62971084fc3175d1af56a99e048bdf4_20231025_153201.json
+++ b/benchmark/results/Linux-CPython-3.10-64bit/0052_4a1d80732930742ad09a3c193c308ce202a4166e_20241119_164843.json
@@ -1,20 +1,20 @@
 {
     "machine_info": {
-        "node": "fv-az553-285",
+        "node": "fv-az1121-475",
         "processor": "x86_64",
         "machine": "x86_64",
         "python_compiler": "GCC 11.4.0",
         "python_implementation": "CPython",
-        "python_implementation_version": "3.11.6",
-        "python_version": "3.11.6",
+        "python_implementation_version": "3.10.15",
+        "python_version": "3.10.15",
         "python_build": [
             "main",
-            "Oct  3 2023 04:42:57"
+            "Sep  9 2024 03:02:45"
         ],
-        "release": "6.2.0-1014-azure",
+        "release": "6.5.0-1025-azure",
         "system": "Linux",
         "cpu": {
-            "python_version": "3.11.6.final.0 (64 bit)",
+            "python_version": "3.10.15.final.0 (64 bit)",
             "cpuinfo_version": [
                 9,
                 0,
@@ -23,53 +23,59 @@
             "cpuinfo_version_string": "9.0.0",
             "arch": "X86_64",
             "bits": 64,
-            "count": 2,
+            "count": 4,
             "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz",
-            "hz_advertised_friendly": "2.6000 GHz",
-            "hz_actual_friendly": "2.5939 GHz",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "3.2428 GHz",
+            "hz_actual_friendly": "3.2428 GHz",
             "hz_advertised": [
-                2600000000,
+                3242818000,
                 0
             ],
             "hz_actual": [
-                2593906000,
+                3242818000,
                 0
             ],
-            "stepping": 7,
-            "model": 85,
-            "family": 6,
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
             "flags": [
+                "3dnowext",
                 "3dnowprefetch",
                 "abm",
                 "adx",
                 "aes",
+                "aperfmperf",
                 "apic",
+                "arat",
                 "avx",
                 "avx2",
-                "avx512bw",
-                "avx512cd",
-                "avx512dq",
-                "avx512f",
-                "avx512vl",
                 "bmi1",
                 "bmi2",
                 "clflush",
                 "clflushopt",
+                "clwb",
+                "clzero",
                 "cmov",
+                "cmp_legacy",
                 "constant_tsc",
                 "cpuid",
+                "cr8_legacy",
                 "cx16",
                 "cx8",
                 "de",
+                "decodeassists",
                 "erms",
+                "extd_apicid",
                 "f16c",
+                "flushbyasid",
                 "fma",
                 "fpu",
                 "fsgsbase",
+                "fsrm",
                 "fxsr",
-                "hle",
+                "fxsr_opt",
                 "ht",
                 "hypervisor",
                 "invpcid",
@@ -78,64 +84,84 @@
                 "lm",
                 "mca",
                 "mce",
-                "md_clear",
+                "misalignsse",
                 "mmx",
+                "mmxext",
                 "movbe",
                 "msr",
                 "mtrr",
+                "nonstop_tsc",
                 "nopl",
+                "npt",
+                "nrip_save",
                 "nx",
+                "osvw",
                 "osxsave",
                 "pae",
                 "pat",
+                "pausefilter",
                 "pcid",
                 "pclmulqdq",
                 "pdpe1gb",
+                "pfthreshold",
                 "pge",
                 "pni",
                 "popcnt",
                 "pse",
                 "pse36",
-                "pti",
+                "rdpid",
+                "rdpru",
                 "rdrand",
                 "rdrnd",
                 "rdseed",
                 "rdtscp",
                 "rep_good",
-                "rtm",
                 "sep",
+                "sha",
+                "sha_ni",
                 "smap",
                 "smep",
-                "ss",
                 "sse",
                 "sse2",
                 "sse4_1",
                 "sse4_2",
+                "sse4a",
                 "ssse3",
+                "svm",
                 "syscall",
+                "topoext",
                 "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
                 "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
                 "xsave",
                 "xsavec",
+                "xsaveerptr",
                 "xsaveopt",
-                "xsaves",
-                "xtopology"
+                "xsaves"
             ],
-            "l3_cache_size": 37486592,
-            "l2_cache_size": 2097152,
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
             "l1_data_cache_size": 65536,
             "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
+            "l2_cache_line_size": 512,
             "l2_cache_associativity": 6
         }
     },
     "commit_info": {
-        "id": "bdee375af62971084fc3175d1af56a99e048bdf4",
-        "time": "2023-10-25T15:31:30+00:00",
-        "author_time": "2023-10-25T15:31:30+00:00",
+        "id": "4a1d80732930742ad09a3c193c308ce202a4166e",
+        "time": "2024-11-19T16:48:21Z",
+        "author_time": "2024-11-19T16:48:21Z",
         "dirty": false,
         "project": "ariadne",
-        "branch": "master"
+        "branch": "main"
     },
     "benchmarks": [
         {
@@ -154,22 +180,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.1346151379999867,
-                "max": 1.1770120219999995,
-                "mean": 1.1468675391999965,
-                "stddev": 0.017661393525947613,
+                "min": 1.002802398,
+                "max": 1.068786767000006,
+                "mean": 1.0350631961999994,
+                "stddev": 0.028191470636414688,
                 "rounds": 5,
-                "median": 1.1378206759999898,
-                "iqr": 0.01934072300000622,
-                "q1": 1.1361167309999978,
-                "q3": 1.155457454000004,
+                "median": 1.0311538679999899,
+                "iqr": 0.049746089749991285,
+                "q1": 1.0112904562500056,
+                "q3": 1.0610365459999969,
                 "iqr_outliers": 0,
-                "stddev_outliers": 1,
-                "outliers": "1;0",
-                "ld15iqr": 1.1346151379999867,
-                "hd15iqr": 1.1770120219999995,
-                "ops": 0.8719402771636167,
-                "total": 5.734337695999983,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 1.002802398,
+                "hd15iqr": 1.068786767000006,
+                "ops": 0.9661245841522276,
+                "total": 5.175315980999997,
                 "iterations": 1
             }
         },
@@ -189,22 +215,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.1327566390000072,
-                "max": 1.2441627900000185,
-                "mean": 1.1957336435999935,
-                "stddev": 0.04048759319305456,
+                "min": 1.0358900539999922,
+                "max": 1.084838406000003,
+                "mean": 1.0612142256000028,
+                "stddev": 0.017624453847653675,
                 "rounds": 5,
-                "median": 1.1971036189999893,
-                "iqr": 0.041132695249999074,
-                "q1": 1.1782905197499858,
-                "q3": 1.2194232149999849,
+                "median": 1.062145614000002,
+                "iqr": 0.019103342500002896,
+                "q1": 1.051738281500004,
+                "q3": 1.070841624000007,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.1327566390000072,
-                "hd15iqr": 1.2441627900000185,
-                "ops": 0.8363066518637893,
-                "total": 5.978668217999967,
+                "ld15iqr": 1.0358900539999922,
+                "hd15iqr": 1.084838406000003,
+                "ops": 0.9423168064248361,
+                "total": 5.3060711280000135,
                 "iterations": 1
             }
         },
@@ -224,22 +250,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.3603590959999963,
-                "max": 1.4168750060000264,
-                "mean": 1.3913086646000068,
-                "stddev": 0.02535652137126278,
+                "min": 1.229691953999989,
+                "max": 1.2955501099999935,
+                "mean": 1.2652441387999942,
+                "stddev": 0.025242474700776868,
                 "rounds": 5,
-                "median": 1.3978032659999826,
-                "iqr": 0.04625668175001607,
-                "q1": 1.3670906550000055,
-                "q3": 1.4133473367500216,
+                "median": 1.2675904849999995,
+                "iqr": 0.0364941852500138,
+                "q1": 1.247428719749987,
+                "q3": 1.2839229050000007,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.3603590959999963,
-                "hd15iqr": 1.4168750060000264,
-                "ops": 0.7187477699547672,
-                "total": 6.956543323000034,
+                "ld15iqr": 1.229691953999989,
+                "hd15iqr": 1.2955501099999935,
+                "ops": 0.7903612981352659,
+                "total": 6.3262206939999714,
                 "iterations": 1
             }
         },
@@ -259,26 +285,26 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.2952206410000144,
-                "max": 1.3368659820000062,
-                "mean": 1.3121656006000024,
-                "stddev": 0.015805074191376042,
+                "min": 1.1233835339999985,
+                "max": 1.1743345209999916,
+                "mean": 1.1555877925999964,
+                "stddev": 0.020450022462859867,
                 "rounds": 5,
-                "median": 1.309520526,
-                "iqr": 0.020010558250007193,
-                "q1": 1.3012133689999956,
-                "q3": 1.3212239272500028,
+                "median": 1.1618279970000032,
+                "iqr": 0.028443919000004314,
+                "q1": 1.1423901389999926,
+                "q3": 1.170834057999997,
                 "iqr_outliers": 0,
-                "stddev_outliers": 2,
-                "outliers": "2;0",
-                "ld15iqr": 1.2952206410000144,
-                "hd15iqr": 1.3368659820000062,
-                "ops": 0.7620989298475275,
-                "total": 6.560828003000012,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 1.1233835339999985,
+                "hd15iqr": 1.1743345209999916,
+                "ops": 0.865360474040718,
+                "total": 5.777938962999983,
                 "iterations": 1
             }
         }
     ],
-    "datetime": "2023-10-25T15:32:39.979200",
-    "version": "4.0.0"
+    "datetime": "2024-11-19T16:49:17.407693+00:00",
+    "version": "5.1.0"
 }
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.11-64bit/0052_e4a810143c049591b4a57c1e97da4147f070187b_20241119_163758.json b/benchmark/results/Linux-CPython-3.11-64bit/0052_e4a810143c049591b4a57c1e97da4147f070187b_20241119_163758.json
new file mode 100644
index 0000000..eff35b3
--- /dev/null
+++ b/benchmark/results/Linux-CPython-3.11-64bit/0052_e4a810143c049591b4a57c1e97da4147f070187b_20241119_163758.json
@@ -0,0 +1,310 @@
+{
+    "machine_info": {
+        "node": "fv-az665-524",
+        "processor": "x86_64",
+        "machine": "x86_64",
+        "python_compiler": "GCC 11.4.0",
+        "python_implementation": "CPython",
+        "python_implementation_version": "3.11.10",
+        "python_version": "3.11.10",
+        "python_build": [
+            "main",
+            "Sep  9 2024 03:20:25"
+        ],
+        "release": "6.5.0-1025-azure",
+        "system": "Linux",
+        "cpu": {
+            "python_version": "3.11.10.final.0 (64 bit)",
+            "cpuinfo_version": [
+                9,
+                0,
+                0
+            ],
+            "cpuinfo_version_string": "9.0.0",
+            "arch": "X86_64",
+            "bits": 64,
+            "count": 4,
+            "arch_string_raw": "x86_64",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "3.2436 GHz",
+            "hz_actual_friendly": "3.2436 GHz",
+            "hz_advertised": [
+                3243559000,
+                0
+            ],
+            "hz_actual": [
+                3243559000,
+                0
+            ],
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
+            "flags": [
+                "3dnowext",
+                "3dnowprefetch",
+                "abm",
+                "adx",
+                "aes",
+                "aperfmperf",
+                "apic",
+                "arat",
+                "avx",
+                "avx2",
+                "bmi1",
+                "bmi2",
+                "clflush",
+                "clflushopt",
+                "clwb",
+                "clzero",
+                "cmov",
+                "cmp_legacy",
+                "constant_tsc",
+                "cpuid",
+                "cr8_legacy",
+                "cx16",
+                "cx8",
+                "de",
+                "decodeassists",
+                "erms",
+                "extd_apicid",
+                "f16c",
+                "flushbyasid",
+                "fma",
+                "fpu",
+                "fsgsbase",
+                "fsrm",
+                "fxsr",
+                "fxsr_opt",
+                "ht",
+                "hypervisor",
+                "invpcid",
+                "invpcid_single",
+                "lahf_lm",
+                "lm",
+                "mca",
+                "mce",
+                "misalignsse",
+                "mmx",
+                "mmxext",
+                "movbe",
+                "msr",
+                "mtrr",
+                "nonstop_tsc",
+                "nopl",
+                "npt",
+                "nrip_save",
+                "nx",
+                "osvw",
+                "osxsave",
+                "pae",
+                "pat",
+                "pausefilter",
+                "pcid",
+                "pclmulqdq",
+                "pdpe1gb",
+                "pfthreshold",
+                "pge",
+                "pni",
+                "popcnt",
+                "pse",
+                "pse36",
+                "rdpid",
+                "rdpru",
+                "rdrand",
+                "rdrnd",
+                "rdseed",
+                "rdtscp",
+                "rep_good",
+                "sep",
+                "sha",
+                "sha_ni",
+                "smap",
+                "smep",
+                "sse",
+                "sse2",
+                "sse4_1",
+                "sse4_2",
+                "sse4a",
+                "ssse3",
+                "svm",
+                "syscall",
+                "topoext",
+                "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
+                "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
+                "xsave",
+                "xsavec",
+                "xsaveerptr",
+                "xsaveopt",
+                "xsaves"
+            ],
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
+            "l1_data_cache_size": 65536,
+            "l1_instruction_cache_size": 65536,
+            "l2_cache_line_size": 512,
+            "l2_cache_associativity": 6
+        }
+    },
+    "commit_info": {
+        "id": "e4a810143c049591b4a57c1e97da4147f070187b",
+        "time": "2024-11-19T16:35:50Z",
+        "author_time": "2024-11-19T16:35:50Z",
+        "dirty": false,
+        "project": "ariadne",
+        "branch": "main"
+    },
+    "benchmarks": [
+        {
+            "group": null,
+            "name": "test_query_without_extensions",
+            "fullname": "benchmark/test_extensions.py::test_query_without_extensions",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.8565311299999792,
+                "max": 0.9826667750000126,
+                "mean": 0.9173938015999965,
+                "stddev": 0.05760671431161522,
+                "rounds": 5,
+                "median": 0.9351804160000086,
+                "iqr": 0.10460864850001172,
+                "q1": 0.8573169214999865,
+                "q3": 0.9619255699999982,
+                "iqr_outliers": 0,
+                "stddev_outliers": 3,
+                "outliers": "3;0",
+                "ld15iqr": 0.8565311299999792,
+                "hd15iqr": 0.9826667750000126,
+                "ops": 1.0900444261296869,
+                "total": 4.586969007999983,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_noop_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_noop_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.8903108210000141,
+                "max": 0.968692271000009,
+                "mean": 0.9276119776000087,
+                "stddev": 0.02965538317641203,
+                "rounds": 5,
+                "median": 0.9316811909999956,
+                "iqr": 0.040580448749992115,
+                "q1": 0.9048510140000161,
+                "q3": 0.9454314627500082,
+                "iqr_outliers": 0,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 0.8903108210000141,
+                "hd15iqr": 0.968692271000009,
+                "ops": 1.0780369638900948,
+                "total": 4.638059888000043,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_open_telemetry_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_open_telemetry_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 1.0642021499999998,
+                "max": 1.1711296569999945,
+                "mean": 1.1194031344000053,
+                "stddev": 0.04730729422197723,
+                "rounds": 5,
+                "median": 1.1388521679999997,
+                "iqr": 0.08208248799999751,
+                "q1": 1.0719371182500126,
+                "q3": 1.15401960625001,
+                "iqr_outliers": 0,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 1.0642021499999998,
+                "hd15iqr": 1.1711296569999945,
+                "ops": 0.8933332141650606,
+                "total": 5.597015672000026,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_open_tracing_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_open_tracing_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.9629680569999834,
+                "max": 1.0084722210000052,
+                "mean": 0.9904317488000004,
+                "stddev": 0.018318557074290753,
+                "rounds": 5,
+                "median": 0.9894162610000024,
+                "iqr": 0.026638148750024015,
+                "q1": 0.9798492872499907,
+                "q3": 1.0064874360000147,
+                "iqr_outliers": 0,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 0.9629680569999834,
+                "hd15iqr": 1.0084722210000052,
+                "ops": 1.009660687080753,
+                "total": 4.952158744000002,
+                "iterations": 1
+            }
+        }
+    ],
+    "datetime": "2024-11-19T16:38:28.816597+00:00",
+    "version": "5.1.0"
+}
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.11-64bit/0053_a76315a7610009ce6150d56ca126a27917a757f4_20241119_163852.json b/benchmark/results/Linux-CPython-3.11-64bit/0053_a76315a7610009ce6150d56ca126a27917a757f4_20241119_163852.json
new file mode 100644
index 0000000..b4e6638
--- /dev/null
+++ b/benchmark/results/Linux-CPython-3.11-64bit/0053_a76315a7610009ce6150d56ca126a27917a757f4_20241119_163852.json
@@ -0,0 +1,310 @@
+{
+    "machine_info": {
+        "node": "fv-az575-736",
+        "processor": "x86_64",
+        "machine": "x86_64",
+        "python_compiler": "GCC 11.4.0",
+        "python_implementation": "CPython",
+        "python_implementation_version": "3.11.10",
+        "python_version": "3.11.10",
+        "python_build": [
+            "main",
+            "Sep  9 2024 03:20:25"
+        ],
+        "release": "6.5.0-1025-azure",
+        "system": "Linux",
+        "cpu": {
+            "python_version": "3.11.10.final.0 (64 bit)",
+            "cpuinfo_version": [
+                9,
+                0,
+                0
+            ],
+            "cpuinfo_version_string": "9.0.0",
+            "arch": "X86_64",
+            "bits": 64,
+            "count": 4,
+            "arch_string_raw": "x86_64",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "2.6911 GHz",
+            "hz_actual_friendly": "2.6911 GHz",
+            "hz_advertised": [
+                2691149000,
+                0
+            ],
+            "hz_actual": [
+                2691149000,
+                0
+            ],
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
+            "flags": [
+                "3dnowext",
+                "3dnowprefetch",
+                "abm",
+                "adx",
+                "aes",
+                "aperfmperf",
+                "apic",
+                "arat",
+                "avx",
+                "avx2",
+                "bmi1",
+                "bmi2",
+                "clflush",
+                "clflushopt",
+                "clwb",
+                "clzero",
+                "cmov",
+                "cmp_legacy",
+                "constant_tsc",
+                "cpuid",
+                "cr8_legacy",
+                "cx16",
+                "cx8",
+                "de",
+                "decodeassists",
+                "erms",
+                "extd_apicid",
+                "f16c",
+                "flushbyasid",
+                "fma",
+                "fpu",
+                "fsgsbase",
+                "fsrm",
+                "fxsr",
+                "fxsr_opt",
+                "ht",
+                "hypervisor",
+                "invpcid",
+                "invpcid_single",
+                "lahf_lm",
+                "lm",
+                "mca",
+                "mce",
+                "misalignsse",
+                "mmx",
+                "mmxext",
+                "movbe",
+                "msr",
+                "mtrr",
+                "nonstop_tsc",
+                "nopl",
+                "npt",
+                "nrip_save",
+                "nx",
+                "osvw",
+                "osxsave",
+                "pae",
+                "pat",
+                "pausefilter",
+                "pcid",
+                "pclmulqdq",
+                "pdpe1gb",
+                "pfthreshold",
+                "pge",
+                "pni",
+                "popcnt",
+                "pse",
+                "pse36",
+                "rdpid",
+                "rdpru",
+                "rdrand",
+                "rdrnd",
+                "rdseed",
+                "rdtscp",
+                "rep_good",
+                "sep",
+                "sha",
+                "sha_ni",
+                "smap",
+                "smep",
+                "sse",
+                "sse2",
+                "sse4_1",
+                "sse4_2",
+                "sse4a",
+                "ssse3",
+                "svm",
+                "syscall",
+                "topoext",
+                "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
+                "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
+                "xsave",
+                "xsavec",
+                "xsaveerptr",
+                "xsaveopt",
+                "xsaves"
+            ],
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
+            "l1_data_cache_size": 65536,
+            "l1_instruction_cache_size": 65536,
+            "l2_cache_line_size": 512,
+            "l2_cache_associativity": 6
+        }
+    },
+    "commit_info": {
+        "id": "a76315a7610009ce6150d56ca126a27917a757f4",
+        "time": "2024-11-19T16:38:28Z",
+        "author_time": "2024-11-19T16:38:28Z",
+        "dirty": false,
+        "project": "ariadne",
+        "branch": "main"
+    },
+    "benchmarks": [
+        {
+            "group": null,
+            "name": "test_query_without_extensions",
+            "fullname": "benchmark/test_extensions.py::test_query_without_extensions",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.8244986739999831,
+                "max": 1.0209091499999943,
+                "mean": 0.8926206813999954,
+                "stddev": 0.07521454683435419,
+                "rounds": 5,
+                "median": 0.8784799190000001,
+                "iqr": 0.06657068150002488,
+                "q1": 0.8495965112499846,
+                "q3": 0.9161671927500095,
+                "iqr_outliers": 1,
+                "stddev_outliers": 1,
+                "outliers": "1;1",
+                "ld15iqr": 0.8244986739999831,
+                "hd15iqr": 1.0209091499999943,
+                "ops": 1.1202966958278289,
+                "total": 4.463103406999977,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_noop_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_noop_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.8618312419999938,
+                "max": 0.9316322840000169,
+                "mean": 0.8996316502000014,
+                "stddev": 0.03286818404657893,
+                "rounds": 5,
+                "median": 0.9087827500000003,
+                "iqr": 0.06218699475000733,
+                "q1": 0.866556433999996,
+                "q3": 0.9287434287500034,
+                "iqr_outliers": 0,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 0.8618312419999938,
+                "hd15iqr": 0.9316322840000169,
+                "ops": 1.1115660501469522,
+                "total": 4.498158251000007,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_open_telemetry_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_open_telemetry_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 1.021531667000005,
+                "max": 1.1193661270000064,
+                "mean": 1.0682239863999996,
+                "stddev": 0.043194687255017156,
+                "rounds": 5,
+                "median": 1.08271800899999,
+                "iqr": 0.0750813537499937,
+                "q1": 1.0241355957500033,
+                "q3": 1.099216949499997,
+                "iqr_outliers": 0,
+                "stddev_outliers": 3,
+                "outliers": "3;0",
+                "ld15iqr": 1.021531667000005,
+                "hd15iqr": 1.1193661270000064,
+                "ops": 0.9361332573799247,
+                "total": 5.341119931999998,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_open_tracing_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_open_tracing_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.9516042349999907,
+                "max": 1.0536222220000013,
+                "mean": 0.9899438103999956,
+                "stddev": 0.04549619491812447,
+                "rounds": 5,
+                "median": 0.9677712219999819,
+                "iqr": 0.07590668000000989,
+                "q1": 0.9539704819999955,
+                "q3": 1.0298771620000053,
+                "iqr_outliers": 0,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 0.9516042349999907,
+                "hd15iqr": 1.0536222220000013,
+                "ops": 1.010158343831597,
+                "total": 4.949719051999978,
+                "iterations": 1
+            }
+        }
+    ],
+    "datetime": "2024-11-19T16:39:21.895829+00:00",
+    "version": "5.1.0"
+}
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.11-64bit/0023_c44d706444e8d23e13fb72292a01b8603deb1b58_20231024_134007.json b/benchmark/results/Linux-CPython-3.11-64bit/0054_bd14bb99cf9f29201d268ef79722f82f95413b0a_20241119_164943.json
similarity index 56%
rename from benchmark/results/Linux-CPython-3.11-64bit/0023_c44d706444e8d23e13fb72292a01b8603deb1b58_20231024_134007.json
rename to benchmark/results/Linux-CPython-3.11-64bit/0054_bd14bb99cf9f29201d268ef79722f82f95413b0a_20241119_164943.json
index 96ed7dd..854e05d 100644
--- a/benchmark/results/Linux-CPython-3.11-64bit/0023_c44d706444e8d23e13fb72292a01b8603deb1b58_20231024_134007.json
+++ b/benchmark/results/Linux-CPython-3.11-64bit/0054_bd14bb99cf9f29201d268ef79722f82f95413b0a_20241119_164943.json
@@ -1,20 +1,20 @@
 {
     "machine_info": {
-        "node": "fv-az477-186",
+        "node": "fv-az658-802",
         "processor": "x86_64",
         "machine": "x86_64",
         "python_compiler": "GCC 11.4.0",
         "python_implementation": "CPython",
-        "python_implementation_version": "3.11.6",
-        "python_version": "3.11.6",
+        "python_implementation_version": "3.11.10",
+        "python_version": "3.11.10",
         "python_build": [
             "main",
-            "Oct  3 2023 04:42:57"
+            "Sep  9 2024 03:20:25"
         ],
-        "release": "6.2.0-1014-azure",
+        "release": "6.5.0-1025-azure",
         "system": "Linux",
         "cpu": {
-            "python_version": "3.11.6.final.0 (64 bit)",
+            "python_version": "3.11.10.final.0 (64 bit)",
             "cpuinfo_version": [
                 9,
                 0,
@@ -23,53 +23,59 @@
             "cpuinfo_version_string": "9.0.0",
             "arch": "X86_64",
             "bits": 64,
-            "count": 2,
+            "count": 4,
             "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz",
-            "hz_advertised_friendly": "2.8000 GHz",
-            "hz_actual_friendly": "2.7934 GHz",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "2.4454 GHz",
+            "hz_actual_friendly": "2.4454 GHz",
             "hz_advertised": [
-                2800000000,
+                2445434000,
                 0
             ],
             "hz_actual": [
-                2793437000,
+                2445434000,
                 0
             ],
-            "stepping": 6,
-            "model": 106,
-            "family": 6,
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
             "flags": [
+                "3dnowext",
                 "3dnowprefetch",
                 "abm",
                 "adx",
                 "aes",
+                "aperfmperf",
                 "apic",
+                "arat",
                 "avx",
                 "avx2",
-                "avx512bw",
-                "avx512cd",
-                "avx512dq",
-                "avx512f",
-                "avx512vl",
                 "bmi1",
                 "bmi2",
                 "clflush",
                 "clflushopt",
+                "clwb",
+                "clzero",
                 "cmov",
+                "cmp_legacy",
                 "constant_tsc",
                 "cpuid",
+                "cr8_legacy",
                 "cx16",
                 "cx8",
                 "de",
+                "decodeassists",
                 "erms",
+                "extd_apicid",
                 "f16c",
+                "flushbyasid",
                 "fma",
                 "fpu",
                 "fsgsbase",
+                "fsrm",
                 "fxsr",
-                "hle",
+                "fxsr_opt",
                 "ht",
                 "hypervisor",
                 "invpcid",
@@ -78,64 +84,84 @@
                 "lm",
                 "mca",
                 "mce",
-                "md_clear",
+                "misalignsse",
                 "mmx",
+                "mmxext",
                 "movbe",
                 "msr",
                 "mtrr",
+                "nonstop_tsc",
                 "nopl",
+                "npt",
+                "nrip_save",
                 "nx",
+                "osvw",
                 "osxsave",
                 "pae",
                 "pat",
+                "pausefilter",
                 "pcid",
                 "pclmulqdq",
                 "pdpe1gb",
+                "pfthreshold",
                 "pge",
                 "pni",
                 "popcnt",
                 "pse",
                 "pse36",
-                "pti",
+                "rdpid",
+                "rdpru",
                 "rdrand",
                 "rdrnd",
                 "rdseed",
                 "rdtscp",
                 "rep_good",
-                "rtm",
                 "sep",
+                "sha",
+                "sha_ni",
                 "smap",
                 "smep",
-                "ss",
                 "sse",
                 "sse2",
                 "sse4_1",
                 "sse4_2",
+                "sse4a",
                 "ssse3",
+                "svm",
                 "syscall",
+                "topoext",
                 "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
                 "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
                 "xsave",
                 "xsavec",
+                "xsaveerptr",
                 "xsaveopt",
-                "xsaves",
-                "xtopology"
+                "xsaves"
             ],
-            "l3_cache_size": 50331648,
-            "l2_cache_size": "2.5 MiB",
-            "l1_data_cache_size": 98304,
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
+            "l1_data_cache_size": 65536,
             "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
+            "l2_cache_line_size": 512,
             "l2_cache_associativity": 6
         }
     },
     "commit_info": {
-        "id": "c44d706444e8d23e13fb72292a01b8603deb1b58",
-        "time": "2023-10-24T13:39:36+00:00",
-        "author_time": "2023-10-24T13:39:36+00:00",
+        "id": "bd14bb99cf9f29201d268ef79722f82f95413b0a",
+        "time": "2024-11-19T16:49:17Z",
+        "author_time": "2024-11-19T16:49:17Z",
         "dirty": false,
         "project": "ariadne",
-        "branch": "master"
+        "branch": "main"
     },
     "benchmarks": [
         {
@@ -154,22 +180,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.0247406389999867,
-                "max": 1.0733194379999986,
-                "mean": 1.041529148399991,
-                "stddev": 0.01877968676529115,
+                "min": 0.8397016650000069,
+                "max": 0.9330739850000214,
+                "mean": 0.8929137825999988,
+                "stddev": 0.042724735655379396,
                 "rounds": 5,
-                "median": 1.0354694059999758,
-                "iqr": 0.01897995149999332,
-                "q1": 1.030561130999999,
-                "q3": 1.0495410824999922,
+                "median": 0.9157291709999811,
+                "iqr": 0.0740891704999953,
+                "q1": 0.8505764055,
+                "q3": 0.9246655759999953,
                 "iqr_outliers": 0,
                 "stddev_outliers": 1,
                 "outliers": "1;0",
-                "ld15iqr": 1.0247406389999867,
-                "hd15iqr": 1.0733194379999986,
-                "ops": 0.9601267535682622,
-                "total": 5.207645741999954,
+                "ld15iqr": 0.8397016650000069,
+                "hd15iqr": 0.9330739850000214,
+                "ops": 1.1199289556133696,
+                "total": 4.464568912999994,
                 "iterations": 1
             }
         },
@@ -189,22 +215,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.0341329629999905,
-                "max": 1.0874000549999892,
-                "mean": 1.071857707800001,
-                "stddev": 0.02195030691004965,
+                "min": 0.8761944759999949,
+                "max": 0.9223054370000057,
+                "mean": 0.8964016258000015,
+                "stddev": 0.023677903505389657,
                 "rounds": 5,
-                "median": 1.082494195999999,
-                "iqr": 0.022965520750005908,
-                "q1": 1.0619318637500044,
-                "q3": 1.0848973845000103,
+                "median": 0.8851213860000087,
+                "iqr": 0.045409219750006,
+                "q1": 0.8765029404999964,
+                "q3": 0.9219121602500024,
                 "iqr_outliers": 0,
-                "stddev_outliers": 1,
-                "outliers": "1;0",
-                "ld15iqr": 1.0341329629999905,
-                "hd15iqr": 1.0874000549999892,
-                "ops": 0.9329596575393485,
-                "total": 5.359288539000005,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 0.8761944759999949,
+                "hd15iqr": 0.9223054370000057,
+                "ops": 1.115571381419061,
+                "total": 4.482008129000008,
                 "iterations": 1
             }
         },
@@ -224,22 +250,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.2644616430000042,
-                "max": 1.2989596930000005,
-                "mean": 1.2849725428000056,
-                "stddev": 0.013041603250701368,
+                "min": 1.0186495779999802,
+                "max": 1.0744187500000066,
+                "mean": 1.045831934599994,
+                "stddev": 0.02586508480981746,
                 "rounds": 5,
-                "median": 1.2865678550000155,
-                "iqr": 0.016072319249992972,
-                "q1": 1.277969078500007,
-                "q3": 1.29404139775,
+                "median": 1.0448312389999899,
+                "iqr": 0.049420401000013214,
+                "q1": 1.021145880249989,
+                "q3": 1.0705662812500023,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.2644616430000042,
-                "hd15iqr": 1.2989596930000005,
-                "ops": 0.778226745468787,
-                "total": 6.424862714000028,
+                "ld15iqr": 1.0186495779999802,
+                "hd15iqr": 1.0744187500000066,
+                "ops": 0.9561765776281028,
+                "total": 5.22915967299997,
                 "iterations": 1
             }
         },
@@ -259,26 +285,26 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.1686460880000027,
-                "max": 1.1859206020000101,
-                "mean": 1.1769496561999973,
-                "stddev": 0.006485035949478855,
+                "min": 0.9254489879999994,
+                "max": 0.9471721190000153,
+                "mean": 0.9344839562000005,
+                "stddev": 0.00822018403123572,
                 "rounds": 5,
-                "median": 1.1767772359999924,
-                "iqr": 0.0088983512500036,
-                "q1": 1.1723982937499926,
-                "q3": 1.1812966449999962,
+                "median": 0.9327437359999919,
+                "iqr": 0.010496195750008042,
+                "q1": 0.9289751422499961,
+                "q3": 0.9394713380000042,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.1686460880000027,
-                "hd15iqr": 1.1859206020000101,
-                "ops": 0.849654014283574,
-                "total": 5.884748280999986,
+                "ld15iqr": 0.9254489879999994,
+                "hd15iqr": 0.9471721190000153,
+                "ops": 1.070109329716494,
+                "total": 4.672419781000002,
                 "iterations": 1
             }
         }
     ],
-    "datetime": "2023-10-24T13:40:42.633375",
-    "version": "4.0.0"
+    "datetime": "2024-11-19T16:50:12.843703+00:00",
+    "version": "5.1.0"
 }
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.12-64bit/0026_28d6d4bd63e4d366a685ffd3f60ad5d7689d2dba_20241119_163950.json b/benchmark/results/Linux-CPython-3.12-64bit/0026_28d6d4bd63e4d366a685ffd3f60ad5d7689d2dba_20241119_163950.json
new file mode 100644
index 0000000..bb8a643
--- /dev/null
+++ b/benchmark/results/Linux-CPython-3.12-64bit/0026_28d6d4bd63e4d366a685ffd3f60ad5d7689d2dba_20241119_163950.json
@@ -0,0 +1,310 @@
+{
+    "machine_info": {
+        "node": "fv-az693-321",
+        "processor": "x86_64",
+        "machine": "x86_64",
+        "python_compiler": "GCC 11.4.0",
+        "python_implementation": "CPython",
+        "python_implementation_version": "3.12.7",
+        "python_version": "3.12.7",
+        "python_build": [
+            "main",
+            "Oct  1 2024 15:17:55"
+        ],
+        "release": "6.5.0-1025-azure",
+        "system": "Linux",
+        "cpu": {
+            "python_version": "3.12.7.final.0 (64 bit)",
+            "cpuinfo_version": [
+                9,
+                0,
+                0
+            ],
+            "cpuinfo_version_string": "9.0.0",
+            "arch": "X86_64",
+            "bits": 64,
+            "count": 4,
+            "arch_string_raw": "x86_64",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "3.2289 GHz",
+            "hz_actual_friendly": "3.2289 GHz",
+            "hz_advertised": [
+                3228908000,
+                0
+            ],
+            "hz_actual": [
+                3228908000,
+                0
+            ],
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
+            "flags": [
+                "3dnowext",
+                "3dnowprefetch",
+                "abm",
+                "adx",
+                "aes",
+                "aperfmperf",
+                "apic",
+                "arat",
+                "avx",
+                "avx2",
+                "bmi1",
+                "bmi2",
+                "clflush",
+                "clflushopt",
+                "clwb",
+                "clzero",
+                "cmov",
+                "cmp_legacy",
+                "constant_tsc",
+                "cpuid",
+                "cr8_legacy",
+                "cx16",
+                "cx8",
+                "de",
+                "decodeassists",
+                "erms",
+                "extd_apicid",
+                "f16c",
+                "flushbyasid",
+                "fma",
+                "fpu",
+                "fsgsbase",
+                "fsrm",
+                "fxsr",
+                "fxsr_opt",
+                "ht",
+                "hypervisor",
+                "invpcid",
+                "invpcid_single",
+                "lahf_lm",
+                "lm",
+                "mca",
+                "mce",
+                "misalignsse",
+                "mmx",
+                "mmxext",
+                "movbe",
+                "msr",
+                "mtrr",
+                "nonstop_tsc",
+                "nopl",
+                "npt",
+                "nrip_save",
+                "nx",
+                "osvw",
+                "osxsave",
+                "pae",
+                "pat",
+                "pausefilter",
+                "pcid",
+                "pclmulqdq",
+                "pdpe1gb",
+                "pfthreshold",
+                "pge",
+                "pni",
+                "popcnt",
+                "pse",
+                "pse36",
+                "rdpid",
+                "rdpru",
+                "rdrand",
+                "rdrnd",
+                "rdseed",
+                "rdtscp",
+                "rep_good",
+                "sep",
+                "sha",
+                "sha_ni",
+                "smap",
+                "smep",
+                "sse",
+                "sse2",
+                "sse4_1",
+                "sse4_2",
+                "sse4a",
+                "ssse3",
+                "svm",
+                "syscall",
+                "topoext",
+                "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
+                "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
+                "xsave",
+                "xsavec",
+                "xsaveerptr",
+                "xsaveopt",
+                "xsaves"
+            ],
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
+            "l1_data_cache_size": 65536,
+            "l1_instruction_cache_size": 65536,
+            "l2_cache_line_size": 512,
+            "l2_cache_associativity": 6
+        }
+    },
+    "commit_info": {
+        "id": "28d6d4bd63e4d366a685ffd3f60ad5d7689d2dba",
+        "time": "2024-11-19T16:39:22Z",
+        "author_time": "2024-11-19T16:39:22Z",
+        "dirty": false,
+        "project": "ariadne",
+        "branch": "main"
+    },
+    "benchmarks": [
+        {
+            "group": null,
+            "name": "test_query_without_extensions",
+            "fullname": "benchmark/test_extensions.py::test_query_without_extensions",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 0.9730524600000194,
+                "max": 1.0778625909999846,
+                "mean": 1.0209843120000073,
+                "stddev": 0.038960955167050164,
+                "rounds": 5,
+                "median": 1.0091272889999914,
+                "iqr": 0.047266674250010965,
+                "q1": 0.9995607517500105,
+                "q3": 1.0468274260000214,
+                "iqr_outliers": 0,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 0.9730524600000194,
+                "hd15iqr": 1.0778625909999846,
+                "ops": 0.9794469790050925,
+                "total": 5.104921560000037,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_noop_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_noop_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 1.041115029000025,
+                "max": 1.1344830200000047,
+                "mean": 1.0807006030000026,
+                "stddev": 0.04019174197338685,
+                "rounds": 5,
+                "median": 1.077855618000001,
+                "iqr": 0.06993157474994405,
+                "q1": 1.0432524742500249,
+                "q3": 1.113184048999969,
+                "iqr_outliers": 0,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 1.041115029000025,
+                "hd15iqr": 1.1344830200000047,
+                "ops": 0.9253256611720403,
+                "total": 5.4035030150000125,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_open_telemetry_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_open_telemetry_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 1.2446947700000237,
+                "max": 1.277398101000017,
+                "mean": 1.2600915836000126,
+                "stddev": 0.013593212481409793,
+                "rounds": 5,
+                "median": 1.2646587550000277,
+                "iqr": 0.021621150249998777,
+                "q1": 1.2470908932500038,
+                "q3": 1.2687120435000026,
+                "iqr_outliers": 0,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 1.2446947700000237,
+                "hd15iqr": 1.277398101000017,
+                "ops": 0.7935931110205933,
+                "total": 6.300457918000063,
+                "iterations": 1
+            }
+        },
+        {
+            "group": null,
+            "name": "test_query_with_open_tracing_extension",
+            "fullname": "benchmark/test_extensions.py::test_query_with_open_tracing_extension",
+            "params": null,
+            "param": null,
+            "extra_info": {},
+            "options": {
+                "disable_gc": false,
+                "timer": "perf_counter",
+                "min_rounds": 5,
+                "max_time": 1.0,
+                "min_time": 5e-06,
+                "warmup": false
+            },
+            "stats": {
+                "min": 1.083641924999995,
+                "max": 1.1167823360000284,
+                "mean": 1.10227213820001,
+                "stddev": 0.012241865025813944,
+                "rounds": 5,
+                "median": 1.104337982000004,
+                "iqr": 0.014599802750026925,
+                "q1": 1.0952275492499979,
+                "q3": 1.1098273520000248,
+                "iqr_outliers": 0,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 1.083641924999995,
+                "hd15iqr": 1.1167823360000284,
+                "ops": 0.9072169796770709,
+                "total": 5.51136069100005,
+                "iterations": 1
+            }
+        }
+    ],
+    "datetime": "2024-11-19T16:40:24.960069+00:00",
+    "version": "5.1.0"
+}
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.9-64bit/0024_7e6cc6c056c045da26935350f917b0d46ec8624b_20231025_152915.json b/benchmark/results/Linux-CPython-3.12-64bit/0027_9426eda87d296fbf400f14d5aa7734dfe0801bee_20241119_165040.json
similarity index 56%
rename from benchmark/results/Linux-CPython-3.9-64bit/0024_7e6cc6c056c045da26935350f917b0d46ec8624b_20231025_152915.json
rename to benchmark/results/Linux-CPython-3.12-64bit/0027_9426eda87d296fbf400f14d5aa7734dfe0801bee_20241119_165040.json
index f6fda9a..0364dae 100644
--- a/benchmark/results/Linux-CPython-3.9-64bit/0024_7e6cc6c056c045da26935350f917b0d46ec8624b_20231025_152915.json
+++ b/benchmark/results/Linux-CPython-3.12-64bit/0027_9426eda87d296fbf400f14d5aa7734dfe0801bee_20241119_165040.json
@@ -1,20 +1,20 @@
 {
     "machine_info": {
-        "node": "fv-az442-684",
+        "node": "fv-az1110-954",
         "processor": "x86_64",
         "machine": "x86_64",
         "python_compiler": "GCC 11.4.0",
         "python_implementation": "CPython",
-        "python_implementation_version": "3.9.18",
-        "python_version": "3.9.18",
+        "python_implementation_version": "3.12.7",
+        "python_version": "3.12.7",
         "python_build": [
             "main",
-            "Aug 28 2023 08:38:32"
+            "Oct  1 2024 15:17:55"
         ],
-        "release": "6.2.0-1015-azure",
+        "release": "6.5.0-1025-azure",
         "system": "Linux",
         "cpu": {
-            "python_version": "3.9.18.final.0 (64 bit)",
+            "python_version": "3.12.7.final.0 (64 bit)",
             "cpuinfo_version": [
                 9,
                 0,
@@ -23,53 +23,59 @@
             "cpuinfo_version_string": "9.0.0",
             "arch": "X86_64",
             "bits": 64,
-            "count": 2,
+            "count": 4,
             "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz",
-            "hz_advertised_friendly": "2.6000 GHz",
-            "hz_actual_friendly": "2.5939 GHz",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "2.4454 GHz",
+            "hz_actual_friendly": "2.4454 GHz",
             "hz_advertised": [
-                2600000000,
+                2445429000,
                 0
             ],
             "hz_actual": [
-                2593905000,
+                2445429000,
                 0
             ],
-            "stepping": 7,
-            "model": 85,
-            "family": 6,
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
             "flags": [
+                "3dnowext",
                 "3dnowprefetch",
                 "abm",
                 "adx",
                 "aes",
+                "aperfmperf",
                 "apic",
+                "arat",
                 "avx",
                 "avx2",
-                "avx512bw",
-                "avx512cd",
-                "avx512dq",
-                "avx512f",
-                "avx512vl",
                 "bmi1",
                 "bmi2",
                 "clflush",
                 "clflushopt",
+                "clwb",
+                "clzero",
                 "cmov",
+                "cmp_legacy",
                 "constant_tsc",
                 "cpuid",
+                "cr8_legacy",
                 "cx16",
                 "cx8",
                 "de",
+                "decodeassists",
                 "erms",
+                "extd_apicid",
                 "f16c",
+                "flushbyasid",
                 "fma",
                 "fpu",
                 "fsgsbase",
+                "fsrm",
                 "fxsr",
-                "hle",
+                "fxsr_opt",
                 "ht",
                 "hypervisor",
                 "invpcid",
@@ -78,64 +84,84 @@
                 "lm",
                 "mca",
                 "mce",
-                "md_clear",
+                "misalignsse",
                 "mmx",
+                "mmxext",
                 "movbe",
                 "msr",
                 "mtrr",
+                "nonstop_tsc",
                 "nopl",
+                "npt",
+                "nrip_save",
                 "nx",
+                "osvw",
                 "osxsave",
                 "pae",
                 "pat",
+                "pausefilter",
                 "pcid",
                 "pclmulqdq",
                 "pdpe1gb",
+                "pfthreshold",
                 "pge",
                 "pni",
                 "popcnt",
                 "pse",
                 "pse36",
-                "pti",
+                "rdpid",
+                "rdpru",
                 "rdrand",
                 "rdrnd",
                 "rdseed",
                 "rdtscp",
                 "rep_good",
-                "rtm",
                 "sep",
+                "sha",
+                "sha_ni",
                 "smap",
                 "smep",
-                "ss",
                 "sse",
                 "sse2",
                 "sse4_1",
                 "sse4_2",
+                "sse4a",
                 "ssse3",
+                "svm",
                 "syscall",
+                "topoext",
                 "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
                 "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
                 "xsave",
                 "xsavec",
+                "xsaveerptr",
                 "xsaveopt",
-                "xsaves",
-                "xtopology"
+                "xsaves"
             ],
-            "l3_cache_size": 37486592,
-            "l2_cache_size": 2097152,
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
             "l1_data_cache_size": 65536,
             "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
+            "l2_cache_line_size": 512,
             "l2_cache_associativity": 6
         }
     },
     "commit_info": {
-        "id": "7e6cc6c056c045da26935350f917b0d46ec8624b",
-        "time": "2023-10-25T15:28:40+00:00",
-        "author_time": "2023-10-25T15:28:40+00:00",
+        "id": "9426eda87d296fbf400f14d5aa7734dfe0801bee",
+        "time": "2024-11-19T16:50:12Z",
+        "author_time": "2024-11-19T16:50:12Z",
         "dirty": false,
         "project": "ariadne",
-        "branch": "master"
+        "branch": "main"
     },
     "benchmarks": [
         {
@@ -154,22 +180,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.3766697830000112,
-                "max": 1.4257441839999956,
-                "mean": 1.4001889710000115,
-                "stddev": 0.02029808338107359,
+                "min": 0.9964549580000153,
+                "max": 1.0662081760000035,
+                "mean": 1.0292846706000034,
+                "stddev": 0.025350409236735347,
                 "rounds": 5,
-                "median": 1.3981270510000172,
-                "iqr": 0.03445582100000877,
-                "q1": 1.3832252742500089,
-                "q3": 1.4176810952500176,
+                "median": 1.0240859870000065,
+                "iqr": 0.028139992999996366,
+                "q1": 1.0161407322500011,
+                "q3": 1.0442807252499975,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.3766697830000112,
-                "hd15iqr": 1.4257441839999956,
-                "ops": 0.7141893135223044,
-                "total": 7.000944855000057,
+                "ld15iqr": 0.9964549580000153,
+                "hd15iqr": 1.0662081760000035,
+                "ops": 0.9715485215737912,
+                "total": 5.146423353000017,
                 "iterations": 1
             }
         },
@@ -189,22 +215,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.4190051130000256,
-                "max": 1.4798389510000334,
-                "mean": 1.4447669664000045,
-                "stddev": 0.025715400392289242,
+                "min": 1.018320813999992,
+                "max": 1.0724990699999921,
+                "mean": 1.0489004077999937,
+                "stddev": 0.02777580777385238,
                 "rounds": 5,
-                "median": 1.4521197039999834,
-                "iqr": 0.04027510949997293,
-                "q1": 1.4195446022500136,
-                "q3": 1.4598197117499865,
+                "median": 1.067180909000001,
+                "iqr": 0.050224957999979836,
+                "q1": 1.0186779737500018,
+                "q3": 1.0689029317499816,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.4190051130000256,
-                "hd15iqr": 1.4798389510000334,
-                "ops": 0.6921531452866396,
-                "total": 7.223834832000023,
+                "ld15iqr": 1.018320813999992,
+                "hd15iqr": 1.0724990699999921,
+                "ops": 0.9533793604842242,
+                "total": 5.244502038999968,
                 "iterations": 1
             }
         },
@@ -224,22 +250,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.6955984059999878,
-                "max": 1.759440686000005,
-                "mean": 1.7333158425999955,
-                "stddev": 0.024535161869963042,
+                "min": 1.2328291309999884,
+                "max": 1.27465817800001,
+                "mean": 1.252999602999995,
+                "stddev": 0.01604504335399034,
                 "rounds": 5,
-                "median": 1.742230128000017,
-                "iqr": 0.031683155250036066,
-                "q1": 1.717029556249969,
-                "q3": 1.748712711500005,
+                "median": 1.2574878069999897,
+                "iqr": 0.021872535500008894,
+                "q1": 1.2400082329999904,
+                "q3": 1.2618807684999993,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.6955984059999878,
-                "hd15iqr": 1.759440686000005,
-                "ops": 0.5769288986016463,
-                "total": 8.666579212999977,
+                "ld15iqr": 1.2328291309999884,
+                "hd15iqr": 1.27465817800001,
+                "ops": 0.7980848498321543,
+                "total": 6.264998014999975,
                 "iterations": 1
             }
         },
@@ -259,26 +285,26 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.5492836249999868,
-                "max": 1.6105074209999657,
-                "mean": 1.5768975872000055,
-                "stddev": 0.0252408311792924,
+                "min": 1.109153111000012,
+                "max": 1.1464530320000108,
+                "mean": 1.1217420224000079,
+                "stddev": 0.015202310595791888,
                 "rounds": 5,
-                "median": 1.5655073520000542,
-                "iqr": 0.039304996499993194,
-                "q1": 1.5600174592500053,
-                "q3": 1.5993224557499985,
+                "median": 1.1173587950000012,
+                "iqr": 0.02025382424999833,
+                "q1": 1.1102282960000096,
+                "q3": 1.130482120250008,
                 "iqr_outliers": 0,
-                "stddev_outliers": 2,
-                "outliers": "2;0",
-                "ld15iqr": 1.5492836249999868,
-                "hd15iqr": 1.6105074209999657,
-                "ops": 0.6341565921066789,
-                "total": 7.884487936000028,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 1.109153111000012,
+                "hd15iqr": 1.1464530320000108,
+                "ops": 0.89147056990917,
+                "total": 5.60871011200004,
                 "iterations": 1
             }
         }
     ],
-    "datetime": "2023-10-25T15:30:01.441717",
-    "version": "4.0.0"
+    "datetime": "2024-11-19T16:51:14.978410+00:00",
+    "version": "5.1.0"
 }
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.8-64bit/0022_94f65b5cbe55253c84af30166f5ccddf61fe88cd_20231024_132259.json b/benchmark/results/Linux-CPython-3.8-64bit/0052_fb35a0923d2125a1291a9cc91b27a6a28ffb3a48_20241119_164641.json
similarity index 58%
rename from benchmark/results/Linux-CPython-3.8-64bit/0022_94f65b5cbe55253c84af30166f5ccddf61fe88cd_20231024_132259.json
rename to benchmark/results/Linux-CPython-3.8-64bit/0052_fb35a0923d2125a1291a9cc91b27a6a28ffb3a48_20241119_164641.json
index af0050c..d19e4ac 100644
--- a/benchmark/results/Linux-CPython-3.8-64bit/0022_94f65b5cbe55253c84af30166f5ccddf61fe88cd_20231024_132259.json
+++ b/benchmark/results/Linux-CPython-3.8-64bit/0052_fb35a0923d2125a1291a9cc91b27a6a28ffb3a48_20241119_164641.json
@@ -1,6 +1,6 @@
 {
     "machine_info": {
-        "node": "fv-az189-75",
+        "node": "fv-az529-860",
         "processor": "x86_64",
         "machine": "x86_64",
         "python_compiler": "GCC 11.4.0",
@@ -9,9 +9,9 @@
         "python_version": "3.8.18",
         "python_build": [
             "default",
-            "Aug 28 2023 08:27:22"
+            "Jul 16 2024 19:04:00"
         ],
-        "release": "6.2.0-1015-azure",
+        "release": "6.5.0-1025-azure",
         "system": "Linux",
         "cpu": {
             "python_version": "3.8.18.final.0 (64 bit)",
@@ -23,53 +23,59 @@
             "cpuinfo_version_string": "9.0.0",
             "arch": "X86_64",
             "bits": 64,
-            "count": 2,
+            "count": 4,
             "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz",
-            "hz_advertised_friendly": "2.8000 GHz",
-            "hz_actual_friendly": "2.7934 GHz",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "3.2437 GHz",
+            "hz_actual_friendly": "3.2437 GHz",
             "hz_advertised": [
-                2800000000,
+                3243746000,
                 0
             ],
             "hz_actual": [
-                2793438000,
+                3243746000,
                 0
             ],
-            "stepping": 6,
-            "model": 106,
-            "family": 6,
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
             "flags": [
+                "3dnowext",
                 "3dnowprefetch",
                 "abm",
                 "adx",
                 "aes",
+                "aperfmperf",
                 "apic",
+                "arat",
                 "avx",
                 "avx2",
-                "avx512bw",
-                "avx512cd",
-                "avx512dq",
-                "avx512f",
-                "avx512vl",
                 "bmi1",
                 "bmi2",
                 "clflush",
                 "clflushopt",
+                "clwb",
+                "clzero",
                 "cmov",
+                "cmp_legacy",
                 "constant_tsc",
                 "cpuid",
+                "cr8_legacy",
                 "cx16",
                 "cx8",
                 "de",
+                "decodeassists",
                 "erms",
+                "extd_apicid",
                 "f16c",
+                "flushbyasid",
                 "fma",
                 "fpu",
                 "fsgsbase",
+                "fsrm",
                 "fxsr",
-                "hle",
+                "fxsr_opt",
                 "ht",
                 "hypervisor",
                 "invpcid",
@@ -78,64 +84,84 @@
                 "lm",
                 "mca",
                 "mce",
-                "md_clear",
+                "misalignsse",
                 "mmx",
+                "mmxext",
                 "movbe",
                 "msr",
                 "mtrr",
+                "nonstop_tsc",
                 "nopl",
+                "npt",
+                "nrip_save",
                 "nx",
+                "osvw",
                 "osxsave",
                 "pae",
                 "pat",
+                "pausefilter",
                 "pcid",
                 "pclmulqdq",
                 "pdpe1gb",
+                "pfthreshold",
                 "pge",
                 "pni",
                 "popcnt",
                 "pse",
                 "pse36",
-                "pti",
+                "rdpid",
+                "rdpru",
                 "rdrand",
                 "rdrnd",
                 "rdseed",
                 "rdtscp",
                 "rep_good",
-                "rtm",
                 "sep",
+                "sha",
+                "sha_ni",
                 "smap",
                 "smep",
-                "ss",
                 "sse",
                 "sse2",
                 "sse4_1",
                 "sse4_2",
+                "sse4a",
                 "ssse3",
+                "svm",
                 "syscall",
+                "topoext",
                 "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
                 "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
                 "xsave",
                 "xsavec",
+                "xsaveerptr",
                 "xsaveopt",
-                "xsaves",
-                "xtopology"
+                "xsaves"
             ],
-            "l3_cache_size": 50331648,
-            "l2_cache_size": "2.5 MiB",
-            "l1_data_cache_size": 98304,
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
+            "l1_data_cache_size": 65536,
             "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
+            "l2_cache_line_size": 512,
             "l2_cache_associativity": 6
         }
     },
     "commit_info": {
-        "id": "94f65b5cbe55253c84af30166f5ccddf61fe88cd",
-        "time": "2023-10-24T13:19:39+00:00",
-        "author_time": "2023-10-24T13:19:39+00:00",
+        "id": "fb35a0923d2125a1291a9cc91b27a6a28ffb3a48",
+        "time": "2024-11-19T17:46:16+01:00",
+        "author_time": "2024-11-19T11:46:16-05:00",
         "dirty": false,
         "project": "ariadne",
-        "branch": "master"
+        "branch": "main"
     },
     "benchmarks": [
         {
@@ -154,22 +180,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.2899942550000105,
-                "max": 1.3277879410000253,
-                "mean": 1.3100436158000093,
-                "stddev": 0.01560528763426289,
+                "min": 1.1224053500000082,
+                "max": 1.1946605599999884,
+                "mean": 1.1524286638000034,
+                "stddev": 0.027983318238854887,
                 "rounds": 5,
-                "median": 1.3128034130000117,
-                "iqr": 0.026203568499973073,
-                "q1": 1.2964831665000176,
-                "q3": 1.3226867349999907,
+                "median": 1.153004435000014,
+                "iqr": 0.038335474499987754,
+                "q1": 1.1299928667500083,
+                "q3": 1.168328341249996,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.2899942550000105,
-                "hd15iqr": 1.3277879410000253,
-                "ops": 0.7633333638203535,
-                "total": 6.550218079000047,
+                "ld15iqr": 1.1224053500000082,
+                "hd15iqr": 1.1946605599999884,
+                "ops": 0.8677326687646009,
+                "total": 5.7621433190000175,
                 "iterations": 1
             }
         },
@@ -189,22 +215,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.314720685000026,
-                "max": 1.3630854460000137,
-                "mean": 1.3416965982000022,
-                "stddev": 0.020747847161725484,
+                "min": 1.1567680999999936,
+                "max": 1.2047465109999962,
+                "mean": 1.1823188696000044,
+                "stddev": 0.019670269795864868,
                 "rounds": 5,
-                "median": 1.337854300999993,
-                "iqr": 0.03526825950000756,
-                "q1": 1.326900096249993,
-                "q3": 1.3621683557500006,
+                "median": 1.1874975869999957,
+                "iqr": 0.03220025675000926,
+                "q1": 1.165057504250008,
+                "q3": 1.1972577610000172,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.314720685000026,
-                "hd15iqr": 1.3630854460000137,
-                "ops": 0.7453249872896625,
-                "total": 6.708482991000011,
+                "ld15iqr": 1.1567680999999936,
+                "hd15iqr": 1.2047465109999962,
+                "ops": 0.8457955173618386,
+                "total": 5.911594348000023,
                 "iterations": 1
             }
         },
@@ -224,22 +250,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.5828401910000025,
-                "max": 1.6383390439999914,
-                "mean": 1.6132441914000026,
-                "stddev": 0.020644591557031727,
+                "min": 1.4118965749999859,
+                "max": 1.4793439170000227,
+                "mean": 1.452507322599996,
+                "stddev": 0.026449081020719998,
                 "rounds": 5,
-                "median": 1.616985136000011,
-                "iqr": 0.02621751124998184,
-                "q1": 1.6000598685000114,
-                "q3": 1.6262773797499932,
+                "median": 1.4645928089999813,
+                "iqr": 0.03465107500001352,
+                "q1": 1.4340932659999908,
+                "q3": 1.4687443410000043,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.5828401910000025,
-                "hd15iqr": 1.6383390439999914,
-                "ops": 0.6198689605274089,
-                "total": 8.066220957000013,
+                "ld15iqr": 1.4118965749999859,
+                "hd15iqr": 1.4793439170000227,
+                "ops": 0.6884646875376811,
+                "total": 7.26253661299998,
                 "iterations": 1
             }
         },
@@ -259,26 +285,26 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.439749656999993,
-                "max": 1.481423253999992,
-                "mean": 1.458130711199999,
-                "stddev": 0.015693430768269494,
+                "min": 1.2850388740000085,
+                "max": 1.3537013220000063,
+                "mean": 1.3163955658000077,
+                "stddev": 0.02517550476175324,
                 "rounds": 5,
-                "median": 1.4586846830000013,
-                "iqr": 0.020451978750003263,
-                "q1": 1.4464691102499998,
-                "q3": 1.466921089000003,
+                "median": 1.3187415810000118,
+                "iqr": 0.028801718000003973,
+                "q1": 1.2996276850000044,
+                "q3": 1.3284294030000083,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.439749656999993,
-                "hd15iqr": 1.481423253999992,
-                "ops": 0.6858095727076684,
-                "total": 7.290653555999995,
+                "ld15iqr": 1.2850388740000085,
+                "hd15iqr": 1.3537013220000063,
+                "ops": 0.7596500823764732,
+                "total": 6.581977829000039,
                 "iterations": 1
             }
         }
     ],
-    "datetime": "2023-10-24T13:23:42.215019",
+    "datetime": "2024-11-19T16:47:20.489937",
     "version": "4.0.0"
 }
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.9-64bit/0023_8a0b2b50e0bc5c5ce8ac6afa564fc223824faea6_20231024_133729.json b/benchmark/results/Linux-CPython-3.9-64bit/0023_8a0b2b50e0bc5c5ce8ac6afa564fc223824faea6_20231024_133729.json
deleted file mode 100644
index 1fd45e9..0000000
--- a/benchmark/results/Linux-CPython-3.9-64bit/0023_8a0b2b50e0bc5c5ce8ac6afa564fc223824faea6_20231024_133729.json
+++ /dev/null
@@ -1,270 +0,0 @@
-{
-    "machine_info": {
-        "node": "fv-az422-305",
-        "processor": "x86_64",
-        "machine": "x86_64",
-        "python_compiler": "GCC 11.4.0",
-        "python_implementation": "CPython",
-        "python_implementation_version": "3.9.18",
-        "python_version": "3.9.18",
-        "python_build": [
-            "main",
-            "Aug 28 2023 08:38:32"
-        ],
-        "release": "6.2.0-1014-azure",
-        "system": "Linux",
-        "cpu": {
-            "python_version": "3.9.18.final.0 (64 bit)",
-            "cpuinfo_version": [
-                9,
-                0,
-                0
-            ],
-            "cpuinfo_version_string": "9.0.0",
-            "arch": "X86_64",
-            "bits": 64,
-            "count": 2,
-            "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) CPU E5-2673 v3 @ 2.40GHz",
-            "hz_advertised_friendly": "2.4000 GHz",
-            "hz_actual_friendly": "2.3945 GHz",
-            "hz_advertised": [
-                2400000000,
-                0
-            ],
-            "hz_actual": [
-                2394455000,
-                0
-            ],
-            "stepping": 2,
-            "model": 63,
-            "family": 6,
-            "flags": [
-                "abm",
-                "aes",
-                "apic",
-                "avx",
-                "avx2",
-                "bmi1",
-                "bmi2",
-                "clflush",
-                "cmov",
-                "constant_tsc",
-                "cpuid",
-                "cx16",
-                "cx8",
-                "de",
-                "erms",
-                "f16c",
-                "fma",
-                "fpu",
-                "fsgsbase",
-                "fxsr",
-                "ht",
-                "hypervisor",
-                "invpcid",
-                "invpcid_single",
-                "lahf_lm",
-                "lm",
-                "mca",
-                "mce",
-                "md_clear",
-                "mmx",
-                "movbe",
-                "msr",
-                "mtrr",
-                "nopl",
-                "nx",
-                "osxsave",
-                "pae",
-                "pat",
-                "pcid",
-                "pclmulqdq",
-                "pdpe1gb",
-                "pge",
-                "pni",
-                "popcnt",
-                "pse",
-                "pse36",
-                "pti",
-                "rdrand",
-                "rdrnd",
-                "rdtscp",
-                "rep_good",
-                "sep",
-                "smep",
-                "ss",
-                "sse",
-                "sse2",
-                "sse4_1",
-                "sse4_2",
-                "ssse3",
-                "syscall",
-                "tsc",
-                "vme",
-                "xsave",
-                "xsaveopt",
-                "xtopology"
-            ],
-            "l3_cache_size": 31457280,
-            "l2_cache_size": 524288,
-            "l1_data_cache_size": 65536,
-            "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
-            "l2_cache_associativity": 6
-        }
-    },
-    "commit_info": {
-        "id": "8a0b2b50e0bc5c5ce8ac6afa564fc223824faea6",
-        "time": "2023-10-24T13:35:33+00:00",
-        "author_time": "2023-10-24T13:35:33+00:00",
-        "dirty": false,
-        "project": "ariadne",
-        "branch": "master"
-    },
-    "benchmarks": [
-        {
-            "group": null,
-            "name": "test_query_without_extensions",
-            "fullname": "benchmark/test_extensions.py::test_query_without_extensions",
-            "params": null,
-            "param": null,
-            "extra_info": {},
-            "options": {
-                "disable_gc": false,
-                "timer": "perf_counter",
-                "min_rounds": 5,
-                "max_time": 1.0,
-                "min_time": 5e-06,
-                "warmup": false
-            },
-            "stats": {
-                "min": 1.5634898570000075,
-                "max": 1.7616455790000032,
-                "mean": 1.6515733028,
-                "stddev": 0.07217861261116912,
-                "rounds": 5,
-                "median": 1.6557776539999907,
-                "iqr": 0.07559948500000502,
-                "q1": 1.6066997209999982,
-                "q3": 1.6822992060000033,
-                "iqr_outliers": 0,
-                "stddev_outliers": 2,
-                "outliers": "2;0",
-                "ld15iqr": 1.5634898570000075,
-                "hd15iqr": 1.7616455790000032,
-                "ops": 0.6054832675635086,
-                "total": 8.257866514,
-                "iterations": 1
-            }
-        },
-        {
-            "group": null,
-            "name": "test_query_with_noop_extension",
-            "fullname": "benchmark/test_extensions.py::test_query_with_noop_extension",
-            "params": null,
-            "param": null,
-            "extra_info": {},
-            "options": {
-                "disable_gc": false,
-                "timer": "perf_counter",
-                "min_rounds": 5,
-                "max_time": 1.0,
-                "min_time": 5e-06,
-                "warmup": false
-            },
-            "stats": {
-                "min": 1.6248173120000047,
-                "max": 1.7134689709999975,
-                "mean": 1.670496831600002,
-                "stddev": 0.03218809678811772,
-                "rounds": 5,
-                "median": 1.6706544500000007,
-                "iqr": 0.03745245300000022,
-                "q1": 1.6523883432500028,
-                "q3": 1.689840796250003,
-                "iqr_outliers": 0,
-                "stddev_outliers": 2,
-                "outliers": "2;0",
-                "ld15iqr": 1.6248173120000047,
-                "hd15iqr": 1.7134689709999975,
-                "ops": 0.5986243021138806,
-                "total": 8.35248415800001,
-                "iterations": 1
-            }
-        },
-        {
-            "group": null,
-            "name": "test_query_with_open_telemetry_extension",
-            "fullname": "benchmark/test_extensions.py::test_query_with_open_telemetry_extension",
-            "params": null,
-            "param": null,
-            "extra_info": {},
-            "options": {
-                "disable_gc": false,
-                "timer": "perf_counter",
-                "min_rounds": 5,
-                "max_time": 1.0,
-                "min_time": 5e-06,
-                "warmup": false
-            },
-            "stats": {
-                "min": 1.9711156229999744,
-                "max": 2.203345313,
-                "mean": 2.0627896427999928,
-                "stddev": 0.09856278100195176,
-                "rounds": 5,
-                "median": 2.0549051319999876,
-                "iqr": 0.1630355449999925,
-                "q1": 1.9720081492500015,
-                "q3": 2.135043694249994,
-                "iqr_outliers": 0,
-                "stddev_outliers": 1,
-                "outliers": "1;0",
-                "ld15iqr": 1.9711156229999744,
-                "hd15iqr": 2.203345313,
-                "ops": 0.4847804057434661,
-                "total": 10.313948213999964,
-                "iterations": 1
-            }
-        },
-        {
-            "group": null,
-            "name": "test_query_with_open_tracing_extension",
-            "fullname": "benchmark/test_extensions.py::test_query_with_open_tracing_extension",
-            "params": null,
-            "param": null,
-            "extra_info": {},
-            "options": {
-                "disable_gc": false,
-                "timer": "perf_counter",
-                "min_rounds": 5,
-                "max_time": 1.0,
-                "min_time": 5e-06,
-                "warmup": false
-            },
-            "stats": {
-                "min": 1.9024634130000209,
-                "max": 1.9747007759999917,
-                "mean": 1.9340883157999997,
-                "stddev": 0.029509844346884445,
-                "rounds": 5,
-                "median": 1.938693440999998,
-                "iqr": 0.04652437649998831,
-                "q1": 1.9068523162500028,
-                "q3": 1.9533766927499912,
-                "iqr_outliers": 0,
-                "stddev_outliers": 2,
-                "outliers": "2;0",
-                "ld15iqr": 1.9024634130000209,
-                "hd15iqr": 1.9747007759999917,
-                "ops": 0.5170394711713919,
-                "total": 9.670441578999998,
-                "iterations": 1
-            }
-        }
-    ],
-    "datetime": "2023-10-24T13:38:24.354320",
-    "version": "4.0.0"
-}
\ No newline at end of file
diff --git a/benchmark/results/Linux-CPython-3.10-64bit/0022_73ce096d9b567ead19faf6554c1c5018ef773787_20231024_132531.json b/benchmark/results/Linux-CPython-3.9-64bit/0053_3734073224ef53de65b0bf96195aaf169f6c26e9_20241119_163513.json
similarity index 57%
rename from benchmark/results/Linux-CPython-3.10-64bit/0022_73ce096d9b567ead19faf6554c1c5018ef773787_20231024_132531.json
rename to benchmark/results/Linux-CPython-3.9-64bit/0053_3734073224ef53de65b0bf96195aaf169f6c26e9_20241119_163513.json
index a6b5b7f..94f3099 100644
--- a/benchmark/results/Linux-CPython-3.10-64bit/0022_73ce096d9b567ead19faf6554c1c5018ef773787_20231024_132531.json
+++ b/benchmark/results/Linux-CPython-3.9-64bit/0053_3734073224ef53de65b0bf96195aaf169f6c26e9_20241119_163513.json
@@ -1,20 +1,20 @@
 {
     "machine_info": {
-        "node": "fv-az1250-266",
+        "node": "fv-az1759-524",
         "processor": "x86_64",
         "machine": "x86_64",
         "python_compiler": "GCC 11.4.0",
         "python_implementation": "CPython",
-        "python_implementation_version": "3.10.13",
-        "python_version": "3.10.13",
+        "python_implementation_version": "3.9.20",
+        "python_version": "3.9.20",
         "python_build": [
             "main",
-            "Aug 28 2023 08:28:42"
+            "Sep  9 2024 03:07:22"
         ],
-        "release": "6.2.0-1014-azure",
+        "release": "6.5.0-1025-azure",
         "system": "Linux",
         "cpu": {
-            "python_version": "3.10.13.final.0 (64 bit)",
+            "python_version": "3.9.20.final.0 (64 bit)",
             "cpuinfo_version": [
                 9,
                 0,
@@ -23,53 +23,59 @@
             "cpuinfo_version_string": "9.0.0",
             "arch": "X86_64",
             "bits": 64,
-            "count": 2,
+            "count": 4,
             "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz",
-            "hz_advertised_friendly": "2.6000 GHz",
-            "hz_actual_friendly": "2.0951 GHz",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "2.4454 GHz",
+            "hz_actual_friendly": "2.4454 GHz",
             "hz_advertised": [
-                2600000000,
+                2445427000,
                 0
             ],
             "hz_actual": [
-                2095077000,
+                2445427000,
                 0
             ],
-            "stepping": 4,
-            "model": 85,
-            "family": 6,
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
             "flags": [
+                "3dnowext",
                 "3dnowprefetch",
                 "abm",
                 "adx",
                 "aes",
+                "aperfmperf",
                 "apic",
+                "arat",
                 "avx",
                 "avx2",
-                "avx512bw",
-                "avx512cd",
-                "avx512dq",
-                "avx512f",
-                "avx512vl",
                 "bmi1",
                 "bmi2",
                 "clflush",
                 "clflushopt",
+                "clwb",
+                "clzero",
                 "cmov",
+                "cmp_legacy",
                 "constant_tsc",
                 "cpuid",
+                "cr8_legacy",
                 "cx16",
                 "cx8",
                 "de",
+                "decodeassists",
                 "erms",
+                "extd_apicid",
                 "f16c",
+                "flushbyasid",
                 "fma",
                 "fpu",
                 "fsgsbase",
+                "fsrm",
                 "fxsr",
-                "hle",
+                "fxsr_opt",
                 "ht",
                 "hypervisor",
                 "invpcid",
@@ -78,64 +84,84 @@
                 "lm",
                 "mca",
                 "mce",
-                "md_clear",
+                "misalignsse",
                 "mmx",
+                "mmxext",
                 "movbe",
                 "msr",
                 "mtrr",
+                "nonstop_tsc",
                 "nopl",
+                "npt",
+                "nrip_save",
                 "nx",
+                "osvw",
                 "osxsave",
                 "pae",
                 "pat",
+                "pausefilter",
                 "pcid",
                 "pclmulqdq",
                 "pdpe1gb",
+                "pfthreshold",
                 "pge",
                 "pni",
                 "popcnt",
                 "pse",
                 "pse36",
-                "pti",
+                "rdpid",
+                "rdpru",
                 "rdrand",
                 "rdrnd",
                 "rdseed",
                 "rdtscp",
                 "rep_good",
-                "rtm",
                 "sep",
+                "sha",
+                "sha_ni",
                 "smap",
                 "smep",
-                "ss",
                 "sse",
                 "sse2",
                 "sse4_1",
                 "sse4_2",
+                "sse4a",
                 "ssse3",
+                "svm",
                 "syscall",
+                "topoext",
                 "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
                 "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
                 "xsave",
                 "xsavec",
+                "xsaveerptr",
                 "xsaveopt",
-                "xsaves",
-                "xtopology"
+                "xsaves"
             ],
-            "l3_cache_size": 37486592,
-            "l2_cache_size": 2097152,
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
             "l1_data_cache_size": 65536,
             "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
+            "l2_cache_line_size": 512,
             "l2_cache_associativity": 6
         }
     },
     "commit_info": {
-        "id": "73ce096d9b567ead19faf6554c1c5018ef773787",
-        "time": "2023-10-24T13:24:53+00:00",
-        "author_time": "2023-10-24T13:24:53+00:00",
+        "id": "3734073224ef53de65b0bf96195aaf169f6c26e9",
+        "time": "2024-11-19T16:34:42Z",
+        "author_time": "2024-11-19T16:34:42Z",
         "dirty": false,
         "project": "ariadne",
-        "branch": "master"
+        "branch": "main"
     },
     "benchmarks": [
         {
@@ -154,22 +180,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.6618058119999972,
-                "max": 1.7346449559999968,
-                "mean": 1.6955735507999976,
-                "stddev": 0.031798397439802464,
+                "min": 1.1053043519999903,
+                "max": 1.1614436039999987,
+                "mean": 1.1302492401999928,
+                "stddev": 0.021923155284786475,
                 "rounds": 5,
-                "median": 1.7008382500000039,
-                "iqr": 0.05636636599999889,
-                "q1": 1.664090188999996,
-                "q3": 1.7204565549999948,
+                "median": 1.123812106999992,
+                "iqr": 0.03196307249999819,
+                "q1": 1.115119259999993,
+                "q3": 1.1470823324999913,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.6618058119999972,
-                "hd15iqr": 1.7346449559999968,
-                "ops": 0.5897709359338524,
-                "total": 8.477867753999988,
+                "ld15iqr": 1.1053043519999903,
+                "hd15iqr": 1.1614436039999987,
+                "ops": 0.8847606036196533,
+                "total": 5.651246200999964,
                 "iterations": 1
             }
         },
@@ -189,22 +215,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.671564552999996,
-                "max": 1.7630059709999983,
-                "mean": 1.718160531999996,
-                "stddev": 0.0413684094332238,
+                "min": 1.1054558529999952,
+                "max": 1.180301811000021,
+                "mean": 1.1493432447999965,
+                "stddev": 0.028448696380881492,
                 "rounds": 5,
-                "median": 1.724863451999994,
-                "iqr": 0.07700485250001066,
-                "q1": 1.6775821457499909,
-                "q3": 1.7545869982500015,
+                "median": 1.1585308469999802,
+                "iqr": 0.03585901925001167,
+                "q1": 1.131200590749991,
+                "q3": 1.1670596100000026,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.671564552999996,
-                "hd15iqr": 1.7630059709999983,
-                "ops": 0.5820177925027569,
-                "total": 8.59080265999998,
+                "ld15iqr": 1.1054558529999952,
+                "hd15iqr": 1.180301811000021,
+                "ops": 0.8700621024435703,
+                "total": 5.746716223999982,
                 "iterations": 1
             }
         },
@@ -224,22 +250,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 2.0004514440000207,
-                "max": 2.102721115999998,
-                "mean": 2.051136749,
-                "stddev": 0.03878771006323934,
+                "min": 1.3300375570000256,
+                "max": 1.4007999959999893,
+                "mean": 1.3629565581999998,
+                "stddev": 0.02671334175075205,
                 "rounds": 5,
-                "median": 2.051837250999995,
-                "iqr": 0.05530808599999659,
-                "q1": 2.0229952522499985,
-                "q3": 2.078303338249995,
+                "median": 1.358254560000006,
+                "iqr": 0.03655994674998908,
+                "q1": 1.345208724999999,
+                "q3": 1.3817686717499882,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 2.0004514440000207,
-                "hd15iqr": 2.102721115999998,
-                "ops": 0.48753453444171124,
-                "total": 10.255683744999999,
+                "ld15iqr": 1.3300375570000256,
+                "hd15iqr": 1.4007999959999893,
+                "ops": 0.7336990999336461,
+                "total": 6.814782790999999,
                 "iterations": 1
             }
         },
@@ -259,26 +285,26 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.8273924780000073,
-                "max": 1.9061192089999963,
-                "mean": 1.8702541318000043,
-                "stddev": 0.0379858529240782,
+                "min": 1.208815154000007,
+                "max": 1.259689408000014,
+                "mean": 1.2387657872000033,
+                "stddev": 0.02075038600526413,
                 "rounds": 5,
-                "median": 1.8883763050000084,
-                "iqr": 0.07008226699998943,
-                "q1": 1.8301663275000095,
-                "q3": 1.900248594499999,
+                "median": 1.2409683230000041,
+                "iqr": 0.03282465875000895,
+                "q1": 1.223784259999995,
+                "q3": 1.256608918750004,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.8273924780000073,
-                "hd15iqr": 1.9061192089999963,
-                "ops": 0.5346866947100721,
-                "total": 9.351270659000022,
+                "ld15iqr": 1.208815154000007,
+                "hd15iqr": 1.259689408000014,
+                "ops": 0.8072551004660142,
+                "total": 6.193828936000017,
                 "iterations": 1
             }
         }
     ],
-    "datetime": "2023-10-24T13:26:26.299630",
-    "version": "4.0.0"
+    "datetime": "2024-11-19T16:35:50.419091+00:00",
+    "version": "5.1.0"
 }
\ No newline at end of file


Test patch:
diff --git a/benchmark/results/Linux-CPython-3.11-64bit/0022_42074f0e3615fba4f8cec46d1ffae2e91a713c9c_20231024_132701.json b/benchmark/results/Linux-CPython-3.9-64bit/0054_91c8979ac6bb251714b870f6401b2a8d57474362_20241119_164742.json
similarity index 56%
rename from benchmark/results/Linux-CPython-3.11-64bit/0022_42074f0e3615fba4f8cec46d1ffae2e91a713c9c_20231024_132701.json
rename to benchmark/results/Linux-CPython-3.9-64bit/0054_91c8979ac6bb251714b870f6401b2a8d57474362_20241119_164742.json
index 9cbe4ed..fa76be9 100644
--- a/benchmark/results/Linux-CPython-3.11-64bit/0022_42074f0e3615fba4f8cec46d1ffae2e91a713c9c_20231024_132701.json
+++ b/benchmark/results/Linux-CPython-3.9-64bit/0054_91c8979ac6bb251714b870f6401b2a8d57474362_20241119_164742.json
@@ -1,20 +1,20 @@
 {
     "machine_info": {
-        "node": "fv-az395-589",
+        "node": "fv-az849-390",
         "processor": "x86_64",
         "machine": "x86_64",
         "python_compiler": "GCC 11.4.0",
         "python_implementation": "CPython",
-        "python_implementation_version": "3.11.6",
-        "python_version": "3.11.6",
+        "python_implementation_version": "3.9.20",
+        "python_version": "3.9.20",
         "python_build": [
             "main",
-            "Oct  3 2023 04:42:57"
+            "Sep  9 2024 03:07:22"
         ],
-        "release": "6.2.0-1014-azure",
+        "release": "6.5.0-1025-azure",
         "system": "Linux",
         "cpu": {
-            "python_version": "3.11.6.final.0 (64 bit)",
+            "python_version": "3.9.20.final.0 (64 bit)",
             "cpuinfo_version": [
                 9,
                 0,
@@ -23,53 +23,59 @@
             "cpuinfo_version_string": "9.0.0",
             "arch": "X86_64",
             "bits": 64,
-            "count": 2,
+            "count": 4,
             "arch_string_raw": "x86_64",
-            "vendor_id_raw": "GenuineIntel",
-            "brand_raw": "Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz",
-            "hz_advertised_friendly": "2.8000 GHz",
-            "hz_actual_friendly": "2.7934 GHz",
+            "vendor_id_raw": "AuthenticAMD",
+            "brand_raw": "AMD EPYC 7763 64-Core Processor",
+            "hz_advertised_friendly": "3.2435 GHz",
+            "hz_actual_friendly": "3.2435 GHz",
             "hz_advertised": [
-                2800000000,
+                3243488000,
                 0
             ],
             "hz_actual": [
-                2793437000,
+                3243488000,
                 0
             ],
-            "stepping": 6,
-            "model": 106,
-            "family": 6,
+            "stepping": 1,
+            "model": 1,
+            "family": 25,
             "flags": [
+                "3dnowext",
                 "3dnowprefetch",
                 "abm",
                 "adx",
                 "aes",
+                "aperfmperf",
                 "apic",
+                "arat",
                 "avx",
                 "avx2",
-                "avx512bw",
-                "avx512cd",
-                "avx512dq",
-                "avx512f",
-                "avx512vl",
                 "bmi1",
                 "bmi2",
                 "clflush",
                 "clflushopt",
+                "clwb",
+                "clzero",
                 "cmov",
+                "cmp_legacy",
                 "constant_tsc",
                 "cpuid",
+                "cr8_legacy",
                 "cx16",
                 "cx8",
                 "de",
+                "decodeassists",
                 "erms",
+                "extd_apicid",
                 "f16c",
+                "flushbyasid",
                 "fma",
                 "fpu",
                 "fsgsbase",
+                "fsrm",
                 "fxsr",
-                "hle",
+                "fxsr_opt",
                 "ht",
                 "hypervisor",
                 "invpcid",
@@ -78,64 +84,84 @@
                 "lm",
                 "mca",
                 "mce",
-                "md_clear",
+                "misalignsse",
                 "mmx",
+                "mmxext",
                 "movbe",
                 "msr",
                 "mtrr",
+                "nonstop_tsc",
                 "nopl",
+                "npt",
+                "nrip_save",
                 "nx",
+                "osvw",
                 "osxsave",
                 "pae",
                 "pat",
+                "pausefilter",
                 "pcid",
                 "pclmulqdq",
                 "pdpe1gb",
+                "pfthreshold",
                 "pge",
                 "pni",
                 "popcnt",
                 "pse",
                 "pse36",
-                "pti",
+                "rdpid",
+                "rdpru",
                 "rdrand",
                 "rdrnd",
                 "rdseed",
                 "rdtscp",
                 "rep_good",
-                "rtm",
                 "sep",
+                "sha",
+                "sha_ni",
                 "smap",
                 "smep",
-                "ss",
                 "sse",
                 "sse2",
                 "sse4_1",
                 "sse4_2",
+                "sse4a",
                 "ssse3",
+                "svm",
                 "syscall",
+                "topoext",
                 "tsc",
+                "tsc_reliable",
+                "tsc_scale",
+                "umip",
+                "v_vmsave_vmload",
+                "vaes",
+                "vmcb_clean",
                 "vme",
+                "vmmcall",
+                "vpclmulqdq",
+                "xgetbv1",
                 "xsave",
                 "xsavec",
+                "xsaveerptr",
                 "xsaveopt",
-                "xsaves",
-                "xtopology"
+                "xsaves"
             ],
-            "l3_cache_size": 50331648,
-            "l2_cache_size": "2.5 MiB",
-            "l1_data_cache_size": 98304,
+            "l3_cache_size": 524288,
+            "l2_cache_size": 1048576,
+            "l1_data_cache_size": 65536,
             "l1_instruction_cache_size": 65536,
-            "l2_cache_line_size": 256,
+            "l2_cache_line_size": 512,
             "l2_cache_associativity": 6
         }
     },
     "commit_info": {
-        "id": "42074f0e3615fba4f8cec46d1ffae2e91a713c9c",
-        "time": "2023-10-24T13:26:26+00:00",
-        "author_time": "2023-10-24T13:26:26+00:00",
+        "id": "91c8979ac6bb251714b870f6401b2a8d57474362",
+        "time": "2024-11-19T16:47:20Z",
+        "author_time": "2024-11-19T16:47:20Z",
         "dirty": false,
         "project": "ariadne",
-        "branch": "master"
+        "branch": "main"
     },
     "benchmarks": [
         {
@@ -154,22 +180,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.0454940950000093,
-                "max": 1.1036979910000184,
-                "mean": 1.071212337600008,
-                "stddev": 0.022626564087262716,
+                "min": 1.1431558479999921,
+                "max": 1.2705813590000048,
+                "mean": 1.1964796759999985,
+                "stddev": 0.04763802669650338,
                 "rounds": 5,
-                "median": 1.0638262260000033,
-                "iqr": 0.03218327750000327,
-                "q1": 1.056198638000005,
-                "q3": 1.0883819155000083,
+                "median": 1.1973390819999992,
+                "iqr": 0.055767436000003556,
+                "q1": 1.1630792169999964,
+                "q3": 1.218846653,
                 "iqr_outliers": 0,
                 "stddev_outliers": 2,
                 "outliers": "2;0",
-                "ld15iqr": 1.0454940950000093,
-                "hd15iqr": 1.1036979910000184,
-                "ops": 0.9335217350468954,
-                "total": 5.35606168800004,
+                "ld15iqr": 1.1431558479999921,
+                "hd15iqr": 1.2705813590000048,
+                "ops": 0.8357851955690063,
+                "total": 5.982398379999992,
                 "iterations": 1
             }
         },
@@ -189,22 +215,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.0531387300000006,
-                "max": 1.1221798300000216,
-                "mean": 1.1005271586000105,
-                "stddev": 0.028236539272916417,
+                "min": 1.1606119399999955,
+                "max": 1.2486342830000012,
+                "mean": 1.208403716999993,
+                "stddev": 0.036120840847554805,
                 "rounds": 5,
-                "median": 1.1026557010000033,
-                "iqr": 0.031939071000017805,
-                "q1": 1.0901933590000041,
-                "q3": 1.122132430000022,
+                "median": 1.200779788999995,
+                "iqr": 0.05786295450000267,
+                "q1": 1.1842215154999884,
+                "q3": 1.2420844699999911,
                 "iqr_outliers": 0,
-                "stddev_outliers": 1,
-                "outliers": "1;0",
-                "ld15iqr": 1.0531387300000006,
-                "hd15iqr": 1.1221798300000216,
-                "ops": 0.9086554495139475,
-                "total": 5.502635793000053,
+                "stddev_outliers": 2,
+                "outliers": "2;0",
+                "ld15iqr": 1.1606119399999955,
+                "hd15iqr": 1.2486342830000012,
+                "ops": 0.8275380040063264,
+                "total": 6.0420185849999655,
                 "iterations": 1
             }
         },
@@ -224,22 +250,22 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.2843037929999923,
-                "max": 1.3108633270000212,
-                "mean": 1.3009426740000039,
-                "stddev": 0.010993825996397394,
+                "min": 1.3842303890000096,
+                "max": 1.4992783309999993,
+                "mean": 1.4267574249999995,
+                "stddev": 0.04398680250854153,
                 "rounds": 5,
-                "median": 1.3043286179999996,
-                "iqr": 0.01676729699999413,
-                "q1": 1.2929688535000068,
-                "q3": 1.309736150500001,
+                "median": 1.4097896760000026,
+                "iqr": 0.04709577074999771,
+                "q1": 1.4020739779999971,
+                "q3": 1.4491697487499948,
                 "iqr_outliers": 0,
                 "stddev_outliers": 1,
                 "outliers": "1;0",
-                "ld15iqr": 1.2843037929999923,
-                "hd15iqr": 1.3108633270000212,
-                "ops": 0.7686733781476347,
-                "total": 6.504713370000019,
+                "ld15iqr": 1.3842303890000096,
+                "hd15iqr": 1.4992783309999993,
+                "ops": 0.700889991863894,
+                "total": 7.133787124999998,
                 "iterations": 1
             }
         },
@@ -259,26 +285,26 @@
                 "warmup": false
             },
             "stats": {
-                "min": 1.1754369140000165,
-                "max": 1.207919406000002,
-                "mean": 1.1888751612000021,
-                "stddev": 0.012841606999628762,
+                "min": 1.2552140249999866,
+                "max": 1.3210122270000113,
+                "mean": 1.2954654283999958,
+                "stddev": 0.025579767959318215,
                 "rounds": 5,
-                "median": 1.1863044269999818,
-                "iqr": 0.0189965357499986,
-                "q1": 1.178939419250007,
-                "q3": 1.1979359550000055,
+                "median": 1.297054017999983,
+                "iqr": 0.033418295999993575,
+                "q1": 1.2818367105000021,
+                "q3": 1.3152550064999957,
                 "iqr_outliers": 0,
-                "stddev_outliers": 2,
-                "outliers": "2;0",
-                "ld15iqr": 1.1754369140000165,
-                "hd15iqr": 1.207919406000002,
-                "ops": 0.8411312075782967,
-                "total": 5.944375806000011,
+                "stddev_outliers": 1,
+                "outliers": "1;0",
+                "ld15iqr": 1.2552140249999866,
+                "hd15iqr": 1.3210122270000113,
+                "ops": 0.7719233397336436,
+                "total": 6.477327141999979,
                 "iterations": 1
             }
         }
     ],
-    "datetime": "2023-10-24T13:27:36.925230",
-    "version": "4.0.0"
+    "datetime": "2024-11-19T16:48:21.048193+00:00",
+    "version": "5.1.0"
 }
\ No newline at end of file
diff --git a/tests/federation/test_utils.py b/tests/federation/test_utils.py
index d6ef51e..9fccdab 100644
--- a/tests/federation/test_utils.py
+++ b/tests/federation/test_utils.py
@@ -63,6 +63,8 @@ def test_purge_directives_remove_custom_directives():
 
         directive @another on FIELD
 
+        directive @plural repeatable on FIELD
+
         type Query {
             field1: String @custom
             field2: String @other
@@ -107,6 +109,10 @@ def test_purge_directives_remove_custom_directives_with_single_line_description(
         "Any Description"
         directive @custom on FIELD
         
+        type Entity {
+            field: String @custom
+        }
+
         type Query {
             rootField: String @custom
         }
@@ -114,6 +120,10 @@ def test_purge_directives_remove_custom_directives_with_single_line_description(
 
     assert sic(purge_schema_directives(type_defs)) == sic(
         """
+            type Entity {
+                field: String
+            }
+
             type Query {
                 rootField: String
             }
@@ -127,6 +137,58 @@ def test_purge_directives_without_leading_whitespace():
     assert sic(purge_schema_directives(type_defs)) == ""
 
 
+def test_purge_directives_remove_custom_directives_from_interfaces():
+    type_defs = """
+        directive @custom on INTERFACE
+
+        interface EntityInterface @custom {
+            field: String
+        }
+
+        type Entity implements EntityInterface {
+            field: String
+        }
+
+        type Query {
+            rootField: Entity
+        }
+    """
+
+    assert sic(purge_schema_directives(type_defs)) == sic(
+        """
+        interface EntityInterface {
+            field: String
+        }
+
+        type Entity implements EntityInterface {
+            field: String
+        }
+
+        type Query {
+            rootField: Entity
+        }
+        """
+    )
+
+
+def test_purge_directives_remove_custom_directive_with_arguments():
+    type_defs = """
+        directive @custom(arg: String) on FIELD
+
+        type Query {
+            rootField: String @custom(arg: "value")
+        }
+    """
+
+    assert sic(purge_schema_directives(type_defs)) == sic(
+        """
+            type Query {
+                rootField: String
+            }
+        """
+    )
+
+
 def test_get_entity_types_with_key_directive():
     type_defs = """
         type Query {
diff --git a/tests_integrations/flask/requirements.txt b/tests_integrations/flask/requirements.txt
index f0dcfd9..51cc954 100644
--- a/tests_integrations/flask/requirements.txt
+++ b/tests_integrations/flask/requirements.txt
@@ -12,11 +12,11 @@ flask==3.0.0
     # via -r requirements.in
 itsdangerous==2.1.2
     # via flask
-jinja2==3.1.3
+jinja2==3.1.4
     # via flask
 markupsafe==2.1.3
     # via
     #   jinja2
     #   werkzeug
-werkzeug==3.0.1
+werkzeug==3.0.6
     # via flask
diff --git a/tests_integrations/starlette/requirements.txt b/tests_integrations/starlette/requirements.txt
index 158f690..20966c4 100644
--- a/tests_integrations/starlette/requirements.txt
+++ b/tests_integrations/starlette/requirements.txt
@@ -10,5 +10,5 @@ idna==3.7
     # via anyio
 sniffio==1.3.0
     # via anyio
-starlette==0.37.1
+starlette==0.40.0
     # via -r requirements.in