This is an automated email from the ASF dual-hosted git repository.

github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-go.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new a2df5901e deploy: 21e85b611b13625a340cfe29f0344fbd1cc0d54f
a2df5901e is described below

commit a2df5901e4310907cc3a6a2c1a625b900e0c6d99
Author: laskoviymishka <[email protected]>
AuthorDate: Wed Sep 23 19:29:43 2026 +0000

    deploy: 21e85b611b13625a340cfe29f0344fbd1cc0d54f
---
 404.html                               |   2 +-
 api.html                               |   8 +-
 cli.html                               |   2 +-
 community.html                         |   2 +-
 concurrent-writes.html                 |   2 +-
 configuration.html                     |   2 +-
 contributing.html                      |   2 +-
 ecosystem.html                         |   2 +-
 expression-dsl.html                    |   4 +-
 feature-status.html                    |   5 +-
 getting-started.html                   |   2 +-
 glossary.html                          |   2 +-
 how-to-release.html                    |   2 +-
 index.html                             |   2 +-
 install.html                           |   2 +-
 introduction.html                      |   2 +-
 metrics-reporting.html                 |   2 +-
 print.html                             | 119 ++++++++++++++++++++++++++-
 releases.html                          |   2 +-
 row-filter-syntax.html                 |  20 ++++-
 searchindex.js                         |   2 +-
 searchindex.json                       |   2 +-
 concurrent-writes.html => variant.html | 142 ++++++++++++++++++---------------
 verify-release.html                    |   2 +-
 24 files changed, 240 insertions(+), 94 deletions(-)

diff --git a/404.html b/404.html
index 514be9102..8cd7b778f 100644
--- a/404.html
+++ b/404.html
@@ -124,7 +124,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/api.html b/api.html
index 9e30c11bb..231fe0c6a 100644
--- a/api.html
+++ b/api.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
@@ -667,7 +667,7 @@ v.Properties()          // iceberg.Properties
 
<tr><td><code>struct&lt;...&gt;</code></td><td><code>arrow.StructOf(...)</code></td></tr>
 <tr><td><code>list&lt;E&gt;</code></td><td><code>arrow.ListOf(E)</code> (or 
<code>LargeListOf</code> if <code>useLargeTypes</code>)</td></tr>
 <tr><td><code>map&lt;K, V&gt;</code></td><td><code>arrow.MapOf(K, 
V)</code></td></tr>
-<tr><td><code>variant</code></td><td><code>arrow.ExtensionType</code> for 
Variant</td></tr>
+<tr><td><code>variant</code></td><td><code>arrow.ExtensionType</code> for 
Variant (see <a href="./variant.html">Variant Type</a>)</td></tr>
 </tbody></table>
 </div>
 <p>Helpers in <a 
href="https://github.com/apache/iceberg-go/blob/main/table/arrow_utils.go";><code>table/arrow_utils.go</code></a>:</p>
@@ -685,7 +685,7 @@ v.Properties()          // iceberg.Properties
                                 <i class="fa fa-angle-left"></i>
                             </a>
 
-                            <a rel="next prefetch" 
href="row-filter-syntax.html" class="mobile-nav-chapters next" title="Next 
chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+                            <a rel="next prefetch" href="variant.html" 
class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" 
aria-keyshortcuts="Right">
                                 <i class="fa fa-angle-right"></i>
                             </a>
 
@@ -699,7 +699,7 @@ v.Properties()          // iceberg.Properties
                         <i class="fa fa-angle-left"></i>
                     </a>
 
-                    <a rel="next prefetch" href="row-filter-syntax.html" 
class="nav-chapters next" title="Next chapter" aria-label="Next chapter" 
aria-keyshortcuts="Right">
+                    <a rel="next prefetch" href="variant.html" 
class="nav-chapters next" title="Next chapter" aria-label="Next chapter" 
aria-keyshortcuts="Right">
                         <i class="fa fa-angle-right"></i>
                     </a>
             </nav>
diff --git a/cli.html b/cli.html
index 0578ba705..1980f97ba 100644
--- a/cli.html
+++ b/cli.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/community.html b/community.html
index 2da22bd0f..8a8782dfa 100644
--- a/community.html
+++ b/community.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/concurrent-writes.html b/concurrent-writes.html
index dbe499a4f..4be21e7e5 100644
--- a/concurrent-writes.html
+++ b/concurrent-writes.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/configuration.html b/configuration.html
index 26a1a9b1e..e26ad1d36 100644
--- a/configuration.html
+++ b/configuration.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html" 
class="active">Configuration</a></li><li class="chapter-item expa [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html" 
class="active">Configuration</a></li><li class="chapter-item expa [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/contributing.html b/contributing.html
index cbe2f855f..02bf397dc 100644
--- a/contributing.html
+++ b/contributing.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/ecosystem.html b/ecosystem.html
index 0e2c80463..497394686 100644
--- a/ecosystem.html
+++ b/ecosystem.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/expression-dsl.html b/expression-dsl.html
index 5fbdbb8be..b79f50e99 100644
--- a/expression-dsl.html
+++ b/expression-dsl.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
@@ -260,6 +260,7 @@ iceberg.AlwaysFalse{}
 <ul>
 <li><code>Reference(&quot;column_name&quot;)</code> - an unbound term that 
names a column (<code>exprs.go:373</code>). Typing happens at bind time, when 
the expression is matched against a schema. This is what you almost always 
want.</li>
 <li><code>BoundReference</code> - the resolved form, produced by 
