Files
greptimedb/query/planner/fn.normalize_field_access_after_subscript.html
T

32 lines
5.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Normalizes dot field accesses that follow a subscript for DataFusion."><title>normalize_field_access_after_subscript in query::planner - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-17e0aaed.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="query" data-themes="" data-resource-suffix="" data-rustdoc-version="1.96.0-nightly (ac7f9ec7d 2026-03-20)" data-channel="nightly" data-search-js="search-63369b7b.js" data-stringdex-js="stringdex-2da4960a.js" data-settings-js="settings-170eb4bf.js" ><script src="../../static.files/storage-41dd4d93.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../static.files/main-5013f961.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-f7c3ffd8.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc fn"><a class="skip-main-content" href="#main-content">Skip to main content</a><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">normalize_field_access_after_subscript</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../query/index.html">query</a><span class="version">1.3.0-alpha.1</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In query::<wbr>planner</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content" tabindex="-1"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">query</a>::<wbr><a href="index.html">planner</a></div><h1>Function <span class="fn">normalize_<wbr>field_<wbr>access_<wbr>after_<wbr>subscript</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/query/planner.rs.html#658-686">Source</a> </span></div><pre class="rust item-decl"><code>fn normalize_field_access_after_subscript(
stmt: &amp;mut Statement,
normalize_ident: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>,
)</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Normalizes dot field accesses that follow a subscript for DataFusion.</p>
<p>sqlparser represents <code>j.o.l[1].inner.l[2]</code> as a compound field access with
the following access chain:</p>
<div class="example-wrap"><pre class="language-text"><code>Dot(Identifier(&quot;o&quot;)),
Dot(Identifier(&quot;l&quot;)),
Subscript(1),
Dot(Identifier(&quot;inner&quot;)),
Dot(Identifier(&quot;l&quot;)),
Subscript(2)</code></pre></div>
<p>DataFusion first resolves the leading <code>j.o.l</code> through
<code>JsonExprPlanner::plan_compound_identifier</code>, which produces an untyped
<code>json_get</code> with path <code>o.l</code>. Before invoking <code>JsonExprPlanner::plan_field_access</code>,
however, DataFusion eagerly converts every remaining access into a
<code>GetFieldAccess</code>. It accepts string values but not [<code>SqlExpr::Identifier</code>]s
in [<code>AccessExpr::Dot</code>] after a subscript. Without this normalization, that
conversion fails at <code>.inner</code>, and <code>plan_field_access</code> is never called, even
for the preceding <code>[1]</code>.</p>
<p>This function converts dot identifiers after the first subscript into
<code>Dot(Value(SingleQuotedString(...)))</code>, applying DataFusions identifier
normalization before discarding whether each identifier was quoted. It
changes neither the SQL text nor the dot accesses into subscript nodes: the
resulting AST is conceptually <code>j.o.l[1].'inner'.'l'[2]</code>. DataFusion converts
the string-valued dot accesses into named field accesses, which
<code>plan_field_access</code> safely encodes as bracket members. It can then extend the
JSON path to <code>o.l[1]["inner"]["l"][2]</code>.</p>
<p>This behavior is unchanged in the latest upstream releases checked here:
DataFusion 55.0.0 and sqlparser 0.62.0.</p>
<p>TODO(LFC): Remove this workaround after upstream supports dot identifiers after subscripts.</p>
</div></details></section></div></main></body></html>