<code>Reference.Bind(schema, caseSensitive)</code> (<code>exprs.go:389</code>). 
You only encounter these when writing custom expression visitors.</li>
+<li><code>Extract(ref, path, typ)</code> - a variant sub-path term that 
navigates a member-selector path (<code>$.a.b</code> or 
<code>$['a']['b']</code>; no array indexing or wildcards) into a 
<code>variant</code> column and casts the leaf to <code>typ</code> 
(<code>variant_extract.go</code>). Use it inside any predicate builder to 
filter on a field within a variant. See <a 
href="./row-filter-syntax.html#variant-extraction">Row Filter Syntax</a>.</li>
 </ul>
 <p>The interfaces are:</p>
 <pre><code class="language-go">type Term interface { ... }                     
   // shared marker
@@ -306,6 +307,7 @@ inverted := expr.Negate()  // equivalent to NotEqualTo(...)
 <tr><td>Filter a scan or row-level delete</td><td>Convenience builders + 
<code>NewAnd</code>/<code>NewOr</code>/<code>NewNot</code></td></tr>
 <tr><td>Combine many clauses dynamically</td><td>Start from 
<code>AlwaysTrue{}</code> (for AND) or <code>AlwaysFalse{}</code> (for OR), 
fold with <code>NewAnd</code>/<code>NewOr</code></td></tr>
 <tr><td>Construct a predicate whose operator is chosen at 
runtime</td><td><code>UnaryPredicate(op, term)</code>, 
<code>LiteralPredicate(op, term, lit)</code>, <code>SetPredicate(op, term, 
lits)</code></td></tr>
+<tr><td>Filter on a field inside a variant column</td><td><code>Extract(ref, 
path, typ)</code> inside a predicate builder</td></tr>
 <tr><td>Walk an expression tree</td><td>A custom 
<code>BooleanExprVisitor</code> from <code>visitors.go</code></td></tr>
 </tbody></table>
 </div>
diff --git a/feature-status.html b/feature-status.html
index 1e914d072..366c3261c 100644
--- a/feature-status.html
+++ b/feature-status.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
@@ -256,7 +256,8 @@
 <tr><td>Row lineage (<code>_row_id</code>, 
<code>_last_updated_sequence_number</code>)</td><td>Supported</td></tr>
 <tr><td>Encryption keys in metadata</td><td>Supported</td></tr>
 <tr><td>Variant type, non-shredded</td><td>Supported (PR <a 
href="https://github.com/apache/iceberg-go/pull/932";>#932</a>; umbrella <a 
href="https://github.com/apache/iceberg-go/issues/929";>#929</a>)</td></tr>
-<tr><td>Variant type, shredded reader / writer</td><td>In progress (<a 
href="https://github.com/apache/iceberg-go/issues/986";>#986</a>, <a 
href="https://github.com/apache/iceberg-go/issues/987";>#987</a>)</td></tr>
+<tr><td>Variant type, shredded reader / writer</td><td>Supported (reader <a 
href="https://github.com/apache/iceberg-go/pull/1238";>#1238</a>, writer <a 
href="https://github.com/apache/iceberg-go/pull/1351";>#1351</a>)</td></tr>
+<tr><td>Variant predicate pushdown / field extract</td><td>Supported (PR <a 
href="https://github.com/apache/iceberg-go/pull/1607";>#1607</a>)</td></tr>
 <tr><td>Deletion vectors, read</td><td>Supported</td></tr>
 <tr><td>Deletion vectors, write (unpartitioned)</td><td>Supported</td></tr>
 <tr><td>Deletion vectors, write (partitioned)</td><td>In progress (<a 
href="https://github.com/apache/iceberg-go/issues/1135";>#1135</a>, PR <a 
href="https://github.com/apache/iceberg-go/pull/1151";>#1151</a>)</td></tr>
diff --git a/getting-started.html b/getting-started.html
index ed7a17771..03e9ea596 100644
--- a/getting-started.html
+++ b/getting-started.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html" class="active">Getting Started</a></li><li 
class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html" class="active">Getting Started</a></li><li 
class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/glossary.html b/glossary.html
index e674c85ab..c2142899c 100644
--- a/glossary.html
+++ b/glossary.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/how-to-release.html b/how-to-release.html
index 113200df8..11aae6593 100644
--- a/how-to-release.html
+++ b/how-to-release.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/index.html b/index.html
index 182a1ab39..5f2b44d43 100644
--- a/index.html
+++ b/index.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html" class="active">Introduction</a></li><li 
class="chapter-item expanded affix "><li class="part-title">User Guide</li><li 
class="chapter-item expanded "><a href="install.html">Install</a></li><li 
class="chapter-item expanded "><a href="getting-started.html">Getting 
Started</a></li><li class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html" class="active">Introduction</a></li><li 
class="chapter-item expanded affix "><li class="part-title">User Guide</li><li 
class="chapter-item expanded "><a href="install.html">Install</a></li><li 
class="chapter-item expanded "><a href="getting-started.html">Getting 
Started</a></li><li class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/install.html b/install.html
index 5bff2a81b..d4bf2e26f 100644
--- a/install.html
+++ b/install.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html" class="active">Install</a></li><li class="chapter-item 
expanded "><a href="getting-started.html">Getting Started</a></li><li 
class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html" class="active">Install</a></li><li class="chapter-item 
expanded "><a href="getting-started.html">Getting Started</a></li><li 
class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/introduction.html b/introduction.html
index 182a1ab39..5f2b44d43 100644
--- a/introduction.html
+++ b/introduction.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html" class="active">Introduction</a></li><li 
class="chapter-item expanded affix "><li class="part-title">User Guide</li><li 
class="chapter-item expanded "><a href="install.html">Install</a></li><li 
class="chapter-item expanded "><a href="getting-started.html">Getting 
Started</a></li><li class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html" class="active">Introduction</a></li><li 
class="chapter-item expanded affix "><li class="part-title">User Guide</li><li 
class="chapter-item expanded "><a href="install.html">Install</a></li><li 
class="chapter-item expanded "><a href="getting-started.html">Getting 
Started</a></li><li class="chapter-item expanded "><a 
href="configuration.html">Configuration</a></li><li class="chapter-item expa 
[...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/metrics-reporting.html b/metrics-reporting.html
index 008383dc1..66dbb15a8 100644
--- a/metrics-reporting.html
+++ b/metrics-reporting.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/print.html b/print.html
index f5ad990a2..31511838b 100644
--- a/print.html
+++ b/print.html
@@ -124,7 +124,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
@@ -1546,7 +1546,7 @@ v.Properties()          // iceberg.Properties
 
<tr><td><code>struct&lt;...&gt;</code></td><td><code>arrow.StructOf(...)</code></td></tr>
 <tr><td><code>list&lt;E&gt;</code></td><td><code>arrow.ListOf(E)</code> (or 
<code>LargeListOf</code> if <code>useLargeTypes</code>)</td></tr>
 <tr><td><code>map&lt;K, V&gt;</code></td><td><code>arrow.MapOf(K, 
V)</code></td></tr>
-<tr><td><code>variant</code></td><td><code>arrow.ExtensionType</code> for 
Variant</td></tr>
+<tr><td><code>variant</code></td><td><code>arrow.ExtensionType</code> for 
Variant (see <a href="./variant.html">Variant Type</a>)</td></tr>
 </tbody></table>
 </div>
 <p>Helpers in <a 
href="https://github.com/apache/iceberg-go/blob/main/table/arrow_utils.go";><code>table/arrow_utils.go</code></a>:</p>
@@ -1573,6 +1573,102 @@ v.Properties()          // iceberg.Properties
   ~ specific language governing permissions and limitations
   ~ under the License.
 -->
+<h1 id="variant-type"><a class="header" href="#variant-type">Variant 
Type</a></h1>
+<p><code>variant</code> is the Iceberg v3 semi-structured type: a single 
self-describing column
+that holds arbitrary JSON-like values (objects, arrays, and scalars) without a
+fixed schema. iceberg-go supports both non-shredded and shredded variants, and 
can
+push predicates down into individual variant fields.</p>
+<h2 id="reading-and-writing"><a class="header" 
href="#reading-and-writing">Reading and writing</a></h2>
+<p>A variant column is declared with <code>iceberg.VariantType{}</code> in the 
table schema and
+maps to the Arrow <code>variant</code> extension type (see <a 
href="./api.html">API</a>). Non-shredded
+variant values need no extra configuration: write an Arrow record whose variant
+column uses the extension type, and read it back the same way.</p>
+<p>Build the column with a variant builder and write it like any other Arrow 
column
+(the table must be format version 3):</p>
+<pre><code class="language-go">import (
+    &quot;fmt&quot;
+
+    &quot;github.com/apache/arrow-go/v18/arrow&quot;
+    &quot;github.com/apache/arrow-go/v18/arrow/array&quot;
+    &quot;github.com/apache/arrow-go/v18/arrow/extensions&quot;
+    &quot;github.com/apache/arrow-go/v18/arrow/memory&quot;
+    &quot;github.com/apache/arrow-go/v18/parquet/variant&quot;
+    &quot;github.com/apache/iceberg-go&quot;
+    &quot;github.com/apache/iceberg-go/table&quot;
+)
+
+// tbl was created with table.PropertyFormatVersion = &quot;3&quot; and this 
schema.
+schema := iceberg.NewSchema(0,
+    iceberg.NestedField{ID: 1, Name: &quot;payload&quot;, Type: 
iceberg.VariantType{}},
+)
+arrowSchema, _ := table.SchemaToArrowSchema(schema, nil, true, false)
+
+bldr := extensions.NewVariantBuilder(memory.DefaultAllocator, 
extensions.NewDefaultVariantType())
+defer bldr.Release()
+
+var vb variant.Builder
+_ = vb.Append(map[string]any{&quot;x&quot;: int64(320), &quot;target&quot;: 
&quot;button-submit&quot;})
+val, _ := vb.Build()
+bldr.Append(val)
+
+col := bldr.NewArray()
+defer col.Release()
+rec := array.NewRecordBatch(arrowSchema, []arrow.Array{col}, 1)
+defer rec.Release()
+
+tx := tbl.NewTransaction()
+arrTable := array.NewTableFromRecords(arrowSchema, []arrow.Record{rec})
+defer arrTable.Release()
+_ = tx.AppendTable(ctx, arrTable, 1024, nil)
+tbl, _ = tx.Commit(ctx)
+</code></pre>
+<p>A normal scan reads it back; the variant column comes back as an 
<code>*extensions.VariantArray</code>:</p>
+<pre><code class="language-go">result, _ := tbl.Scan().ToArrowTable(ctx)
+defer result.Release()
+
+variants := result.Column(0).Data().Chunk(0).(*extensions.VariantArray)
+v, _ := variants.Value(0)
+fmt.Println(v.Value()) // variant.ObjectValue for the object above
+</code></pre>
+<h2 id="shredding"><a class="header" href="#shredding">Shredding</a></h2>
+<p>Shredding stores the fields of a variant as typed Parquet sub-columns 
instead of a
+single opaque blob. This lets scans read and filter a field as a native column
+rather than decoding every value. Shredding is opt-in and configured with two 
write
+properties (see <a 
href="./configuration.html#parquet-writer">Configuration</a>):</p>
+<ul>
+<li><code>write.parquet.shred-variants</code> - enable shredding of top-level 
variant columns
+(default <code>false</code>).</li>
+<li><code>write.parquet.variant-inference-buffer-size</code> - rows buffered 
per file to infer
+the shredding schema (default <code>100</code>).</li>
+</ul>
+<p>The reader accepts both shredded and non-shredded data; no read-side
+configuration is required.</p>
+<h2 id="filtering-on-variant-fields"><a class="header" 
href="#filtering-on-variant-fields">Filtering on variant fields</a></h2>
+<p>Filter on a field inside a variant with <code>iceberg.Extract</code>, which 
plugs into the
+usual predicate builders. See <a 
href="./row-filter-syntax.html#variant-extraction">Row Filter Syntax</a>
+for usage, supported target types, and caveats.</p>
+<h2 id="constraints"><a class="header" href="#constraints">Constraints</a></h2>
+<ul>
+<li>A variant column cannot be a partition source or an identity-transform 
source.</li>
+</ul>
+<div style="break-before: page; page-break-before: always;"></div><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
 <h1 id="row-filter-syntax"><a class="header" href="#row-filter-syntax">Row 
Filter Syntax</a></h1>
 <p>Row filters drive predicate pushdown during scans, partition pruning, and 
row-level deletes. The DSL lives in the root <code>iceberg</code> package - all 
you need is the import:</p>
 <pre><code class="language-go">import &quot;github.com/apache/iceberg-go&quot;
@@ -1615,6 +1711,20 @@ iceberg.NotNaN(iceberg.Reference(&quot;ratio&quot;))
 iceberg.NotStartsWith(iceberg.Reference(&quot;name&quot;), &quot;tmp_&quot;)
 </code></pre>
 <p>Operators <code>OpStartsWith</code> and <code>OpNotStartsWith</code> 
(<code>exprs.go:53-54</code>). The value must be a <code>string</code>.</p>
+<h2 id="variant-extraction"><a class="header" 
href="#variant-extraction">Variant extraction</a></h2>
+<p><code>iceberg.Extract(ref, path, typ)</code> builds a term that navigates a 
member-selector path into a <code>variant</code> column and casts the leaf to 
<code>typ</code>. The path uses dot (<code>$.user.age</code>) or quoted-bracket 
(<code>$['user']['age']</code>) notation; array indexing 
(<code>$.items[0]</code>), wildcards, filters, and recursive descent are 
rejected at bind time. It is an <code>UnboundTerm</code>, so it plugs into the 
same predicate builders as <code>iceberg.Refer [...]
+<pre><code class="language-go">filter := iceberg.EqualTo(
+    iceberg.Extract(iceberg.Reference(&quot;payload&quot;), 
&quot;$.user.age&quot;, iceberg.PrimitiveTypes.Int64),
+    int64(30),
+)
+</code></pre>
+<p>The referenced column must be a <code>variant</code>, and a target type is 
required. Supported target types: <code>bool</code>, <code>int32</code>, 
<code>int64</code>, <code>float32</code>, <code>float64</code>, 
<code>date</code>, <code>time</code>, <code>timestamp</code>, 
<code>timestamptz</code>, <code>timestamp_ns</code>, 
<code>timestamptz_ns</code>, <code>string</code>, <code>fixed</code>, 
<code>binary</code>, <code>decimal</code>, <code>uuid</code>.</p>
+<p>Caveats:</p>
+<ul>
+<li>Extract predicates prune whole data files by shredded-field bounds 
(best-effort, and only for shredded fields), then filter row by row. Row-group 
statistics and bloom filters do not apply to them.</li>
+<li>Extract terms are DSL-only (no string row-filter form) and are not 
REST-serializable. Under local scan planning (the default) they run as local 
residuals; with remote scan planning, a filter containing an Extract term fails 
to serialize rather than being silently dropped.</li>
+</ul>
+<p>See <a href="./variant.html">Variant Type</a> for shredding.</p>
 <h2 id="constants"><a class="header" href="#constants">Constants</a></h2>
 <pre><code class="language-go">iceberg.AlwaysTrue{}
 iceberg.AlwaysFalse{}
@@ -1702,6 +1812,7 @@ iceberg.AlwaysFalse{}
 <ul>
 <li><code>Reference(&quot;column_name&quot;)</code> - an unbound term that 
names a column (<code>exprs.go:373</code>). Typing happens at bind time, when 
the expression is matched against a schema. This is what you almost always 
want.</li>
 <li><code>BoundReference</code> - the resolved form, produced by 
<code>Reference.Bind(schema, caseSensitive)</code> (<code>exprs.go:389</code>). 
You only encounter these when writing custom expression visitors.</li>
+<li><code>Extract(ref, path, typ)</code> - a variant sub-path term that 
navigates a member-selector path (<code>$.a.b</code> or 
<code>$['a']['b']</code>; no array indexing or wildcards) into a 
<code>variant</code> column and casts the leaf to <code>typ</code> 
(<code>variant_extract.go</code>). Use it inside any predicate builder to 
filter on a field within a variant. See <a 
href="./row-filter-syntax.html#variant-extraction">Row Filter Syntax</a>.</li>
 </ul>
 <p>The interfaces are:</p>
 <pre><code class="language-go">type Term interface { ... }                     
   // shared marker
@@ -1748,6 +1859,7 @@ inverted := expr.Negate()  // equivalent to 
NotEqualTo(...)
 <tr><td>Filter a scan or row-level delete</td><td>Convenience builders + 
<code>NewAnd</code>/<code>NewOr</code>/<code>NewNot</code></td></tr>
 <tr><td>Combine many clauses dynamically</td><td>Start from 
<code>AlwaysTrue{}</code> (for AND) or <code>AlwaysFalse{}</code> (for OR), 
fold with <code>NewAnd</code>/<code>NewOr</code></td></tr>
 <tr><td>Construct a predicate whose operator is chosen at 
runtime</td><td><code>UnaryPredicate(op, term)</code>, 
<code>LiteralPredicate(op, term, lit)</code>, <code>SetPredicate(op, term, 
lits)</code></td></tr>
+<tr><td>Filter on a field inside a variant column</td><td><code>Extract(ref, 
path, typ)</code> inside a predicate builder</td></tr>
 <tr><td>Walk an expression tree</td><td>A custom 
<code>BooleanExprVisitor</code> from <code>visitors.go</code></td></tr>
 </tbody></table>
 </div>
@@ -2011,7 +2123,8 @@ instance to <code>table.WithReporter</code> or 
<code>table.WithMetricsReporter</
 <tr><td>Row lineage (<code>_row_id</code>, 
<code>_last_updated_sequence_number</code>)</td><td>Supported</td></tr>
 <tr><td>Encryption keys in metadata</td><td>Supported</td></tr>
 <tr><td>Variant type, non-shredded</td><td>Supported (PR <a 
href="https://github.com/apache/iceberg-go/pull/932";>#932</a>; umbrella <a 
href="https://github.com/apache/iceberg-go/issues/929";>#929</a>)</td></tr>
-<tr><td>Variant type, shredded reader / writer</td><td>In progress (<a 
href="https://github.com/apache/iceberg-go/issues/986";>#986</a>, <a 
href="https://github.com/apache/iceberg-go/issues/987";>#987</a>)</td></tr>
+<tr><td>Variant type, shredded reader / writer</td><td>Supported (reader <a 
href="https://github.com/apache/iceberg-go/pull/1238";>#1238</a>, writer <a 
href="https://github.com/apache/iceberg-go/pull/1351";>#1351</a>)</td></tr>
+<tr><td>Variant predicate pushdown / field extract</td><td>Supported (PR <a 
href="https://github.com/apache/iceberg-go/pull/1607";>#1607</a>)</td></tr>
 <tr><td>Deletion vectors, read</td><td>Supported</td></tr>
 <tr><td>Deletion vectors, write (unpartitioned)</td><td>Supported</td></tr>
 <tr><td>Deletion vectors, write (partitioned)</td><td>In progress (<a 
href="https://github.com/apache/iceberg-go/issues/1135";>#1135</a>, PR <a 
href="https://github.com/apache/iceberg-go/pull/1151";>#1151</a>)</td></tr>
diff --git a/releases.html b/releases.html
index 15a2218c0..139e645a0 100644
--- a/releases.html
+++ b/releases.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
diff --git a/row-filter-syntax.html b/row-filter-syntax.html
index 831a90880..5a23b7b12 100644
--- a/row-filter-syntax.html
+++ b/row-filter-syntax.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
@@ -274,6 +274,20 @@ iceberg.NotNaN(iceberg.Reference(&quot;ratio&quot;))
 iceberg.NotStartsWith(iceberg.Reference(&quot;name&quot;), &quot;tmp_&quot;)
 </code></pre>
 <p>Operators <code>OpStartsWith</code> and <code>OpNotStartsWith</code> 
(<code>exprs.go:53-54</code>). The value must be a <code>string</code>.</p>
+<h2 id="variant-extraction"><a class="header" 
href="#variant-extraction">Variant extraction</a></h2>
+<p><code>iceberg.Extract(ref, path, typ)</code> builds a term that navigates a 
member-selector path into a <code>variant</code> column and casts the leaf to 
<code>typ</code>. The path uses dot (<code>$.user.age</code>) or quoted-bracket 
(<code>$['user']['age']</code>) notation; array indexing 
(<code>$.items[0]</code>), wildcards, filters, and recursive descent are 
rejected at bind time. It is an <code>UnboundTerm</code>, so it plugs into the 
same predicate builders as <code>iceberg.Refer [...]
+<pre><code class="language-go">filter := iceberg.EqualTo(
+    iceberg.Extract(iceberg.Reference(&quot;payload&quot;), 
&quot;$.user.age&quot;, iceberg.PrimitiveTypes.Int64),
+    int64(30),
+)
+</code></pre>
+<p>The referenced column must be a <code>variant</code>, and a target type is 
required. Supported target types: <code>bool</code>, <code>int32</code>, 
<code>int64</code>, <code>float32</code>, <code>float64</code>, 
<code>date</code>, <code>time</code>, <code>timestamp</code>, 
<code>timestamptz</code>, <code>timestamp_ns</code>, 
<code>timestamptz_ns</code>, <code>string</code>, <code>fixed</code>, 
<code>binary</code>, <code>decimal</code>, <code>uuid</code>.</p>
+<p>Caveats:</p>
+<ul>
+<li>Extract predicates prune whole data files by shredded-field bounds 
(best-effort, and only for shredded fields), then filter row by row. Row-group 
statistics and bloom filters do not apply to them.</li>
+<li>Extract terms are DSL-only (no string row-filter form) and are not 
REST-serializable. Under local scan planning (the default) they run as local 
residuals; with remote scan planning, a filter containing an Extract term fails 
to serialize rather than being silently dropped.</li>
+</ul>
+<p>See <a href="./variant.html">Variant Type</a> for shredding.</p>
 <h2 id="constants"><a class="header" href="#constants">Constants</a></h2>
 <pre><code class="language-go">iceberg.AlwaysTrue{}
 iceberg.AlwaysFalse{}
@@ -320,7 +334,7 @@ scan := tbl.Scan(table.WithRowFilter(filter))
 
                     <nav class="nav-wrapper" aria-label="Page navigation">
                         <!-- Mobile navigation buttons -->
-                            <a rel="prev" href="api.html" 
class="mobile-nav-chapters previous" title="Previous chapter" 
aria-label="Previous chapter" aria-keyshortcuts="Left">
+                            <a rel="prev" href="variant.html" 
class="mobile-nav-chapters previous" title="Previous chapter" 
aria-label="Previous chapter" aria-keyshortcuts="Left">
                                 <i class="fa fa-angle-left"></i>
                             </a>
 
@@ -334,7 +348,7 @@ scan := tbl.Scan(table.WithRowFilter(filter))
             </div>
 
             <nav class="nav-wide-wrapper" aria-label="Page navigation">
-                    <a rel="prev" href="api.html" class="nav-chapters 
previous" title="Previous chapter" aria-label="Previous chapter" 
aria-keyshortcuts="Left">
+                    <a rel="prev" href="variant.html" class="nav-chapters 
previous" title="Previous chapter" aria-label="Previous chapter" 
aria-keyshortcuts="Left">
                         <i class="fa fa-angle-left"></i>
                     </a>
 
diff --git a/searchindex.js b/searchindex.js
index 5fa351c56..ef1a6ef6d 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Object.assign(window.search, 
{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#
 [...]
\ No newline at end of file
+Object.assign(window.search, 
{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#
 [...]
\ No newline at end of file
diff --git a/searchindex.json b/searchindex.json
index 247398a6a..ead48439a 100644
--- a/searchindex.json
+++ b/searchindex.json
@@ -1 +1 @@
-{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#4-write-some-arrow-data","get
 [...]
\ No newline at end of file
+{"doc_urls":["introduction.html#iceberg-go","introduction.html#where-to-start","introduction.html#what-works-today","introduction.html#beyond-go","introduction.html#help-and-contribution","install.html#install","install.html#requirements","install.html#installation","getting-started.html#getting-started","getting-started.html#1-install","getting-started.html#2-open-a-local-catalog","getting-started.html#3-create-a-namespace-and-a-table","getting-started.html#4-write-some-arrow-data","get
 [...]
\ No newline at end of file
diff --git a/concurrent-writes.html b/variant.html
similarity index 69%
copy from concurrent-writes.html
copy to variant.html
index dbe499a4f..7443bb77c 100644
--- a/concurrent-writes.html
+++ b/variant.html
@@ -3,7 +3,7 @@
     <head>
         <!-- Book generated using mdBook -->
         <meta charset="UTF-8">
-        <title>Concurrent Writes - Iceberg Golang</title>
+        <title>Variant Type - Iceberg Golang</title>
 
 
         <!-- Custom HTML head -->
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>
@@ -185,7 +185,7 @@
                         <a href="https://github.com/apache/iceberg-go"; 
title="Git repository" aria-label="Git repository">
                             <i id="git-repository-button" class="fa 
fa-github"></i>
                         </a>
-                        <a 
href="https://github.com/apache/iceberg-go/edit/main/website/src/concurrent-writes.md";
 title="Suggest an edit" aria-label="Suggest an edit">
+                        <a 
href="https://github.com/apache/iceberg-go/edit/main/website/src/variant.md"; 
title="Suggest an edit" aria-label="Suggest an edit">
                             <i id="git-edit-button" class="fa fa-edit"></i>
                         </a>
 
@@ -232,78 +232,94 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
 -->
-<h1 id="concurrent-writes"><a class="header" 
href="#concurrent-writes">Concurrent Writes</a></h1>
-<p>When multiple writers commit to the same table, iceberg-go uses optimistic
-concurrency control: every commit is validated against the table state it was
-built on. If another writer committed first, the commit is rejected rather than
-silently clobbering their snapshot.</p>
-<h2 id="conflict-detection"><a class="header" 
href="#conflict-detection">Conflict detection</a></h2>
-<p>Each producer (<code>Append</code>, <code>Overwrite</code>, 
<code>Delete</code>, <code>RowDelta</code>, <code>RewriteDataFiles</code>)
-runs a set of validators before the commit lands. They check that the files the
-operation assumed (added, deleted, or filtered) still match the current table
-state. A failed validation surfaces as one of:</p>
-<ul>
-<li><code>table.ErrCommitFailed</code> — the base snapshot moved on; the 
commit can be
-retried after refreshing (see below).</li>
-<li><code>table.ErrCommitDiverged</code> — terminal. The base snapshot is no 
longer on the
-branch at all, so a retry cannot reconcile the change.</li>
-</ul>
+<h1 id="variant-type"><a class="header" href="#variant-type">Variant 
Type</a></h1>
+<p><code>variant</code> is the Iceberg v3 semi-structured type: a single 
self-describing column
+that holds arbitrary JSON-like values (objects, arrays, and scalars) without a
+fixed schema. iceberg-go supports both non-shredded and shredded variants, and 
can
+push predicates down into individual variant fields.</p>
+<h2 id="reading-and-writing"><a class="header" 
href="#reading-and-writing">Reading and writing</a></h2>
+<p>A variant column is declared with <code>iceberg.VariantType{}</code> in the 
table schema and
+maps to the Arrow <code>variant</code> extension type (see <a 
href="./api.html">API</a>). Non-shredded
+variant values need no extra configuration: write an Arrow record whose variant
+column uses the extension type, and read it back the same way.</p>
+<p>Build the column with a variant builder and write it like any other Arrow 
column
+(the table must be format version 3):</p>
 <pre><code class="language-go">import (
-    &quot;context&quot;
-    &quot;errors&quot;
-
+    &quot;fmt&quot;
+
+    &quot;github.com/apache/arrow-go/v18/arrow&quot;
+    &quot;github.com/apache/arrow-go/v18/arrow/array&quot;
+    &quot;github.com/apache/arrow-go/v18/arrow/extensions&quot;
+    &quot;github.com/apache/arrow-go/v18/arrow/memory&quot;
+    &quot;github.com/apache/arrow-go/v18/parquet/variant&quot;
+    &quot;github.com/apache/iceberg-go&quot;
     &quot;github.com/apache/iceberg-go/table&quot;
 )
 
-_, err := txn.Commit(context.Background())
-switch {
-case errors.Is(err, table.ErrCommitDiverged):
-    // unrecoverable: rebuild the operation from the latest table
-case errors.Is(err, table.ErrCommitFailed):
-    // retriable: refresh and try again (the retry loop does this for you)
-}
-</code></pre>
-<h2 id="isolation-levels"><a class="header" href="#isolation-levels">Isolation 
levels</a></h2>
-<p>Delete and update operations are validated under an isolation level, set per
-operation through table properties:</p>
-<div class="table-wrapper"><table><thead><tr><th style="text-align: 
left">Property</th><th style="text-align: left">Default</th><th 
style="text-align: left">Values</th></tr></thead><tbody>
-<tr><td style="text-align: 
left"><code>write.delete.isolation-level</code></td><td style="text-align: 
left"><code>serializable</code></td><td style="text-align: 
left"><code>serializable</code>, <code>snapshot</code></td></tr>
-<tr><td style="text-align: 
left"><code>write.update.isolation-level</code></td><td style="text-align: 
left"><code>serializable</code></td><td style="text-align: 
left"><code>serializable</code>, <code>snapshot</code></td></tr>
-</tbody></table>
-</div>
-<p><code>serializable</code> rejects the commit if <em>any</em> concurrent 
snapshot added data
-matching the operation's filter. <code>snapshot</code> is more permissive — it 
only
-rejects when concurrent deletes touch the same files.</p>
-<h2 id="automatic-retry"><a class="header" href="#automatic-retry">Automatic 
retry</a></h2>
-<p>iceberg-go can refresh the table and replay the operation against the latest
-snapshot between attempts. On each retry the table metadata is reloaded, the
-producer's validators re-run against the fresh snapshot, and the commit is
-re-submitted only if it is still valid.</p>
-<p>Retry is <strong>off by default</strong> 
(<code>commit.retry.num-retries</code> is <code>0</code>). Opt in by
-setting the retry properties — see <a 
href="./configuration.html#manifest-and-commit">Manifest and commit</a>
-in the configuration reference for the full list:</p>
-<pre><code class="language-go">// Opt in to retries (e.g. 4 attempts after the 
first) for a contended table.
-_, err := cat.CreateTable(ctx, ident, schema,
-    catalog.WithProperties(iceberg.Properties{
-        &quot;commit.retry.num-retries&quot;: &quot;4&quot;,
-    }),
+// tbl was created with table.PropertyFormatVersion = &quot;3&quot; and this 
schema.
+schema := iceberg.NewSchema(0,
+    iceberg.NestedField{ID: 1, Name: &quot;payload&quot;, Type: 
iceberg.VariantType{}},
 )
+arrowSchema, _ := table.SchemaToArrowSchema(schema, nil, true, false)
+
+bldr := extensions.NewVariantBuilder(memory.DefaultAllocator, 
extensions.NewDefaultVariantType())
+defer bldr.Release()
+
+var vb variant.Builder
+_ = vb.Append(map[string]any{&quot;x&quot;: int64(320), &quot;target&quot;: 
&quot;button-submit&quot;})
+val, _ := vb.Build()
+bldr.Append(val)
+
+col := bldr.NewArray()
+defer col.Release()
+rec := array.NewRecordBatch(arrowSchema, []arrow.Array{col}, 1)
+defer rec.Release()
+
+tx := tbl.NewTransaction()
+arrTable := array.NewTableFromRecords(arrowSchema, []arrow.Record{rec})
+defer arrTable.Release()
+_ = tx.AppendTable(ctx, arrTable, 1024, nil)
+tbl, _ = tx.Commit(ctx)
+</code></pre>
+<p>A normal scan reads it back; the variant column comes back as an 
<code>*extensions.VariantArray</code>:</p>
+<pre><code class="language-go">result, _ := tbl.Scan().ToArrowTable(ctx)
+defer result.Release()
+
+variants := result.Column(0).Data().Chunk(0).(*extensions.VariantArray)
+v, _ := variants.Value(0)
+fmt.Println(v.Value()) // variant.ObjectValue for the object above
 </code></pre>
-<blockquote>
-<p><strong>Catalog support:</strong> retry currently engages on the REST 
catalog, which wraps
-commit conflicts as <code>ErrCommitFailed</code>. The Glue, SQL, and Hive 
catalogs do
-not yet wrap their conflict errors, so the retry loop will not fire on 
them.</p>
-</blockquote>
+<h2 id="shredding"><a class="header" href="#shredding">Shredding</a></h2>
+<p>Shredding stores the fields of a variant as typed Parquet sub-columns 
instead of a
+single opaque blob. This lets scans read and filter a field as a native column
+rather than decoding every value. Shredding is opt-in and configured with two 
write
+properties (see <a 
href="./configuration.html#parquet-writer">Configuration</a>):</p>
+<ul>
+<li><code>write.parquet.shred-variants</code> - enable shredding of top-level 
variant columns
+(default <code>false</code>).</li>
+<li><code>write.parquet.variant-inference-buffer-size</code> - rows buffered 
per file to infer
+the shredding schema (default <code>100</code>).</li>
+</ul>
+<p>The reader accepts both shredded and non-shredded data; no read-side
+configuration is required.</p>
+<h2 id="filtering-on-variant-fields"><a class="header" 
href="#filtering-on-variant-fields">Filtering on variant fields</a></h2>
+<p>Filter on a field inside a variant with <code>iceberg.Extract</code>, which 
plugs into the
+usual predicate builders. See <a 
href="./row-filter-syntax.html#variant-extraction">Row Filter Syntax</a>
+for usage, supported target types, and caveats.</p>
+<h2 id="constraints"><a class="header" href="#constraints">Constraints</a></h2>
+<ul>
+<li>A variant column cannot be a partition source or an identity-transform 
source.</li>
+</ul>
 
                     </main>
 
                     <nav class="nav-wrapper" aria-label="Page navigation">
                         <!-- Mobile navigation buttons -->
-                            <a rel="prev" href="expression-dsl.html" 
class="mobile-nav-chapters previous" title="Previous chapter" 
aria-label="Previous chapter" aria-keyshortcuts="Left">
+                            <a rel="prev" href="api.html" 
class="mobile-nav-chapters previous" title="Previous chapter" 
aria-label="Previous chapter" aria-keyshortcuts="Left">
                                 <i class="fa fa-angle-left"></i>
                             </a>
 
-                            <a rel="next prefetch" 
href="metrics-reporting.html" class="mobile-nav-chapters next" title="Next 
chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+                            <a rel="next prefetch" 
href="row-filter-syntax.html" class="mobile-nav-chapters next" title="Next 
chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                 <i class="fa fa-angle-right"></i>
                             </a>
 
@@ -313,11 +329,11 @@ not yet wrap their conflict errors, so the retry loop 
will not fire on them.</p>
             </div>
 
             <nav class="nav-wide-wrapper" aria-label="Page navigation">
-                    <a rel="prev" href="expression-dsl.html" 
class="nav-chapters previous" title="Previous chapter" aria-label="Previous 
chapter" aria-keyshortcuts="Left">
+                    <a rel="prev" href="api.html" class="nav-chapters 
previous" title="Previous chapter" aria-label="Previous chapter" 
aria-keyshortcuts="Left">
                         <i class="fa fa-angle-left"></i>
                     </a>
 
-                    <a rel="next prefetch" href="metrics-reporting.html" 
class="nav-chapters next" title="Next chapter" aria-label="Next chapter" 
aria-keyshortcuts="Right">
+                    <a rel="next prefetch" href="row-filter-syntax.html" 
class="nav-chapters next" title="Next chapter" aria-label="Next chapter" 
aria-keyshortcuts="Right">
                         <i class="fa fa-angle-right"></i>
                     </a>
             </nav>
diff --git a/verify-release.html b/verify-release.html
index 65ca365df..0bb2cb894 100644
--- a/verify-release.html
+++ b/verify-release.html
@@ -123,7 +123,7 @@
 
         <nav id="sidebar" class="sidebar" aria-label="Table of contents">
             <div class="sidebar-scrollbox">
-                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
+                <ol class="chapter"><li class="chapter-item expanded "><a 
href="introduction.html">Introduction</a></li><li class="chapter-item expanded 
affix "><li class="part-title">User Guide</li><li class="chapter-item expanded 
"><a href="install.html">Install</a></li><li class="chapter-item expanded "><a 
href="getting-started.html">Getting Started</a></li><li class="chapter-item 
expanded "><a href="configuration.html">Configuration</a></li><li 
class="chapter-item expanded "><a href= [...]
             </div>
             <div id="sidebar-resize-handle" class="sidebar-resize-handle">
                 <div class="sidebar-resize-indicator"></div>

Reply via email to