You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by gi...@apache.org on 2025/11/10 01:41:54 UTC

(iceberg-rust) branch gh-pages updated: deploy: bb607dc5f550b694dc1741b1d95294500b5959c6

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

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


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

commit d100cff3a93bbebfc62e6541b2f85509d26392d7
Author: liurenjie1024 <li...@users.noreply.github.com>
AuthorDate: Mon Nov 10 01:41:50 2025 +0000

    deploy: bb607dc5f550b694dc1741b1d95294500b5959c6
---
 api/src/iceberg/spec/values.rs.html | 2823 +++++++++++++++++++----------------
 1 file changed, 1557 insertions(+), 1266 deletions(-)

diff --git a/api/src/iceberg/spec/values.rs.html b/api/src/iceberg/spec/values.rs.html
index fc894ee8..d7d1950f 100644
--- a/api/src/iceberg/spec/values.rs.html
+++ b/api/src/iceberg/spec/values.rs.html
@@ -2682,1315 +2682,1606 @@
 <a href=#2682 id=2682 data-nosnippet>2682</a>                    Type::Primitive(PrimitiveType::String) =&gt; <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::string(v))),
 <a href=#2683 id=2683 data-nosnippet>2683</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string"</span>)),
 <a href=#2684 id=2684 data-nosnippet>2684</a>                },
-<a href=#2685 id=2685 data-nosnippet>2685</a>                <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#2686 id=2686 data-nosnippet>2686</a>                // rust avro don't support deserialize any bytes representation now.
-<a href=#2687 id=2687 data-nosnippet>2687</a>                </span>RawLiteralEnum::Bytes(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2688 id=2688 data-nosnippet>2688</a>                    <span class="string">"bytes"</span>,
-<a href=#2689 id=2689 data-nosnippet>2689</a>                    <span class="string">"todo: rust avro doesn't support deserialize any bytes representation now"</span>,
-<a href=#2690 id=2690 data-nosnippet>2690</a>                )),
-<a href=#2691 id=2691 data-nosnippet>2691</a>                RawLiteralEnum::List(v) =&gt; <span class="kw">match </span>ty {
-<a href=#2692 id=2692 data-nosnippet>2692</a>                    Type::List(ty) =&gt; <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
-<a href=#2693 id=2693 data-nosnippet>2693</a>                        v.list
-<a href=#2694 id=2694 data-nosnippet>2694</a>                            .into_iter()
-<a href=#2695 id=2695 data-nosnippet>2695</a>                            .map(|v| {
-<a href=#2696 id=2696 data-nosnippet>2696</a>                                <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = v {
-<a href=#2697 id=2697 data-nosnippet>2697</a>                                    v.try_into(<span class="kw-2">&amp;</span>ty.element_field.field_type)
-<a href=#2698 id=2698 data-nosnippet>2698</a>                                } <span class="kw">else </span>{
-<a href=#2699 id=2699 data-nosnippet>2699</a>                                    <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
-<a href=#2700 id=2700 data-nosnippet>2700</a>                                }
-<a href=#2701 id=2701 data-nosnippet>2701</a>                            })
-<a href=#2702 id=2702 data-nosnippet>2702</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;<span class="kw">_</span>, Error&gt;&gt;()<span class="question-mark">?</span>,
-<a href=#2703 id=2703 data-nosnippet>2703</a>                    ))),
-<a href=#2704 id=2704 data-nosnippet>2704</a>                    Type::Map(map_ty) =&gt; {
-<a href=#2705 id=2705 data-nosnippet>2705</a>                        <span class="kw">let </span>key_ty = map_ty.key_field.field_type.as_ref();
-<a href=#2706 id=2706 data-nosnippet>2706</a>                        <span class="kw">let </span>value_ty = map_ty.value_field.field_type.as_ref();
-<a href=#2707 id=2707 data-nosnippet>2707</a>                        <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#2708 id=2708 data-nosnippet>2708</a>                        <span class="kw">for </span>k_v <span class="kw">in </span>v.list {
-<a href=#2709 id=2709 data-nosnippet>2709</a>                            <span class="kw">let </span>k_v = k_v.ok_or_else(|| invalid_err_with_reason(<span class="string">"list"</span>,<span class="string">"In deserialize, None will be represented as Some(RawLiteral::Null), all element in list must be valid"</span>))<span class="question-mark">?</span>;
-<a href=#2710 id=2710 data-nosnippet>2710</a>                            <span class="kw">if let </span>RawLiteralEnum::Record(Record {
-<a href=#2711 id=2711 data-nosnippet>2711</a>                                required,
-<a href=#2712 id=2712 data-nosnippet>2712</a>                                optional: <span class="kw">_</span>,
-<a href=#2713 id=2713 data-nosnippet>2713</a>                            }) = k_v
-<a href=#2714 id=2714 data-nosnippet>2714</a>                            {
-<a href=#2715 id=2715 data-nosnippet>2715</a>                                <span class="kw">if </span>required.len() != <span class="number">2 </span>{
-<a href=#2716 id=2716 data-nosnippet>2716</a>                                    <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2717 id=2717 data-nosnippet>2717</a>                                        <span class="string">"list"</span>,
-<a href=#2718 id=2718 data-nosnippet>2718</a>                                        <span class="string">"Record must contains two element(key and value) of array"</span>,
-<a href=#2719 id=2719 data-nosnippet>2719</a>                                    ));
-<a href=#2720 id=2720 data-nosnippet>2720</a>                                }
-<a href=#2721 id=2721 data-nosnippet>2721</a>                                <span class="kw">let </span><span class="kw-2">mut </span>key = <span class="prelude-val">None</span>;
-<a href=#2722 id=2722 data-nosnippet>2722</a>                                <span class="kw">let </span><span class="kw-2">mut </span>value = <span class="prelude-val">None</span>;
-<a href=#2723 id=2723 data-nosnippet>2723</a>                                required.into_iter().for_each(|(k, v)| {
-<a href=#2724 id=2724 data-nosnippet>2724</a>                                    <span class="kw">if </span>k == MAP_KEY_FIELD_NAME {
-<a href=#2725 id=2725 data-nosnippet>2725</a>                                        key = <span class="prelude-val">Some</span>(v);
-<a href=#2726 id=2726 data-nosnippet>2726</a>                                    } <span class="kw">else if </span>k == MAP_VALUE_FIELD_NAME {
-<a href=#2727 id=2727 data-nosnippet>2727</a>                                        value = <span class="prelude-val">Some</span>(v);
-<a href=#2728 id=2728 data-nosnippet>2728</a>                                    }
-<a href=#2729 id=2729 data-nosnippet>2729</a>                                });
-<a href=#2730 id=2730 data-nosnippet>2730</a>                                <span class="kw">match </span>(key, value) {
-<a href=#2731 id=2731 data-nosnippet>2731</a>                                    (<span class="prelude-val">Some</span>(k), <span class="prelude-val">Some</span>(v)) =&gt; {
-<a href=#2732 id=2732 data-nosnippet>2732</a>                                        <span class="kw">let </span>key = k.try_into(key_ty)<span class="question-mark">?</span>.ok_or_else(|| {
-<a href=#2733 id=2733 data-nosnippet>2733</a>                                            invalid_err_with_reason(
-<a href=#2734 id=2734 data-nosnippet>2734</a>                                                <span class="string">"list"</span>,
-<a href=#2735 id=2735 data-nosnippet>2735</a>                                                <span class="string">"Key element in Map must be valid"</span>,
-<a href=#2736 id=2736 data-nosnippet>2736</a>                                            )
-<a href=#2737 id=2737 data-nosnippet>2737</a>                                        })<span class="question-mark">?</span>;
-<a href=#2738 id=2738 data-nosnippet>2738</a>                                        <span class="kw">let </span>value = v.try_into(value_ty)<span class="question-mark">?</span>;
-<a href=#2739 id=2739 data-nosnippet>2739</a>                                        <span class="kw">if </span>map_ty.value_field.required &amp;&amp; value.is_none() {
-<a href=#2740 id=2740 data-nosnippet>2740</a>                                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2741 id=2741 data-nosnippet>2741</a>                                                <span class="string">"list"</span>,
-<a href=#2742 id=2742 data-nosnippet>2742</a>                                                <span class="string">"Value element is required in this Map"</span>,
-<a href=#2743 id=2743 data-nosnippet>2743</a>                                            ));
-<a href=#2744 id=2744 data-nosnippet>2744</a>                                        }
-<a href=#2745 id=2745 data-nosnippet>2745</a>                                        map.insert(key, value);
-<a href=#2746 id=2746 data-nosnippet>2746</a>                                    }
-<a href=#2747 id=2747 data-nosnippet>2747</a>                                    <span class="kw">_ </span>=&gt; {
-<a href=#2748 id=2748 data-nosnippet>2748</a>                                        <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2749 id=2749 data-nosnippet>2749</a>                                            <span class="string">"list"</span>,
-<a href=#2750 id=2750 data-nosnippet>2750</a>                                            <span class="string">"The elements of record in list are not key and value"</span>,
-<a href=#2751 id=2751 data-nosnippet>2751</a>                                        ));
-<a href=#2752 id=2752 data-nosnippet>2752</a>                                    }
-<a href=#2753 id=2753 data-nosnippet>2753</a>                                }
-<a href=#2754 id=2754 data-nosnippet>2754</a>                            } <span class="kw">else </span>{
-<a href=#2755 id=2755 data-nosnippet>2755</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2756 id=2756 data-nosnippet>2756</a>                                    <span class="string">"list"</span>,
-<a href=#2757 id=2757 data-nosnippet>2757</a>                                    <span class="string">"Map should represented as record array."</span>,
-<a href=#2758 id=2758 data-nosnippet>2758</a>                                ));
-<a href=#2759 id=2759 data-nosnippet>2759</a>                            }
-<a href=#2760 id=2760 data-nosnippet>2760</a>                        }
-<a href=#2761 id=2761 data-nosnippet>2761</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
-<a href=#2762 id=2762 data-nosnippet>2762</a>                    }
-<a href=#2763 id=2763 data-nosnippet>2763</a>                    Type::Primitive(PrimitiveType::Uuid) =&gt; {
-<a href=#2764 id=2764 data-nosnippet>2764</a>                        <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
-<a href=#2765 id=2765 data-nosnippet>2765</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2766 id=2766 data-nosnippet>2766</a>                                <span class="string">"list"</span>,
-<a href=#2767 id=2767 data-nosnippet>2767</a>                                <span class="string">"The length of list should be 16"</span>,
-<a href=#2768 id=2768 data-nosnippet>2768</a>                            ));
-<a href=#2769 id=2769 data-nosnippet>2769</a>                        }
-<a href=#2770 id=2770 data-nosnippet>2770</a>                        <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
-<a href=#2771 id=2771 data-nosnippet>2771</a>                        <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
-<a href=#2772 id=2772 data-nosnippet>2772</a>                            <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2773 id=2773 data-nosnippet>2773</a>                                bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
-<a href=#2774 id=2774 data-nosnippet>2774</a>                            } <span class="kw">else </span>{
-<a href=#2775 id=2775 data-nosnippet>2775</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2776 id=2776 data-nosnippet>2776</a>                                    <span class="string">"list"</span>,
-<a href=#2777 id=2777 data-nosnippet>2777</a>                                    <span class="string">"The element of list should be int"</span>,
-<a href=#2778 id=2778 data-nosnippet>2778</a>                                ));
-<a href=#2779 id=2779 data-nosnippet>2779</a>                            }
-<a href=#2780 id=2780 data-nosnippet>2780</a>                        }
-<a href=#2781 id=2781 data-nosnippet>2781</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
-<a href=#2782 id=2782 data-nosnippet>2782</a>                    }
-<a href=#2783 id=2783 data-nosnippet>2783</a>                    Type::Primitive(PrimitiveType::Decimal {
-<a href=#2784 id=2784 data-nosnippet>2784</a>                        precision: <span class="kw">_</span>,
-<a href=#2785 id=2785 data-nosnippet>2785</a>                        scale: <span class="kw">_</span>,
-<a href=#2786 id=2786 data-nosnippet>2786</a>                    }) =&gt; {
-<a href=#2787 id=2787 data-nosnippet>2787</a>                        <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
-<a href=#2788 id=2788 data-nosnippet>2788</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2789 id=2789 data-nosnippet>2789</a>                                <span class="string">"list"</span>,
-<a href=#2790 id=2790 data-nosnippet>2790</a>                                <span class="string">"The length of list should be 16"</span>,
-<a href=#2791 id=2791 data-nosnippet>2791</a>                            ));
-<a href=#2792 id=2792 data-nosnippet>2792</a>                        }
-<a href=#2793 id=2793 data-nosnippet>2793</a>                        <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
-<a href=#2794 id=2794 data-nosnippet>2794</a>                        <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
-<a href=#2795 id=2795 data-nosnippet>2795</a>                            <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2796 id=2796 data-nosnippet>2796</a>                                bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
-<a href=#2797 id=2797 data-nosnippet>2797</a>                            } <span class="kw">else </span>{
-<a href=#2798 id=2798 data-nosnippet>2798</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2799 id=2799 data-nosnippet>2799</a>                                    <span class="string">"list"</span>,
-<a href=#2800 id=2800 data-nosnippet>2800</a>                                    <span class="string">"The element of list should be int"</span>,
-<a href=#2801 id=2801 data-nosnippet>2801</a>                                ));
-<a href=#2802 id=2802 data-nosnippet>2802</a>                            }
-<a href=#2803 id=2803 data-nosnippet>2803</a>                        }
-<a href=#2804 id=2804 data-nosnippet>2804</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::decimal(i128::from_be_bytes(bytes))))
-<a href=#2805 id=2805 data-nosnippet>2805</a>                    }
-<a href=#2806 id=2806 data-nosnippet>2806</a>                    Type::Primitive(PrimitiveType::Binary) =&gt; {
-<a href=#2807 id=2807 data-nosnippet>2807</a>                        <span class="kw">let </span>bytes = v
-<a href=#2808 id=2808 data-nosnippet>2808</a>                            .list
-<a href=#2809 id=2809 data-nosnippet>2809</a>                            .into_iter()
-<a href=#2810 id=2810 data-nosnippet>2810</a>                            .map(|v| {
-<a href=#2811 id=2811 data-nosnippet>2811</a>                                <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2812 id=2812 data-nosnippet>2812</a>                                    <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
-<a href=#2813 id=2813 data-nosnippet>2813</a>                                } <span class="kw">else </span>{
-<a href=#2814 id=2814 data-nosnippet>2814</a>                                    <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2815 id=2815 data-nosnippet>2815</a>                                        <span class="string">"list"</span>,
-<a href=#2816 id=2816 data-nosnippet>2816</a>                                        <span class="string">"The element of list should be int"</span>,
-<a href=#2817 id=2817 data-nosnippet>2817</a>                                    ))
-<a href=#2818 id=2818 data-nosnippet>2818</a>                                }
-<a href=#2819 id=2819 data-nosnippet>2819</a>                            })
-<a href=#2820 id=2820 data-nosnippet>2820</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;<span class="kw">_</span>&gt;, Error&gt;&gt;()<span class="question-mark">?</span>;
-<a href=#2821 id=2821 data-nosnippet>2821</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(bytes)))
-<a href=#2822 id=2822 data-nosnippet>2822</a>                    }
-<a href=#2823 id=2823 data-nosnippet>2823</a>                    Type::Primitive(PrimitiveType::Fixed(size)) =&gt; {
-<a href=#2824 id=2824 data-nosnippet>2824</a>                        <span class="kw">if </span>v.list.len() != <span class="kw-2">*</span>size <span class="kw">as </span>usize {
-<a href=#2825 id=2825 data-nosnippet>2825</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2826 id=2826 data-nosnippet>2826</a>                                <span class="string">"list"</span>,
-<a href=#2827 id=2827 data-nosnippet>2827</a>                                <span class="string">"The length of list should be equal to size"</span>,
-<a href=#2828 id=2828 data-nosnippet>2828</a>                            ));
-<a href=#2829 id=2829 data-nosnippet>2829</a>                        }
-<a href=#2830 id=2830 data-nosnippet>2830</a>                        <span class="kw">let </span>bytes = v
-<a href=#2831 id=2831 data-nosnippet>2831</a>                            .list
-<a href=#2832 id=2832 data-nosnippet>2832</a>                            .into_iter()
-<a href=#2833 id=2833 data-nosnippet>2833</a>                            .map(|v| {
-<a href=#2834 id=2834 data-nosnippet>2834</a>                                <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2835 id=2835 data-nosnippet>2835</a>                                    <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
-<a href=#2836 id=2836 data-nosnippet>2836</a>                                } <span class="kw">else </span>{
-<a href=#2837 id=2837 data-nosnippet>2837</a>                                    <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2838 id=2838 data-nosnippet>2838</a>                                        <span class="string">"list"</span>,
-<a href=#2839 id=2839 data-nosnippet>2839</a>                                        <span class="string">"The element of list should be int"</span>,
-<a href=#2840 id=2840 data-nosnippet>2840</a>                                    ))
-<a href=#2841 id=2841 data-nosnippet>2841</a>                                }
-<a href=#2842 id=2842 data-nosnippet>2842</a>                            })
-<a href=#2843 id=2843 data-nosnippet>2843</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;<span class="kw">_</span>&gt;, Error&gt;&gt;()<span class="question-mark">?</span>;
-<a href=#2844 id=2844 data-nosnippet>2844</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(bytes)))
-<a href=#2845 id=2845 data-nosnippet>2845</a>                    }
-<a href=#2846 id=2846 data-nosnippet>2846</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"list"</span>)),
-<a href=#2847 id=2847 data-nosnippet>2847</a>                },
-<a href=#2848 id=2848 data-nosnippet>2848</a>                RawLiteralEnum::Record(Record {
-<a href=#2849 id=2849 data-nosnippet>2849</a>                    required,
-<a href=#2850 id=2850 data-nosnippet>2850</a>                    optional: <span class="kw">_</span>,
-<a href=#2851 id=2851 data-nosnippet>2851</a>                }) =&gt; <span class="kw">match </span>ty {
-<a href=#2852 id=2852 data-nosnippet>2852</a>                    Type::Struct(struct_ty) =&gt; {
-<a href=#2853 id=2853 data-nosnippet>2853</a>                        <span class="kw">let </span>iters: Vec&lt;<span class="prelude-ty">Option</span>&lt;Literal&gt;&gt; = required
-<a href=#2854 id=2854 data-nosnippet>2854</a>                            .into_iter()
-<a href=#2855 id=2855 data-nosnippet>2855</a>                            .map(|(field_name, value)| {
-<a href=#2856 id=2856 data-nosnippet>2856</a>                                <span class="kw">let </span>field = struct_ty
-<a href=#2857 id=2857 data-nosnippet>2857</a>                                    .field_by_name(field_name.as_str())
-<a href=#2858 id=2858 data-nosnippet>2858</a>                                    .ok_or_else(|| {
-<a href=#2859 id=2859 data-nosnippet>2859</a>                                        invalid_err_with_reason(
-<a href=#2860 id=2860 data-nosnippet>2860</a>                                            <span class="string">"record"</span>,
-<a href=#2861 id=2861 data-nosnippet>2861</a>                                            <span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"field {} is not exist"</span>, <span class="kw-2">&amp;</span>field_name),
-<a href=#2862 id=2862 data-nosnippet>2862</a>                                        )
-<a href=#2863 id=2863 data-nosnippet>2863</a>                                    })<span class="question-mark">?</span>;
-<a href=#2864 id=2864 data-nosnippet>2864</a>                                <span class="kw">let </span>value = value.try_into(<span class="kw-2">&amp;</span>field.field_type)<span class="question-mark">?</span>;
-<a href=#2865 id=2865 data-nosnippet>2865</a>                                <span class="prelude-val">Ok</span>(value)
-<a href=#2866 id=2866 data-nosnippet>2866</a>                            })
-<a href=#2867 id=2867 data-nosnippet>2867</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;<span class="kw">_</span>, Error&gt;&gt;()<span class="question-mark">?</span>;
-<a href=#2868 id=2868 data-nosnippet>2868</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Struct(<span class="kw">super</span>::Struct::from_iter(iters))))
-<a href=#2869 id=2869 data-nosnippet>2869</a>                    }
-<a href=#2870 id=2870 data-nosnippet>2870</a>                    Type::Map(map_ty) =&gt; {
-<a href=#2871 id=2871 data-nosnippet>2871</a>                        <span class="kw">if </span><span class="kw-2">*</span>map_ty.key_field.field_type != Type::Primitive(PrimitiveType::String) {
-<a href=#2872 id=2872 data-nosnippet>2872</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2873 id=2873 data-nosnippet>2873</a>                                <span class="string">"record"</span>,
-<a href=#2874 id=2874 data-nosnippet>2874</a>                                <span class="string">"Map key must be string"</span>,
-<a href=#2875 id=2875 data-nosnippet>2875</a>                            ));
-<a href=#2876 id=2876 data-nosnippet>2876</a>                        }
-<a href=#2877 id=2877 data-nosnippet>2877</a>                        <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#2878 id=2878 data-nosnippet>2878</a>                        <span class="kw">for </span>(k, v) <span class="kw">in </span>required {
-<a href=#2879 id=2879 data-nosnippet>2879</a>                            <span class="kw">let </span>value = v.try_into(<span class="kw-2">&amp;</span>map_ty.value_field.field_type)<span class="question-mark">?</span>;
-<a href=#2880 id=2880 data-nosnippet>2880</a>                            <span class="kw">if </span>map_ty.value_field.required &amp;&amp; value.is_none() {
-<a href=#2881 id=2881 data-nosnippet>2881</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2882 id=2882 data-nosnippet>2882</a>                                    <span class="string">"record"</span>,
-<a href=#2883 id=2883 data-nosnippet>2883</a>                                    <span class="string">"Value element is required in this Map"</span>,
-<a href=#2884 id=2884 data-nosnippet>2884</a>                                ));
-<a href=#2885 id=2885 data-nosnippet>2885</a>                            }
-<a href=#2886 id=2886 data-nosnippet>2886</a>                            map.insert(Literal::string(k), value);
-<a href=#2887 id=2887 data-nosnippet>2887</a>                        }
-<a href=#2888 id=2888 data-nosnippet>2888</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
-<a href=#2889 id=2889 data-nosnippet>2889</a>                    }
-<a href=#2890 id=2890 data-nosnippet>2890</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"record"</span>)),
-<a href=#2891 id=2891 data-nosnippet>2891</a>                },
-<a href=#2892 id=2892 data-nosnippet>2892</a>                RawLiteralEnum::StringMap(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string map"</span>)),
-<a href=#2893 id=2893 data-nosnippet>2893</a>            }
-<a href=#2894 id=2894 data-nosnippet>2894</a>        }
-<a href=#2895 id=2895 data-nosnippet>2895</a>    }
-<a href=#2896 id=2896 data-nosnippet>2896</a>}
-<a href=#2897 id=2897 data-nosnippet>2897</a>
-<a href=#2898 id=2898 data-nosnippet>2898</a><span class="attr">#[cfg(test)]
-<a href=#2899 id=2899 data-nosnippet>2899</a></span><span class="kw">mod </span>tests {
-<a href=#2900 id=2900 data-nosnippet>2900</a>    <span class="kw">use </span>apache_avro::to_value;
-<a href=#2901 id=2901 data-nosnippet>2901</a>    <span class="kw">use </span>apache_avro::types::Value;
-<a href=#2902 id=2902 data-nosnippet>2902</a>
-<a href=#2903 id=2903 data-nosnippet>2903</a>    <span class="kw">use super</span>::<span class="kw-2">*</span>;
-<a href=#2904 id=2904 data-nosnippet>2904</a>    <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
-<a href=#2905 id=2905 data-nosnippet>2905</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::Schema;
-<a href=#2906 id=2906 data-nosnippet>2906</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::Type::Primitive;
-<a href=#2907 id=2907 data-nosnippet>2907</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{ListType, MapType, NestedField, StructType};
-<a href=#2908 id=2908 data-nosnippet>2908</a>
-<a href=#2909 id=2909 data-nosnippet>2909</a>    <span class="kw">fn </span>check_json_serde(json: <span class="kw-2">&amp;</span>str, expected_literal: Literal, expected_type: <span class="kw-2">&amp;</span>Type) {
-<a href=#2910 id=2910 data-nosnippet>2910</a>        <span class="kw">let </span>raw_json_value = serde_json::from_str::&lt;JsonValue&gt;(json).unwrap();
-<a href=#2911 id=2911 data-nosnippet>2911</a>        <span class="kw">let </span>desered_literal =
-<a href=#2912 id=2912 data-nosnippet>2912</a>            Literal::try_from_json(raw_json_value.clone(), expected_type).unwrap();
-<a href=#2913 id=2913 data-nosnippet>2913</a>        <span class="macro">assert_eq!</span>(desered_literal, <span class="prelude-val">Some</span>(expected_literal.clone()));
-<a href=#2914 id=2914 data-nosnippet>2914</a>
-<a href=#2915 id=2915 data-nosnippet>2915</a>        <span class="kw">let </span>expected_json_value: JsonValue = expected_literal.try_into_json(expected_type).unwrap();
-<a href=#2916 id=2916 data-nosnippet>2916</a>        <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&amp;</span>expected_json_value).unwrap();
-<a href=#2917 id=2917 data-nosnippet>2917</a>        <span class="kw">let </span>parsed_json_value = serde_json::from_str::&lt;JsonValue&gt;(<span class="kw-2">&amp;</span>sered_json).unwrap();
-<a href=#2918 id=2918 data-nosnippet>2918</a>
-<a href=#2919 id=2919 data-nosnippet>2919</a>        <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
-<a href=#2920 id=2920 data-nosnippet>2920</a>    }
-<a href=#2921 id=2921 data-nosnippet>2921</a>
-<a href=#2922 id=2922 data-nosnippet>2922</a>    <span class="kw">fn </span>check_avro_bytes_serde(
-<a href=#2923 id=2923 data-nosnippet>2923</a>        input: Vec&lt;u8&gt;,
-<a href=#2924 id=2924 data-nosnippet>2924</a>        expected_datum: Datum,
-<a href=#2925 id=2925 data-nosnippet>2925</a>        expected_type: <span class="kw-2">&amp;</span>PrimitiveType,
-<a href=#2926 id=2926 data-nosnippet>2926</a>    ) {
-<a href=#2927 id=2927 data-nosnippet>2927</a>        <span class="kw">let </span>raw_schema = <span class="string">r#""bytes""#</span>;
-<a href=#2928 id=2928 data-nosnippet>2928</a>        <span class="kw">let </span>schema = apache_avro::Schema::parse_str(raw_schema).unwrap();
-<a href=#2929 id=2929 data-nosnippet>2929</a>
-<a href=#2930 id=2930 data-nosnippet>2930</a>        <span class="kw">let </span>bytes = ByteBuf::from(input);
-<a href=#2931 id=2931 data-nosnippet>2931</a>        <span class="kw">let </span>datum = Datum::try_from_bytes(<span class="kw-2">&amp;</span>bytes, expected_type.clone()).unwrap();
-<a href=#2932 id=2932 data-nosnippet>2932</a>        <span class="macro">assert_eq!</span>(datum, expected_datum);
-<a href=#2933 id=2933 data-nosnippet>2933</a>
-<a href=#2934 id=2934 data-nosnippet>2934</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>schema, Vec::new());
-<a href=#2935 id=2935 data-nosnippet>2935</a>        writer.append_ser(datum.to_bytes().unwrap()).unwrap();
-<a href=#2936 id=2936 data-nosnippet>2936</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2937 id=2937 data-nosnippet>2937</a>        <span class="kw">let </span>reader = apache_avro::Reader::with_schema(<span class="kw-2">&amp;</span>schema, <span class="kw-2">&amp;*</span>encoded).unwrap();
-<a href=#2938 id=2938 data-nosnippet>2938</a>
-<a href=#2939 id=2939 data-nosnippet>2939</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2940 id=2940 data-nosnippet>2940</a>            <span class="kw">let </span>result = apache_avro::from_value::&lt;ByteBuf&gt;(<span class="kw-2">&amp;</span>record.unwrap()).unwrap();
-<a href=#2941 id=2941 data-nosnippet>2941</a>            <span class="kw">let </span>desered_datum = Datum::try_from_bytes(<span class="kw-2">&amp;</span>result, expected_type.clone()).unwrap();
-<a href=#2942 id=2942 data-nosnippet>2942</a>            <span class="macro">assert_eq!</span>(desered_datum, expected_datum);
-<a href=#2943 id=2943 data-nosnippet>2943</a>        }
-<a href=#2944 id=2944 data-nosnippet>2944</a>    }
-<a href=#2945 id=2945 data-nosnippet>2945</a>
-<a href=#2946 id=2946 data-nosnippet>2946</a>    <span class="kw">fn </span>check_convert_with_avro(expected_literal: Literal, expected_type: <span class="kw-2">&amp;</span>Type) {
-<a href=#2947 id=2947 data-nosnippet>2947</a>        <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
-<a href=#2948 id=2948 data-nosnippet>2948</a>        <span class="kw">let </span>schema = Schema::builder()
-<a href=#2949 id=2949 data-nosnippet>2949</a>            .with_fields(fields.clone())
-<a href=#2950 id=2950 data-nosnippet>2950</a>            .build()
-<a href=#2951 id=2951 data-nosnippet>2951</a>            .unwrap();
-<a href=#2952 id=2952 data-nosnippet>2952</a>        <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&amp;</span>schema).unwrap();
-<a href=#2953 id=2953 data-nosnippet>2953</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#2954 id=2954 data-nosnippet>2954</a>        <span class="kw">let </span>struct_literal =
-<a href=#2955 id=2955 data-nosnippet>2955</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#2685 id=2685 data-nosnippet>2685</a>                RawLiteralEnum::Bytes(v) =&gt; <span class="kw">match </span>ty {
+<a href=#2686 id=2686 data-nosnippet>2686</a>                    Type::Primitive(PrimitiveType::Binary) =&gt; <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(v.to_vec()))),
+<a href=#2687 id=2687 data-nosnippet>2687</a>                    Type::Primitive(PrimitiveType::Fixed(expected_len)) =&gt; {
+<a href=#2688 id=2688 data-nosnippet>2688</a>                        <span class="kw">if </span>v.len() == <span class="kw-2">*</span>expected_len <span class="kw">as </span>usize {
+<a href=#2689 id=2689 data-nosnippet>2689</a>                            <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(v.to_vec())))
+<a href=#2690 id=2690 data-nosnippet>2690</a>                        } <span class="kw">else </span>{
+<a href=#2691 id=2691 data-nosnippet>2691</a>                            <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2692 id=2692 data-nosnippet>2692</a>                                <span class="string">"bytes"</span>,
+<a href=#2693 id=2693 data-nosnippet>2693</a>                                <span class="kw-2">&amp;</span><span class="macro">format!</span>(
+<a href=#2694 id=2694 data-nosnippet>2694</a>                                    <span class="string">"Fixed type must be exactly {} bytes, got {}"</span>,
+<a href=#2695 id=2695 data-nosnippet>2695</a>                                    expected_len,
+<a href=#2696 id=2696 data-nosnippet>2696</a>                                    v.len()
+<a href=#2697 id=2697 data-nosnippet>2697</a>                                ),
+<a href=#2698 id=2698 data-nosnippet>2698</a>                            ))
+<a href=#2699 id=2699 data-nosnippet>2699</a>                        }
+<a href=#2700 id=2700 data-nosnippet>2700</a>                    }
+<a href=#2701 id=2701 data-nosnippet>2701</a>                    Type::Primitive(PrimitiveType::Uuid) =&gt; {
+<a href=#2702 id=2702 data-nosnippet>2702</a>                        <span class="kw">if </span>v.len() == <span class="number">16 </span>{
+<a href=#2703 id=2703 data-nosnippet>2703</a>                            <span class="kw">let </span>bytes: [u8; <span class="number">16</span>] = v.as_slice().try_into().map_err(|<span class="kw">_</span>| {
+<a href=#2704 id=2704 data-nosnippet>2704</a>                                invalid_err_with_reason(<span class="string">"bytes"</span>, <span class="string">"UUID must be exactly 16 bytes"</span>)
+<a href=#2705 id=2705 data-nosnippet>2705</a>                            })<span class="question-mark">?</span>;
+<a href=#2706 id=2706 data-nosnippet>2706</a>                            <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
+<a href=#2707 id=2707 data-nosnippet>2707</a>                        } <span class="kw">else </span>{
+<a href=#2708 id=2708 data-nosnippet>2708</a>                            <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2709 id=2709 data-nosnippet>2709</a>                                <span class="string">"bytes"</span>,
+<a href=#2710 id=2710 data-nosnippet>2710</a>                                <span class="string">"UUID must be exactly 16 bytes"</span>,
+<a href=#2711 id=2711 data-nosnippet>2711</a>                            ))
+<a href=#2712 id=2712 data-nosnippet>2712</a>                        }
+<a href=#2713 id=2713 data-nosnippet>2713</a>                    }
+<a href=#2714 id=2714 data-nosnippet>2714</a>                    Type::Primitive(PrimitiveType::Decimal { precision, .. }) =&gt; {
+<a href=#2715 id=2715 data-nosnippet>2715</a>                        <span class="kw">let </span>required_bytes = Type::decimal_required_bytes(<span class="kw-2">*</span>precision)<span class="question-mark">? </span><span class="kw">as </span>usize;
+<a href=#2716 id=2716 data-nosnippet>2716</a>
+<a href=#2717 id=2717 data-nosnippet>2717</a>                        <span class="kw">if </span>v.len() == required_bytes {
+<a href=#2718 id=2718 data-nosnippet>2718</a>                            <span class="comment">// Pad the bytes to 16 bytes (i128 size) with sign extension
+<a href=#2719 id=2719 data-nosnippet>2719</a>                            </span><span class="kw">let </span><span class="kw-2">mut </span>padded_bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
+<a href=#2720 id=2720 data-nosnippet>2720</a>                            <span class="kw">let </span>start_idx = <span class="number">16 </span>- v.len();
+<a href=#2721 id=2721 data-nosnippet>2721</a>
+<a href=#2722 id=2722 data-nosnippet>2722</a>                            <span class="comment">// Copy the input bytes to the end of the array
+<a href=#2723 id=2723 data-nosnippet>2723</a>                            </span>padded_bytes[start_idx..].copy_from_slice(<span class="kw-2">&amp;</span>v);
+<a href=#2724 id=2724 data-nosnippet>2724</a>
+<a href=#2725 id=2725 data-nosnippet>2725</a>                            <span class="comment">// Sign extend if the number is negative (MSB is 1)
+<a href=#2726 id=2726 data-nosnippet>2726</a>                            </span><span class="kw">if </span>!v.is_empty() &amp;&amp; (v[<span class="number">0</span>] &amp; <span class="number">0x80</span>) != <span class="number">0 </span>{
+<a href=#2727 id=2727 data-nosnippet>2727</a>                                <span class="comment">// Fill the padding with 0xFF for negative numbers
+<a href=#2728 id=2728 data-nosnippet>2728</a>                                </span><span class="kw">for </span>byte <span class="kw">in </span><span class="kw-2">&amp;mut </span>padded_bytes[..start_idx] {
+<a href=#2729 id=2729 data-nosnippet>2729</a>                                    <span class="kw-2">*</span>byte = <span class="number">0xFF</span>;
+<a href=#2730 id=2730 data-nosnippet>2730</a>                                }
+<a href=#2731 id=2731 data-nosnippet>2731</a>                            }
+<a href=#2732 id=2732 data-nosnippet>2732</a>
+<a href=#2733 id=2733 data-nosnippet>2733</a>                            <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int128(
+<a href=#2734 id=2734 data-nosnippet>2734</a>                                i128::from_be_bytes(padded_bytes),
+<a href=#2735 id=2735 data-nosnippet>2735</a>                            ))))
+<a href=#2736 id=2736 data-nosnippet>2736</a>                        } <span class="kw">else </span>{
+<a href=#2737 id=2737 data-nosnippet>2737</a>                            <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2738 id=2738 data-nosnippet>2738</a>                                <span class="string">"bytes"</span>,
+<a href=#2739 id=2739 data-nosnippet>2739</a>                                <span class="kw-2">&amp;</span><span class="macro">format!</span>(
+<a href=#2740 id=2740 data-nosnippet>2740</a>                                    <span class="string">"Decimal with precision {} must be exactly {} bytes, got {}"</span>,
+<a href=#2741 id=2741 data-nosnippet>2741</a>                                    precision,
+<a href=#2742 id=2742 data-nosnippet>2742</a>                                    required_bytes,
+<a href=#2743 id=2743 data-nosnippet>2743</a>                                    v.len()
+<a href=#2744 id=2744 data-nosnippet>2744</a>                                ),
+<a href=#2745 id=2745 data-nosnippet>2745</a>                            ))
+<a href=#2746 id=2746 data-nosnippet>2746</a>                        }
+<a href=#2747 id=2747 data-nosnippet>2747</a>                    }
+<a href=#2748 id=2748 data-nosnippet>2748</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"bytes"</span>)),
+<a href=#2749 id=2749 data-nosnippet>2749</a>                },
+<a href=#2750 id=2750 data-nosnippet>2750</a>                RawLiteralEnum::List(v) =&gt; <span class="kw">match </span>ty {
+<a href=#2751 id=2751 data-nosnippet>2751</a>                    Type::List(ty) =&gt; <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
+<a href=#2752 id=2752 data-nosnippet>2752</a>                        v.list
+<a href=#2753 id=2753 data-nosnippet>2753</a>                            .into_iter()
+<a href=#2754 id=2754 data-nosnippet>2754</a>                            .map(|v| {
+<a href=#2755 id=2755 data-nosnippet>2755</a>                                <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = v {
+<a href=#2756 id=2756 data-nosnippet>2756</a>                                    v.try_into(<span class="kw-2">&amp;</span>ty.element_field.field_type)
+<a href=#2757 id=2757 data-nosnippet>2757</a>                                } <span class="kw">else </span>{
+<a href=#2758 id=2758 data-nosnippet>2758</a>                                    <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
+<a href=#2759 id=2759 data-nosnippet>2759</a>                                }
+<a href=#2760 id=2760 data-nosnippet>2760</a>                            })
+<a href=#2761 id=2761 data-nosnippet>2761</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;<span class="kw">_</span>, Error&gt;&gt;()<span class="question-mark">?</span>,
+<a href=#2762 id=2762 data-nosnippet>2762</a>                    ))),
+<a href=#2763 id=2763 data-nosnippet>2763</a>                    Type::Map(map_ty) =&gt; {
+<a href=#2764 id=2764 data-nosnippet>2764</a>                        <span class="kw">let </span>key_ty = map_ty.key_field.field_type.as_ref();
+<a href=#2765 id=2765 data-nosnippet>2765</a>                        <span class="kw">let </span>value_ty = map_ty.value_field.field_type.as_ref();
+<a href=#2766 id=2766 data-nosnippet>2766</a>                        <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#2767 id=2767 data-nosnippet>2767</a>                        <span class="kw">for </span>k_v <span class="kw">in </span>v.list {
+<a href=#2768 id=2768 data-nosnippet>2768</a>                            <span class="kw">let </span>k_v = k_v.ok_or_else(|| invalid_err_with_reason(<span class="string">"list"</span>,<span class="string">"In deserialize, None will be represented as Some(RawLiteral::Null), all element in list must be valid"</span>))<span class="question-mark">?</span>;
+<a href=#2769 id=2769 data-nosnippet>2769</a>                            <span class="kw">if let </span>RawLiteralEnum::Record(Record {
+<a href=#2770 id=2770 data-nosnippet>2770</a>                                required,
+<a href=#2771 id=2771 data-nosnippet>2771</a>                                optional: <span class="kw">_</span>,
+<a href=#2772 id=2772 data-nosnippet>2772</a>                            }) = k_v
+<a href=#2773 id=2773 data-nosnippet>2773</a>                            {
+<a href=#2774 id=2774 data-nosnippet>2774</a>                                <span class="kw">if </span>required.len() != <span class="number">2 </span>{
+<a href=#2775 id=2775 data-nosnippet>2775</a>                                    <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2776 id=2776 data-nosnippet>2776</a>                                        <span class="string">"list"</span>,
+<a href=#2777 id=2777 data-nosnippet>2777</a>                                        <span class="string">"Record must contains two element(key and value) of array"</span>,
+<a href=#2778 id=2778 data-nosnippet>2778</a>                                    ));
+<a href=#2779 id=2779 data-nosnippet>2779</a>                                }
+<a href=#2780 id=2780 data-nosnippet>2780</a>                                <span class="kw">let </span><span class="kw-2">mut </span>key = <span class="prelude-val">None</span>;
+<a href=#2781 id=2781 data-nosnippet>2781</a>                                <span class="kw">let </span><span class="kw-2">mut </span>value = <span class="prelude-val">None</span>;
+<a href=#2782 id=2782 data-nosnippet>2782</a>                                required.into_iter().for_each(|(k, v)| {
+<a href=#2783 id=2783 data-nosnippet>2783</a>                                    <span class="kw">if </span>k == MAP_KEY_FIELD_NAME {
+<a href=#2784 id=2784 data-nosnippet>2784</a>                                        key = <span class="prelude-val">Some</span>(v);
+<a href=#2785 id=2785 data-nosnippet>2785</a>                                    } <span class="kw">else if </span>k == MAP_VALUE_FIELD_NAME {
+<a href=#2786 id=2786 data-nosnippet>2786</a>                                        value = <span class="prelude-val">Some</span>(v);
+<a href=#2787 id=2787 data-nosnippet>2787</a>                                    }
+<a href=#2788 id=2788 data-nosnippet>2788</a>                                });
+<a href=#2789 id=2789 data-nosnippet>2789</a>                                <span class="kw">match </span>(key, value) {
+<a href=#2790 id=2790 data-nosnippet>2790</a>                                    (<span class="prelude-val">Some</span>(k), <span class="prelude-val">Some</span>(v)) =&gt; {
+<a href=#2791 id=2791 data-nosnippet>2791</a>                                        <span class="kw">let </span>key = k.try_into(key_ty)<span class="question-mark">?</span>.ok_or_else(|| {
+<a href=#2792 id=2792 data-nosnippet>2792</a>                                            invalid_err_with_reason(
+<a href=#2793 id=2793 data-nosnippet>2793</a>                                                <span class="string">"list"</span>,
+<a href=#2794 id=2794 data-nosnippet>2794</a>                                                <span class="string">"Key element in Map must be valid"</span>,
+<a href=#2795 id=2795 data-nosnippet>2795</a>                                            )
+<a href=#2796 id=2796 data-nosnippet>2796</a>                                        })<span class="question-mark">?</span>;
+<a href=#2797 id=2797 data-nosnippet>2797</a>                                        <span class="kw">let </span>value = v.try_into(value_ty)<span class="question-mark">?</span>;
+<a href=#2798 id=2798 data-nosnippet>2798</a>                                        <span class="kw">if </span>map_ty.value_field.required &amp;&amp; value.is_none() {
+<a href=#2799 id=2799 data-nosnippet>2799</a>                                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2800 id=2800 data-nosnippet>2800</a>                                                <span class="string">"list"</span>,
+<a href=#2801 id=2801 data-nosnippet>2801</a>                                                <span class="string">"Value element is required in this Map"</span>,
+<a href=#2802 id=2802 data-nosnippet>2802</a>                                            ));
+<a href=#2803 id=2803 data-nosnippet>2803</a>                                        }
+<a href=#2804 id=2804 data-nosnippet>2804</a>                                        map.insert(key, value);
+<a href=#2805 id=2805 data-nosnippet>2805</a>                                    }
+<a href=#2806 id=2806 data-nosnippet>2806</a>                                    <span class="kw">_ </span>=&gt; {
+<a href=#2807 id=2807 data-nosnippet>2807</a>                                        <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2808 id=2808 data-nosnippet>2808</a>                                            <span class="string">"list"</span>,
+<a href=#2809 id=2809 data-nosnippet>2809</a>                                            <span class="string">"The elements of record in list are not key and value"</span>,
+<a href=#2810 id=2810 data-nosnippet>2810</a>                                        ));
+<a href=#2811 id=2811 data-nosnippet>2811</a>                                    }
+<a href=#2812 id=2812 data-nosnippet>2812</a>                                }
+<a href=#2813 id=2813 data-nosnippet>2813</a>                            } <span class="kw">else </span>{
+<a href=#2814 id=2814 data-nosnippet>2814</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2815 id=2815 data-nosnippet>2815</a>                                    <span class="string">"list"</span>,
+<a href=#2816 id=2816 data-nosnippet>2816</a>                                    <span class="string">"Map should represented as record array."</span>,
+<a href=#2817 id=2817 data-nosnippet>2817</a>                                ));
+<a href=#2818 id=2818 data-nosnippet>2818</a>                            }
+<a href=#2819 id=2819 data-nosnippet>2819</a>                        }
+<a href=#2820 id=2820 data-nosnippet>2820</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
+<a href=#2821 id=2821 data-nosnippet>2821</a>                    }
+<a href=#2822 id=2822 data-nosnippet>2822</a>                    Type::Primitive(PrimitiveType::Uuid) =&gt; {
+<a href=#2823 id=2823 data-nosnippet>2823</a>                        <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
+<a href=#2824 id=2824 data-nosnippet>2824</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2825 id=2825 data-nosnippet>2825</a>                                <span class="string">"list"</span>,
+<a href=#2826 id=2826 data-nosnippet>2826</a>                                <span class="string">"The length of list should be 16"</span>,
+<a href=#2827 id=2827 data-nosnippet>2827</a>                            ));
+<a href=#2828 id=2828 data-nosnippet>2828</a>                        }
+<a href=#2829 id=2829 data-nosnippet>2829</a>                        <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
+<a href=#2830 id=2830 data-nosnippet>2830</a>                        <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
+<a href=#2831 id=2831 data-nosnippet>2831</a>                            <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2832 id=2832 data-nosnippet>2832</a>                                bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
+<a href=#2833 id=2833 data-nosnippet>2833</a>                            } <span class="kw">else </span>{
+<a href=#2834 id=2834 data-nosnippet>2834</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2835 id=2835 data-nosnippet>2835</a>                                    <span class="string">"list"</span>,
+<a href=#2836 id=2836 data-nosnippet>2836</a>                                    <span class="string">"The element of list should be int"</span>,
+<a href=#2837 id=2837 data-nosnippet>2837</a>                                ));
+<a href=#2838 id=2838 data-nosnippet>2838</a>                            }
+<a href=#2839 id=2839 data-nosnippet>2839</a>                        }
+<a href=#2840 id=2840 data-nosnippet>2840</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
+<a href=#2841 id=2841 data-nosnippet>2841</a>                    }
+<a href=#2842 id=2842 data-nosnippet>2842</a>                    Type::Primitive(PrimitiveType::Decimal {
+<a href=#2843 id=2843 data-nosnippet>2843</a>                        precision: <span class="kw">_</span>,
+<a href=#2844 id=2844 data-nosnippet>2844</a>                        scale: <span class="kw">_</span>,
+<a href=#2845 id=2845 data-nosnippet>2845</a>                    }) =&gt; {
+<a href=#2846 id=2846 data-nosnippet>2846</a>                        <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
+<a href=#2847 id=2847 data-nosnippet>2847</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2848 id=2848 data-nosnippet>2848</a>                                <span class="string">"list"</span>,
+<a href=#2849 id=2849 data-nosnippet>2849</a>                                <span class="string">"The length of list should be 16"</span>,
+<a href=#2850 id=2850 data-nosnippet>2850</a>                            ));
+<a href=#2851 id=2851 data-nosnippet>2851</a>                        }
+<a href=#2852 id=2852 data-nosnippet>2852</a>                        <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
+<a href=#2853 id=2853 data-nosnippet>2853</a>                        <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
+<a href=#2854 id=2854 data-nosnippet>2854</a>                            <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2855 id=2855 data-nosnippet>2855</a>                                bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
+<a href=#2856 id=2856 data-nosnippet>2856</a>                            } <span class="kw">else </span>{
+<a href=#2857 id=2857 data-nosnippet>2857</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2858 id=2858 data-nosnippet>2858</a>                                    <span class="string">"list"</span>,
+<a href=#2859 id=2859 data-nosnippet>2859</a>                                    <span class="string">"The element of list should be int"</span>,
+<a href=#2860 id=2860 data-nosnippet>2860</a>                                ));
+<a href=#2861 id=2861 data-nosnippet>2861</a>                            }
+<a href=#2862 id=2862 data-nosnippet>2862</a>                        }
+<a href=#2863 id=2863 data-nosnippet>2863</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::decimal(i128::from_be_bytes(bytes))))
+<a href=#2864 id=2864 data-nosnippet>2864</a>                    }
+<a href=#2865 id=2865 data-nosnippet>2865</a>                    Type::Primitive(PrimitiveType::Binary) =&gt; {
+<a href=#2866 id=2866 data-nosnippet>2866</a>                        <span class="kw">let </span>bytes = v
+<a href=#2867 id=2867 data-nosnippet>2867</a>                            .list
+<a href=#2868 id=2868 data-nosnippet>2868</a>                            .into_iter()
+<a href=#2869 id=2869 data-nosnippet>2869</a>                            .map(|v| {
+<a href=#2870 id=2870 data-nosnippet>2870</a>                                <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2871 id=2871 data-nosnippet>2871</a>                                    <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
+<a href=#2872 id=2872 data-nosnippet>2872</a>                                } <span class="kw">else </span>{
+<a href=#2873 id=2873 data-nosnippet>2873</a>                                    <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2874 id=2874 data-nosnippet>2874</a>                                        <span class="string">"list"</span>,
+<a href=#2875 id=2875 data-nosnippet>2875</a>                                        <span class="string">"The element of list should be int"</span>,
+<a href=#2876 id=2876 data-nosnippet>2876</a>                                    ))
+<a href=#2877 id=2877 data-nosnippet>2877</a>                                }
+<a href=#2878 id=2878 data-nosnippet>2878</a>                            })
+<a href=#2879 id=2879 data-nosnippet>2879</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;<span class="kw">_</span>&gt;, Error&gt;&gt;()<span class="question-mark">?</span>;
+<a href=#2880 id=2880 data-nosnippet>2880</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(bytes)))
+<a href=#2881 id=2881 data-nosnippet>2881</a>                    }
+<a href=#2882 id=2882 data-nosnippet>2882</a>                    Type::Primitive(PrimitiveType::Fixed(size)) =&gt; {
+<a href=#2883 id=2883 data-nosnippet>2883</a>                        <span class="kw">if </span>v.list.len() != <span class="kw-2">*</span>size <span class="kw">as </span>usize {
+<a href=#2884 id=2884 data-nosnippet>2884</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2885 id=2885 data-nosnippet>2885</a>                                <span class="string">"list"</span>,
+<a href=#2886 id=2886 data-nosnippet>2886</a>                                <span class="string">"The length of list should be equal to size"</span>,
+<a href=#2887 id=2887 data-nosnippet>2887</a>                            ));
+<a href=#2888 id=2888 data-nosnippet>2888</a>                        }
+<a href=#2889 id=2889 data-nosnippet>2889</a>                        <span class="kw">let </span>bytes = v
+<a href=#2890 id=2890 data-nosnippet>2890</a>                            .list
+<a href=#2891 id=2891 data-nosnippet>2891</a>                            .into_iter()
+<a href=#2892 id=2892 data-nosnippet>2892</a>                            .map(|v| {
+<a href=#2893 id=2893 data-nosnippet>2893</a>                                <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2894 id=2894 data-nosnippet>2894</a>                                    <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
+<a href=#2895 id=2895 data-nosnippet>2895</a>                                } <span class="kw">else </span>{
+<a href=#2896 id=2896 data-nosnippet>2896</a>                                    <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2897 id=2897 data-nosnippet>2897</a>                                        <span class="string">"list"</span>,
+<a href=#2898 id=2898 data-nosnippet>2898</a>                                        <span class="string">"The element of list should be int"</span>,
+<a href=#2899 id=2899 data-nosnippet>2899</a>                                    ))
+<a href=#2900 id=2900 data-nosnippet>2900</a>                                }
+<a href=#2901 id=2901 data-nosnippet>2901</a>                            })
+<a href=#2902 id=2902 data-nosnippet>2902</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;<span class="kw">_</span>&gt;, Error&gt;&gt;()<span class="question-mark">?</span>;
+<a href=#2903 id=2903 data-nosnippet>2903</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(bytes)))
+<a href=#2904 id=2904 data-nosnippet>2904</a>                    }
+<a href=#2905 id=2905 data-nosnippet>2905</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"list"</span>)),
+<a href=#2906 id=2906 data-nosnippet>2906</a>                },
+<a href=#2907 id=2907 data-nosnippet>2907</a>                RawLiteralEnum::Record(Record {
+<a href=#2908 id=2908 data-nosnippet>2908</a>                    required,
+<a href=#2909 id=2909 data-nosnippet>2909</a>                    optional: <span class="kw">_</span>,
+<a href=#2910 id=2910 data-nosnippet>2910</a>                }) =&gt; <span class="kw">match </span>ty {
+<a href=#2911 id=2911 data-nosnippet>2911</a>                    Type::Struct(struct_ty) =&gt; {
+<a href=#2912 id=2912 data-nosnippet>2912</a>                        <span class="kw">let </span>iters: Vec&lt;<span class="prelude-ty">Option</span>&lt;Literal&gt;&gt; = required
+<a href=#2913 id=2913 data-nosnippet>2913</a>                            .into_iter()
+<a href=#2914 id=2914 data-nosnippet>2914</a>                            .map(|(field_name, value)| {
+<a href=#2915 id=2915 data-nosnippet>2915</a>                                <span class="kw">let </span>field = struct_ty
+<a href=#2916 id=2916 data-nosnippet>2916</a>                                    .field_by_name(field_name.as_str())
+<a href=#2917 id=2917 data-nosnippet>2917</a>                                    .ok_or_else(|| {
+<a href=#2918 id=2918 data-nosnippet>2918</a>                                        invalid_err_with_reason(
+<a href=#2919 id=2919 data-nosnippet>2919</a>                                            <span class="string">"record"</span>,
+<a href=#2920 id=2920 data-nosnippet>2920</a>                                            <span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"field {} is not exist"</span>, <span class="kw-2">&amp;</span>field_name),
+<a href=#2921 id=2921 data-nosnippet>2921</a>                                        )
+<a href=#2922 id=2922 data-nosnippet>2922</a>                                    })<span class="question-mark">?</span>;
+<a href=#2923 id=2923 data-nosnippet>2923</a>                                <span class="kw">let </span>value = value.try_into(<span class="kw-2">&amp;</span>field.field_type)<span class="question-mark">?</span>;
+<a href=#2924 id=2924 data-nosnippet>2924</a>                                <span class="prelude-val">Ok</span>(value)
+<a href=#2925 id=2925 data-nosnippet>2925</a>                            })
+<a href=#2926 id=2926 data-nosnippet>2926</a>                            .collect::&lt;<span class="prelude-ty">Result</span>&lt;<span class="kw">_</span>, Error&gt;&gt;()<span class="question-mark">?</span>;
+<a href=#2927 id=2927 data-nosnippet>2927</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Struct(<span class="kw">super</span>::Struct::from_iter(iters))))
+<a href=#2928 id=2928 data-nosnippet>2928</a>                    }
+<a href=#2929 id=2929 data-nosnippet>2929</a>                    Type::Map(map_ty) =&gt; {
+<a href=#2930 id=2930 data-nosnippet>2930</a>                        <span class="kw">if </span><span class="kw-2">*</span>map_ty.key_field.field_type != Type::Primitive(PrimitiveType::String) {
+<a href=#2931 id=2931 data-nosnippet>2931</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2932 id=2932 data-nosnippet>2932</a>                                <span class="string">"record"</span>,
+<a href=#2933 id=2933 data-nosnippet>2933</a>                                <span class="string">"Map key must be string"</span>,
+<a href=#2934 id=2934 data-nosnippet>2934</a>                            ));
+<a href=#2935 id=2935 data-nosnippet>2935</a>                        }
+<a href=#2936 id=2936 data-nosnippet>2936</a>                        <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#2937 id=2937 data-nosnippet>2937</a>                        <span class="kw">for </span>(k, v) <span class="kw">in </span>required {
+<a href=#2938 id=2938 data-nosnippet>2938</a>                            <span class="kw">let </span>value = v.try_into(<span class="kw-2">&amp;</span>map_ty.value_field.field_type)<span class="question-mark">?</span>;
+<a href=#2939 id=2939 data-nosnippet>2939</a>                            <span class="kw">if </span>map_ty.value_field.required &amp;&amp; value.is_none() {
+<a href=#2940 id=2940 data-nosnippet>2940</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2941 id=2941 data-nosnippet>2941</a>                                    <span class="string">"record"</span>,
+<a href=#2942 id=2942 data-nosnippet>2942</a>                                    <span class="string">"Value element is required in this Map"</span>,
+<a href=#2943 id=2943 data-nosnippet>2943</a>                                ));
+<a href=#2944 id=2944 data-nosnippet>2944</a>                            }
+<a href=#2945 id=2945 data-nosnippet>2945</a>                            map.insert(Literal::string(k), value);
+<a href=#2946 id=2946 data-nosnippet>2946</a>                        }
+<a href=#2947 id=2947 data-nosnippet>2947</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
+<a href=#2948 id=2948 data-nosnippet>2948</a>                    }
+<a href=#2949 id=2949 data-nosnippet>2949</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"record"</span>)),
+<a href=#2950 id=2950 data-nosnippet>2950</a>                },
+<a href=#2951 id=2951 data-nosnippet>2951</a>                RawLiteralEnum::StringMap(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string map"</span>)),
+<a href=#2952 id=2952 data-nosnippet>2952</a>            }
+<a href=#2953 id=2953 data-nosnippet>2953</a>        }
+<a href=#2954 id=2954 data-nosnippet>2954</a>    }
+<a href=#2955 id=2955 data-nosnippet>2955</a>}
 <a href=#2956 id=2956 data-nosnippet>2956</a>
-<a href=#2957 id=2957 data-nosnippet>2957</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>avro_schema, Vec::new());
-<a href=#2958 id=2958 data-nosnippet>2958</a>        <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&amp;</span>struct_type).unwrap();
-<a href=#2959 id=2959 data-nosnippet>2959</a>        writer.append_ser(raw_literal).unwrap();
-<a href=#2960 id=2960 data-nosnippet>2960</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2957 id=2957 data-nosnippet>2957</a><span class="attr">#[cfg(test)]
+<a href=#2958 id=2958 data-nosnippet>2958</a></span><span class="kw">mod </span>tests {
+<a href=#2959 id=2959 data-nosnippet>2959</a>    <span class="kw">use </span>apache_avro::to_value;
+<a href=#2960 id=2960 data-nosnippet>2960</a>    <span class="kw">use </span>apache_avro::types::Value;
 <a href=#2961 id=2961 data-nosnippet>2961</a>
-<a href=#2962 id=2962 data-nosnippet>2962</a>        <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&amp;*</span>encoded).unwrap();
-<a href=#2963 id=2963 data-nosnippet>2963</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2964 id=2964 data-nosnippet>2964</a>            <span class="kw">let </span>result = apache_avro::from_value::&lt;RawLiteral&gt;(<span class="kw-2">&amp;</span>record.unwrap()).unwrap();
-<a href=#2965 id=2965 data-nosnippet>2965</a>            <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&amp;</span>struct_type).unwrap().unwrap();
-<a href=#2966 id=2966 data-nosnippet>2966</a>            <span class="macro">assert_eq!</span>(desered_literal, struct_literal);
-<a href=#2967 id=2967 data-nosnippet>2967</a>        }
-<a href=#2968 id=2968 data-nosnippet>2968</a>    }
-<a href=#2969 id=2969 data-nosnippet>2969</a>
-<a href=#2970 id=2970 data-nosnippet>2970</a>    <span class="kw">fn </span>check_serialize_avro(literal: Literal, ty: <span class="kw-2">&amp;</span>Type, expect_value: Value) {
-<a href=#2971 id=2971 data-nosnippet>2971</a>        <span class="kw">let </span>expect_value = Value::Record(<span class="macro">vec!</span>[(<span class="string">"col"</span>.to_string(), expect_value)]);
-<a href=#2972 id=2972 data-nosnippet>2972</a>
-<a href=#2973 id=2973 data-nosnippet>2973</a>        <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, ty.clone()).into()];
-<a href=#2974 id=2974 data-nosnippet>2974</a>        <span class="kw">let </span>schema = Schema::builder()
-<a href=#2975 id=2975 data-nosnippet>2975</a>            .with_fields(fields.clone())
-<a href=#2976 id=2976 data-nosnippet>2976</a>            .build()
-<a href=#2977 id=2977 data-nosnippet>2977</a>            .unwrap();
-<a href=#2978 id=2978 data-nosnippet>2978</a>        <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&amp;</span>schema).unwrap();
-<a href=#2979 id=2979 data-nosnippet>2979</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#2980 id=2980 data-nosnippet>2980</a>        <span class="kw">let </span>struct_literal = Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(literal.clone())]));
-<a href=#2981 id=2981 data-nosnippet>2981</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>avro_schema, Vec::new());
-<a href=#2982 id=2982 data-nosnippet>2982</a>        <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&amp;</span>struct_type).unwrap();
-<a href=#2983 id=2983 data-nosnippet>2983</a>        <span class="kw">let </span>value = to_value(raw_literal)
-<a href=#2984 id=2984 data-nosnippet>2984</a>            .unwrap()
-<a href=#2985 id=2985 data-nosnippet>2985</a>            .resolve(<span class="kw-2">&amp;</span>avro_schema)
-<a href=#2986 id=2986 data-nosnippet>2986</a>            .unwrap();
-<a href=#2987 id=2987 data-nosnippet>2987</a>        writer.append_value_ref(<span class="kw-2">&amp;</span>value).unwrap();
-<a href=#2988 id=2988 data-nosnippet>2988</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2989 id=2989 data-nosnippet>2989</a>
-<a href=#2990 id=2990 data-nosnippet>2990</a>        <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&amp;*</span>encoded).unwrap();
-<a href=#2991 id=2991 data-nosnippet>2991</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2992 id=2992 data-nosnippet>2992</a>            <span class="macro">assert_eq!</span>(record.unwrap(), expect_value);
-<a href=#2993 id=2993 data-nosnippet>2993</a>        }
-<a href=#2994 id=2994 data-nosnippet>2994</a>    }
-<a href=#2995 id=2995 data-nosnippet>2995</a>
-<a href=#2996 id=2996 data-nosnippet>2996</a>    <span class="attr">#[test]
-<a href=#2997 id=2997 data-nosnippet>2997</a>    </span><span class="kw">fn </span>json_boolean() {
-<a href=#2998 id=2998 data-nosnippet>2998</a>        <span class="kw">let </span>record = <span class="string">r#"true"#</span>;
-<a href=#2999 id=2999 data-nosnippet>2999</a>
-<a href=#3000 id=3000 data-nosnippet>3000</a>        check_json_serde(
-<a href=#3001 id=3001 data-nosnippet>3001</a>            record,
-<a href=#3002 id=3002 data-nosnippet>3002</a>            Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
-<a href=#3003 id=3003 data-nosnippet>3003</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Boolean),
-<a href=#3004 id=3004 data-nosnippet>3004</a>        );
-<a href=#3005 id=3005 data-nosnippet>3005</a>    }
-<a href=#3006 id=3006 data-nosnippet>3006</a>
-<a href=#3007 id=3007 data-nosnippet>3007</a>    <span class="attr">#[test]
-<a href=#3008 id=3008 data-nosnippet>3008</a>    </span><span class="kw">fn </span>json_int() {
-<a href=#3009 id=3009 data-nosnippet>3009</a>        <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
-<a href=#3010 id=3010 data-nosnippet>3010</a>
-<a href=#3011 id=3011 data-nosnippet>3011</a>        check_json_serde(
-<a href=#3012 id=3012 data-nosnippet>3012</a>            record,
-<a href=#3013 id=3013 data-nosnippet>3013</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
-<a href=#3014 id=3014 data-nosnippet>3014</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Int),
-<a href=#3015 id=3015 data-nosnippet>3015</a>        );
-<a href=#3016 id=3016 data-nosnippet>3016</a>    }
-<a href=#3017 id=3017 data-nosnippet>3017</a>
-<a href=#3018 id=3018 data-nosnippet>3018</a>    <span class="attr">#[test]
-<a href=#3019 id=3019 data-nosnippet>3019</a>    </span><span class="kw">fn </span>json_long() {
-<a href=#3020 id=3020 data-nosnippet>3020</a>        <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
-<a href=#3021 id=3021 data-nosnippet>3021</a>
-<a href=#3022 id=3022 data-nosnippet>3022</a>        check_json_serde(
-<a href=#3023 id=3023 data-nosnippet>3023</a>            record,
-<a href=#3024 id=3024 data-nosnippet>3024</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
-<a href=#3025 id=3025 data-nosnippet>3025</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Long),
-<a href=#3026 id=3026 data-nosnippet>3026</a>        );
+<a href=#2962 id=2962 data-nosnippet>2962</a>    <span class="kw">use super</span>::<span class="kw-2">*</span>;
+<a href=#2963 id=2963 data-nosnippet>2963</a>    <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
+<a href=#2964 id=2964 data-nosnippet>2964</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::Schema;
+<a href=#2965 id=2965 data-nosnippet>2965</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::Type::Primitive;
+<a href=#2966 id=2966 data-nosnippet>2966</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{ListType, MapType, NestedField, StructType};
+<a href=#2967 id=2967 data-nosnippet>2967</a>
+<a href=#2968 id=2968 data-nosnippet>2968</a>    <span class="kw">fn </span>check_json_serde(json: <span class="kw-2">&amp;</span>str, expected_literal: Literal, expected_type: <span class="kw-2">&amp;</span>Type) {
+<a href=#2969 id=2969 data-nosnippet>2969</a>        <span class="kw">let </span>raw_json_value = serde_json::from_str::&lt;JsonValue&gt;(json).unwrap();
+<a href=#2970 id=2970 data-nosnippet>2970</a>        <span class="kw">let </span>desered_literal =
+<a href=#2971 id=2971 data-nosnippet>2971</a>            Literal::try_from_json(raw_json_value.clone(), expected_type).unwrap();
+<a href=#2972 id=2972 data-nosnippet>2972</a>        <span class="macro">assert_eq!</span>(desered_literal, <span class="prelude-val">Some</span>(expected_literal.clone()));
+<a href=#2973 id=2973 data-nosnippet>2973</a>
+<a href=#2974 id=2974 data-nosnippet>2974</a>        <span class="kw">let </span>expected_json_value: JsonValue = expected_literal.try_into_json(expected_type).unwrap();
+<a href=#2975 id=2975 data-nosnippet>2975</a>        <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&amp;</span>expected_json_value).unwrap();
+<a href=#2976 id=2976 data-nosnippet>2976</a>        <span class="kw">let </span>parsed_json_value = serde_json::from_str::&lt;JsonValue&gt;(<span class="kw-2">&amp;</span>sered_json).unwrap();
+<a href=#2977 id=2977 data-nosnippet>2977</a>
+<a href=#2978 id=2978 data-nosnippet>2978</a>        <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
+<a href=#2979 id=2979 data-nosnippet>2979</a>    }
+<a href=#2980 id=2980 data-nosnippet>2980</a>
+<a href=#2981 id=2981 data-nosnippet>2981</a>    <span class="kw">fn </span>check_avro_bytes_serde(
+<a href=#2982 id=2982 data-nosnippet>2982</a>        input: Vec&lt;u8&gt;,
+<a href=#2983 id=2983 data-nosnippet>2983</a>        expected_datum: Datum,
+<a href=#2984 id=2984 data-nosnippet>2984</a>        expected_type: <span class="kw-2">&amp;</span>PrimitiveType,
+<a href=#2985 id=2985 data-nosnippet>2985</a>    ) {
+<a href=#2986 id=2986 data-nosnippet>2986</a>        <span class="kw">let </span>raw_schema = <span class="string">r#""bytes""#</span>;
+<a href=#2987 id=2987 data-nosnippet>2987</a>        <span class="kw">let </span>schema = apache_avro::Schema::parse_str(raw_schema).unwrap();
+<a href=#2988 id=2988 data-nosnippet>2988</a>
+<a href=#2989 id=2989 data-nosnippet>2989</a>        <span class="kw">let </span>bytes = ByteBuf::from(input);
+<a href=#2990 id=2990 data-nosnippet>2990</a>        <span class="kw">let </span>datum = Datum::try_from_bytes(<span class="kw-2">&amp;</span>bytes, expected_type.clone()).unwrap();
+<a href=#2991 id=2991 data-nosnippet>2991</a>        <span class="macro">assert_eq!</span>(datum, expected_datum);
+<a href=#2992 id=2992 data-nosnippet>2992</a>
+<a href=#2993 id=2993 data-nosnippet>2993</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>schema, Vec::new());
+<a href=#2994 id=2994 data-nosnippet>2994</a>        writer.append_ser(datum.to_bytes().unwrap()).unwrap();
+<a href=#2995 id=2995 data-nosnippet>2995</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2996 id=2996 data-nosnippet>2996</a>        <span class="kw">let </span>reader = apache_avro::Reader::with_schema(<span class="kw-2">&amp;</span>schema, <span class="kw-2">&amp;*</span>encoded).unwrap();
+<a href=#2997 id=2997 data-nosnippet>2997</a>
+<a href=#2998 id=2998 data-nosnippet>2998</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#2999 id=2999 data-nosnippet>2999</a>            <span class="kw">let </span>result = apache_avro::from_value::&lt;ByteBuf&gt;(<span class="kw-2">&amp;</span>record.unwrap()).unwrap();
+<a href=#3000 id=3000 data-nosnippet>3000</a>            <span class="kw">let </span>desered_datum = Datum::try_from_bytes(<span class="kw-2">&amp;</span>result, expected_type.clone()).unwrap();
+<a href=#3001 id=3001 data-nosnippet>3001</a>            <span class="macro">assert_eq!</span>(desered_datum, expected_datum);
+<a href=#3002 id=3002 data-nosnippet>3002</a>        }
+<a href=#3003 id=3003 data-nosnippet>3003</a>    }
+<a href=#3004 id=3004 data-nosnippet>3004</a>
+<a href=#3005 id=3005 data-nosnippet>3005</a>    <span class="kw">fn </span>check_convert_with_avro(expected_literal: Literal, expected_type: <span class="kw-2">&amp;</span>Type) {
+<a href=#3006 id=3006 data-nosnippet>3006</a>        <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
+<a href=#3007 id=3007 data-nosnippet>3007</a>        <span class="kw">let </span>schema = Schema::builder()
+<a href=#3008 id=3008 data-nosnippet>3008</a>            .with_fields(fields.clone())
+<a href=#3009 id=3009 data-nosnippet>3009</a>            .build()
+<a href=#3010 id=3010 data-nosnippet>3010</a>            .unwrap();
+<a href=#3011 id=3011 data-nosnippet>3011</a>        <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&amp;</span>schema).unwrap();
+<a href=#3012 id=3012 data-nosnippet>3012</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3013 id=3013 data-nosnippet>3013</a>        <span class="kw">let </span>struct_literal =
+<a href=#3014 id=3014 data-nosnippet>3014</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#3015 id=3015 data-nosnippet>3015</a>
+<a href=#3016 id=3016 data-nosnippet>3016</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>avro_schema, Vec::new());
+<a href=#3017 id=3017 data-nosnippet>3017</a>        <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&amp;</span>struct_type).unwrap();
+<a href=#3018 id=3018 data-nosnippet>3018</a>        writer.append_ser(raw_literal).unwrap();
+<a href=#3019 id=3019 data-nosnippet>3019</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3020 id=3020 data-nosnippet>3020</a>
+<a href=#3021 id=3021 data-nosnippet>3021</a>        <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&amp;*</span>encoded).unwrap();
+<a href=#3022 id=3022 data-nosnippet>3022</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3023 id=3023 data-nosnippet>3023</a>            <span class="kw">let </span>result = apache_avro::from_value::&lt;RawLiteral&gt;(<span class="kw-2">&amp;</span>record.unwrap()).unwrap();
+<a href=#3024 id=3024 data-nosnippet>3024</a>            <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&amp;</span>struct_type).unwrap().unwrap();
+<a href=#3025 id=3025 data-nosnippet>3025</a>            <span class="macro">assert_eq!</span>(desered_literal, struct_literal);
+<a href=#3026 id=3026 data-nosnippet>3026</a>        }
 <a href=#3027 id=3027 data-nosnippet>3027</a>    }
 <a href=#3028 id=3028 data-nosnippet>3028</a>
-<a href=#3029 id=3029 data-nosnippet>3029</a>    <span class="attr">#[test]
-<a href=#3030 id=3030 data-nosnippet>3030</a>    </span><span class="kw">fn </span>json_float() {
-<a href=#3031 id=3031 data-nosnippet>3031</a>        <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
-<a href=#3032 id=3032 data-nosnippet>3032</a>
-<a href=#3033 id=3033 data-nosnippet>3033</a>        check_json_serde(
-<a href=#3034 id=3034 data-nosnippet>3034</a>            record,
-<a href=#3035 id=3035 data-nosnippet>3035</a>            Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3036 id=3036 data-nosnippet>3036</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Float),
-<a href=#3037 id=3037 data-nosnippet>3037</a>        );
-<a href=#3038 id=3038 data-nosnippet>3038</a>    }
-<a href=#3039 id=3039 data-nosnippet>3039</a>
-<a href=#3040 id=3040 data-nosnippet>3040</a>    <span class="attr">#[test]
-<a href=#3041 id=3041 data-nosnippet>3041</a>    </span><span class="kw">fn </span>json_double() {
-<a href=#3042 id=3042 data-nosnippet>3042</a>        <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
-<a href=#3043 id=3043 data-nosnippet>3043</a>
-<a href=#3044 id=3044 data-nosnippet>3044</a>        check_json_serde(
-<a href=#3045 id=3045 data-nosnippet>3045</a>            record,
-<a href=#3046 id=3046 data-nosnippet>3046</a>            Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3047 id=3047 data-nosnippet>3047</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Double),
-<a href=#3048 id=3048 data-nosnippet>3048</a>        );
-<a href=#3049 id=3049 data-nosnippet>3049</a>    }
-<a href=#3050 id=3050 data-nosnippet>3050</a>
-<a href=#3051 id=3051 data-nosnippet>3051</a>    <span class="attr">#[test]
-<a href=#3052 id=3052 data-nosnippet>3052</a>    </span><span class="kw">fn </span>json_date() {
-<a href=#3053 id=3053 data-nosnippet>3053</a>        <span class="kw">let </span>record = <span class="string">r#""2017-11-16""#</span>;
+<a href=#3029 id=3029 data-nosnippet>3029</a>    <span class="kw">fn </span>check_serialize_avro(literal: Literal, ty: <span class="kw-2">&amp;</span>Type, expect_value: Value) {
+<a href=#3030 id=3030 data-nosnippet>3030</a>        <span class="kw">let </span>expect_value = Value::Record(<span class="macro">vec!</span>[(<span class="string">"col"</span>.to_string(), expect_value)]);
+<a href=#3031 id=3031 data-nosnippet>3031</a>
+<a href=#3032 id=3032 data-nosnippet>3032</a>        <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, ty.clone()).into()];
+<a href=#3033 id=3033 data-nosnippet>3033</a>        <span class="kw">let </span>schema = Schema::builder()
+<a href=#3034 id=3034 data-nosnippet>3034</a>            .with_fields(fields.clone())
+<a href=#3035 id=3035 data-nosnippet>3035</a>            .build()
+<a href=#3036 id=3036 data-nosnippet>3036</a>            .unwrap();
+<a href=#3037 id=3037 data-nosnippet>3037</a>        <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&amp;</span>schema).unwrap();
+<a href=#3038 id=3038 data-nosnippet>3038</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3039 id=3039 data-nosnippet>3039</a>        <span class="kw">let </span>struct_literal = Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(literal.clone())]));
+<a href=#3040 id=3040 data-nosnippet>3040</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>avro_schema, Vec::new());
+<a href=#3041 id=3041 data-nosnippet>3041</a>        <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&amp;</span>struct_type).unwrap();
+<a href=#3042 id=3042 data-nosnippet>3042</a>        <span class="kw">let </span>value = to_value(raw_literal)
+<a href=#3043 id=3043 data-nosnippet>3043</a>            .unwrap()
+<a href=#3044 id=3044 data-nosnippet>3044</a>            .resolve(<span class="kw-2">&amp;</span>avro_schema)
+<a href=#3045 id=3045 data-nosnippet>3045</a>            .unwrap();
+<a href=#3046 id=3046 data-nosnippet>3046</a>        writer.append_value_ref(<span class="kw-2">&amp;</span>value).unwrap();
+<a href=#3047 id=3047 data-nosnippet>3047</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3048 id=3048 data-nosnippet>3048</a>
+<a href=#3049 id=3049 data-nosnippet>3049</a>        <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&amp;*</span>encoded).unwrap();
+<a href=#3050 id=3050 data-nosnippet>3050</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3051 id=3051 data-nosnippet>3051</a>            <span class="macro">assert_eq!</span>(record.unwrap(), expect_value);
+<a href=#3052 id=3052 data-nosnippet>3052</a>        }
+<a href=#3053 id=3053 data-nosnippet>3053</a>    }
 <a href=#3054 id=3054 data-nosnippet>3054</a>
-<a href=#3055 id=3055 data-nosnippet>3055</a>        check_json_serde(
-<a href=#3056 id=3056 data-nosnippet>3056</a>            record,
-<a href=#3057 id=3057 data-nosnippet>3057</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
-<a href=#3058 id=3058 data-nosnippet>3058</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date),
-<a href=#3059 id=3059 data-nosnippet>3059</a>        );
-<a href=#3060 id=3060 data-nosnippet>3060</a>    }
-<a href=#3061 id=3061 data-nosnippet>3061</a>
-<a href=#3062 id=3062 data-nosnippet>3062</a>    <span class="attr">#[test]
-<a href=#3063 id=3063 data-nosnippet>3063</a>    </span><span class="kw">fn </span>json_time() {
-<a href=#3064 id=3064 data-nosnippet>3064</a>        <span class="kw">let </span>record = <span class="string">r#""22:31:08.123456""#</span>;
+<a href=#3055 id=3055 data-nosnippet>3055</a>    <span class="attr">#[test]
+<a href=#3056 id=3056 data-nosnippet>3056</a>    </span><span class="kw">fn </span>json_boolean() {
+<a href=#3057 id=3057 data-nosnippet>3057</a>        <span class="kw">let </span>record = <span class="string">r#"true"#</span>;
+<a href=#3058 id=3058 data-nosnippet>3058</a>
+<a href=#3059 id=3059 data-nosnippet>3059</a>        check_json_serde(
+<a href=#3060 id=3060 data-nosnippet>3060</a>            record,
+<a href=#3061 id=3061 data-nosnippet>3061</a>            Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
+<a href=#3062 id=3062 data-nosnippet>3062</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Boolean),
+<a href=#3063 id=3063 data-nosnippet>3063</a>        );
+<a href=#3064 id=3064 data-nosnippet>3064</a>    }
 <a href=#3065 id=3065 data-nosnippet>3065</a>
-<a href=#3066 id=3066 data-nosnippet>3066</a>        check_json_serde(
-<a href=#3067 id=3067 data-nosnippet>3067</a>            record,
-<a href=#3068 id=3068 data-nosnippet>3068</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
-<a href=#3069 id=3069 data-nosnippet>3069</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Time),
-<a href=#3070 id=3070 data-nosnippet>3070</a>        );
-<a href=#3071 id=3071 data-nosnippet>3071</a>    }
-<a href=#3072 id=3072 data-nosnippet>3072</a>
-<a href=#3073 id=3073 data-nosnippet>3073</a>    <span class="attr">#[test]
-<a href=#3074 id=3074 data-nosnippet>3074</a>    </span><span class="kw">fn </span>json_timestamp() {
-<a href=#3075 id=3075 data-nosnippet>3075</a>        <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456""#</span>;
+<a href=#3066 id=3066 data-nosnippet>3066</a>    <span class="attr">#[test]
+<a href=#3067 id=3067 data-nosnippet>3067</a>    </span><span class="kw">fn </span>json_int() {
+<a href=#3068 id=3068 data-nosnippet>3068</a>        <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
+<a href=#3069 id=3069 data-nosnippet>3069</a>
+<a href=#3070 id=3070 data-nosnippet>3070</a>        check_json_serde(
+<a href=#3071 id=3071 data-nosnippet>3071</a>            record,
+<a href=#3072 id=3072 data-nosnippet>3072</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
+<a href=#3073 id=3073 data-nosnippet>3073</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Int),
+<a href=#3074 id=3074 data-nosnippet>3074</a>        );
+<a href=#3075 id=3075 data-nosnippet>3075</a>    }
 <a href=#3076 id=3076 data-nosnippet>3076</a>
-<a href=#3077 id=3077 data-nosnippet>3077</a>        check_json_serde(
-<a href=#3078 id=3078 data-nosnippet>3078</a>            record,
-<a href=#3079 id=3079 data-nosnippet>3079</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3080 id=3080 data-nosnippet>3080</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamp),
-<a href=#3081 id=3081 data-nosnippet>3081</a>        );
-<a href=#3082 id=3082 data-nosnippet>3082</a>    }
-<a href=#3083 id=3083 data-nosnippet>3083</a>
-<a href=#3084 id=3084 data-nosnippet>3084</a>    <span class="attr">#[test]
-<a href=#3085 id=3085 data-nosnippet>3085</a>    </span><span class="kw">fn </span>json_timestamptz() {
-<a href=#3086 id=3086 data-nosnippet>3086</a>        <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456+00:00""#</span>;
+<a href=#3077 id=3077 data-nosnippet>3077</a>    <span class="attr">#[test]
+<a href=#3078 id=3078 data-nosnippet>3078</a>    </span><span class="kw">fn </span>json_long() {
+<a href=#3079 id=3079 data-nosnippet>3079</a>        <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
+<a href=#3080 id=3080 data-nosnippet>3080</a>
+<a href=#3081 id=3081 data-nosnippet>3081</a>        check_json_serde(
+<a href=#3082 id=3082 data-nosnippet>3082</a>            record,
+<a href=#3083 id=3083 data-nosnippet>3083</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
+<a href=#3084 id=3084 data-nosnippet>3084</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Long),
+<a href=#3085 id=3085 data-nosnippet>3085</a>        );
+<a href=#3086 id=3086 data-nosnippet>3086</a>    }
 <a href=#3087 id=3087 data-nosnippet>3087</a>
-<a href=#3088 id=3088 data-nosnippet>3088</a>        check_json_serde(
-<a href=#3089 id=3089 data-nosnippet>3089</a>            record,
-<a href=#3090 id=3090 data-nosnippet>3090</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3091 id=3091 data-nosnippet>3091</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#3092 id=3092 data-nosnippet>3092</a>        );
-<a href=#3093 id=3093 data-nosnippet>3093</a>    }
-<a href=#3094 id=3094 data-nosnippet>3094</a>
-<a href=#3095 id=3095 data-nosnippet>3095</a>    <span class="attr">#[test]
-<a href=#3096 id=3096 data-nosnippet>3096</a>    </span><span class="kw">fn </span>json_string() {
-<a href=#3097 id=3097 data-nosnippet>3097</a>        <span class="kw">let </span>record = <span class="string">r#""iceberg""#</span>;
+<a href=#3088 id=3088 data-nosnippet>3088</a>    <span class="attr">#[test]
+<a href=#3089 id=3089 data-nosnippet>3089</a>    </span><span class="kw">fn </span>json_float() {
+<a href=#3090 id=3090 data-nosnippet>3090</a>        <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
+<a href=#3091 id=3091 data-nosnippet>3091</a>
+<a href=#3092 id=3092 data-nosnippet>3092</a>        check_json_serde(
+<a href=#3093 id=3093 data-nosnippet>3093</a>            record,
+<a href=#3094 id=3094 data-nosnippet>3094</a>            Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3095 id=3095 data-nosnippet>3095</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Float),
+<a href=#3096 id=3096 data-nosnippet>3096</a>        );
+<a href=#3097 id=3097 data-nosnippet>3097</a>    }
 <a href=#3098 id=3098 data-nosnippet>3098</a>
-<a href=#3099 id=3099 data-nosnippet>3099</a>        check_json_serde(
-<a href=#3100 id=3100 data-nosnippet>3100</a>            record,
-<a href=#3101 id=3101 data-nosnippet>3101</a>            Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
-<a href=#3102 id=3102 data-nosnippet>3102</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::String),
-<a href=#3103 id=3103 data-nosnippet>3103</a>        );
-<a href=#3104 id=3104 data-nosnippet>3104</a>    }
-<a href=#3105 id=3105 data-nosnippet>3105</a>
-<a href=#3106 id=3106 data-nosnippet>3106</a>    <span class="attr">#[test]
-<a href=#3107 id=3107 data-nosnippet>3107</a>    </span><span class="kw">fn </span>json_uuid() {
-<a href=#3108 id=3108 data-nosnippet>3108</a>        <span class="kw">let </span>record = <span class="string">r#""f79c3e09-677c-4bbd-a479-3f349cb785e7""#</span>;
+<a href=#3099 id=3099 data-nosnippet>3099</a>    <span class="attr">#[test]
+<a href=#3100 id=3100 data-nosnippet>3100</a>    </span><span class="kw">fn </span>json_double() {
+<a href=#3101 id=3101 data-nosnippet>3101</a>        <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
+<a href=#3102 id=3102 data-nosnippet>3102</a>
+<a href=#3103 id=3103 data-nosnippet>3103</a>        check_json_serde(
+<a href=#3104 id=3104 data-nosnippet>3104</a>            record,
+<a href=#3105 id=3105 data-nosnippet>3105</a>            Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3106 id=3106 data-nosnippet>3106</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Double),
+<a href=#3107 id=3107 data-nosnippet>3107</a>        );
+<a href=#3108 id=3108 data-nosnippet>3108</a>    }
 <a href=#3109 id=3109 data-nosnippet>3109</a>
-<a href=#3110 id=3110 data-nosnippet>3110</a>        check_json_serde(
-<a href=#3111 id=3111 data-nosnippet>3111</a>            record,
-<a href=#3112 id=3112 data-nosnippet>3112</a>            Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#3113 id=3113 data-nosnippet>3113</a>                Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>)
-<a href=#3114 id=3114 data-nosnippet>3114</a>                    .unwrap()
-<a href=#3115 id=3115 data-nosnippet>3115</a>                    .as_u128(),
-<a href=#3116 id=3116 data-nosnippet>3116</a>            )),
-<a href=#3117 id=3117 data-nosnippet>3117</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3110 id=3110 data-nosnippet>3110</a>    <span class="attr">#[test]
+<a href=#3111 id=3111 data-nosnippet>3111</a>    </span><span class="kw">fn </span>json_date() {
+<a href=#3112 id=3112 data-nosnippet>3112</a>        <span class="kw">let </span>record = <span class="string">r#""2017-11-16""#</span>;
+<a href=#3113 id=3113 data-nosnippet>3113</a>
+<a href=#3114 id=3114 data-nosnippet>3114</a>        check_json_serde(
+<a href=#3115 id=3115 data-nosnippet>3115</a>            record,
+<a href=#3116 id=3116 data-nosnippet>3116</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
+<a href=#3117 id=3117 data-nosnippet>3117</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date),
 <a href=#3118 id=3118 data-nosnippet>3118</a>        );
 <a href=#3119 id=3119 data-nosnippet>3119</a>    }
 <a href=#3120 id=3120 data-nosnippet>3120</a>
 <a href=#3121 id=3121 data-nosnippet>3121</a>    <span class="attr">#[test]
-<a href=#3122 id=3122 data-nosnippet>3122</a>    </span><span class="kw">fn </span>json_decimal() {
-<a href=#3123 id=3123 data-nosnippet>3123</a>        <span class="kw">let </span>record = <span class="string">r#""14.20""#</span>;
+<a href=#3122 id=3122 data-nosnippet>3122</a>    </span><span class="kw">fn </span>json_time() {
+<a href=#3123 id=3123 data-nosnippet>3123</a>        <span class="kw">let </span>record = <span class="string">r#""22:31:08.123456""#</span>;
 <a href=#3124 id=3124 data-nosnippet>3124</a>
 <a href=#3125 id=3125 data-nosnippet>3125</a>        check_json_serde(
 <a href=#3126 id=3126 data-nosnippet>3126</a>            record,
-<a href=#3127 id=3127 data-nosnippet>3127</a>            Literal::Primitive(PrimitiveLiteral::Int128(<span class="number">1420</span>)),
-<a href=#3128 id=3128 data-nosnippet>3128</a>            <span class="kw-2">&amp;</span>Type::decimal(<span class="number">28</span>, <span class="number">2</span>).unwrap(),
+<a href=#3127 id=3127 data-nosnippet>3127</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
+<a href=#3128 id=3128 data-nosnippet>3128</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Time),
 <a href=#3129 id=3129 data-nosnippet>3129</a>        );
 <a href=#3130 id=3130 data-nosnippet>3130</a>    }
 <a href=#3131 id=3131 data-nosnippet>3131</a>
 <a href=#3132 id=3132 data-nosnippet>3132</a>    <span class="attr">#[test]
-<a href=#3133 id=3133 data-nosnippet>3133</a>    </span><span class="kw">fn </span>json_struct() {
-<a href=#3134 id=3134 data-nosnippet>3134</a>        <span class="kw">let </span>record = <span class="string">r#"{"1": 1, "2": "bar", "3": null}"#</span>;
+<a href=#3133 id=3133 data-nosnippet>3133</a>    </span><span class="kw">fn </span>json_timestamp() {
+<a href=#3134 id=3134 data-nosnippet>3134</a>        <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456""#</span>;
 <a href=#3135 id=3135 data-nosnippet>3135</a>
 <a href=#3136 id=3136 data-nosnippet>3136</a>        check_json_serde(
 <a href=#3137 id=3137 data-nosnippet>3137</a>            record,
-<a href=#3138 id=3138 data-nosnippet>3138</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
-<a href=#3139 id=3139 data-nosnippet>3139</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3140 id=3140 data-nosnippet>3140</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#3141 id=3141 data-nosnippet>3141</a>                    <span class="string">"bar"</span>.to_string(),
-<a href=#3142 id=3142 data-nosnippet>3142</a>                ))),
-<a href=#3143 id=3143 data-nosnippet>3143</a>                <span class="prelude-val">None</span>,
-<a href=#3144 id=3144 data-nosnippet>3144</a>            ])),
-<a href=#3145 id=3145 data-nosnippet>3145</a>            <span class="kw-2">&amp;</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#3146 id=3146 data-nosnippet>3146</a>                NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#3147 id=3147 data-nosnippet>3147</a>                NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3148 id=3148 data-nosnippet>3148</a>                NestedField::optional(<span class="number">3</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3149 id=3149 data-nosnippet>3149</a>            ])),
-<a href=#3150 id=3150 data-nosnippet>3150</a>        );
-<a href=#3151 id=3151 data-nosnippet>3151</a>    }
-<a href=#3152 id=3152 data-nosnippet>3152</a>
-<a href=#3153 id=3153 data-nosnippet>3153</a>    <span class="attr">#[test]
-<a href=#3154 id=3154 data-nosnippet>3154</a>    </span><span class="kw">fn </span>json_list() {
-<a href=#3155 id=3155 data-nosnippet>3155</a>        <span class="kw">let </span>record = <span class="string">r#"[1, 2, 3, null]"#</span>;
-<a href=#3156 id=3156 data-nosnippet>3156</a>
-<a href=#3157 id=3157 data-nosnippet>3157</a>        check_json_serde(
-<a href=#3158 id=3158 data-nosnippet>3158</a>            record,
-<a href=#3159 id=3159 data-nosnippet>3159</a>            Literal::List(<span class="macro">vec!</span>[
-<a href=#3160 id=3160 data-nosnippet>3160</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3161 id=3161 data-nosnippet>3161</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3162 id=3162 data-nosnippet>3162</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3163 id=3163 data-nosnippet>3163</a>                <span class="prelude-val">None</span>,
-<a href=#3164 id=3164 data-nosnippet>3164</a>            ]),
-<a href=#3165 id=3165 data-nosnippet>3165</a>            <span class="kw-2">&amp;</span>Type::List(ListType {
-<a href=#3166 id=3166 data-nosnippet>3166</a>                element_field: NestedField::list_element(
-<a href=#3167 id=3167 data-nosnippet>3167</a>                    <span class="number">0</span>,
-<a href=#3168 id=3168 data-nosnippet>3168</a>                    Type::Primitive(PrimitiveType::Int),
-<a href=#3169 id=3169 data-nosnippet>3169</a>                    <span class="bool-val">true</span>,
-<a href=#3170 id=3170 data-nosnippet>3170</a>                )
-<a href=#3171 id=3171 data-nosnippet>3171</a>                .into(),
-<a href=#3172 id=3172 data-nosnippet>3172</a>            }),
-<a href=#3173 id=3173 data-nosnippet>3173</a>        );
-<a href=#3174 id=3174 data-nosnippet>3174</a>    }
-<a href=#3175 id=3175 data-nosnippet>3175</a>
-<a href=#3176 id=3176 data-nosnippet>3176</a>    <span class="attr">#[test]
-<a href=#3177 id=3177 data-nosnippet>3177</a>    </span><span class="kw">fn </span>json_map() {
-<a href=#3178 id=3178 data-nosnippet>3178</a>        <span class="kw">let </span>record = <span class="string">r#"{ "keys": ["a", "b", "c"], "values": [1, 2, null] }"#</span>;
+<a href=#3138 id=3138 data-nosnippet>3138</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3139 id=3139 data-nosnippet>3139</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamp),
+<a href=#3140 id=3140 data-nosnippet>3140</a>        );
+<a href=#3141 id=3141 data-nosnippet>3141</a>    }
+<a href=#3142 id=3142 data-nosnippet>3142</a>
+<a href=#3143 id=3143 data-nosnippet>3143</a>    <span class="attr">#[test]
+<a href=#3144 id=3144 data-nosnippet>3144</a>    </span><span class="kw">fn </span>json_timestamptz() {
+<a href=#3145 id=3145 data-nosnippet>3145</a>        <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456+00:00""#</span>;
+<a href=#3146 id=3146 data-nosnippet>3146</a>
+<a href=#3147 id=3147 data-nosnippet>3147</a>        check_json_serde(
+<a href=#3148 id=3148 data-nosnippet>3148</a>            record,
+<a href=#3149 id=3149 data-nosnippet>3149</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3150 id=3150 data-nosnippet>3150</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#3151 id=3151 data-nosnippet>3151</a>        );
+<a href=#3152 id=3152 data-nosnippet>3152</a>    }
+<a href=#3153 id=3153 data-nosnippet>3153</a>
+<a href=#3154 id=3154 data-nosnippet>3154</a>    <span class="attr">#[test]
+<a href=#3155 id=3155 data-nosnippet>3155</a>    </span><span class="kw">fn </span>json_string() {
+<a href=#3156 id=3156 data-nosnippet>3156</a>        <span class="kw">let </span>record = <span class="string">r#""iceberg""#</span>;
+<a href=#3157 id=3157 data-nosnippet>3157</a>
+<a href=#3158 id=3158 data-nosnippet>3158</a>        check_json_serde(
+<a href=#3159 id=3159 data-nosnippet>3159</a>            record,
+<a href=#3160 id=3160 data-nosnippet>3160</a>            Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
+<a href=#3161 id=3161 data-nosnippet>3161</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::String),
+<a href=#3162 id=3162 data-nosnippet>3162</a>        );
+<a href=#3163 id=3163 data-nosnippet>3163</a>    }
+<a href=#3164 id=3164 data-nosnippet>3164</a>
+<a href=#3165 id=3165 data-nosnippet>3165</a>    <span class="attr">#[test]
+<a href=#3166 id=3166 data-nosnippet>3166</a>    </span><span class="kw">fn </span>json_uuid() {
+<a href=#3167 id=3167 data-nosnippet>3167</a>        <span class="kw">let </span>record = <span class="string">r#""f79c3e09-677c-4bbd-a479-3f349cb785e7""#</span>;
+<a href=#3168 id=3168 data-nosnippet>3168</a>
+<a href=#3169 id=3169 data-nosnippet>3169</a>        check_json_serde(
+<a href=#3170 id=3170 data-nosnippet>3170</a>            record,
+<a href=#3171 id=3171 data-nosnippet>3171</a>            Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#3172 id=3172 data-nosnippet>3172</a>                Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>)
+<a href=#3173 id=3173 data-nosnippet>3173</a>                    .unwrap()
+<a href=#3174 id=3174 data-nosnippet>3174</a>                    .as_u128(),
+<a href=#3175 id=3175 data-nosnippet>3175</a>            )),
+<a href=#3176 id=3176 data-nosnippet>3176</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3177 id=3177 data-nosnippet>3177</a>        );
+<a href=#3178 id=3178 data-nosnippet>3178</a>    }
 <a href=#3179 id=3179 data-nosnippet>3179</a>
-<a href=#3180 id=3180 data-nosnippet>3180</a>        check_json_serde(
-<a href=#3181 id=3181 data-nosnippet>3181</a>            record,
-<a href=#3182 id=3182 data-nosnippet>3182</a>            Literal::Map(Map::from([
-<a href=#3183 id=3183 data-nosnippet>3183</a>                (
-<a href=#3184 id=3184 data-nosnippet>3184</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3185 id=3185 data-nosnippet>3185</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3186 id=3186 data-nosnippet>3186</a>                ),
-<a href=#3187 id=3187 data-nosnippet>3187</a>                (
-<a href=#3188 id=3188 data-nosnippet>3188</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3189 id=3189 data-nosnippet>3189</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3190 id=3190 data-nosnippet>3190</a>                ),
-<a href=#3191 id=3191 data-nosnippet>3191</a>                (
-<a href=#3192 id=3192 data-nosnippet>3192</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3193 id=3193 data-nosnippet>3193</a>                    <span class="prelude-val">None</span>,
-<a href=#3194 id=3194 data-nosnippet>3194</a>                ),
-<a href=#3195 id=3195 data-nosnippet>3195</a>            ])),
-<a href=#3196 id=3196 data-nosnippet>3196</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
-<a href=#3197 id=3197 data-nosnippet>3197</a>                key_field: NestedField::map_key_element(<span class="number">0</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3198 id=3198 data-nosnippet>3198</a>                    .into(),
-<a href=#3199 id=3199 data-nosnippet>3199</a>                value_field: NestedField::map_value_element(
-<a href=#3200 id=3200 data-nosnippet>3200</a>                    <span class="number">1</span>,
-<a href=#3201 id=3201 data-nosnippet>3201</a>                    Type::Primitive(PrimitiveType::Int),
-<a href=#3202 id=3202 data-nosnippet>3202</a>                    <span class="bool-val">true</span>,
-<a href=#3203 id=3203 data-nosnippet>3203</a>                )
-<a href=#3204 id=3204 data-nosnippet>3204</a>                .into(),
-<a href=#3205 id=3205 data-nosnippet>3205</a>            }),
-<a href=#3206 id=3206 data-nosnippet>3206</a>        );
-<a href=#3207 id=3207 data-nosnippet>3207</a>    }
-<a href=#3208 id=3208 data-nosnippet>3208</a>
-<a href=#3209 id=3209 data-nosnippet>3209</a>    <span class="attr">#[test]
-<a href=#3210 id=3210 data-nosnippet>3210</a>    </span><span class="kw">fn </span>avro_bytes_boolean() {
-<a href=#3211 id=3211 data-nosnippet>3211</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>];
-<a href=#3212 id=3212 data-nosnippet>3212</a>
-<a href=#3213 id=3213 data-nosnippet>3213</a>        check_avro_bytes_serde(bytes, Datum::bool(<span class="bool-val">true</span>), <span class="kw-2">&amp;</span>PrimitiveType::Boolean);
-<a href=#3214 id=3214 data-nosnippet>3214</a>    }
+<a href=#3180 id=3180 data-nosnippet>3180</a>    <span class="attr">#[test]
+<a href=#3181 id=3181 data-nosnippet>3181</a>    </span><span class="kw">fn </span>json_decimal() {
+<a href=#3182 id=3182 data-nosnippet>3182</a>        <span class="kw">let </span>record = <span class="string">r#""14.20""#</span>;
+<a href=#3183 id=3183 data-nosnippet>3183</a>
+<a href=#3184 id=3184 data-nosnippet>3184</a>        check_json_serde(
+<a href=#3185 id=3185 data-nosnippet>3185</a>            record,
+<a href=#3186 id=3186 data-nosnippet>3186</a>            Literal::Primitive(PrimitiveLiteral::Int128(<span class="number">1420</span>)),
+<a href=#3187 id=3187 data-nosnippet>3187</a>            <span class="kw-2">&amp;</span>Type::decimal(<span class="number">28</span>, <span class="number">2</span>).unwrap(),
+<a href=#3188 id=3188 data-nosnippet>3188</a>        );
+<a href=#3189 id=3189 data-nosnippet>3189</a>    }
+<a href=#3190 id=3190 data-nosnippet>3190</a>
+<a href=#3191 id=3191 data-nosnippet>3191</a>    <span class="attr">#[test]
+<a href=#3192 id=3192 data-nosnippet>3192</a>    </span><span class="kw">fn </span>json_struct() {
+<a href=#3193 id=3193 data-nosnippet>3193</a>        <span class="kw">let </span>record = <span class="string">r#"{"1": 1, "2": "bar", "3": null}"#</span>;
+<a href=#3194 id=3194 data-nosnippet>3194</a>
+<a href=#3195 id=3195 data-nosnippet>3195</a>        check_json_serde(
+<a href=#3196 id=3196 data-nosnippet>3196</a>            record,
+<a href=#3197 id=3197 data-nosnippet>3197</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
+<a href=#3198 id=3198 data-nosnippet>3198</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3199 id=3199 data-nosnippet>3199</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#3200 id=3200 data-nosnippet>3200</a>                    <span class="string">"bar"</span>.to_string(),
+<a href=#3201 id=3201 data-nosnippet>3201</a>                ))),
+<a href=#3202 id=3202 data-nosnippet>3202</a>                <span class="prelude-val">None</span>,
+<a href=#3203 id=3203 data-nosnippet>3203</a>            ])),
+<a href=#3204 id=3204 data-nosnippet>3204</a>            <span class="kw-2">&amp;</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#3205 id=3205 data-nosnippet>3205</a>                NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#3206 id=3206 data-nosnippet>3206</a>                NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3207 id=3207 data-nosnippet>3207</a>                NestedField::optional(<span class="number">3</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3208 id=3208 data-nosnippet>3208</a>            ])),
+<a href=#3209 id=3209 data-nosnippet>3209</a>        );
+<a href=#3210 id=3210 data-nosnippet>3210</a>    }
+<a href=#3211 id=3211 data-nosnippet>3211</a>
+<a href=#3212 id=3212 data-nosnippet>3212</a>    <span class="attr">#[test]
+<a href=#3213 id=3213 data-nosnippet>3213</a>    </span><span class="kw">fn </span>json_list() {
+<a href=#3214 id=3214 data-nosnippet>3214</a>        <span class="kw">let </span>record = <span class="string">r#"[1, 2, 3, null]"#</span>;
 <a href=#3215 id=3215 data-nosnippet>3215</a>
-<a href=#3216 id=3216 data-nosnippet>3216</a>    <span class="attr">#[test]
-<a href=#3217 id=3217 data-nosnippet>3217</a>    </span><span class="kw">fn </span>avro_bytes_int() {
-<a href=#3218 id=3218 data-nosnippet>3218</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
-<a href=#3219 id=3219 data-nosnippet>3219</a>
-<a href=#3220 id=3220 data-nosnippet>3220</a>        check_avro_bytes_serde(bytes, Datum::int(<span class="number">32</span>), <span class="kw-2">&amp;</span>PrimitiveType::Int);
-<a href=#3221 id=3221 data-nosnippet>3221</a>    }
-<a href=#3222 id=3222 data-nosnippet>3222</a>
-<a href=#3223 id=3223 data-nosnippet>3223</a>    <span class="attr">#[test]
-<a href=#3224 id=3224 data-nosnippet>3224</a>    </span><span class="kw">fn </span>avro_bytes_long() {
-<a href=#3225 id=3225 data-nosnippet>3225</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
-<a href=#3226 id=3226 data-nosnippet>3226</a>
-<a href=#3227 id=3227 data-nosnippet>3227</a>        check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&amp;</span>PrimitiveType::Long);
-<a href=#3228 id=3228 data-nosnippet>3228</a>    }
-<a href=#3229 id=3229 data-nosnippet>3229</a>
-<a href=#3230 id=3230 data-nosnippet>3230</a>    <span class="attr">#[test]
-<a href=#3231 id=3231 data-nosnippet>3231</a>    </span><span class="kw">fn </span>avro_bytes_long_from_int() {
-<a href=#3232 id=3232 data-nosnippet>3232</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
-<a href=#3233 id=3233 data-nosnippet>3233</a>
-<a href=#3234 id=3234 data-nosnippet>3234</a>        check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&amp;</span>PrimitiveType::Long);
-<a href=#3235 id=3235 data-nosnippet>3235</a>    }
-<a href=#3236 id=3236 data-nosnippet>3236</a>
-<a href=#3237 id=3237 data-nosnippet>3237</a>    <span class="attr">#[test]
-<a href=#3238 id=3238 data-nosnippet>3238</a>    </span><span class="kw">fn </span>avro_bytes_float() {
-<a href=#3239 id=3239 data-nosnippet>3239</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
-<a href=#3240 id=3240 data-nosnippet>3240</a>
-<a href=#3241 id=3241 data-nosnippet>3241</a>        check_avro_bytes_serde(bytes, Datum::float(<span class="number">1.0</span>), <span class="kw-2">&amp;</span>PrimitiveType::Float);
-<a href=#3242 id=3242 data-nosnippet>3242</a>    }
-<a href=#3243 id=3243 data-nosnippet>3243</a>
-<a href=#3244 id=3244 data-nosnippet>3244</a>    <span class="attr">#[test]
-<a href=#3245 id=3245 data-nosnippet>3245</a>    </span><span class="kw">fn </span>avro_bytes_double() {
-<a href=#3246 id=3246 data-nosnippet>3246</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">240u8</span>, <span class="number">63u8</span>];
-<a href=#3247 id=3247 data-nosnippet>3247</a>
-<a href=#3248 id=3248 data-nosnippet>3248</a>        check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&amp;</span>PrimitiveType::Double);
-<a href=#3249 id=3249 data-nosnippet>3249</a>    }
-<a href=#3250 id=3250 data-nosnippet>3250</a>
-<a href=#3251 id=3251 data-nosnippet>3251</a>    <span class="attr">#[test]
-<a href=#3252 id=3252 data-nosnippet>3252</a>    </span><span class="kw">fn </span>avro_bytes_double_from_float() {
-<a href=#3253 id=3253 data-nosnippet>3253</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
-<a href=#3254 id=3254 data-nosnippet>3254</a>
-<a href=#3255 id=3255 data-nosnippet>3255</a>        check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&amp;</span>PrimitiveType::Double);
-<a href=#3256 id=3256 data-nosnippet>3256</a>    }
-<a href=#3257 id=3257 data-nosnippet>3257</a>
-<a href=#3258 id=3258 data-nosnippet>3258</a>    <span class="attr">#[test]
-<a href=#3259 id=3259 data-nosnippet>3259</a>    </span><span class="kw">fn </span>avro_bytes_string() {
-<a href=#3260 id=3260 data-nosnippet>3260</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">105u8</span>, <span class="number">99u8</span>, <span class="number">101u8</span>, <span class="number">98u8</span>, <span class="number">101u8</span>, <span class="number">114u8</span>, <span class="number">103u8</span>];
-<a href=#3261 id=3261 data-nosnippet>3261</a>
-<a href=#3262 id=3262 data-nosnippet>3262</a>        check_avro_bytes_serde(bytes, Datum::string(<span class="string">"iceberg"</span>), <span class="kw-2">&amp;</span>PrimitiveType::String);
-<a href=#3263 id=3263 data-nosnippet>3263</a>    }
-<a href=#3264 id=3264 data-nosnippet>3264</a>
-<a href=#3265 id=3265 data-nosnippet>3265</a>    <span class="attr">#[test]
-<a href=#3266 id=3266 data-nosnippet>3266</a>    </span><span class="kw">fn </span>avro_bytes_decimal() {
-<a href=#3267 id=3267 data-nosnippet>3267</a>        <span class="comment">// (input_bytes, decimal_num, expect_scale, expect_precision)
-<a href=#3268 id=3268 data-nosnippet>3268</a>        </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[
-<a href=#3269 id=3269 data-nosnippet>3269</a>            (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
-<a href=#3270 id=3270 data-nosnippet>3270</a>            (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
-<a href=#3271 id=3271 data-nosnippet>3271</a>            (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
-<a href=#3272 id=3272 data-nosnippet>3272</a>            (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
-<a href=#3273 id=3273 data-nosnippet>3273</a>            (<span class="macro">vec!</span>[<span class="number">42u8</span>], <span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
-<a href=#3274 id=3274 data-nosnippet>3274</a>            (<span class="macro">vec!</span>[<span class="number">214u8</span>], -<span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
-<a href=#3275 id=3275 data-nosnippet>3275</a>        ];
-<a href=#3276 id=3276 data-nosnippet>3276</a>
-<a href=#3277 id=3277 data-nosnippet>3277</a>        <span class="kw">for </span>(input_bytes, decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
-<a href=#3278 id=3278 data-nosnippet>3278</a>            check_avro_bytes_serde(
-<a href=#3279 id=3279 data-nosnippet>3279</a>                input_bytes,
-<a href=#3280 id=3280 data-nosnippet>3280</a>                Datum::decimal_with_precision(
-<a href=#3281 id=3281 data-nosnippet>3281</a>                    Decimal::new(decimal_num, expect_scale),
-<a href=#3282 id=3282 data-nosnippet>3282</a>                    expect_precision,
-<a href=#3283 id=3283 data-nosnippet>3283</a>                )
-<a href=#3284 id=3284 data-nosnippet>3284</a>                .unwrap(),
-<a href=#3285 id=3285 data-nosnippet>3285</a>                <span class="kw-2">&amp;</span>PrimitiveType::Decimal {
-<a href=#3286 id=3286 data-nosnippet>3286</a>                    precision: expect_precision,
-<a href=#3287 id=3287 data-nosnippet>3287</a>                    scale: expect_scale,
-<a href=#3288 id=3288 data-nosnippet>3288</a>                },
-<a href=#3289 id=3289 data-nosnippet>3289</a>            );
-<a href=#3290 id=3290 data-nosnippet>3290</a>        }
-<a href=#3291 id=3291 data-nosnippet>3291</a>    }
+<a href=#3216 id=3216 data-nosnippet>3216</a>        check_json_serde(
+<a href=#3217 id=3217 data-nosnippet>3217</a>            record,
+<a href=#3218 id=3218 data-nosnippet>3218</a>            Literal::List(<span class="macro">vec!</span>[
+<a href=#3219 id=3219 data-nosnippet>3219</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3220 id=3220 data-nosnippet>3220</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3221 id=3221 data-nosnippet>3221</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3222 id=3222 data-nosnippet>3222</a>                <span class="prelude-val">None</span>,
+<a href=#3223 id=3223 data-nosnippet>3223</a>            ]),
+<a href=#3224 id=3224 data-nosnippet>3224</a>            <span class="kw-2">&amp;</span>Type::List(ListType {
+<a href=#3225 id=3225 data-nosnippet>3225</a>                element_field: NestedField::list_element(
+<a href=#3226 id=3226 data-nosnippet>3226</a>                    <span class="number">0</span>,
+<a href=#3227 id=3227 data-nosnippet>3227</a>                    Type::Primitive(PrimitiveType::Int),
+<a href=#3228 id=3228 data-nosnippet>3228</a>                    <span class="bool-val">true</span>,
+<a href=#3229 id=3229 data-nosnippet>3229</a>                )
+<a href=#3230 id=3230 data-nosnippet>3230</a>                .into(),
+<a href=#3231 id=3231 data-nosnippet>3231</a>            }),
+<a href=#3232 id=3232 data-nosnippet>3232</a>        );
+<a href=#3233 id=3233 data-nosnippet>3233</a>    }
+<a href=#3234 id=3234 data-nosnippet>3234</a>
+<a href=#3235 id=3235 data-nosnippet>3235</a>    <span class="attr">#[test]
+<a href=#3236 id=3236 data-nosnippet>3236</a>    </span><span class="kw">fn </span>json_map() {
+<a href=#3237 id=3237 data-nosnippet>3237</a>        <span class="kw">let </span>record = <span class="string">r#"{ "keys": ["a", "b", "c"], "values": [1, 2, null] }"#</span>;
+<a href=#3238 id=3238 data-nosnippet>3238</a>
+<a href=#3239 id=3239 data-nosnippet>3239</a>        check_json_serde(
+<a href=#3240 id=3240 data-nosnippet>3240</a>            record,
+<a href=#3241 id=3241 data-nosnippet>3241</a>            Literal::Map(Map::from([
+<a href=#3242 id=3242 data-nosnippet>3242</a>                (
+<a href=#3243 id=3243 data-nosnippet>3243</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3244 id=3244 data-nosnippet>3244</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3245 id=3245 data-nosnippet>3245</a>                ),
+<a href=#3246 id=3246 data-nosnippet>3246</a>                (
+<a href=#3247 id=3247 data-nosnippet>3247</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3248 id=3248 data-nosnippet>3248</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3249 id=3249 data-nosnippet>3249</a>                ),
+<a href=#3250 id=3250 data-nosnippet>3250</a>                (
+<a href=#3251 id=3251 data-nosnippet>3251</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3252 id=3252 data-nosnippet>3252</a>                    <span class="prelude-val">None</span>,
+<a href=#3253 id=3253 data-nosnippet>3253</a>                ),
+<a href=#3254 id=3254 data-nosnippet>3254</a>            ])),
+<a href=#3255 id=3255 data-nosnippet>3255</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
+<a href=#3256 id=3256 data-nosnippet>3256</a>                key_field: NestedField::map_key_element(<span class="number">0</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3257 id=3257 data-nosnippet>3257</a>                    .into(),
+<a href=#3258 id=3258 data-nosnippet>3258</a>                value_field: NestedField::map_value_element(
+<a href=#3259 id=3259 data-nosnippet>3259</a>                    <span class="number">1</span>,
+<a href=#3260 id=3260 data-nosnippet>3260</a>                    Type::Primitive(PrimitiveType::Int),
+<a href=#3261 id=3261 data-nosnippet>3261</a>                    <span class="bool-val">true</span>,
+<a href=#3262 id=3262 data-nosnippet>3262</a>                )
+<a href=#3263 id=3263 data-nosnippet>3263</a>                .into(),
+<a href=#3264 id=3264 data-nosnippet>3264</a>            }),
+<a href=#3265 id=3265 data-nosnippet>3265</a>        );
+<a href=#3266 id=3266 data-nosnippet>3266</a>    }
+<a href=#3267 id=3267 data-nosnippet>3267</a>
+<a href=#3268 id=3268 data-nosnippet>3268</a>    <span class="attr">#[test]
+<a href=#3269 id=3269 data-nosnippet>3269</a>    </span><span class="kw">fn </span>avro_bytes_boolean() {
+<a href=#3270 id=3270 data-nosnippet>3270</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>];
+<a href=#3271 id=3271 data-nosnippet>3271</a>
+<a href=#3272 id=3272 data-nosnippet>3272</a>        check_avro_bytes_serde(bytes, Datum::bool(<span class="bool-val">true</span>), <span class="kw-2">&amp;</span>PrimitiveType::Boolean);
+<a href=#3273 id=3273 data-nosnippet>3273</a>    }
+<a href=#3274 id=3274 data-nosnippet>3274</a>
+<a href=#3275 id=3275 data-nosnippet>3275</a>    <span class="attr">#[test]
+<a href=#3276 id=3276 data-nosnippet>3276</a>    </span><span class="kw">fn </span>avro_bytes_int() {
+<a href=#3277 id=3277 data-nosnippet>3277</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
+<a href=#3278 id=3278 data-nosnippet>3278</a>
+<a href=#3279 id=3279 data-nosnippet>3279</a>        check_avro_bytes_serde(bytes, Datum::int(<span class="number">32</span>), <span class="kw-2">&amp;</span>PrimitiveType::Int);
+<a href=#3280 id=3280 data-nosnippet>3280</a>    }
+<a href=#3281 id=3281 data-nosnippet>3281</a>
+<a href=#3282 id=3282 data-nosnippet>3282</a>    <span class="attr">#[test]
+<a href=#3283 id=3283 data-nosnippet>3283</a>    </span><span class="kw">fn </span>avro_bytes_long() {
+<a href=#3284 id=3284 data-nosnippet>3284</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
+<a href=#3285 id=3285 data-nosnippet>3285</a>
+<a href=#3286 id=3286 data-nosnippet>3286</a>        check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&amp;</span>PrimitiveType::Long);
+<a href=#3287 id=3287 data-nosnippet>3287</a>    }
+<a href=#3288 id=3288 data-nosnippet>3288</a>
+<a href=#3289 id=3289 data-nosnippet>3289</a>    <span class="attr">#[test]
+<a href=#3290 id=3290 data-nosnippet>3290</a>    </span><span class="kw">fn </span>avro_bytes_long_from_int() {
+<a href=#3291 id=3291 data-nosnippet>3291</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
 <a href=#3292 id=3292 data-nosnippet>3292</a>
-<a href=#3293 id=3293 data-nosnippet>3293</a>    <span class="attr">#[test]
-<a href=#3294 id=3294 data-nosnippet>3294</a>    </span><span class="kw">fn </span>avro_bytes_decimal_expect_error() {
-<a href=#3295 id=3295 data-nosnippet>3295</a>        <span class="comment">// (decimal_num, expect_scale, expect_precision)
-<a href=#3296 id=3296 data-nosnippet>3296</a>        </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[(<span class="number">1234</span>, <span class="number">2</span>, <span class="number">1</span>)];
-<a href=#3297 id=3297 data-nosnippet>3297</a>
-<a href=#3298 id=3298 data-nosnippet>3298</a>        <span class="kw">for </span>(decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
-<a href=#3299 id=3299 data-nosnippet>3299</a>            <span class="kw">let </span>result = Datum::decimal_with_precision(
-<a href=#3300 id=3300 data-nosnippet>3300</a>                Decimal::new(decimal_num, expect_scale),
-<a href=#3301 id=3301 data-nosnippet>3301</a>                expect_precision,
-<a href=#3302 id=3302 data-nosnippet>3302</a>            );
-<a href=#3303 id=3303 data-nosnippet>3303</a>            <span class="macro">assert!</span>(result.is_err(), <span class="string">"expect error but got {result:?}"</span>);
-<a href=#3304 id=3304 data-nosnippet>3304</a>            <span class="macro">assert_eq!</span>(
-<a href=#3305 id=3305 data-nosnippet>3305</a>                result.unwrap_err().kind(),
-<a href=#3306 id=3306 data-nosnippet>3306</a>                ErrorKind::DataInvalid,
-<a href=#3307 id=3307 data-nosnippet>3307</a>                <span class="string">"expect error DataInvalid"</span>,
-<a href=#3308 id=3308 data-nosnippet>3308</a>            );
-<a href=#3309 id=3309 data-nosnippet>3309</a>        }
-<a href=#3310 id=3310 data-nosnippet>3310</a>    }
-<a href=#3311 id=3311 data-nosnippet>3311</a>
-<a href=#3312 id=3312 data-nosnippet>3312</a>    <span class="attr">#[test]
-<a href=#3313 id=3313 data-nosnippet>3313</a>    </span><span class="kw">fn </span>avro_convert_test_int() {
-<a href=#3314 id=3314 data-nosnippet>3314</a>        check_convert_with_avro(
-<a href=#3315 id=3315 data-nosnippet>3315</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
-<a href=#3316 id=3316 data-nosnippet>3316</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Int),
-<a href=#3317 id=3317 data-nosnippet>3317</a>        );
-<a href=#3318 id=3318 data-nosnippet>3318</a>    }
-<a href=#3319 id=3319 data-nosnippet>3319</a>
-<a href=#3320 id=3320 data-nosnippet>3320</a>    <span class="attr">#[test]
-<a href=#3321 id=3321 data-nosnippet>3321</a>    </span><span class="kw">fn </span>avro_convert_test_long() {
-<a href=#3322 id=3322 data-nosnippet>3322</a>        check_convert_with_avro(
-<a href=#3323 id=3323 data-nosnippet>3323</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
-<a href=#3324 id=3324 data-nosnippet>3324</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Long),
-<a href=#3325 id=3325 data-nosnippet>3325</a>        );
-<a href=#3326 id=3326 data-nosnippet>3326</a>    }
-<a href=#3327 id=3327 data-nosnippet>3327</a>
-<a href=#3328 id=3328 data-nosnippet>3328</a>    <span class="attr">#[test]
-<a href=#3329 id=3329 data-nosnippet>3329</a>    </span><span class="kw">fn </span>avro_convert_test_float() {
-<a href=#3330 id=3330 data-nosnippet>3330</a>        check_convert_with_avro(
-<a href=#3331 id=3331 data-nosnippet>3331</a>            Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3332 id=3332 data-nosnippet>3332</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Float),
-<a href=#3333 id=3333 data-nosnippet>3333</a>        );
-<a href=#3334 id=3334 data-nosnippet>3334</a>    }
+<a href=#3293 id=3293 data-nosnippet>3293</a>        check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&amp;</span>PrimitiveType::Long);
+<a href=#3294 id=3294 data-nosnippet>3294</a>    }
+<a href=#3295 id=3295 data-nosnippet>3295</a>
+<a href=#3296 id=3296 data-nosnippet>3296</a>    <span class="attr">#[test]
+<a href=#3297 id=3297 data-nosnippet>3297</a>    </span><span class="kw">fn </span>avro_bytes_float() {
+<a href=#3298 id=3298 data-nosnippet>3298</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
+<a href=#3299 id=3299 data-nosnippet>3299</a>
+<a href=#3300 id=3300 data-nosnippet>3300</a>        check_avro_bytes_serde(bytes, Datum::float(<span class="number">1.0</span>), <span class="kw-2">&amp;</span>PrimitiveType::Float);
+<a href=#3301 id=3301 data-nosnippet>3301</a>    }
+<a href=#3302 id=3302 data-nosnippet>3302</a>
+<a href=#3303 id=3303 data-nosnippet>3303</a>    <span class="attr">#[test]
+<a href=#3304 id=3304 data-nosnippet>3304</a>    </span><span class="kw">fn </span>avro_bytes_double() {
+<a href=#3305 id=3305 data-nosnippet>3305</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">240u8</span>, <span class="number">63u8</span>];
+<a href=#3306 id=3306 data-nosnippet>3306</a>
+<a href=#3307 id=3307 data-nosnippet>3307</a>        check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&amp;</span>PrimitiveType::Double);
+<a href=#3308 id=3308 data-nosnippet>3308</a>    }
+<a href=#3309 id=3309 data-nosnippet>3309</a>
+<a href=#3310 id=3310 data-nosnippet>3310</a>    <span class="attr">#[test]
+<a href=#3311 id=3311 data-nosnippet>3311</a>    </span><span class="kw">fn </span>avro_bytes_double_from_float() {
+<a href=#3312 id=3312 data-nosnippet>3312</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
+<a href=#3313 id=3313 data-nosnippet>3313</a>
+<a href=#3314 id=3314 data-nosnippet>3314</a>        check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&amp;</span>PrimitiveType::Double);
+<a href=#3315 id=3315 data-nosnippet>3315</a>    }
+<a href=#3316 id=3316 data-nosnippet>3316</a>
+<a href=#3317 id=3317 data-nosnippet>3317</a>    <span class="attr">#[test]
+<a href=#3318 id=3318 data-nosnippet>3318</a>    </span><span class="kw">fn </span>avro_bytes_string() {
+<a href=#3319 id=3319 data-nosnippet>3319</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">105u8</span>, <span class="number">99u8</span>, <span class="number">101u8</span>, <span class="number">98u8</span>, <span class="number">101u8</span>, <span class="number">114u8</span>, <span class="number">103u8</span>];
+<a href=#3320 id=3320 data-nosnippet>3320</a>
+<a href=#3321 id=3321 data-nosnippet>3321</a>        check_avro_bytes_serde(bytes, Datum::string(<span class="string">"iceberg"</span>), <span class="kw-2">&amp;</span>PrimitiveType::String);
+<a href=#3322 id=3322 data-nosnippet>3322</a>    }
+<a href=#3323 id=3323 data-nosnippet>3323</a>
+<a href=#3324 id=3324 data-nosnippet>3324</a>    <span class="attr">#[test]
+<a href=#3325 id=3325 data-nosnippet>3325</a>    </span><span class="kw">fn </span>avro_bytes_decimal() {
+<a href=#3326 id=3326 data-nosnippet>3326</a>        <span class="comment">// (input_bytes, decimal_num, expect_scale, expect_precision)
+<a href=#3327 id=3327 data-nosnippet>3327</a>        </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[
+<a href=#3328 id=3328 data-nosnippet>3328</a>            (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
+<a href=#3329 id=3329 data-nosnippet>3329</a>            (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
+<a href=#3330 id=3330 data-nosnippet>3330</a>            (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
+<a href=#3331 id=3331 data-nosnippet>3331</a>            (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
+<a href=#3332 id=3332 data-nosnippet>3332</a>            (<span class="macro">vec!</span>[<span class="number">42u8</span>], <span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
+<a href=#3333 id=3333 data-nosnippet>3333</a>            (<span class="macro">vec!</span>[<span class="number">214u8</span>], -<span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
+<a href=#3334 id=3334 data-nosnippet>3334</a>        ];
 <a href=#3335 id=3335 data-nosnippet>3335</a>
-<a href=#3336 id=3336 data-nosnippet>3336</a>    <span class="attr">#[test]
-<a href=#3337 id=3337 data-nosnippet>3337</a>    </span><span class="kw">fn </span>avro_convert_test_double() {
-<a href=#3338 id=3338 data-nosnippet>3338</a>        check_convert_with_avro(
-<a href=#3339 id=3339 data-nosnippet>3339</a>            Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3340 id=3340 data-nosnippet>3340</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Double),
-<a href=#3341 id=3341 data-nosnippet>3341</a>        );
-<a href=#3342 id=3342 data-nosnippet>3342</a>    }
-<a href=#3343 id=3343 data-nosnippet>3343</a>
-<a href=#3344 id=3344 data-nosnippet>3344</a>    <span class="attr">#[test]
-<a href=#3345 id=3345 data-nosnippet>3345</a>    </span><span class="kw">fn </span>avro_convert_test_string() {
-<a href=#3346 id=3346 data-nosnippet>3346</a>        check_convert_with_avro(
-<a href=#3347 id=3347 data-nosnippet>3347</a>            Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
-<a href=#3348 id=3348 data-nosnippet>3348</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::String),
-<a href=#3349 id=3349 data-nosnippet>3349</a>        );
+<a href=#3336 id=3336 data-nosnippet>3336</a>        <span class="kw">for </span>(input_bytes, decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
+<a href=#3337 id=3337 data-nosnippet>3337</a>            check_avro_bytes_serde(
+<a href=#3338 id=3338 data-nosnippet>3338</a>                input_bytes,
+<a href=#3339 id=3339 data-nosnippet>3339</a>                Datum::decimal_with_precision(
+<a href=#3340 id=3340 data-nosnippet>3340</a>                    Decimal::new(decimal_num, expect_scale),
+<a href=#3341 id=3341 data-nosnippet>3341</a>                    expect_precision,
+<a href=#3342 id=3342 data-nosnippet>3342</a>                )
+<a href=#3343 id=3343 data-nosnippet>3343</a>                .unwrap(),
+<a href=#3344 id=3344 data-nosnippet>3344</a>                <span class="kw-2">&amp;</span>PrimitiveType::Decimal {
+<a href=#3345 id=3345 data-nosnippet>3345</a>                    precision: expect_precision,
+<a href=#3346 id=3346 data-nosnippet>3346</a>                    scale: expect_scale,
+<a href=#3347 id=3347 data-nosnippet>3347</a>                },
+<a href=#3348 id=3348 data-nosnippet>3348</a>            );
+<a href=#3349 id=3349 data-nosnippet>3349</a>        }
 <a href=#3350 id=3350 data-nosnippet>3350</a>    }
 <a href=#3351 id=3351 data-nosnippet>3351</a>
 <a href=#3352 id=3352 data-nosnippet>3352</a>    <span class="attr">#[test]
-<a href=#3353 id=3353 data-nosnippet>3353</a>    </span><span class="kw">fn </span>avro_convert_test_date() {
-<a href=#3354 id=3354 data-nosnippet>3354</a>        check_convert_with_avro(
-<a href=#3355 id=3355 data-nosnippet>3355</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
-<a href=#3356 id=3356 data-nosnippet>3356</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date),
-<a href=#3357 id=3357 data-nosnippet>3357</a>        );
-<a href=#3358 id=3358 data-nosnippet>3358</a>    }
-<a href=#3359 id=3359 data-nosnippet>3359</a>
-<a href=#3360 id=3360 data-nosnippet>3360</a>    <span class="attr">#[test]
-<a href=#3361 id=3361 data-nosnippet>3361</a>    </span><span class="kw">fn </span>avro_convert_test_time() {
-<a href=#3362 id=3362 data-nosnippet>3362</a>        check_convert_with_avro(
-<a href=#3363 id=3363 data-nosnippet>3363</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
-<a href=#3364 id=3364 data-nosnippet>3364</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Time),
-<a href=#3365 id=3365 data-nosnippet>3365</a>        );
-<a href=#3366 id=3366 data-nosnippet>3366</a>    }
-<a href=#3367 id=3367 data-nosnippet>3367</a>
-<a href=#3368 id=3368 data-nosnippet>3368</a>    <span class="attr">#[test]
-<a href=#3369 id=3369 data-nosnippet>3369</a>    </span><span class="kw">fn </span>avro_convert_test_timestamp() {
-<a href=#3370 id=3370 data-nosnippet>3370</a>        check_convert_with_avro(
-<a href=#3371 id=3371 data-nosnippet>3371</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3372 id=3372 data-nosnippet>3372</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamp),
-<a href=#3373 id=3373 data-nosnippet>3373</a>        );
-<a href=#3374 id=3374 data-nosnippet>3374</a>    }
-<a href=#3375 id=3375 data-nosnippet>3375</a>
-<a href=#3376 id=3376 data-nosnippet>3376</a>    <span class="attr">#[test]
-<a href=#3377 id=3377 data-nosnippet>3377</a>    </span><span class="kw">fn </span>avro_convert_test_timestamptz() {
-<a href=#3378 id=3378 data-nosnippet>3378</a>        check_convert_with_avro(
-<a href=#3379 id=3379 data-nosnippet>3379</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3380 id=3380 data-nosnippet>3380</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#3381 id=3381 data-nosnippet>3381</a>        );
-<a href=#3382 id=3382 data-nosnippet>3382</a>    }
-<a href=#3383 id=3383 data-nosnippet>3383</a>
-<a href=#3384 id=3384 data-nosnippet>3384</a>    <span class="attr">#[test]
-<a href=#3385 id=3385 data-nosnippet>3385</a>    </span><span class="kw">fn </span>avro_convert_test_list() {
-<a href=#3386 id=3386 data-nosnippet>3386</a>        check_convert_with_avro(
-<a href=#3387 id=3387 data-nosnippet>3387</a>            Literal::List(<span class="macro">vec!</span>[
-<a href=#3388 id=3388 data-nosnippet>3388</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3389 id=3389 data-nosnippet>3389</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3390 id=3390 data-nosnippet>3390</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3391 id=3391 data-nosnippet>3391</a>                <span class="prelude-val">None</span>,
-<a href=#3392 id=3392 data-nosnippet>3392</a>            ]),
-<a href=#3393 id=3393 data-nosnippet>3393</a>            <span class="kw-2">&amp;</span>Type::List(ListType {
-<a href=#3394 id=3394 data-nosnippet>3394</a>                element_field: NestedField::list_element(
-<a href=#3395 id=3395 data-nosnippet>3395</a>                    <span class="number">0</span>,
-<a href=#3396 id=3396 data-nosnippet>3396</a>                    Type::Primitive(PrimitiveType::Int),
-<a href=#3397 id=3397 data-nosnippet>3397</a>                    <span class="bool-val">false</span>,
-<a href=#3398 id=3398 data-nosnippet>3398</a>                )
-<a href=#3399 id=3399 data-nosnippet>3399</a>                .into(),
-<a href=#3400 id=3400 data-nosnippet>3400</a>            }),
+<a href=#3353 id=3353 data-nosnippet>3353</a>    </span><span class="kw">fn </span>avro_bytes_decimal_expect_error() {
+<a href=#3354 id=3354 data-nosnippet>3354</a>        <span class="comment">// (decimal_num, expect_scale, expect_precision)
+<a href=#3355 id=3355 data-nosnippet>3355</a>        </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[(<span class="number">1234</span>, <span class="number">2</span>, <span class="number">1</span>)];
+<a href=#3356 id=3356 data-nosnippet>3356</a>
+<a href=#3357 id=3357 data-nosnippet>3357</a>        <span class="kw">for </span>(decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
+<a href=#3358 id=3358 data-nosnippet>3358</a>            <span class="kw">let </span>result = Datum::decimal_with_precision(
+<a href=#3359 id=3359 data-nosnippet>3359</a>                Decimal::new(decimal_num, expect_scale),
+<a href=#3360 id=3360 data-nosnippet>3360</a>                expect_precision,
+<a href=#3361 id=3361 data-nosnippet>3361</a>            );
+<a href=#3362 id=3362 data-nosnippet>3362</a>            <span class="macro">assert!</span>(result.is_err(), <span class="string">"expect error but got {result:?}"</span>);
+<a href=#3363 id=3363 data-nosnippet>3363</a>            <span class="macro">assert_eq!</span>(
+<a href=#3364 id=3364 data-nosnippet>3364</a>                result.unwrap_err().kind(),
+<a href=#3365 id=3365 data-nosnippet>3365</a>                ErrorKind::DataInvalid,
+<a href=#3366 id=3366 data-nosnippet>3366</a>                <span class="string">"expect error DataInvalid"</span>,
+<a href=#3367 id=3367 data-nosnippet>3367</a>            );
+<a href=#3368 id=3368 data-nosnippet>3368</a>        }
+<a href=#3369 id=3369 data-nosnippet>3369</a>    }
+<a href=#3370 id=3370 data-nosnippet>3370</a>
+<a href=#3371 id=3371 data-nosnippet>3371</a>    <span class="kw">fn </span>check_raw_literal_bytes_serde_via_avro(
+<a href=#3372 id=3372 data-nosnippet>3372</a>        input_bytes: Vec&lt;u8&gt;,
+<a href=#3373 id=3373 data-nosnippet>3373</a>        expected_literal: Literal,
+<a href=#3374 id=3374 data-nosnippet>3374</a>        expected_type: <span class="kw-2">&amp;</span>Type,
+<a href=#3375 id=3375 data-nosnippet>3375</a>    ) {
+<a href=#3376 id=3376 data-nosnippet>3376</a>        <span class="kw">use </span>apache_avro::types::Value;
+<a href=#3377 id=3377 data-nosnippet>3377</a>
+<a href=#3378 id=3378 data-nosnippet>3378</a>        <span class="comment">// Create an Avro bytes value and deserialize it through the RawLiteral path
+<a href=#3379 id=3379 data-nosnippet>3379</a>        </span><span class="kw">let </span>avro_value = Value::Bytes(input_bytes);
+<a href=#3380 id=3380 data-nosnippet>3380</a>        <span class="kw">let </span>raw_literal: _serde::RawLiteral = apache_avro::from_value(<span class="kw-2">&amp;</span>avro_value).unwrap();
+<a href=#3381 id=3381 data-nosnippet>3381</a>        <span class="kw">let </span>result = raw_literal.try_into(expected_type).unwrap();
+<a href=#3382 id=3382 data-nosnippet>3382</a>        <span class="macro">assert_eq!</span>(result, <span class="prelude-val">Some</span>(expected_literal));
+<a href=#3383 id=3383 data-nosnippet>3383</a>    }
+<a href=#3384 id=3384 data-nosnippet>3384</a>
+<a href=#3385 id=3385 data-nosnippet>3385</a>    <span class="kw">fn </span>check_raw_literal_bytes_error_via_avro(input_bytes: Vec&lt;u8&gt;, expected_type: <span class="kw-2">&amp;</span>Type) {
+<a href=#3386 id=3386 data-nosnippet>3386</a>        <span class="kw">use </span>apache_avro::types::Value;
+<a href=#3387 id=3387 data-nosnippet>3387</a>
+<a href=#3388 id=3388 data-nosnippet>3388</a>        <span class="kw">let </span>avro_value = Value::Bytes(input_bytes);
+<a href=#3389 id=3389 data-nosnippet>3389</a>        <span class="kw">let </span>raw_literal: _serde::RawLiteral = apache_avro::from_value(<span class="kw-2">&amp;</span>avro_value).unwrap();
+<a href=#3390 id=3390 data-nosnippet>3390</a>        <span class="kw">let </span>result = raw_literal.try_into(expected_type);
+<a href=#3391 id=3391 data-nosnippet>3391</a>        <span class="macro">assert!</span>(result.is_err(), <span class="string">"Expected error but got: {:?}"</span>, result);
+<a href=#3392 id=3392 data-nosnippet>3392</a>    }
+<a href=#3393 id=3393 data-nosnippet>3393</a>
+<a href=#3394 id=3394 data-nosnippet>3394</a>    <span class="attr">#[test]
+<a href=#3395 id=3395 data-nosnippet>3395</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_binary() {
+<a href=#3396 id=3396 data-nosnippet>3396</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>, <span class="number">4u8</span>, <span class="number">5u8</span>];
+<a href=#3397 id=3397 data-nosnippet>3397</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3398 id=3398 data-nosnippet>3398</a>            bytes.clone(),
+<a href=#3399 id=3399 data-nosnippet>3399</a>            Literal::binary(bytes),
+<a href=#3400 id=3400 data-nosnippet>3400</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Binary),
 <a href=#3401 id=3401 data-nosnippet>3401</a>        );
-<a href=#3402 id=3402 data-nosnippet>3402</a>
-<a href=#3403 id=3403 data-nosnippet>3403</a>        check_convert_with_avro(
-<a href=#3404 id=3404 data-nosnippet>3404</a>            Literal::List(<span class="macro">vec!</span>[
-<a href=#3405 id=3405 data-nosnippet>3405</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3406 id=3406 data-nosnippet>3406</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3407 id=3407 data-nosnippet>3407</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3408 id=3408 data-nosnippet>3408</a>            ]),
-<a href=#3409 id=3409 data-nosnippet>3409</a>            <span class="kw-2">&amp;</span>Type::List(ListType {
-<a href=#3410 id=3410 data-nosnippet>3410</a>                element_field: NestedField::list_element(
-<a href=#3411 id=3411 data-nosnippet>3411</a>                    <span class="number">0</span>,
-<a href=#3412 id=3412 data-nosnippet>3412</a>                    Type::Primitive(PrimitiveType::Int),
-<a href=#3413 id=3413 data-nosnippet>3413</a>                    <span class="bool-val">true</span>,
-<a href=#3414 id=3414 data-nosnippet>3414</a>                )
-<a href=#3415 id=3415 data-nosnippet>3415</a>                .into(),
-<a href=#3416 id=3416 data-nosnippet>3416</a>            }),
-<a href=#3417 id=3417 data-nosnippet>3417</a>        );
-<a href=#3418 id=3418 data-nosnippet>3418</a>    }
-<a href=#3419 id=3419 data-nosnippet>3419</a>
-<a href=#3420 id=3420 data-nosnippet>3420</a>    <span class="kw">fn </span>check_convert_with_avro_map(expected_literal: Literal, expected_type: <span class="kw-2">&amp;</span>Type) {
-<a href=#3421 id=3421 data-nosnippet>3421</a>        <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
-<a href=#3422 id=3422 data-nosnippet>3422</a>        <span class="kw">let </span>schema = Schema::builder()
-<a href=#3423 id=3423 data-nosnippet>3423</a>            .with_fields(fields.clone())
-<a href=#3424 id=3424 data-nosnippet>3424</a>            .build()
-<a href=#3425 id=3425 data-nosnippet>3425</a>            .unwrap();
-<a href=#3426 id=3426 data-nosnippet>3426</a>        <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&amp;</span>schema).unwrap();
-<a href=#3427 id=3427 data-nosnippet>3427</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#3428 id=3428 data-nosnippet>3428</a>        <span class="kw">let </span>struct_literal =
-<a href=#3429 id=3429 data-nosnippet>3429</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
-<a href=#3430 id=3430 data-nosnippet>3430</a>
-<a href=#3431 id=3431 data-nosnippet>3431</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>avro_schema, Vec::new());
-<a href=#3432 id=3432 data-nosnippet>3432</a>        <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&amp;</span>struct_type).unwrap();
-<a href=#3433 id=3433 data-nosnippet>3433</a>        writer.append_ser(raw_literal).unwrap();
-<a href=#3434 id=3434 data-nosnippet>3434</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#3435 id=3435 data-nosnippet>3435</a>
-<a href=#3436 id=3436 data-nosnippet>3436</a>        <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&amp;*</span>encoded).unwrap();
-<a href=#3437 id=3437 data-nosnippet>3437</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#3438 id=3438 data-nosnippet>3438</a>            <span class="kw">let </span>result = apache_avro::from_value::&lt;RawLiteral&gt;(<span class="kw-2">&amp;</span>record.unwrap()).unwrap();
-<a href=#3439 id=3439 data-nosnippet>3439</a>            <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&amp;</span>struct_type).unwrap().unwrap();
-<a href=#3440 id=3440 data-nosnippet>3440</a>            <span class="kw">match </span>(<span class="kw-2">&amp;</span>desered_literal, <span class="kw-2">&amp;</span>struct_literal) {
-<a href=#3441 id=3441 data-nosnippet>3441</a>                (Literal::Struct(desered), Literal::Struct(expected)) =&gt; {
-<a href=#3442 id=3442 data-nosnippet>3442</a>                    <span class="kw">match </span>(<span class="kw-2">&amp;</span>desered.fields[<span class="number">0</span>], <span class="kw-2">&amp;</span>expected.fields[<span class="number">0</span>]) {
-<a href=#3443 id=3443 data-nosnippet>3443</a>                        (<span class="prelude-val">Some</span>(Literal::Map(desered)), <span class="prelude-val">Some</span>(Literal::Map(expected))) =&gt; {
-<a href=#3444 id=3444 data-nosnippet>3444</a>                            <span class="macro">assert!</span>(desered.has_same_content(expected))
-<a href=#3445 id=3445 data-nosnippet>3445</a>                        }
-<a href=#3446 id=3446 data-nosnippet>3446</a>                        <span class="kw">_ </span>=&gt; {
-<a href=#3447 id=3447 data-nosnippet>3447</a>                            <span class="macro">unreachable!</span>()
-<a href=#3448 id=3448 data-nosnippet>3448</a>                        }
-<a href=#3449 id=3449 data-nosnippet>3449</a>                    }
-<a href=#3450 id=3450 data-nosnippet>3450</a>                }
-<a href=#3451 id=3451 data-nosnippet>3451</a>                <span class="kw">_ </span>=&gt; {
-<a href=#3452 id=3452 data-nosnippet>3452</a>                    <span class="macro">panic!</span>(<span class="string">"unexpected literal type"</span>);
-<a href=#3453 id=3453 data-nosnippet>3453</a>                }
-<a href=#3454 id=3454 data-nosnippet>3454</a>            }
-<a href=#3455 id=3455 data-nosnippet>3455</a>        }
-<a href=#3456 id=3456 data-nosnippet>3456</a>    }
-<a href=#3457 id=3457 data-nosnippet>3457</a>
-<a href=#3458 id=3458 data-nosnippet>3458</a>    <span class="attr">#[test]
-<a href=#3459 id=3459 data-nosnippet>3459</a>    </span><span class="kw">fn </span>avro_convert_test_map() {
-<a href=#3460 id=3460 data-nosnippet>3460</a>        check_convert_with_avro_map(
-<a href=#3461 id=3461 data-nosnippet>3461</a>            Literal::Map(Map::from([
-<a href=#3462 id=3462 data-nosnippet>3462</a>                (
-<a href=#3463 id=3463 data-nosnippet>3463</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#3464 id=3464 data-nosnippet>3464</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
-<a href=#3465 id=3465 data-nosnippet>3465</a>                ),
-<a href=#3466 id=3466 data-nosnippet>3466</a>                (
-<a href=#3467 id=3467 data-nosnippet>3467</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
-<a href=#3468 id=3468 data-nosnippet>3468</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
-<a href=#3469 id=3469 data-nosnippet>3469</a>                ),
-<a href=#3470 id=3470 data-nosnippet>3470</a>                (Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)), <span class="prelude-val">None</span>),
-<a href=#3471 id=3471 data-nosnippet>3471</a>            ])),
-<a href=#3472 id=3472 data-nosnippet>3472</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
-<a href=#3473 id=3473 data-nosnippet>3473</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#3474 id=3474 data-nosnippet>3474</a>                    .into(),
-<a href=#3475 id=3475 data-nosnippet>3475</a>                value_field: NestedField::map_value_element(
-<a href=#3476 id=3476 data-nosnippet>3476</a>                    <span class="number">3</span>,
-<a href=#3477 id=3477 data-nosnippet>3477</a>                    Type::Primitive(PrimitiveType::Long),
-<a href=#3478 id=3478 data-nosnippet>3478</a>                    <span class="bool-val">false</span>,
-<a href=#3479 id=3479 data-nosnippet>3479</a>                )
-<a href=#3480 id=3480 data-nosnippet>3480</a>                .into(),
-<a href=#3481 id=3481 data-nosnippet>3481</a>            }),
-<a href=#3482 id=3482 data-nosnippet>3482</a>        );
-<a href=#3483 id=3483 data-nosnippet>3483</a>
-<a href=#3484 id=3484 data-nosnippet>3484</a>        check_convert_with_avro_map(
-<a href=#3485 id=3485 data-nosnippet>3485</a>            Literal::Map(Map::from([
-<a href=#3486 id=3486 data-nosnippet>3486</a>                (
-<a href=#3487 id=3487 data-nosnippet>3487</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#3488 id=3488 data-nosnippet>3488</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
-<a href=#3489 id=3489 data-nosnippet>3489</a>                ),
-<a href=#3490 id=3490 data-nosnippet>3490</a>                (
-<a href=#3491 id=3491 data-nosnippet>3491</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
-<a href=#3492 id=3492 data-nosnippet>3492</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
-<a href=#3493 id=3493 data-nosnippet>3493</a>                ),
-<a href=#3494 id=3494 data-nosnippet>3494</a>                (
-<a href=#3495 id=3495 data-nosnippet>3495</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)),
-<a href=#3496 id=3496 data-nosnippet>3496</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">3</span>))),
-<a href=#3497 id=3497 data-nosnippet>3497</a>                ),
-<a href=#3498 id=3498 data-nosnippet>3498</a>            ])),
-<a href=#3499 id=3499 data-nosnippet>3499</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
-<a href=#3500 id=3500 data-nosnippet>3500</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#3501 id=3501 data-nosnippet>3501</a>                    .into(),
-<a href=#3502 id=3502 data-nosnippet>3502</a>                value_field: NestedField::map_value_element(
-<a href=#3503 id=3503 data-nosnippet>3503</a>                    <span class="number">3</span>,
-<a href=#3504 id=3504 data-nosnippet>3504</a>                    Type::Primitive(PrimitiveType::Long),
-<a href=#3505 id=3505 data-nosnippet>3505</a>                    <span class="bool-val">true</span>,
-<a href=#3506 id=3506 data-nosnippet>3506</a>                )
-<a href=#3507 id=3507 data-nosnippet>3507</a>                .into(),
-<a href=#3508 id=3508 data-nosnippet>3508</a>            }),
-<a href=#3509 id=3509 data-nosnippet>3509</a>        );
-<a href=#3510 id=3510 data-nosnippet>3510</a>    }
-<a href=#3511 id=3511 data-nosnippet>3511</a>
-<a href=#3512 id=3512 data-nosnippet>3512</a>    <span class="attr">#[test]
-<a href=#3513 id=3513 data-nosnippet>3513</a>    </span><span class="kw">fn </span>avro_convert_test_string_map() {
-<a href=#3514 id=3514 data-nosnippet>3514</a>        check_convert_with_avro_map(
-<a href=#3515 id=3515 data-nosnippet>3515</a>            Literal::Map(Map::from([
-<a href=#3516 id=3516 data-nosnippet>3516</a>                (
-<a href=#3517 id=3517 data-nosnippet>3517</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3518 id=3518 data-nosnippet>3518</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3519 id=3519 data-nosnippet>3519</a>                ),
-<a href=#3520 id=3520 data-nosnippet>3520</a>                (
-<a href=#3521 id=3521 data-nosnippet>3521</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3522 id=3522 data-nosnippet>3522</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3523 id=3523 data-nosnippet>3523</a>                ),
-<a href=#3524 id=3524 data-nosnippet>3524</a>                (
-<a href=#3525 id=3525 data-nosnippet>3525</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3526 id=3526 data-nosnippet>3526</a>                    <span class="prelude-val">None</span>,
-<a href=#3527 id=3527 data-nosnippet>3527</a>                ),
-<a href=#3528 id=3528 data-nosnippet>3528</a>            ])),
-<a href=#3529 id=3529 data-nosnippet>3529</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
-<a href=#3530 id=3530 data-nosnippet>3530</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3531 id=3531 data-nosnippet>3531</a>                    .into(),
-<a href=#3532 id=3532 data-nosnippet>3532</a>                value_field: NestedField::map_value_element(
-<a href=#3533 id=3533 data-nosnippet>3533</a>                    <span class="number">3</span>,
-<a href=#3534 id=3534 data-nosnippet>3534</a>                    Type::Primitive(PrimitiveType::Int),
-<a href=#3535 id=3535 data-nosnippet>3535</a>                    <span class="bool-val">false</span>,
-<a href=#3536 id=3536 data-nosnippet>3536</a>                )
-<a href=#3537 id=3537 data-nosnippet>3537</a>                .into(),
-<a href=#3538 id=3538 data-nosnippet>3538</a>            }),
-<a href=#3539 id=3539 data-nosnippet>3539</a>        );
+<a href=#3402 id=3402 data-nosnippet>3402</a>    }
+<a href=#3403 id=3403 data-nosnippet>3403</a>
+<a href=#3404 id=3404 data-nosnippet>3404</a>    <span class="attr">#[test]
+<a href=#3405 id=3405 data-nosnippet>3405</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_binary_empty() {
+<a href=#3406 id=3406 data-nosnippet>3406</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[];
+<a href=#3407 id=3407 data-nosnippet>3407</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3408 id=3408 data-nosnippet>3408</a>            bytes.clone(),
+<a href=#3409 id=3409 data-nosnippet>3409</a>            Literal::binary(bytes),
+<a href=#3410 id=3410 data-nosnippet>3410</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Binary),
+<a href=#3411 id=3411 data-nosnippet>3411</a>        );
+<a href=#3412 id=3412 data-nosnippet>3412</a>    }
+<a href=#3413 id=3413 data-nosnippet>3413</a>
+<a href=#3414 id=3414 data-nosnippet>3414</a>    <span class="attr">#[test]
+<a href=#3415 id=3415 data-nosnippet>3415</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_fixed_correct_length() {
+<a href=#3416 id=3416 data-nosnippet>3416</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>, <span class="number">4u8</span>];
+<a href=#3417 id=3417 data-nosnippet>3417</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3418 id=3418 data-nosnippet>3418</a>            bytes.clone(),
+<a href=#3419 id=3419 data-nosnippet>3419</a>            Literal::fixed(bytes),
+<a href=#3420 id=3420 data-nosnippet>3420</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Fixed(<span class="number">4</span>)),
+<a href=#3421 id=3421 data-nosnippet>3421</a>        );
+<a href=#3422 id=3422 data-nosnippet>3422</a>    }
+<a href=#3423 id=3423 data-nosnippet>3423</a>
+<a href=#3424 id=3424 data-nosnippet>3424</a>    <span class="attr">#[test]
+<a href=#3425 id=3425 data-nosnippet>3425</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_fixed_wrong_length() {
+<a href=#3426 id=3426 data-nosnippet>3426</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>]; <span class="comment">// 3 bytes, but expecting 4
+<a href=#3427 id=3427 data-nosnippet>3427</a>        </span>check_raw_literal_bytes_error_via_avro(bytes, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Fixed(<span class="number">4</span>)));
+<a href=#3428 id=3428 data-nosnippet>3428</a>    }
+<a href=#3429 id=3429 data-nosnippet>3429</a>
+<a href=#3430 id=3430 data-nosnippet>3430</a>    <span class="attr">#[test]
+<a href=#3431 id=3431 data-nosnippet>3431</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_fixed_empty_correct_length() {
+<a href=#3432 id=3432 data-nosnippet>3432</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[];
+<a href=#3433 id=3433 data-nosnippet>3433</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3434 id=3434 data-nosnippet>3434</a>            bytes.clone(),
+<a href=#3435 id=3435 data-nosnippet>3435</a>            Literal::fixed(bytes),
+<a href=#3436 id=3436 data-nosnippet>3436</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Fixed(<span class="number">0</span>)),
+<a href=#3437 id=3437 data-nosnippet>3437</a>        );
+<a href=#3438 id=3438 data-nosnippet>3438</a>    }
+<a href=#3439 id=3439 data-nosnippet>3439</a>
+<a href=#3440 id=3440 data-nosnippet>3440</a>    <span class="attr">#[test]
+<a href=#3441 id=3441 data-nosnippet>3441</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_uuid_correct_length() {
+<a href=#3442 id=3442 data-nosnippet>3442</a>        <span class="kw">let </span>uuid_bytes = <span class="macro">vec!</span>[
+<a href=#3443 id=3443 data-nosnippet>3443</a>            <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</span>, <span class="number">0xab</span>, <span class="number">0xcd</span>, <span class="number">0xef</span>, <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</ [...]
+<a href=#3444 id=3444 data-nosnippet>3444</a>            <span class="number">0xcd</span>, <span class="number">0xef</span>,
+<a href=#3445 id=3445 data-nosnippet>3445</a>        ];
+<a href=#3446 id=3446 data-nosnippet>3446</a>        <span class="kw">let </span>expected_uuid = u128::from_be_bytes([
+<a href=#3447 id=3447 data-nosnippet>3447</a>            <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</span>, <span class="number">0xab</span>, <span class="number">0xcd</span>, <span class="number">0xef</span>, <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</ [...]
+<a href=#3448 id=3448 data-nosnippet>3448</a>            <span class="number">0xcd</span>, <span class="number">0xef</span>,
+<a href=#3449 id=3449 data-nosnippet>3449</a>        ]);
+<a href=#3450 id=3450 data-nosnippet>3450</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3451 id=3451 data-nosnippet>3451</a>            uuid_bytes,
+<a href=#3452 id=3452 data-nosnippet>3452</a>            Literal::Primitive(PrimitiveLiteral::UInt128(expected_uuid)),
+<a href=#3453 id=3453 data-nosnippet>3453</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3454 id=3454 data-nosnippet>3454</a>        );
+<a href=#3455 id=3455 data-nosnippet>3455</a>    }
+<a href=#3456 id=3456 data-nosnippet>3456</a>
+<a href=#3457 id=3457 data-nosnippet>3457</a>    <span class="attr">#[test]
+<a href=#3458 id=3458 data-nosnippet>3458</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_uuid_wrong_length() {
+<a href=#3459 id=3459 data-nosnippet>3459</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>]; <span class="comment">// 3 bytes, but UUID needs 16
+<a href=#3460 id=3460 data-nosnippet>3460</a>        </span>check_raw_literal_bytes_error_via_avro(bytes, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Uuid));
+<a href=#3461 id=3461 data-nosnippet>3461</a>    }
+<a href=#3462 id=3462 data-nosnippet>3462</a>
+<a href=#3463 id=3463 data-nosnippet>3463</a>    <span class="attr">#[test]
+<a href=#3464 id=3464 data-nosnippet>3464</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_4_scale_2() {
+<a href=#3465 id=3465 data-nosnippet>3465</a>        <span class="comment">// Precision 4 requires 2 bytes
+<a href=#3466 id=3466 data-nosnippet>3466</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x04</span>, <span class="number">0xd2</span>]; <span class="comment">// 1234 in 2 bytes
+<a href=#3467 id=3467 data-nosnippet>3467</a>        </span><span class="kw">let </span>expected_decimal = <span class="number">1234i128</span>;
+<a href=#3468 id=3468 data-nosnippet>3468</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3469 id=3469 data-nosnippet>3469</a>            decimal_bytes,
+<a href=#3470 id=3470 data-nosnippet>3470</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3471 id=3471 data-nosnippet>3471</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3472 id=3472 data-nosnippet>3472</a>                precision: <span class="number">4</span>,
+<a href=#3473 id=3473 data-nosnippet>3473</a>                scale: <span class="number">2</span>,
+<a href=#3474 id=3474 data-nosnippet>3474</a>            }),
+<a href=#3475 id=3475 data-nosnippet>3475</a>        );
+<a href=#3476 id=3476 data-nosnippet>3476</a>    }
+<a href=#3477 id=3477 data-nosnippet>3477</a>
+<a href=#3478 id=3478 data-nosnippet>3478</a>    <span class="attr">#[test]
+<a href=#3479 id=3479 data-nosnippet>3479</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_4_negative() {
+<a href=#3480 id=3480 data-nosnippet>3480</a>        <span class="comment">// Precision 4 requires 2 bytes, negative number
+<a href=#3481 id=3481 data-nosnippet>3481</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0xfb</span>, <span class="number">0x2e</span>]; <span class="comment">// -1234 in 2 bytes
+<a href=#3482 id=3482 data-nosnippet>3482</a>        </span><span class="kw">let </span>expected_decimal = -<span class="number">1234i128</span>;
+<a href=#3483 id=3483 data-nosnippet>3483</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3484 id=3484 data-nosnippet>3484</a>            decimal_bytes,
+<a href=#3485 id=3485 data-nosnippet>3485</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3486 id=3486 data-nosnippet>3486</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3487 id=3487 data-nosnippet>3487</a>                precision: <span class="number">4</span>,
+<a href=#3488 id=3488 data-nosnippet>3488</a>                scale: <span class="number">2</span>,
+<a href=#3489 id=3489 data-nosnippet>3489</a>            }),
+<a href=#3490 id=3490 data-nosnippet>3490</a>        );
+<a href=#3491 id=3491 data-nosnippet>3491</a>    }
+<a href=#3492 id=3492 data-nosnippet>3492</a>
+<a href=#3493 id=3493 data-nosnippet>3493</a>    <span class="attr">#[test]
+<a href=#3494 id=3494 data-nosnippet>3494</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_9_scale_2() {
+<a href=#3495 id=3495 data-nosnippet>3495</a>        <span class="comment">// Precision 9 requires 4 bytes
+<a href=#3496 id=3496 data-nosnippet>3496</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x00</span>, <span class="number">0x12</span>, <span class="number">0xd6</span>, <span class="number">0x87</span>]; <span class="comment">// 1234567 in 4 bytes
+<a href=#3497 id=3497 data-nosnippet>3497</a>        </span><span class="kw">let </span>expected_decimal = <span class="number">1234567i128</span>;
+<a href=#3498 id=3498 data-nosnippet>3498</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3499 id=3499 data-nosnippet>3499</a>            decimal_bytes,
+<a href=#3500 id=3500 data-nosnippet>3500</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3501 id=3501 data-nosnippet>3501</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3502 id=3502 data-nosnippet>3502</a>                precision: <span class="number">9</span>,
+<a href=#3503 id=3503 data-nosnippet>3503</a>                scale: <span class="number">2</span>,
+<a href=#3504 id=3504 data-nosnippet>3504</a>            }),
+<a href=#3505 id=3505 data-nosnippet>3505</a>        );
+<a href=#3506 id=3506 data-nosnippet>3506</a>    }
+<a href=#3507 id=3507 data-nosnippet>3507</a>
+<a href=#3508 id=3508 data-nosnippet>3508</a>    <span class="attr">#[test]
+<a href=#3509 id=3509 data-nosnippet>3509</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_18_scale_2() {
+<a href=#3510 id=3510 data-nosnippet>3510</a>        <span class="comment">// Precision 18 requires 8 bytes
+<a href=#3511 id=3511 data-nosnippet>3511</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x04</span>, <span class="number">0xd2</span>]; <span class="comment">// 1234 in 8 bytes
+<a href=#3512 id=3512 data-nosnippet>3512</a>        </span><span class="kw">let </span>expected_decimal = <span class="number">1234i128</span>;
+<a href=#3513 id=3513 data-nosnippet>3513</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3514 id=3514 data-nosnippet>3514</a>            decimal_bytes,
+<a href=#3515 id=3515 data-nosnippet>3515</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3516 id=3516 data-nosnippet>3516</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3517 id=3517 data-nosnippet>3517</a>                precision: <span class="number">18</span>,
+<a href=#3518 id=3518 data-nosnippet>3518</a>                scale: <span class="number">2</span>,
+<a href=#3519 id=3519 data-nosnippet>3519</a>            }),
+<a href=#3520 id=3520 data-nosnippet>3520</a>        );
+<a href=#3521 id=3521 data-nosnippet>3521</a>    }
+<a href=#3522 id=3522 data-nosnippet>3522</a>
+<a href=#3523 id=3523 data-nosnippet>3523</a>    <span class="attr">#[test]
+<a href=#3524 id=3524 data-nosnippet>3524</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_38_scale_2() {
+<a href=#3525 id=3525 data-nosnippet>3525</a>        <span class="comment">// Precision 38 requires 16 bytes (maximum precision)
+<a href=#3526 id=3526 data-nosnippet>3526</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[
+<a href=#3527 id=3527 data-nosnippet>3527</a>            <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</ [...]
+<a href=#3528 id=3528 data-nosnippet>3528</a>            <span class="number">0x04</span>, <span class="number">0xd2</span>, <span class="comment">// 1234 in 16 bytes
+<a href=#3529 id=3529 data-nosnippet>3529</a>        </span>];
+<a href=#3530 id=3530 data-nosnippet>3530</a>        <span class="kw">let </span>expected_decimal = <span class="number">1234i128</span>;
+<a href=#3531 id=3531 data-nosnippet>3531</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3532 id=3532 data-nosnippet>3532</a>            decimal_bytes,
+<a href=#3533 id=3533 data-nosnippet>3533</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3534 id=3534 data-nosnippet>3534</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3535 id=3535 data-nosnippet>3535</a>                precision: <span class="number">38</span>,
+<a href=#3536 id=3536 data-nosnippet>3536</a>                scale: <span class="number">2</span>,
+<a href=#3537 id=3537 data-nosnippet>3537</a>            }),
+<a href=#3538 id=3538 data-nosnippet>3538</a>        );
+<a href=#3539 id=3539 data-nosnippet>3539</a>    }
 <a href=#3540 id=3540 data-nosnippet>3540</a>
-<a href=#3541 id=3541 data-nosnippet>3541</a>        check_convert_with_avro_map(
-<a href=#3542 id=3542 data-nosnippet>3542</a>            Literal::Map(Map::from([
-<a href=#3543 id=3543 data-nosnippet>3543</a>                (
-<a href=#3544 id=3544 data-nosnippet>3544</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3545 id=3545 data-nosnippet>3545</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3546 id=3546 data-nosnippet>3546</a>                ),
-<a href=#3547 id=3547 data-nosnippet>3547</a>                (
-<a href=#3548 id=3548 data-nosnippet>3548</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3549 id=3549 data-nosnippet>3549</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3550 id=3550 data-nosnippet>3550</a>                ),
-<a href=#3551 id=3551 data-nosnippet>3551</a>                (
-<a href=#3552 id=3552 data-nosnippet>3552</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3553 id=3553 data-nosnippet>3553</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3554 id=3554 data-nosnippet>3554</a>                ),
-<a href=#3555 id=3555 data-nosnippet>3555</a>            ])),
-<a href=#3556 id=3556 data-nosnippet>3556</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
-<a href=#3557 id=3557 data-nosnippet>3557</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3558 id=3558 data-nosnippet>3558</a>                    .into(),
-<a href=#3559 id=3559 data-nosnippet>3559</a>                value_field: NestedField::map_value_element(
-<a href=#3560 id=3560 data-nosnippet>3560</a>                    <span class="number">3</span>,
-<a href=#3561 id=3561 data-nosnippet>3561</a>                    Type::Primitive(PrimitiveType::Int),
-<a href=#3562 id=3562 data-nosnippet>3562</a>                    <span class="bool-val">true</span>,
-<a href=#3563 id=3563 data-nosnippet>3563</a>                )
-<a href=#3564 id=3564 data-nosnippet>3564</a>                .into(),
-<a href=#3565 id=3565 data-nosnippet>3565</a>            }),
-<a href=#3566 id=3566 data-nosnippet>3566</a>        );
-<a href=#3567 id=3567 data-nosnippet>3567</a>    }
-<a href=#3568 id=3568 data-nosnippet>3568</a>
-<a href=#3569 id=3569 data-nosnippet>3569</a>    <span class="attr">#[test]
-<a href=#3570 id=3570 data-nosnippet>3570</a>    </span><span class="kw">fn </span>avro_convert_test_record() {
-<a href=#3571 id=3571 data-nosnippet>3571</a>        check_convert_with_avro(
-<a href=#3572 id=3572 data-nosnippet>3572</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
-<a href=#3573 id=3573 data-nosnippet>3573</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3574 id=3574 data-nosnippet>3574</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#3575 id=3575 data-nosnippet>3575</a>                    <span class="string">"bar"</span>.to_string(),
-<a href=#3576 id=3576 data-nosnippet>3576</a>                ))),
-<a href=#3577 id=3577 data-nosnippet>3577</a>                <span class="prelude-val">None</span>,
-<a href=#3578 id=3578 data-nosnippet>3578</a>            ])),
-<a href=#3579 id=3579 data-nosnippet>3579</a>            <span class="kw-2">&amp;</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#3580 id=3580 data-nosnippet>3580</a>                NestedField::required(<span class="number">2</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#3581 id=3581 data-nosnippet>3581</a>                NestedField::optional(<span class="number">3</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3582 id=3582 data-nosnippet>3582</a>                NestedField::optional(<span class="number">4</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3583 id=3583 data-nosnippet>3583</a>            ])),
-<a href=#3584 id=3584 data-nosnippet>3584</a>        );
-<a href=#3585 id=3585 data-nosnippet>3585</a>    }
-<a href=#3586 id=3586 data-nosnippet>3586</a>
-<a href=#3587 id=3587 data-nosnippet>3587</a>    <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#3588 id=3588 data-nosnippet>3588</a>    // rust avro don't support deserialize any bytes representation now:
-<a href=#3589 id=3589 data-nosnippet>3589</a>    // - binary
-<a href=#3590 id=3590 data-nosnippet>3590</a>    // - decimal
-<a href=#3591 id=3591 data-nosnippet>3591</a>    </span><span class="attr">#[test]
-<a href=#3592 id=3592 data-nosnippet>3592</a>    </span><span class="kw">fn </span>avro_convert_test_binary_ser() {
-<a href=#3593 id=3593 data-nosnippet>3593</a>        <span class="kw">let </span>literal = Literal::Primitive(PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]));
-<a href=#3594 id=3594 data-nosnippet>3594</a>        <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Binary);
-<a href=#3595 id=3595 data-nosnippet>3595</a>        <span class="kw">let </span>expect_value = Value::Bytes(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
-<a href=#3596 id=3596 data-nosnippet>3596</a>        check_serialize_avro(literal, <span class="kw-2">&amp;</span>ty, expect_value);
-<a href=#3597 id=3597 data-nosnippet>3597</a>    }
-<a href=#3598 id=3598 data-nosnippet>3598</a>
-<a href=#3599 id=3599 data-nosnippet>3599</a>    <span class="attr">#[test]
-<a href=#3600 id=3600 data-nosnippet>3600</a>    </span><span class="kw">fn </span>avro_convert_test_decimal_ser() {
-<a href=#3601 id=3601 data-nosnippet>3601</a>        <span class="kw">let </span>literal = Literal::decimal(<span class="number">12345</span>);
-<a href=#3602 id=3602 data-nosnippet>3602</a>        <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Decimal {
-<a href=#3603 id=3603 data-nosnippet>3603</a>            precision: <span class="number">9</span>,
-<a href=#3604 id=3604 data-nosnippet>3604</a>            scale: <span class="number">8</span>,
-<a href=#3605 id=3605 data-nosnippet>3605</a>        });
-<a href=#3606 id=3606 data-nosnippet>3606</a>        <span class="kw">let </span>expect_value = Value::Decimal(apache_avro::Decimal::from(<span class="number">12345_i128</span>.to_be_bytes()));
-<a href=#3607 id=3607 data-nosnippet>3607</a>        check_serialize_avro(literal, <span class="kw-2">&amp;</span>ty, expect_value);
-<a href=#3608 id=3608 data-nosnippet>3608</a>    }
-<a href=#3609 id=3609 data-nosnippet>3609</a>
-<a href=#3610 id=3610 data-nosnippet>3610</a>    <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#3611 id=3611 data-nosnippet>3611</a>    // rust avro can't support to convert any byte-like type to fixed in avro now.
-<a href=#3612 id=3612 data-nosnippet>3612</a>    // - uuid ser/de
-<a href=#3613 id=3613 data-nosnippet>3613</a>    // - fixed ser/de
-<a href=#3614 id=3614 data-nosnippet>3614</a>
-<a href=#3615 id=3615 data-nosnippet>3615</a>    </span><span class="attr">#[test]
-<a href=#3616 id=3616 data-nosnippet>3616</a>    </span><span class="kw">fn </span>test_parse_timestamp() {
-<a href=#3617 id=3617 data-nosnippet>3617</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>).unwrap();
-<a href=#3618 id=3618 data-nosnippet>3618</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900"</span>);
-<a href=#3619 id=3619 data-nosnippet>3619</a>
-<a href=#3620 id=3620 data-nosnippet>3620</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2023-01-06T00:00:00"</span>).unwrap();
-<a href=#3621 id=3621 data-nosnippet>3621</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2023-01-06 00:00:00"</span>);
-<a href=#3622 id=3622 data-nosnippet>3622</a>
-<a href=#3623 id=3623 data-nosnippet>3623</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899+0800"</span>);
-<a href=#3624 id=3624 data-nosnippet>3624</a>        <span class="macro">assert!</span>(value.is_err(), <span class="string">"Parse timestamp with timezone should fail!"</span>);
-<a href=#3625 id=3625 data-nosnippet>3625</a>
-<a href=#3626 id=3626 data-nosnippet>3626</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"dfa"</span>);
-<a href=#3627 id=3627 data-nosnippet>3627</a>        <span class="macro">assert!</span>(
-<a href=#3628 id=3628 data-nosnippet>3628</a>            value.is_err(),
-<a href=#3629 id=3629 data-nosnippet>3629</a>            <span class="string">"Parse timestamp with invalid input should fail!"
-<a href=#3630 id=3630 data-nosnippet>3630</a>        </span>);
-<a href=#3631 id=3631 data-nosnippet>3631</a>    }
-<a href=#3632 id=3632 data-nosnippet>3632</a>
-<a href=#3633 id=3633 data-nosnippet>3633</a>    <span class="attr">#[test]
-<a href=#3634 id=3634 data-nosnippet>3634</a>    </span><span class="kw">fn </span>test_parse_timestamptz() {
-<a href=#3635 id=3635 data-nosnippet>3635</a>        <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T09:09:00.0899+0800"</span>).unwrap();
-<a href=#3636 id=3636 data-nosnippet>3636</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900 UTC"</span>);
-<a href=#3637 id=3637 data-nosnippet>3637</a>
-<a href=#3638 id=3638 data-nosnippet>3638</a>        <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>);
-<a href=#3639 id=3639 data-nosnippet>3639</a>        <span class="macro">assert!</span>(
-<a href=#3640 id=3640 data-nosnippet>3640</a>            value.is_err(),
-<a href=#3641 id=3641 data-nosnippet>3641</a>            <span class="string">"Parse timestamptz without timezone should fail!"
-<a href=#3642 id=3642 data-nosnippet>3642</a>        </span>);
-<a href=#3643 id=3643 data-nosnippet>3643</a>
-<a href=#3644 id=3644 data-nosnippet>3644</a>        <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"dfa"</span>);
-<a href=#3645 id=3645 data-nosnippet>3645</a>        <span class="macro">assert!</span>(
-<a href=#3646 id=3646 data-nosnippet>3646</a>            value.is_err(),
-<a href=#3647 id=3647 data-nosnippet>3647</a>            <span class="string">"Parse timestamptz with invalid input should fail!"
-<a href=#3648 id=3648 data-nosnippet>3648</a>        </span>);
+<a href=#3541 id=3541 data-nosnippet>3541</a>    <span class="attr">#[test]
+<a href=#3542 id=3542 data-nosnippet>3542</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_1_scale_0() {
+<a href=#3543 id=3543 data-nosnippet>3543</a>        <span class="comment">// Precision 1 requires 1 byte
+<a href=#3544 id=3544 data-nosnippet>3544</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x07</span>]; <span class="comment">// 7 in 1 byte
+<a href=#3545 id=3545 data-nosnippet>3545</a>        </span><span class="kw">let </span>expected_decimal = <span class="number">7i128</span>;
+<a href=#3546 id=3546 data-nosnippet>3546</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3547 id=3547 data-nosnippet>3547</a>            decimal_bytes,
+<a href=#3548 id=3548 data-nosnippet>3548</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3549 id=3549 data-nosnippet>3549</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3550 id=3550 data-nosnippet>3550</a>                precision: <span class="number">1</span>,
+<a href=#3551 id=3551 data-nosnippet>3551</a>                scale: <span class="number">0</span>,
+<a href=#3552 id=3552 data-nosnippet>3552</a>            }),
+<a href=#3553 id=3553 data-nosnippet>3553</a>        );
+<a href=#3554 id=3554 data-nosnippet>3554</a>    }
+<a href=#3555 id=3555 data-nosnippet>3555</a>
+<a href=#3556 id=3556 data-nosnippet>3556</a>    <span class="attr">#[test]
+<a href=#3557 id=3557 data-nosnippet>3557</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_1_negative() {
+<a href=#3558 id=3558 data-nosnippet>3558</a>        <span class="comment">// Precision 1 requires 1 byte, negative number
+<a href=#3559 id=3559 data-nosnippet>3559</a>        </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0xf9</span>]; <span class="comment">// -7 in 1 byte (two's complement)
+<a href=#3560 id=3560 data-nosnippet>3560</a>        </span><span class="kw">let </span>expected_decimal = -<span class="number">7i128</span>;
+<a href=#3561 id=3561 data-nosnippet>3561</a>        check_raw_literal_bytes_serde_via_avro(
+<a href=#3562 id=3562 data-nosnippet>3562</a>            decimal_bytes,
+<a href=#3563 id=3563 data-nosnippet>3563</a>            Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3564 id=3564 data-nosnippet>3564</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3565 id=3565 data-nosnippet>3565</a>                precision: <span class="number">1</span>,
+<a href=#3566 id=3566 data-nosnippet>3566</a>                scale: <span class="number">0</span>,
+<a href=#3567 id=3567 data-nosnippet>3567</a>            }),
+<a href=#3568 id=3568 data-nosnippet>3568</a>        );
+<a href=#3569 id=3569 data-nosnippet>3569</a>    }
+<a href=#3570 id=3570 data-nosnippet>3570</a>
+<a href=#3571 id=3571 data-nosnippet>3571</a>    <span class="attr">#[test]
+<a href=#3572 id=3572 data-nosnippet>3572</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_wrong_length() {
+<a href=#3573 id=3573 data-nosnippet>3573</a>        <span class="comment">// 3 bytes provided, but precision 4 requires 2 bytes
+<a href=#3574 id=3574 data-nosnippet>3574</a>        </span><span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>];
+<a href=#3575 id=3575 data-nosnippet>3575</a>        check_raw_literal_bytes_error_via_avro(
+<a href=#3576 id=3576 data-nosnippet>3576</a>            bytes,
+<a href=#3577 id=3577 data-nosnippet>3577</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3578 id=3578 data-nosnippet>3578</a>                precision: <span class="number">4</span>,
+<a href=#3579 id=3579 data-nosnippet>3579</a>                scale: <span class="number">2</span>,
+<a href=#3580 id=3580 data-nosnippet>3580</a>            }),
+<a href=#3581 id=3581 data-nosnippet>3581</a>        );
+<a href=#3582 id=3582 data-nosnippet>3582</a>    }
+<a href=#3583 id=3583 data-nosnippet>3583</a>
+<a href=#3584 id=3584 data-nosnippet>3584</a>    <span class="attr">#[test]
+<a href=#3585 id=3585 data-nosnippet>3585</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_wrong_length_too_few() {
+<a href=#3586 id=3586 data-nosnippet>3586</a>        <span class="comment">// 1 byte provided, but precision 9 requires 4 bytes
+<a href=#3587 id=3587 data-nosnippet>3587</a>        </span><span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0x42</span>];
+<a href=#3588 id=3588 data-nosnippet>3588</a>        check_raw_literal_bytes_error_via_avro(
+<a href=#3589 id=3589 data-nosnippet>3589</a>            bytes,
+<a href=#3590 id=3590 data-nosnippet>3590</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3591 id=3591 data-nosnippet>3591</a>                precision: <span class="number">9</span>,
+<a href=#3592 id=3592 data-nosnippet>3592</a>                scale: <span class="number">2</span>,
+<a href=#3593 id=3593 data-nosnippet>3593</a>            }),
+<a href=#3594 id=3594 data-nosnippet>3594</a>        );
+<a href=#3595 id=3595 data-nosnippet>3595</a>    }
+<a href=#3596 id=3596 data-nosnippet>3596</a>
+<a href=#3597 id=3597 data-nosnippet>3597</a>    <span class="attr">#[test]
+<a href=#3598 id=3598 data-nosnippet>3598</a>    </span><span class="kw">fn </span>test_raw_literal_bytes_unsupported_type() {
+<a href=#3599 id=3599 data-nosnippet>3599</a>        <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>, <span class="number">4u8</span>];
+<a href=#3600 id=3600 data-nosnippet>3600</a>        check_raw_literal_bytes_error_via_avro(bytes, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Int));
+<a href=#3601 id=3601 data-nosnippet>3601</a>    }
+<a href=#3602 id=3602 data-nosnippet>3602</a>
+<a href=#3603 id=3603 data-nosnippet>3603</a>    <span class="attr">#[test]
+<a href=#3604 id=3604 data-nosnippet>3604</a>    </span><span class="kw">fn </span>avro_convert_test_int() {
+<a href=#3605 id=3605 data-nosnippet>3605</a>        check_convert_with_avro(
+<a href=#3606 id=3606 data-nosnippet>3606</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
+<a href=#3607 id=3607 data-nosnippet>3607</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Int),
+<a href=#3608 id=3608 data-nosnippet>3608</a>        );
+<a href=#3609 id=3609 data-nosnippet>3609</a>    }
+<a href=#3610 id=3610 data-nosnippet>3610</a>
+<a href=#3611 id=3611 data-nosnippet>3611</a>    <span class="attr">#[test]
+<a href=#3612 id=3612 data-nosnippet>3612</a>    </span><span class="kw">fn </span>avro_convert_test_long() {
+<a href=#3613 id=3613 data-nosnippet>3613</a>        check_convert_with_avro(
+<a href=#3614 id=3614 data-nosnippet>3614</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
+<a href=#3615 id=3615 data-nosnippet>3615</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Long),
+<a href=#3616 id=3616 data-nosnippet>3616</a>        );
+<a href=#3617 id=3617 data-nosnippet>3617</a>    }
+<a href=#3618 id=3618 data-nosnippet>3618</a>
+<a href=#3619 id=3619 data-nosnippet>3619</a>    <span class="attr">#[test]
+<a href=#3620 id=3620 data-nosnippet>3620</a>    </span><span class="kw">fn </span>avro_convert_test_float() {
+<a href=#3621 id=3621 data-nosnippet>3621</a>        check_convert_with_avro(
+<a href=#3622 id=3622 data-nosnippet>3622</a>            Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3623 id=3623 data-nosnippet>3623</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Float),
+<a href=#3624 id=3624 data-nosnippet>3624</a>        );
+<a href=#3625 id=3625 data-nosnippet>3625</a>    }
+<a href=#3626 id=3626 data-nosnippet>3626</a>
+<a href=#3627 id=3627 data-nosnippet>3627</a>    <span class="attr">#[test]
+<a href=#3628 id=3628 data-nosnippet>3628</a>    </span><span class="kw">fn </span>avro_convert_test_double() {
+<a href=#3629 id=3629 data-nosnippet>3629</a>        check_convert_with_avro(
+<a href=#3630 id=3630 data-nosnippet>3630</a>            Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3631 id=3631 data-nosnippet>3631</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Double),
+<a href=#3632 id=3632 data-nosnippet>3632</a>        );
+<a href=#3633 id=3633 data-nosnippet>3633</a>    }
+<a href=#3634 id=3634 data-nosnippet>3634</a>
+<a href=#3635 id=3635 data-nosnippet>3635</a>    <span class="attr">#[test]
+<a href=#3636 id=3636 data-nosnippet>3636</a>    </span><span class="kw">fn </span>avro_convert_test_string() {
+<a href=#3637 id=3637 data-nosnippet>3637</a>        check_convert_with_avro(
+<a href=#3638 id=3638 data-nosnippet>3638</a>            Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
+<a href=#3639 id=3639 data-nosnippet>3639</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::String),
+<a href=#3640 id=3640 data-nosnippet>3640</a>        );
+<a href=#3641 id=3641 data-nosnippet>3641</a>    }
+<a href=#3642 id=3642 data-nosnippet>3642</a>
+<a href=#3643 id=3643 data-nosnippet>3643</a>    <span class="attr">#[test]
+<a href=#3644 id=3644 data-nosnippet>3644</a>    </span><span class="kw">fn </span>avro_convert_test_date() {
+<a href=#3645 id=3645 data-nosnippet>3645</a>        check_convert_with_avro(
+<a href=#3646 id=3646 data-nosnippet>3646</a>            Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
+<a href=#3647 id=3647 data-nosnippet>3647</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date),
+<a href=#3648 id=3648 data-nosnippet>3648</a>        );
 <a href=#3649 id=3649 data-nosnippet>3649</a>    }
 <a href=#3650 id=3650 data-nosnippet>3650</a>
 <a href=#3651 id=3651 data-nosnippet>3651</a>    <span class="attr">#[test]
-<a href=#3652 id=3652 data-nosnippet>3652</a>    </span><span class="kw">fn </span>test_datum_ser_deser() {
-<a href=#3653 id=3653 data-nosnippet>3653</a>        <span class="kw">let </span>test_fn = |datum: Datum| {
-<a href=#3654 id=3654 data-nosnippet>3654</a>            <span class="kw">let </span>json = serde_json::to_value(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3655 id=3655 data-nosnippet>3655</a>            <span class="kw">let </span>desered_datum: Datum = serde_json::from_value(json).unwrap();
-<a href=#3656 id=3656 data-nosnippet>3656</a>            <span class="macro">assert_eq!</span>(datum, desered_datum);
-<a href=#3657 id=3657 data-nosnippet>3657</a>        };
-<a href=#3658 id=3658 data-nosnippet>3658</a>        <span class="kw">let </span>datum = Datum::int(<span class="number">1</span>);
-<a href=#3659 id=3659 data-nosnippet>3659</a>        test_fn(datum);
-<a href=#3660 id=3660 data-nosnippet>3660</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">1</span>);
-<a href=#3661 id=3661 data-nosnippet>3661</a>        test_fn(datum);
-<a href=#3662 id=3662 data-nosnippet>3662</a>
-<a href=#3663 id=3663 data-nosnippet>3663</a>        <span class="kw">let </span>datum = Datum::float(<span class="number">1.0</span>);
-<a href=#3664 id=3664 data-nosnippet>3664</a>        test_fn(datum);
-<a href=#3665 id=3665 data-nosnippet>3665</a>        <span class="kw">let </span>datum = Datum::float(<span class="number">0_f32</span>);
-<a href=#3666 id=3666 data-nosnippet>3666</a>        test_fn(datum);
-<a href=#3667 id=3667 data-nosnippet>3667</a>        <span class="kw">let </span>datum = Datum::float(-<span class="number">0_f32</span>);
-<a href=#3668 id=3668 data-nosnippet>3668</a>        test_fn(datum);
-<a href=#3669 id=3669 data-nosnippet>3669</a>        <span class="kw">let </span>datum = Datum::float(f32::MAX);
-<a href=#3670 id=3670 data-nosnippet>3670</a>        test_fn(datum);
-<a href=#3671 id=3671 data-nosnippet>3671</a>        <span class="kw">let </span>datum = Datum::float(f32::MIN);
-<a href=#3672 id=3672 data-nosnippet>3672</a>        test_fn(datum);
-<a href=#3673 id=3673 data-nosnippet>3673</a>
-<a href=#3674 id=3674 data-nosnippet>3674</a>        <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
-<a href=#3675 id=3675 data-nosnippet>3675</a>        </span><span class="kw">let </span>datum = Datum::float(f32::INFINITY);
-<a href=#3676 id=3676 data-nosnippet>3676</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3677 id=3677 data-nosnippet>3677</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
-<a href=#3678 id=3678 data-nosnippet>3678</a>        <span class="kw">let </span>datum = Datum::float(f32::NEG_INFINITY);
-<a href=#3679 id=3679 data-nosnippet>3679</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3680 id=3680 data-nosnippet>3680</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
-<a href=#3681 id=3681 data-nosnippet>3681</a>        <span class="kw">let </span>datum = Datum::float(f32::NAN);
-<a href=#3682 id=3682 data-nosnippet>3682</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3683 id=3683 data-nosnippet>3683</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
-<a href=#3684 id=3684 data-nosnippet>3684</a>
-<a href=#3685 id=3685 data-nosnippet>3685</a>        <span class="kw">let </span>datum = Datum::double(<span class="number">1.0</span>);
-<a href=#3686 id=3686 data-nosnippet>3686</a>        test_fn(datum);
-<a href=#3687 id=3687 data-nosnippet>3687</a>        <span class="kw">let </span>datum = Datum::double(f64::MAX);
-<a href=#3688 id=3688 data-nosnippet>3688</a>        test_fn(datum);
-<a href=#3689 id=3689 data-nosnippet>3689</a>        <span class="kw">let </span>datum = Datum::double(f64::MIN);
-<a href=#3690 id=3690 data-nosnippet>3690</a>        test_fn(datum);
-<a href=#3691 id=3691 data-nosnippet>3691</a>
-<a href=#3692 id=3692 data-nosnippet>3692</a>        <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
-<a href=#3693 id=3693 data-nosnippet>3693</a>        </span><span class="kw">let </span>datum = Datum::double(f64::INFINITY);
-<a href=#3694 id=3694 data-nosnippet>3694</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3695 id=3695 data-nosnippet>3695</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
-<a href=#3696 id=3696 data-nosnippet>3696</a>        <span class="kw">let </span>datum = Datum::double(f64::NEG_INFINITY);
-<a href=#3697 id=3697 data-nosnippet>3697</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3698 id=3698 data-nosnippet>3698</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
-<a href=#3699 id=3699 data-nosnippet>3699</a>        <span class="kw">let </span>datum = Datum::double(f64::NAN);
-<a href=#3700 id=3700 data-nosnippet>3700</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
-<a href=#3701 id=3701 data-nosnippet>3701</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
-<a href=#3702 id=3702 data-nosnippet>3702</a>
-<a href=#3703 id=3703 data-nosnippet>3703</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"iceberg"</span>);
-<a href=#3704 id=3704 data-nosnippet>3704</a>        test_fn(datum);
-<a href=#3705 id=3705 data-nosnippet>3705</a>        <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
-<a href=#3706 id=3706 data-nosnippet>3706</a>        test_fn(datum);
-<a href=#3707 id=3707 data-nosnippet>3707</a>        <span class="kw">let </span>datum = Datum::date(<span class="number">17486</span>);
-<a href=#3708 id=3708 data-nosnippet>3708</a>        test_fn(datum);
-<a href=#3709 id=3709 data-nosnippet>3709</a>        <span class="kw">let </span>datum = Datum::time_from_hms_micro(<span class="number">22</span>, <span class="number">15</span>, <span class="number">33</span>, <span class="number">111</span>).unwrap();
-<a href=#3710 id=3710 data-nosnippet>3710</a>        test_fn(datum);
-<a href=#3711 id=3711 data-nosnippet>3711</a>        <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">1510871468123456</span>);
-<a href=#3712 id=3712 data-nosnippet>3712</a>        test_fn(datum);
-<a href=#3713 id=3713 data-nosnippet>3713</a>        <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">1510871468123456</span>);
-<a href=#3714 id=3714 data-nosnippet>3714</a>        test_fn(datum);
-<a href=#3715 id=3715 data-nosnippet>3715</a>        <span class="kw">let </span>datum = Datum::uuid(Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>).unwrap());
-<a href=#3716 id=3716 data-nosnippet>3716</a>        test_fn(datum);
-<a href=#3717 id=3717 data-nosnippet>3717</a>        <span class="kw">let </span>datum = Datum::decimal(<span class="number">1420</span>).unwrap();
-<a href=#3718 id=3718 data-nosnippet>3718</a>        test_fn(datum);
-<a href=#3719 id=3719 data-nosnippet>3719</a>        <span class="kw">let </span>datum = Datum::binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
-<a href=#3720 id=3720 data-nosnippet>3720</a>        test_fn(datum);
-<a href=#3721 id=3721 data-nosnippet>3721</a>        <span class="kw">let </span>datum = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
-<a href=#3722 id=3722 data-nosnippet>3722</a>        test_fn(datum);
-<a href=#3723 id=3723 data-nosnippet>3723</a>    }
-<a href=#3724 id=3724 data-nosnippet>3724</a>
-<a href=#3725 id=3725 data-nosnippet>3725</a>    <span class="attr">#[test]
-<a href=#3726 id=3726 data-nosnippet>3726</a>    </span><span class="kw">fn </span>test_datum_date_convert_to_int() {
-<a href=#3727 id=3727 data-nosnippet>3727</a>        <span class="kw">let </span>datum_date = Datum::date(<span class="number">12345</span>);
-<a href=#3728 id=3728 data-nosnippet>3728</a>
-<a href=#3729 id=3729 data-nosnippet>3729</a>        <span class="kw">let </span>result = datum_date.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3730 id=3730 data-nosnippet>3730</a>
-<a href=#3731 id=3731 data-nosnippet>3731</a>        <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3732 id=3732 data-nosnippet>3732</a>
-<a href=#3733 id=3733 data-nosnippet>3733</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3734 id=3734 data-nosnippet>3734</a>    }
-<a href=#3735 id=3735 data-nosnippet>3735</a>
-<a href=#3736 id=3736 data-nosnippet>3736</a>    <span class="attr">#[test]
-<a href=#3737 id=3737 data-nosnippet>3737</a>    </span><span class="kw">fn </span>test_datum_int_convert_to_date() {
-<a href=#3738 id=3738 data-nosnippet>3738</a>        <span class="kw">let </span>datum_int = Datum::int(<span class="number">12345</span>);
-<a href=#3739 id=3739 data-nosnippet>3739</a>
-<a href=#3740 id=3740 data-nosnippet>3740</a>        <span class="kw">let </span>result = datum_int.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3741 id=3741 data-nosnippet>3741</a>
-<a href=#3742 id=3742 data-nosnippet>3742</a>        <span class="kw">let </span>expected = Datum::date(<span class="number">12345</span>);
-<a href=#3743 id=3743 data-nosnippet>3743</a>
-<a href=#3744 id=3744 data-nosnippet>3744</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3745 id=3745 data-nosnippet>3745</a>    }
-<a href=#3746 id=3746 data-nosnippet>3746</a>
-<a href=#3747 id=3747 data-nosnippet>3747</a>    <span class="attr">#[test]
-<a href=#3748 id=3748 data-nosnippet>3748</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_int() {
-<a href=#3749 id=3749 data-nosnippet>3749</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3750 id=3750 data-nosnippet>3750</a>
-<a href=#3751 id=3751 data-nosnippet>3751</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3752 id=3752 data-nosnippet>3752</a>
-<a href=#3753 id=3753 data-nosnippet>3753</a>        <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3754 id=3754 data-nosnippet>3754</a>
-<a href=#3755 id=3755 data-nosnippet>3755</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3756 id=3756 data-nosnippet>3756</a>    }
-<a href=#3757 id=3757 data-nosnippet>3757</a>
-<a href=#3758 id=3758 data-nosnippet>3758</a>    <span class="attr">#[test]
-<a href=#3759 id=3759 data-nosnippet>3759</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_int_above_max() {
-<a href=#3760 id=3760 data-nosnippet>3760</a>        <span class="kw">let </span>datum = Datum::long(INT_MAX <span class="kw">as </span>i64 + <span class="number">1</span>);
-<a href=#3761 id=3761 data-nosnippet>3761</a>
-<a href=#3762 id=3762 data-nosnippet>3762</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3763 id=3763 data-nosnippet>3763</a>
-<a href=#3764 id=3764 data-nosnippet>3764</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax);
-<a href=#3765 id=3765 data-nosnippet>3765</a>
-<a href=#3766 id=3766 data-nosnippet>3766</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3767 id=3767 data-nosnippet>3767</a>    }
-<a href=#3768 id=3768 data-nosnippet>3768</a>
-<a href=#3769 id=3769 data-nosnippet>3769</a>    <span class="attr">#[test]
-<a href=#3770 id=3770 data-nosnippet>3770</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_int_below_min() {
-<a href=#3771 id=3771 data-nosnippet>3771</a>        <span class="kw">let </span>datum = Datum::long(INT_MIN <span class="kw">as </span>i64 - <span class="number">1</span>);
-<a href=#3772 id=3772 data-nosnippet>3772</a>
-<a href=#3773 id=3773 data-nosnippet>3773</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#3652 id=3652 data-nosnippet>3652</a>    </span><span class="kw">fn </span>avro_convert_test_time() {
+<a href=#3653 id=3653 data-nosnippet>3653</a>        check_convert_with_avro(
+<a href=#3654 id=3654 data-nosnippet>3654</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
+<a href=#3655 id=3655 data-nosnippet>3655</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Time),
+<a href=#3656 id=3656 data-nosnippet>3656</a>        );
+<a href=#3657 id=3657 data-nosnippet>3657</a>    }
+<a href=#3658 id=3658 data-nosnippet>3658</a>
+<a href=#3659 id=3659 data-nosnippet>3659</a>    <span class="attr">#[test]
+<a href=#3660 id=3660 data-nosnippet>3660</a>    </span><span class="kw">fn </span>avro_convert_test_timestamp() {
+<a href=#3661 id=3661 data-nosnippet>3661</a>        check_convert_with_avro(
+<a href=#3662 id=3662 data-nosnippet>3662</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3663 id=3663 data-nosnippet>3663</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamp),
+<a href=#3664 id=3664 data-nosnippet>3664</a>        );
+<a href=#3665 id=3665 data-nosnippet>3665</a>    }
+<a href=#3666 id=3666 data-nosnippet>3666</a>
+<a href=#3667 id=3667 data-nosnippet>3667</a>    <span class="attr">#[test]
+<a href=#3668 id=3668 data-nosnippet>3668</a>    </span><span class="kw">fn </span>avro_convert_test_timestamptz() {
+<a href=#3669 id=3669 data-nosnippet>3669</a>        check_convert_with_avro(
+<a href=#3670 id=3670 data-nosnippet>3670</a>            Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3671 id=3671 data-nosnippet>3671</a>            <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#3672 id=3672 data-nosnippet>3672</a>        );
+<a href=#3673 id=3673 data-nosnippet>3673</a>    }
+<a href=#3674 id=3674 data-nosnippet>3674</a>
+<a href=#3675 id=3675 data-nosnippet>3675</a>    <span class="attr">#[test]
+<a href=#3676 id=3676 data-nosnippet>3676</a>    </span><span class="kw">fn </span>avro_convert_test_list() {
+<a href=#3677 id=3677 data-nosnippet>3677</a>        check_convert_with_avro(
+<a href=#3678 id=3678 data-nosnippet>3678</a>            Literal::List(<span class="macro">vec!</span>[
+<a href=#3679 id=3679 data-nosnippet>3679</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3680 id=3680 data-nosnippet>3680</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3681 id=3681 data-nosnippet>3681</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3682 id=3682 data-nosnippet>3682</a>                <span class="prelude-val">None</span>,
+<a href=#3683 id=3683 data-nosnippet>3683</a>            ]),
+<a href=#3684 id=3684 data-nosnippet>3684</a>            <span class="kw-2">&amp;</span>Type::List(ListType {
+<a href=#3685 id=3685 data-nosnippet>3685</a>                element_field: NestedField::list_element(
+<a href=#3686 id=3686 data-nosnippet>3686</a>                    <span class="number">0</span>,
+<a href=#3687 id=3687 data-nosnippet>3687</a>                    Type::Primitive(PrimitiveType::Int),
+<a href=#3688 id=3688 data-nosnippet>3688</a>                    <span class="bool-val">false</span>,
+<a href=#3689 id=3689 data-nosnippet>3689</a>                )
+<a href=#3690 id=3690 data-nosnippet>3690</a>                .into(),
+<a href=#3691 id=3691 data-nosnippet>3691</a>            }),
+<a href=#3692 id=3692 data-nosnippet>3692</a>        );
+<a href=#3693 id=3693 data-nosnippet>3693</a>
+<a href=#3694 id=3694 data-nosnippet>3694</a>        check_convert_with_avro(
+<a href=#3695 id=3695 data-nosnippet>3695</a>            Literal::List(<span class="macro">vec!</span>[
+<a href=#3696 id=3696 data-nosnippet>3696</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3697 id=3697 data-nosnippet>3697</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3698 id=3698 data-nosnippet>3698</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3699 id=3699 data-nosnippet>3699</a>            ]),
+<a href=#3700 id=3700 data-nosnippet>3700</a>            <span class="kw-2">&amp;</span>Type::List(ListType {
+<a href=#3701 id=3701 data-nosnippet>3701</a>                element_field: NestedField::list_element(
+<a href=#3702 id=3702 data-nosnippet>3702</a>                    <span class="number">0</span>,
+<a href=#3703 id=3703 data-nosnippet>3703</a>                    Type::Primitive(PrimitiveType::Int),
+<a href=#3704 id=3704 data-nosnippet>3704</a>                    <span class="bool-val">true</span>,
+<a href=#3705 id=3705 data-nosnippet>3705</a>                )
+<a href=#3706 id=3706 data-nosnippet>3706</a>                .into(),
+<a href=#3707 id=3707 data-nosnippet>3707</a>            }),
+<a href=#3708 id=3708 data-nosnippet>3708</a>        );
+<a href=#3709 id=3709 data-nosnippet>3709</a>    }
+<a href=#3710 id=3710 data-nosnippet>3710</a>
+<a href=#3711 id=3711 data-nosnippet>3711</a>    <span class="kw">fn </span>check_convert_with_avro_map(expected_literal: Literal, expected_type: <span class="kw-2">&amp;</span>Type) {
+<a href=#3712 id=3712 data-nosnippet>3712</a>        <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
+<a href=#3713 id=3713 data-nosnippet>3713</a>        <span class="kw">let </span>schema = Schema::builder()
+<a href=#3714 id=3714 data-nosnippet>3714</a>            .with_fields(fields.clone())
+<a href=#3715 id=3715 data-nosnippet>3715</a>            .build()
+<a href=#3716 id=3716 data-nosnippet>3716</a>            .unwrap();
+<a href=#3717 id=3717 data-nosnippet>3717</a>        <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&amp;</span>schema).unwrap();
+<a href=#3718 id=3718 data-nosnippet>3718</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3719 id=3719 data-nosnippet>3719</a>        <span class="kw">let </span>struct_literal =
+<a href=#3720 id=3720 data-nosnippet>3720</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#3721 id=3721 data-nosnippet>3721</a>
+<a href=#3722 id=3722 data-nosnippet>3722</a>        <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&amp;</span>avro_schema, Vec::new());
+<a href=#3723 id=3723 data-nosnippet>3723</a>        <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&amp;</span>struct_type).unwrap();
+<a href=#3724 id=3724 data-nosnippet>3724</a>        writer.append_ser(raw_literal).unwrap();
+<a href=#3725 id=3725 data-nosnippet>3725</a>        <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3726 id=3726 data-nosnippet>3726</a>
+<a href=#3727 id=3727 data-nosnippet>3727</a>        <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&amp;*</span>encoded).unwrap();
+<a href=#3728 id=3728 data-nosnippet>3728</a>        <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3729 id=3729 data-nosnippet>3729</a>            <span class="kw">let </span>result = apache_avro::from_value::&lt;RawLiteral&gt;(<span class="kw-2">&amp;</span>record.unwrap()).unwrap();
+<a href=#3730 id=3730 data-nosnippet>3730</a>            <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&amp;</span>struct_type).unwrap().unwrap();
+<a href=#3731 id=3731 data-nosnippet>3731</a>            <span class="kw">match </span>(<span class="kw-2">&amp;</span>desered_literal, <span class="kw-2">&amp;</span>struct_literal) {
+<a href=#3732 id=3732 data-nosnippet>3732</a>                (Literal::Struct(desered), Literal::Struct(expected)) =&gt; {
+<a href=#3733 id=3733 data-nosnippet>3733</a>                    <span class="kw">match </span>(<span class="kw-2">&amp;</span>desered.fields[<span class="number">0</span>], <span class="kw-2">&amp;</span>expected.fields[<span class="number">0</span>]) {
+<a href=#3734 id=3734 data-nosnippet>3734</a>                        (<span class="prelude-val">Some</span>(Literal::Map(desered)), <span class="prelude-val">Some</span>(Literal::Map(expected))) =&gt; {
+<a href=#3735 id=3735 data-nosnippet>3735</a>                            <span class="macro">assert!</span>(desered.has_same_content(expected))
+<a href=#3736 id=3736 data-nosnippet>3736</a>                        }
+<a href=#3737 id=3737 data-nosnippet>3737</a>                        <span class="kw">_ </span>=&gt; {
+<a href=#3738 id=3738 data-nosnippet>3738</a>                            <span class="macro">unreachable!</span>()
+<a href=#3739 id=3739 data-nosnippet>3739</a>                        }
+<a href=#3740 id=3740 data-nosnippet>3740</a>                    }
+<a href=#3741 id=3741 data-nosnippet>3741</a>                }
+<a href=#3742 id=3742 data-nosnippet>3742</a>                <span class="kw">_ </span>=&gt; {
+<a href=#3743 id=3743 data-nosnippet>3743</a>                    <span class="macro">panic!</span>(<span class="string">"unexpected literal type"</span>);
+<a href=#3744 id=3744 data-nosnippet>3744</a>                }
+<a href=#3745 id=3745 data-nosnippet>3745</a>            }
+<a href=#3746 id=3746 data-nosnippet>3746</a>        }
+<a href=#3747 id=3747 data-nosnippet>3747</a>    }
+<a href=#3748 id=3748 data-nosnippet>3748</a>
+<a href=#3749 id=3749 data-nosnippet>3749</a>    <span class="attr">#[test]
+<a href=#3750 id=3750 data-nosnippet>3750</a>    </span><span class="kw">fn </span>avro_convert_test_map() {
+<a href=#3751 id=3751 data-nosnippet>3751</a>        check_convert_with_avro_map(
+<a href=#3752 id=3752 data-nosnippet>3752</a>            Literal::Map(Map::from([
+<a href=#3753 id=3753 data-nosnippet>3753</a>                (
+<a href=#3754 id=3754 data-nosnippet>3754</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#3755 id=3755 data-nosnippet>3755</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
+<a href=#3756 id=3756 data-nosnippet>3756</a>                ),
+<a href=#3757 id=3757 data-nosnippet>3757</a>                (
+<a href=#3758 id=3758 data-nosnippet>3758</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
+<a href=#3759 id=3759 data-nosnippet>3759</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
+<a href=#3760 id=3760 data-nosnippet>3760</a>                ),
+<a href=#3761 id=3761 data-nosnippet>3761</a>                (Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)), <span class="prelude-val">None</span>),
+<a href=#3762 id=3762 data-nosnippet>3762</a>            ])),
+<a href=#3763 id=3763 data-nosnippet>3763</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
+<a href=#3764 id=3764 data-nosnippet>3764</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#3765 id=3765 data-nosnippet>3765</a>                    .into(),
+<a href=#3766 id=3766 data-nosnippet>3766</a>                value_field: NestedField::map_value_element(
+<a href=#3767 id=3767 data-nosnippet>3767</a>                    <span class="number">3</span>,
+<a href=#3768 id=3768 data-nosnippet>3768</a>                    Type::Primitive(PrimitiveType::Long),
+<a href=#3769 id=3769 data-nosnippet>3769</a>                    <span class="bool-val">false</span>,
+<a href=#3770 id=3770 data-nosnippet>3770</a>                )
+<a href=#3771 id=3771 data-nosnippet>3771</a>                .into(),
+<a href=#3772 id=3772 data-nosnippet>3772</a>            }),
+<a href=#3773 id=3773 data-nosnippet>3773</a>        );
 <a href=#3774 id=3774 data-nosnippet>3774</a>
-<a href=#3775 id=3775 data-nosnippet>3775</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin);
-<a href=#3776 id=3776 data-nosnippet>3776</a>
-<a href=#3777 id=3777 data-nosnippet>3777</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3778 id=3778 data-nosnippet>3778</a>    }
-<a href=#3779 id=3779 data-nosnippet>3779</a>
-<a href=#3780 id=3780 data-nosnippet>3780</a>    <span class="attr">#[test]
-<a href=#3781 id=3781 data-nosnippet>3781</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_timestamp() {
-<a href=#3782 id=3782 data-nosnippet>3782</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3783 id=3783 data-nosnippet>3783</a>
-<a href=#3784 id=3784 data-nosnippet>3784</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamp)).unwrap();
-<a href=#3785 id=3785 data-nosnippet>3785</a>
-<a href=#3786 id=3786 data-nosnippet>3786</a>        <span class="kw">let </span>expected = Datum::timestamp_micros(<span class="number">12345</span>);
-<a href=#3787 id=3787 data-nosnippet>3787</a>
-<a href=#3788 id=3788 data-nosnippet>3788</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3789 id=3789 data-nosnippet>3789</a>    }
-<a href=#3790 id=3790 data-nosnippet>3790</a>
-<a href=#3791 id=3791 data-nosnippet>3791</a>    <span class="attr">#[test]
-<a href=#3792 id=3792 data-nosnippet>3792</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_timestamptz() {
-<a href=#3793 id=3793 data-nosnippet>3793</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3794 id=3794 data-nosnippet>3794</a>
-<a href=#3795 id=3795 data-nosnippet>3795</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
-<a href=#3796 id=3796 data-nosnippet>3796</a>
-<a href=#3797 id=3797 data-nosnippet>3797</a>        <span class="kw">let </span>expected = Datum::timestamptz_micros(<span class="number">12345</span>);
-<a href=#3798 id=3798 data-nosnippet>3798</a>
-<a href=#3799 id=3799 data-nosnippet>3799</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3800 id=3800 data-nosnippet>3800</a>    }
-<a href=#3801 id=3801 data-nosnippet>3801</a>
-<a href=#3802 id=3802 data-nosnippet>3802</a>    <span class="attr">#[test]
-<a href=#3803 id=3803 data-nosnippet>3803</a>    </span><span class="kw">fn </span>test_datum_decimal_convert_to_long() {
-<a href=#3804 id=3804 data-nosnippet>3804</a>        <span class="kw">let </span>datum = Datum::decimal(<span class="number">12345</span>).unwrap();
-<a href=#3805 id=3805 data-nosnippet>3805</a>
-<a href=#3806 id=3806 data-nosnippet>3806</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3807 id=3807 data-nosnippet>3807</a>
-<a href=#3808 id=3808 data-nosnippet>3808</a>        <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
-<a href=#3809 id=3809 data-nosnippet>3809</a>
-<a href=#3810 id=3810 data-nosnippet>3810</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3811 id=3811 data-nosnippet>3811</a>    }
-<a href=#3812 id=3812 data-nosnippet>3812</a>
-<a href=#3813 id=3813 data-nosnippet>3813</a>    <span class="attr">#[test]
-<a href=#3814 id=3814 data-nosnippet>3814</a>    </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_above_max() {
-<a href=#3815 id=3815 data-nosnippet>3815</a>        <span class="kw">let </span>datum = Datum::decimal(LONG_MAX <span class="kw">as </span>i128 + <span class="number">1</span>).unwrap();
-<a href=#3816 id=3816 data-nosnippet>3816</a>
-<a href=#3817 id=3817 data-nosnippet>3817</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3818 id=3818 data-nosnippet>3818</a>
-<a href=#3819 id=3819 data-nosnippet>3819</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax);
-<a href=#3820 id=3820 data-nosnippet>3820</a>
-<a href=#3821 id=3821 data-nosnippet>3821</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3822 id=3822 data-nosnippet>3822</a>    }
-<a href=#3823 id=3823 data-nosnippet>3823</a>
-<a href=#3824 id=3824 data-nosnippet>3824</a>    <span class="attr">#[test]
-<a href=#3825 id=3825 data-nosnippet>3825</a>    </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_below_min() {
-<a href=#3826 id=3826 data-nosnippet>3826</a>        <span class="kw">let </span>datum = Datum::decimal(LONG_MIN <span class="kw">as </span>i128 - <span class="number">1</span>).unwrap();
-<a href=#3827 id=3827 data-nosnippet>3827</a>
-<a href=#3828 id=3828 data-nosnippet>3828</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3829 id=3829 data-nosnippet>3829</a>
-<a href=#3830 id=3830 data-nosnippet>3830</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin);
+<a href=#3775 id=3775 data-nosnippet>3775</a>        check_convert_with_avro_map(
+<a href=#3776 id=3776 data-nosnippet>3776</a>            Literal::Map(Map::from([
+<a href=#3777 id=3777 data-nosnippet>3777</a>                (
+<a href=#3778 id=3778 data-nosnippet>3778</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#3779 id=3779 data-nosnippet>3779</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
+<a href=#3780 id=3780 data-nosnippet>3780</a>                ),
+<a href=#3781 id=3781 data-nosnippet>3781</a>                (
+<a href=#3782 id=3782 data-nosnippet>3782</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
+<a href=#3783 id=3783 data-nosnippet>3783</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
+<a href=#3784 id=3784 data-nosnippet>3784</a>                ),
+<a href=#3785 id=3785 data-nosnippet>3785</a>                (
+<a href=#3786 id=3786 data-nosnippet>3786</a>                    Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)),
+<a href=#3787 id=3787 data-nosnippet>3787</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">3</span>))),
+<a href=#3788 id=3788 data-nosnippet>3788</a>                ),
+<a href=#3789 id=3789 data-nosnippet>3789</a>            ])),
+<a href=#3790 id=3790 data-nosnippet>3790</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
+<a href=#3791 id=3791 data-nosnippet>3791</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#3792 id=3792 data-nosnippet>3792</a>                    .into(),
+<a href=#3793 id=3793 data-nosnippet>3793</a>                value_field: NestedField::map_value_element(
+<a href=#3794 id=3794 data-nosnippet>3794</a>                    <span class="number">3</span>,
+<a href=#3795 id=3795 data-nosnippet>3795</a>                    Type::Primitive(PrimitiveType::Long),
+<a href=#3796 id=3796 data-nosnippet>3796</a>                    <span class="bool-val">true</span>,
+<a href=#3797 id=3797 data-nosnippet>3797</a>                )
+<a href=#3798 id=3798 data-nosnippet>3798</a>                .into(),
+<a href=#3799 id=3799 data-nosnippet>3799</a>            }),
+<a href=#3800 id=3800 data-nosnippet>3800</a>        );
+<a href=#3801 id=3801 data-nosnippet>3801</a>    }
+<a href=#3802 id=3802 data-nosnippet>3802</a>
+<a href=#3803 id=3803 data-nosnippet>3803</a>    <span class="attr">#[test]
+<a href=#3804 id=3804 data-nosnippet>3804</a>    </span><span class="kw">fn </span>avro_convert_test_string_map() {
+<a href=#3805 id=3805 data-nosnippet>3805</a>        check_convert_with_avro_map(
+<a href=#3806 id=3806 data-nosnippet>3806</a>            Literal::Map(Map::from([
+<a href=#3807 id=3807 data-nosnippet>3807</a>                (
+<a href=#3808 id=3808 data-nosnippet>3808</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3809 id=3809 data-nosnippet>3809</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3810 id=3810 data-nosnippet>3810</a>                ),
+<a href=#3811 id=3811 data-nosnippet>3811</a>                (
+<a href=#3812 id=3812 data-nosnippet>3812</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3813 id=3813 data-nosnippet>3813</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3814 id=3814 data-nosnippet>3814</a>                ),
+<a href=#3815 id=3815 data-nosnippet>3815</a>                (
+<a href=#3816 id=3816 data-nosnippet>3816</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3817 id=3817 data-nosnippet>3817</a>                    <span class="prelude-val">None</span>,
+<a href=#3818 id=3818 data-nosnippet>3818</a>                ),
+<a href=#3819 id=3819 data-nosnippet>3819</a>            ])),
+<a href=#3820 id=3820 data-nosnippet>3820</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
+<a href=#3821 id=3821 data-nosnippet>3821</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3822 id=3822 data-nosnippet>3822</a>                    .into(),
+<a href=#3823 id=3823 data-nosnippet>3823</a>                value_field: NestedField::map_value_element(
+<a href=#3824 id=3824 data-nosnippet>3824</a>                    <span class="number">3</span>,
+<a href=#3825 id=3825 data-nosnippet>3825</a>                    Type::Primitive(PrimitiveType::Int),
+<a href=#3826 id=3826 data-nosnippet>3826</a>                    <span class="bool-val">false</span>,
+<a href=#3827 id=3827 data-nosnippet>3827</a>                )
+<a href=#3828 id=3828 data-nosnippet>3828</a>                .into(),
+<a href=#3829 id=3829 data-nosnippet>3829</a>            }),
+<a href=#3830 id=3830 data-nosnippet>3830</a>        );
 <a href=#3831 id=3831 data-nosnippet>3831</a>
-<a href=#3832 id=3832 data-nosnippet>3832</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3833 id=3833 data-nosnippet>3833</a>    }
-<a href=#3834 id=3834 data-nosnippet>3834</a>
-<a href=#3835 id=3835 data-nosnippet>3835</a>    <span class="attr">#[test]
-<a href=#3836 id=3836 data-nosnippet>3836</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_boolean() {
-<a href=#3837 id=3837 data-nosnippet>3837</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"true"</span>);
-<a href=#3838 id=3838 data-nosnippet>3838</a>
-<a href=#3839 id=3839 data-nosnippet>3839</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Boolean)).unwrap();
-<a href=#3840 id=3840 data-nosnippet>3840</a>
-<a href=#3841 id=3841 data-nosnippet>3841</a>        <span class="kw">let </span>expected = Datum::bool(<span class="bool-val">true</span>);
-<a href=#3842 id=3842 data-nosnippet>3842</a>
-<a href=#3843 id=3843 data-nosnippet>3843</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3844 id=3844 data-nosnippet>3844</a>    }
-<a href=#3845 id=3845 data-nosnippet>3845</a>
-<a href=#3846 id=3846 data-nosnippet>3846</a>    <span class="attr">#[test]
-<a href=#3847 id=3847 data-nosnippet>3847</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_int() {
-<a href=#3848 id=3848 data-nosnippet>3848</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
-<a href=#3849 id=3849 data-nosnippet>3849</a>
-<a href=#3850 id=3850 data-nosnippet>3850</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3851 id=3851 data-nosnippet>3851</a>
-<a href=#3852 id=3852 data-nosnippet>3852</a>        <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3853 id=3853 data-nosnippet>3853</a>
-<a href=#3854 id=3854 data-nosnippet>3854</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3855 id=3855 data-nosnippet>3855</a>    }
-<a href=#3856 id=3856 data-nosnippet>3856</a>
-<a href=#3857 id=3857 data-nosnippet>3857</a>    <span class="attr">#[test]
-<a href=#3858 id=3858 data-nosnippet>3858</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_long() {
-<a href=#3859 id=3859 data-nosnippet>3859</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
-<a href=#3860 id=3860 data-nosnippet>3860</a>
-<a href=#3861 id=3861 data-nosnippet>3861</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3862 id=3862 data-nosnippet>3862</a>
-<a href=#3863 id=3863 data-nosnippet>3863</a>        <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
-<a href=#3864 id=3864 data-nosnippet>3864</a>
-<a href=#3865 id=3865 data-nosnippet>3865</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3866 id=3866 data-nosnippet>3866</a>    }
-<a href=#3867 id=3867 data-nosnippet>3867</a>
-<a href=#3868 id=3868 data-nosnippet>3868</a>    <span class="attr">#[test]
-<a href=#3869 id=3869 data-nosnippet>3869</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_timestamp() {
-<a href=#3870 id=3870 data-nosnippet>3870</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000"</span>);
-<a href=#3871 id=3871 data-nosnippet>3871</a>
-<a href=#3872 id=3872 data-nosnippet>3872</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamp)).unwrap();
-<a href=#3873 id=3873 data-nosnippet>3873</a>
-<a href=#3874 id=3874 data-nosnippet>3874</a>        <span class="kw">let </span>expected = Datum::timestamp_micros(-<span class="number">1407990900000000</span>);
-<a href=#3875 id=3875 data-nosnippet>3875</a>
-<a href=#3876 id=3876 data-nosnippet>3876</a>        <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3877 id=3877 data-nosnippet>3877</a>    }
-<a href=#3878 id=3878 data-nosnippet>3878</a>
-<a href=#3879 id=3879 data-nosnippet>3879</a>    <span class="attr">#[test]
-<a href=#3880 id=3880 data-nosnippet>3880</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_timestamptz() {
-<a href=#3881 id=3881 data-nosnippet>3881</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000 UTC"</span>);
-<a href=#3882 id=3882 data-nosnippet>3882</a>
-<a href=#3883 id=3883 data-nosnippet>3883</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
-<a href=#3884 id=3884 data-nosnippet>3884</a>
-<a href=#3885 id=3885 data-nosnippet>3885</a>        <span class="kw">let </span>expected = Datum::timestamptz_micros(-<span class="number">1407990900000000</span>);
-<a href=#3886 id=3886 data-nosnippet>3886</a>
-<a href=#3887 id=3887 data-nosnippet>3887</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3832 id=3832 data-nosnippet>3832</a>        check_convert_with_avro_map(
+<a href=#3833 id=3833 data-nosnippet>3833</a>            Literal::Map(Map::from([
+<a href=#3834 id=3834 data-nosnippet>3834</a>                (
+<a href=#3835 id=3835 data-nosnippet>3835</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3836 id=3836 data-nosnippet>3836</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3837 id=3837 data-nosnippet>3837</a>                ),
+<a href=#3838 id=3838 data-nosnippet>3838</a>                (
+<a href=#3839 id=3839 data-nosnippet>3839</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3840 id=3840 data-nosnippet>3840</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3841 id=3841 data-nosnippet>3841</a>                ),
+<a href=#3842 id=3842 data-nosnippet>3842</a>                (
+<a href=#3843 id=3843 data-nosnippet>3843</a>                    Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3844 id=3844 data-nosnippet>3844</a>                    <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3845 id=3845 data-nosnippet>3845</a>                ),
+<a href=#3846 id=3846 data-nosnippet>3846</a>            ])),
+<a href=#3847 id=3847 data-nosnippet>3847</a>            <span class="kw-2">&amp;</span>Type::Map(MapType {
+<a href=#3848 id=3848 data-nosnippet>3848</a>                key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3849 id=3849 data-nosnippet>3849</a>                    .into(),
+<a href=#3850 id=3850 data-nosnippet>3850</a>                value_field: NestedField::map_value_element(
+<a href=#3851 id=3851 data-nosnippet>3851</a>                    <span class="number">3</span>,
+<a href=#3852 id=3852 data-nosnippet>3852</a>                    Type::Primitive(PrimitiveType::Int),
+<a href=#3853 id=3853 data-nosnippet>3853</a>                    <span class="bool-val">true</span>,
+<a href=#3854 id=3854 data-nosnippet>3854</a>                )
+<a href=#3855 id=3855 data-nosnippet>3855</a>                .into(),
+<a href=#3856 id=3856 data-nosnippet>3856</a>            }),
+<a href=#3857 id=3857 data-nosnippet>3857</a>        );
+<a href=#3858 id=3858 data-nosnippet>3858</a>    }
+<a href=#3859 id=3859 data-nosnippet>3859</a>
+<a href=#3860 id=3860 data-nosnippet>3860</a>    <span class="attr">#[test]
+<a href=#3861 id=3861 data-nosnippet>3861</a>    </span><span class="kw">fn </span>avro_convert_test_record() {
+<a href=#3862 id=3862 data-nosnippet>3862</a>        check_convert_with_avro(
+<a href=#3863 id=3863 data-nosnippet>3863</a>            Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
+<a href=#3864 id=3864 data-nosnippet>3864</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3865 id=3865 data-nosnippet>3865</a>                <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#3866 id=3866 data-nosnippet>3866</a>                    <span class="string">"bar"</span>.to_string(),
+<a href=#3867 id=3867 data-nosnippet>3867</a>                ))),
+<a href=#3868 id=3868 data-nosnippet>3868</a>                <span class="prelude-val">None</span>,
+<a href=#3869 id=3869 data-nosnippet>3869</a>            ])),
+<a href=#3870 id=3870 data-nosnippet>3870</a>            <span class="kw-2">&amp;</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#3871 id=3871 data-nosnippet>3871</a>                NestedField::required(<span class="number">2</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#3872 id=3872 data-nosnippet>3872</a>                NestedField::optional(<span class="number">3</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3873 id=3873 data-nosnippet>3873</a>                NestedField::optional(<span class="number">4</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3874 id=3874 data-nosnippet>3874</a>            ])),
+<a href=#3875 id=3875 data-nosnippet>3875</a>        );
+<a href=#3876 id=3876 data-nosnippet>3876</a>    }
+<a href=#3877 id=3877 data-nosnippet>3877</a>
+<a href=#3878 id=3878 data-nosnippet>3878</a>    <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#3879 id=3879 data-nosnippet>3879</a>    // rust avro don't support deserialize any bytes representation now:
+<a href=#3880 id=3880 data-nosnippet>3880</a>    // - binary
+<a href=#3881 id=3881 data-nosnippet>3881</a>    // - decimal
+<a href=#3882 id=3882 data-nosnippet>3882</a>    </span><span class="attr">#[test]
+<a href=#3883 id=3883 data-nosnippet>3883</a>    </span><span class="kw">fn </span>avro_convert_test_binary_ser() {
+<a href=#3884 id=3884 data-nosnippet>3884</a>        <span class="kw">let </span>literal = Literal::Primitive(PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]));
+<a href=#3885 id=3885 data-nosnippet>3885</a>        <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Binary);
+<a href=#3886 id=3886 data-nosnippet>3886</a>        <span class="kw">let </span>expect_value = Value::Bytes(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
+<a href=#3887 id=3887 data-nosnippet>3887</a>        check_serialize_avro(literal, <span class="kw-2">&amp;</span>ty, expect_value);
 <a href=#3888 id=3888 data-nosnippet>3888</a>    }
 <a href=#3889 id=3889 data-nosnippet>3889</a>
 <a href=#3890 id=3890 data-nosnippet>3890</a>    <span class="attr">#[test]
-<a href=#3891 id=3891 data-nosnippet>3891</a>    </span><span class="kw">fn </span>test_iceberg_float_order() {
-<a href=#3892 id=3892 data-nosnippet>3892</a>        <span class="comment">// Test float ordering
-<a href=#3893 id=3893 data-nosnippet>3893</a>        </span><span class="kw">let </span>float_values = <span class="macro">vec!</span>[
-<a href=#3894 id=3894 data-nosnippet>3894</a>            Datum::float(f32::NAN),
-<a href=#3895 id=3895 data-nosnippet>3895</a>            Datum::float(-f32::NAN),
-<a href=#3896 id=3896 data-nosnippet>3896</a>            Datum::float(f32::MAX),
-<a href=#3897 id=3897 data-nosnippet>3897</a>            Datum::float(f32::MIN),
-<a href=#3898 id=3898 data-nosnippet>3898</a>            Datum::float(f32::INFINITY),
-<a href=#3899 id=3899 data-nosnippet>3899</a>            Datum::float(-f32::INFINITY),
-<a href=#3900 id=3900 data-nosnippet>3900</a>            Datum::float(<span class="number">1.0</span>),
-<a href=#3901 id=3901 data-nosnippet>3901</a>            Datum::float(-<span class="number">1.0</span>),
-<a href=#3902 id=3902 data-nosnippet>3902</a>            Datum::float(<span class="number">0.0</span>),
-<a href=#3903 id=3903 data-nosnippet>3903</a>            Datum::float(-<span class="number">0.0</span>),
-<a href=#3904 id=3904 data-nosnippet>3904</a>        ];
+<a href=#3891 id=3891 data-nosnippet>3891</a>    </span><span class="kw">fn </span>avro_convert_test_decimal_ser() {
+<a href=#3892 id=3892 data-nosnippet>3892</a>        <span class="kw">let </span>literal = Literal::decimal(<span class="number">12345</span>);
+<a href=#3893 id=3893 data-nosnippet>3893</a>        <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Decimal {
+<a href=#3894 id=3894 data-nosnippet>3894</a>            precision: <span class="number">9</span>,
+<a href=#3895 id=3895 data-nosnippet>3895</a>            scale: <span class="number">8</span>,
+<a href=#3896 id=3896 data-nosnippet>3896</a>        });
+<a href=#3897 id=3897 data-nosnippet>3897</a>        <span class="kw">let </span>expect_value = Value::Decimal(apache_avro::Decimal::from(<span class="number">12345_i128</span>.to_be_bytes()));
+<a href=#3898 id=3898 data-nosnippet>3898</a>        check_serialize_avro(literal, <span class="kw-2">&amp;</span>ty, expect_value);
+<a href=#3899 id=3899 data-nosnippet>3899</a>    }
+<a href=#3900 id=3900 data-nosnippet>3900</a>
+<a href=#3901 id=3901 data-nosnippet>3901</a>    <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#3902 id=3902 data-nosnippet>3902</a>    // rust avro can't support to convert any byte-like type to fixed in avro now.
+<a href=#3903 id=3903 data-nosnippet>3903</a>    // - uuid ser/de
+<a href=#3904 id=3904 data-nosnippet>3904</a>    // - fixed ser/de
 <a href=#3905 id=3905 data-nosnippet>3905</a>
-<a href=#3906 id=3906 data-nosnippet>3906</a>        <span class="kw">let </span><span class="kw-2">mut </span>float_sorted = float_values.clone();
-<a href=#3907 id=3907 data-nosnippet>3907</a>        float_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
-<a href=#3908 id=3908 data-nosnippet>3908</a>
-<a href=#3909 id=3909 data-nosnippet>3909</a>        <span class="kw">let </span>float_expected = <span class="macro">vec!</span>[
-<a href=#3910 id=3910 data-nosnippet>3910</a>            Datum::float(-f32::NAN),
-<a href=#3911 id=3911 data-nosnippet>3911</a>            Datum::float(-f32::INFINITY),
-<a href=#3912 id=3912 data-nosnippet>3912</a>            Datum::float(f32::MIN),
-<a href=#3913 id=3913 data-nosnippet>3913</a>            Datum::float(-<span class="number">1.0</span>),
-<a href=#3914 id=3914 data-nosnippet>3914</a>            Datum::float(-<span class="number">0.0</span>),
-<a href=#3915 id=3915 data-nosnippet>3915</a>            Datum::float(<span class="number">0.0</span>),
-<a href=#3916 id=3916 data-nosnippet>3916</a>            Datum::float(<span class="number">1.0</span>),
-<a href=#3917 id=3917 data-nosnippet>3917</a>            Datum::float(f32::MAX),
-<a href=#3918 id=3918 data-nosnippet>3918</a>            Datum::float(f32::INFINITY),
-<a href=#3919 id=3919 data-nosnippet>3919</a>            Datum::float(f32::NAN),
-<a href=#3920 id=3920 data-nosnippet>3920</a>        ];
-<a href=#3921 id=3921 data-nosnippet>3921</a>
-<a href=#3922 id=3922 data-nosnippet>3922</a>        <span class="macro">assert_eq!</span>(float_sorted, float_expected);
+<a href=#3906 id=3906 data-nosnippet>3906</a>    </span><span class="attr">#[test]
+<a href=#3907 id=3907 data-nosnippet>3907</a>    </span><span class="kw">fn </span>test_parse_timestamp() {
+<a href=#3908 id=3908 data-nosnippet>3908</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>).unwrap();
+<a href=#3909 id=3909 data-nosnippet>3909</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900"</span>);
+<a href=#3910 id=3910 data-nosnippet>3910</a>
+<a href=#3911 id=3911 data-nosnippet>3911</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2023-01-06T00:00:00"</span>).unwrap();
+<a href=#3912 id=3912 data-nosnippet>3912</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2023-01-06 00:00:00"</span>);
+<a href=#3913 id=3913 data-nosnippet>3913</a>
+<a href=#3914 id=3914 data-nosnippet>3914</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899+0800"</span>);
+<a href=#3915 id=3915 data-nosnippet>3915</a>        <span class="macro">assert!</span>(value.is_err(), <span class="string">"Parse timestamp with timezone should fail!"</span>);
+<a href=#3916 id=3916 data-nosnippet>3916</a>
+<a href=#3917 id=3917 data-nosnippet>3917</a>        <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"dfa"</span>);
+<a href=#3918 id=3918 data-nosnippet>3918</a>        <span class="macro">assert!</span>(
+<a href=#3919 id=3919 data-nosnippet>3919</a>            value.is_err(),
+<a href=#3920 id=3920 data-nosnippet>3920</a>            <span class="string">"Parse timestamp with invalid input should fail!"
+<a href=#3921 id=3921 data-nosnippet>3921</a>        </span>);
+<a href=#3922 id=3922 data-nosnippet>3922</a>    }
 <a href=#3923 id=3923 data-nosnippet>3923</a>
-<a href=#3924 id=3924 data-nosnippet>3924</a>        <span class="comment">// Test double ordering
-<a href=#3925 id=3925 data-nosnippet>3925</a>        </span><span class="kw">let </span>double_values = <span class="macro">vec!</span>[
-<a href=#3926 id=3926 data-nosnippet>3926</a>            Datum::double(f64::NAN),
-<a href=#3927 id=3927 data-nosnippet>3927</a>            Datum::double(-f64::NAN),
-<a href=#3928 id=3928 data-nosnippet>3928</a>            Datum::double(f64::INFINITY),
-<a href=#3929 id=3929 data-nosnippet>3929</a>            Datum::double(-f64::INFINITY),
-<a href=#3930 id=3930 data-nosnippet>3930</a>            Datum::double(f64::MAX),
-<a href=#3931 id=3931 data-nosnippet>3931</a>            Datum::double(f64::MIN),
-<a href=#3932 id=3932 data-nosnippet>3932</a>            Datum::double(<span class="number">1.0</span>),
-<a href=#3933 id=3933 data-nosnippet>3933</a>            Datum::double(-<span class="number">1.0</span>),
-<a href=#3934 id=3934 data-nosnippet>3934</a>            Datum::double(<span class="number">0.0</span>),
-<a href=#3935 id=3935 data-nosnippet>3935</a>            Datum::double(-<span class="number">0.0</span>),
-<a href=#3936 id=3936 data-nosnippet>3936</a>        ];
-<a href=#3937 id=3937 data-nosnippet>3937</a>
-<a href=#3938 id=3938 data-nosnippet>3938</a>        <span class="kw">let </span><span class="kw-2">mut </span>double_sorted = double_values.clone();
-<a href=#3939 id=3939 data-nosnippet>3939</a>        double_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
-<a href=#3940 id=3940 data-nosnippet>3940</a>
-<a href=#3941 id=3941 data-nosnippet>3941</a>        <span class="kw">let </span>double_expected = <span class="macro">vec!</span>[
-<a href=#3942 id=3942 data-nosnippet>3942</a>            Datum::double(-f64::NAN),
-<a href=#3943 id=3943 data-nosnippet>3943</a>            Datum::double(-f64::INFINITY),
-<a href=#3944 id=3944 data-nosnippet>3944</a>            Datum::double(f64::MIN),
-<a href=#3945 id=3945 data-nosnippet>3945</a>            Datum::double(-<span class="number">1.0</span>),
-<a href=#3946 id=3946 data-nosnippet>3946</a>            Datum::double(-<span class="number">0.0</span>),
-<a href=#3947 id=3947 data-nosnippet>3947</a>            Datum::double(<span class="number">0.0</span>),
-<a href=#3948 id=3948 data-nosnippet>3948</a>            Datum::double(<span class="number">1.0</span>),
-<a href=#3949 id=3949 data-nosnippet>3949</a>            Datum::double(f64::MAX),
-<a href=#3950 id=3950 data-nosnippet>3950</a>            Datum::double(f64::INFINITY),
-<a href=#3951 id=3951 data-nosnippet>3951</a>            Datum::double(f64::NAN),
-<a href=#3952 id=3952 data-nosnippet>3952</a>        ];
+<a href=#3924 id=3924 data-nosnippet>3924</a>    <span class="attr">#[test]
+<a href=#3925 id=3925 data-nosnippet>3925</a>    </span><span class="kw">fn </span>test_parse_timestamptz() {
+<a href=#3926 id=3926 data-nosnippet>3926</a>        <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T09:09:00.0899+0800"</span>).unwrap();
+<a href=#3927 id=3927 data-nosnippet>3927</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900 UTC"</span>);
+<a href=#3928 id=3928 data-nosnippet>3928</a>
+<a href=#3929 id=3929 data-nosnippet>3929</a>        <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>);
+<a href=#3930 id=3930 data-nosnippet>3930</a>        <span class="macro">assert!</span>(
+<a href=#3931 id=3931 data-nosnippet>3931</a>            value.is_err(),
+<a href=#3932 id=3932 data-nosnippet>3932</a>            <span class="string">"Parse timestamptz without timezone should fail!"
+<a href=#3933 id=3933 data-nosnippet>3933</a>        </span>);
+<a href=#3934 id=3934 data-nosnippet>3934</a>
+<a href=#3935 id=3935 data-nosnippet>3935</a>        <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"dfa"</span>);
+<a href=#3936 id=3936 data-nosnippet>3936</a>        <span class="macro">assert!</span>(
+<a href=#3937 id=3937 data-nosnippet>3937</a>            value.is_err(),
+<a href=#3938 id=3938 data-nosnippet>3938</a>            <span class="string">"Parse timestamptz with invalid input should fail!"
+<a href=#3939 id=3939 data-nosnippet>3939</a>        </span>);
+<a href=#3940 id=3940 data-nosnippet>3940</a>    }
+<a href=#3941 id=3941 data-nosnippet>3941</a>
+<a href=#3942 id=3942 data-nosnippet>3942</a>    <span class="attr">#[test]
+<a href=#3943 id=3943 data-nosnippet>3943</a>    </span><span class="kw">fn </span>test_datum_ser_deser() {
+<a href=#3944 id=3944 data-nosnippet>3944</a>        <span class="kw">let </span>test_fn = |datum: Datum| {
+<a href=#3945 id=3945 data-nosnippet>3945</a>            <span class="kw">let </span>json = serde_json::to_value(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3946 id=3946 data-nosnippet>3946</a>            <span class="kw">let </span>desered_datum: Datum = serde_json::from_value(json).unwrap();
+<a href=#3947 id=3947 data-nosnippet>3947</a>            <span class="macro">assert_eq!</span>(datum, desered_datum);
+<a href=#3948 id=3948 data-nosnippet>3948</a>        };
+<a href=#3949 id=3949 data-nosnippet>3949</a>        <span class="kw">let </span>datum = Datum::int(<span class="number">1</span>);
+<a href=#3950 id=3950 data-nosnippet>3950</a>        test_fn(datum);
+<a href=#3951 id=3951 data-nosnippet>3951</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">1</span>);
+<a href=#3952 id=3952 data-nosnippet>3952</a>        test_fn(datum);
 <a href=#3953 id=3953 data-nosnippet>3953</a>
-<a href=#3954 id=3954 data-nosnippet>3954</a>        <span class="macro">assert_eq!</span>(double_sorted, double_expected);
-<a href=#3955 id=3955 data-nosnippet>3955</a>    }
-<a href=#3956 id=3956 data-nosnippet>3956</a>
-<a href=#3957 id=3957 data-nosnippet>3957</a>    <span class="doccomment">/// Test Date deserialization from JSON as number (days since epoch).
-<a href=#3958 id=3958 data-nosnippet>3958</a>    ///
-<a href=#3959 id=3959 data-nosnippet>3959</a>    /// This reproduces the scenario from Iceberg Java's TestAddFilesProcedure where:
-<a href=#3960 id=3960 data-nosnippet>3960</a>    /// - Date partition columns have initial_default values in manifests
-<a href=#3961 id=3961 data-nosnippet>3961</a>    /// - These values are serialized as days since epoch (e.g., 18628 for 2021-01-01)
-<a href=#3962 id=3962 data-nosnippet>3962</a>    /// - The JSON schema includes: {"type":"date","initial-default":18628}
-<a href=#3963 id=3963 data-nosnippet>3963</a>    ///
-<a href=#3964 id=3964 data-nosnippet>3964</a>    /// Prior to this fix, Date values in JSON were only parsed from String format ("2021-01-01"),
-<a href=#3965 id=3965 data-nosnippet>3965</a>    /// causing initial_default values to be lost during schema deserialization.
-<a href=#3966 id=3966 data-nosnippet>3966</a>    ///
-<a href=#3967 id=3967 data-nosnippet>3967</a>    /// This test ensures both formats are supported:
-<a href=#3968 id=3968 data-nosnippet>3968</a>    /// - String format: "2021-01-01" (used in table metadata)
-<a href=#3969 id=3969 data-nosnippet>3969</a>    /// - Number format: 18628 (used in initial-default values from add_files)
-<a href=#3970 id=3970 data-nosnippet>3970</a>    ///
-<a href=#3971 id=3971 data-nosnippet>3971</a>    /// See: Iceberg Java TestAddFilesProcedure.addDataPartitionedByDateToPartitioned()
-<a href=#3972 id=3972 data-nosnippet>3972</a>    </span><span class="attr">#[test]
-<a href=#3973 id=3973 data-nosnippet>3973</a>    </span><span class="kw">fn </span>test_date_from_json_as_number() {
-<a href=#3974 id=3974 data-nosnippet>3974</a>        <span class="kw">use </span>serde_json::json;
+<a href=#3954 id=3954 data-nosnippet>3954</a>        <span class="kw">let </span>datum = Datum::float(<span class="number">1.0</span>);
+<a href=#3955 id=3955 data-nosnippet>3955</a>        test_fn(datum);
+<a href=#3956 id=3956 data-nosnippet>3956</a>        <span class="kw">let </span>datum = Datum::float(<span class="number">0_f32</span>);
+<a href=#3957 id=3957 data-nosnippet>3957</a>        test_fn(datum);
+<a href=#3958 id=3958 data-nosnippet>3958</a>        <span class="kw">let </span>datum = Datum::float(-<span class="number">0_f32</span>);
+<a href=#3959 id=3959 data-nosnippet>3959</a>        test_fn(datum);
+<a href=#3960 id=3960 data-nosnippet>3960</a>        <span class="kw">let </span>datum = Datum::float(f32::MAX);
+<a href=#3961 id=3961 data-nosnippet>3961</a>        test_fn(datum);
+<a href=#3962 id=3962 data-nosnippet>3962</a>        <span class="kw">let </span>datum = Datum::float(f32::MIN);
+<a href=#3963 id=3963 data-nosnippet>3963</a>        test_fn(datum);
+<a href=#3964 id=3964 data-nosnippet>3964</a>
+<a href=#3965 id=3965 data-nosnippet>3965</a>        <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
+<a href=#3966 id=3966 data-nosnippet>3966</a>        </span><span class="kw">let </span>datum = Datum::float(f32::INFINITY);
+<a href=#3967 id=3967 data-nosnippet>3967</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3968 id=3968 data-nosnippet>3968</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
+<a href=#3969 id=3969 data-nosnippet>3969</a>        <span class="kw">let </span>datum = Datum::float(f32::NEG_INFINITY);
+<a href=#3970 id=3970 data-nosnippet>3970</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3971 id=3971 data-nosnippet>3971</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
+<a href=#3972 id=3972 data-nosnippet>3972</a>        <span class="kw">let </span>datum = Datum::float(f32::NAN);
+<a href=#3973 id=3973 data-nosnippet>3973</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3974 id=3974 data-nosnippet>3974</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
 <a href=#3975 id=3975 data-nosnippet>3975</a>
-<a href=#3976 id=3976 data-nosnippet>3976</a>        <span class="comment">// Test Date as number (days since epoch) - used in initial-default from add_files
-<a href=#3977 id=3977 data-nosnippet>3977</a>        </span><span class="kw">let </span>date_number = <span class="macro">json!</span>(<span class="number">18628</span>); <span class="comment">// 2021-01-01 is 18628 days since 1970-01-01
-<a href=#3978 id=3978 data-nosnippet>3978</a>        </span><span class="kw">let </span>result =
-<a href=#3979 id=3979 data-nosnippet>3979</a>            Literal::try_from_json(date_number, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3980 id=3980 data-nosnippet>3980</a>        <span class="macro">assert_eq!</span>(
-<a href=#3981 id=3981 data-nosnippet>3981</a>            result,
-<a href=#3982 id=3982 data-nosnippet>3982</a>            <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
-<a href=#3983 id=3983 data-nosnippet>3983</a>        );
-<a href=#3984 id=3984 data-nosnippet>3984</a>
-<a href=#3985 id=3985 data-nosnippet>3985</a>        <span class="comment">// Test Date as string - traditional format
-<a href=#3986 id=3986 data-nosnippet>3986</a>        </span><span class="kw">let </span>date_string = <span class="macro">json!</span>(<span class="string">"2021-01-01"</span>);
-<a href=#3987 id=3987 data-nosnippet>3987</a>        <span class="kw">let </span>result =
-<a href=#3988 id=3988 data-nosnippet>3988</a>            Literal::try_from_json(date_string, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3989 id=3989 data-nosnippet>3989</a>        <span class="macro">assert_eq!</span>(
-<a href=#3990 id=3990 data-nosnippet>3990</a>            result,
-<a href=#3991 id=3991 data-nosnippet>3991</a>            <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
-<a href=#3992 id=3992 data-nosnippet>3992</a>        );
+<a href=#3976 id=3976 data-nosnippet>3976</a>        <span class="kw">let </span>datum = Datum::double(<span class="number">1.0</span>);
+<a href=#3977 id=3977 data-nosnippet>3977</a>        test_fn(datum);
+<a href=#3978 id=3978 data-nosnippet>3978</a>        <span class="kw">let </span>datum = Datum::double(f64::MAX);
+<a href=#3979 id=3979 data-nosnippet>3979</a>        test_fn(datum);
+<a href=#3980 id=3980 data-nosnippet>3980</a>        <span class="kw">let </span>datum = Datum::double(f64::MIN);
+<a href=#3981 id=3981 data-nosnippet>3981</a>        test_fn(datum);
+<a href=#3982 id=3982 data-nosnippet>3982</a>
+<a href=#3983 id=3983 data-nosnippet>3983</a>        <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
+<a href=#3984 id=3984 data-nosnippet>3984</a>        </span><span class="kw">let </span>datum = Datum::double(f64::INFINITY);
+<a href=#3985 id=3985 data-nosnippet>3985</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3986 id=3986 data-nosnippet>3986</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
+<a href=#3987 id=3987 data-nosnippet>3987</a>        <span class="kw">let </span>datum = Datum::double(f64::NEG_INFINITY);
+<a href=#3988 id=3988 data-nosnippet>3988</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3989 id=3989 data-nosnippet>3989</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
+<a href=#3990 id=3990 data-nosnippet>3990</a>        <span class="kw">let </span>datum = Datum::double(f64::NAN);
+<a href=#3991 id=3991 data-nosnippet>3991</a>        <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&amp;</span>datum).unwrap();
+<a href=#3992 id=3992 data-nosnippet>3992</a>        <span class="macro">assert!</span>(serde_json::from_str::&lt;Datum&gt;(<span class="kw-2">&amp;</span>json).is_err());
 <a href=#3993 id=3993 data-nosnippet>3993</a>
-<a href=#3994 id=3994 data-nosnippet>3994</a>        <span class="comment">// Both formats should produce the same Literal value
-<a href=#3995 id=3995 data-nosnippet>3995</a>    </span>}
-<a href=#3996 id=3996 data-nosnippet>3996</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
+<a href=#3994 id=3994 data-nosnippet>3994</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"iceberg"</span>);
+<a href=#3995 id=3995 data-nosnippet>3995</a>        test_fn(datum);
+<a href=#3996 id=3996 data-nosnippet>3996</a>        <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
+<a href=#3997 id=3997 data-nosnippet>3997</a>        test_fn(datum);
+<a href=#3998 id=3998 data-nosnippet>3998</a>        <span class="kw">let </span>datum = Datum::date(<span class="number">17486</span>);
+<a href=#3999 id=3999 data-nosnippet>3999</a>        test_fn(datum);
+<a href=#4000 id=4000 data-nosnippet>4000</a>        <span class="kw">let </span>datum = Datum::time_from_hms_micro(<span class="number">22</span>, <span class="number">15</span>, <span class="number">33</span>, <span class="number">111</span>).unwrap();
+<a href=#4001 id=4001 data-nosnippet>4001</a>        test_fn(datum);
+<a href=#4002 id=4002 data-nosnippet>4002</a>        <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">1510871468123456</span>);
+<a href=#4003 id=4003 data-nosnippet>4003</a>        test_fn(datum);
+<a href=#4004 id=4004 data-nosnippet>4004</a>        <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">1510871468123456</span>);
+<a href=#4005 id=4005 data-nosnippet>4005</a>        test_fn(datum);
+<a href=#4006 id=4006 data-nosnippet>4006</a>        <span class="kw">let </span>datum = Datum::uuid(Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>).unwrap());
+<a href=#4007 id=4007 data-nosnippet>4007</a>        test_fn(datum);
+<a href=#4008 id=4008 data-nosnippet>4008</a>        <span class="kw">let </span>datum = Datum::decimal(<span class="number">1420</span>).unwrap();
+<a href=#4009 id=4009 data-nosnippet>4009</a>        test_fn(datum);
+<a href=#4010 id=4010 data-nosnippet>4010</a>        <span class="kw">let </span>datum = Datum::binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
+<a href=#4011 id=4011 data-nosnippet>4011</a>        test_fn(datum);
+<a href=#4012 id=4012 data-nosnippet>4012</a>        <span class="kw">let </span>datum = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
+<a href=#4013 id=4013 data-nosnippet>4013</a>        test_fn(datum);
+<a href=#4014 id=4014 data-nosnippet>4014</a>    }
+<a href=#4015 id=4015 data-nosnippet>4015</a>
+<a href=#4016 id=4016 data-nosnippet>4016</a>    <span class="attr">#[test]
+<a href=#4017 id=4017 data-nosnippet>4017</a>    </span><span class="kw">fn </span>test_datum_date_convert_to_int() {
+<a href=#4018 id=4018 data-nosnippet>4018</a>        <span class="kw">let </span>datum_date = Datum::date(<span class="number">12345</span>);
+<a href=#4019 id=4019 data-nosnippet>4019</a>
+<a href=#4020 id=4020 data-nosnippet>4020</a>        <span class="kw">let </span>result = datum_date.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4021 id=4021 data-nosnippet>4021</a>
+<a href=#4022 id=4022 data-nosnippet>4022</a>        <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
+<a href=#4023 id=4023 data-nosnippet>4023</a>
+<a href=#4024 id=4024 data-nosnippet>4024</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4025 id=4025 data-nosnippet>4025</a>    }
+<a href=#4026 id=4026 data-nosnippet>4026</a>
+<a href=#4027 id=4027 data-nosnippet>4027</a>    <span class="attr">#[test]
+<a href=#4028 id=4028 data-nosnippet>4028</a>    </span><span class="kw">fn </span>test_datum_int_convert_to_date() {
+<a href=#4029 id=4029 data-nosnippet>4029</a>        <span class="kw">let </span>datum_int = Datum::int(<span class="number">12345</span>);
+<a href=#4030 id=4030 data-nosnippet>4030</a>
+<a href=#4031 id=4031 data-nosnippet>4031</a>        <span class="kw">let </span>result = datum_int.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Date)).unwrap();
+<a href=#4032 id=4032 data-nosnippet>4032</a>
+<a href=#4033 id=4033 data-nosnippet>4033</a>        <span class="kw">let </span>expected = Datum::date(<span class="number">12345</span>);
+<a href=#4034 id=4034 data-nosnippet>4034</a>
+<a href=#4035 id=4035 data-nosnippet>4035</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4036 id=4036 data-nosnippet>4036</a>    }
+<a href=#4037 id=4037 data-nosnippet>4037</a>
+<a href=#4038 id=4038 data-nosnippet>4038</a>    <span class="attr">#[test]
+<a href=#4039 id=4039 data-nosnippet>4039</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_int() {
+<a href=#4040 id=4040 data-nosnippet>4040</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#4041 id=4041 data-nosnippet>4041</a>
+<a href=#4042 id=4042 data-nosnippet>4042</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4043 id=4043 data-nosnippet>4043</a>
+<a href=#4044 id=4044 data-nosnippet>4044</a>        <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
+<a href=#4045 id=4045 data-nosnippet>4045</a>
+<a href=#4046 id=4046 data-nosnippet>4046</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4047 id=4047 data-nosnippet>4047</a>    }
+<a href=#4048 id=4048 data-nosnippet>4048</a>
+<a href=#4049 id=4049 data-nosnippet>4049</a>    <span class="attr">#[test]
+<a href=#4050 id=4050 data-nosnippet>4050</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_int_above_max() {
+<a href=#4051 id=4051 data-nosnippet>4051</a>        <span class="kw">let </span>datum = Datum::long(INT_MAX <span class="kw">as </span>i64 + <span class="number">1</span>);
+<a href=#4052 id=4052 data-nosnippet>4052</a>
+<a href=#4053 id=4053 data-nosnippet>4053</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4054 id=4054 data-nosnippet>4054</a>
+<a href=#4055 id=4055 data-nosnippet>4055</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax);
+<a href=#4056 id=4056 data-nosnippet>4056</a>
+<a href=#4057 id=4057 data-nosnippet>4057</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4058 id=4058 data-nosnippet>4058</a>    }
+<a href=#4059 id=4059 data-nosnippet>4059</a>
+<a href=#4060 id=4060 data-nosnippet>4060</a>    <span class="attr">#[test]
+<a href=#4061 id=4061 data-nosnippet>4061</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_int_below_min() {
+<a href=#4062 id=4062 data-nosnippet>4062</a>        <span class="kw">let </span>datum = Datum::long(INT_MIN <span class="kw">as </span>i64 - <span class="number">1</span>);
+<a href=#4063 id=4063 data-nosnippet>4063</a>
+<a href=#4064 id=4064 data-nosnippet>4064</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4065 id=4065 data-nosnippet>4065</a>
+<a href=#4066 id=4066 data-nosnippet>4066</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin);
+<a href=#4067 id=4067 data-nosnippet>4067</a>
+<a href=#4068 id=4068 data-nosnippet>4068</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4069 id=4069 data-nosnippet>4069</a>    }
+<a href=#4070 id=4070 data-nosnippet>4070</a>
+<a href=#4071 id=4071 data-nosnippet>4071</a>    <span class="attr">#[test]
+<a href=#4072 id=4072 data-nosnippet>4072</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_timestamp() {
+<a href=#4073 id=4073 data-nosnippet>4073</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#4074 id=4074 data-nosnippet>4074</a>
+<a href=#4075 id=4075 data-nosnippet>4075</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#4076 id=4076 data-nosnippet>4076</a>
+<a href=#4077 id=4077 data-nosnippet>4077</a>        <span class="kw">let </span>expected = Datum::timestamp_micros(<span class="number">12345</span>);
+<a href=#4078 id=4078 data-nosnippet>4078</a>
+<a href=#4079 id=4079 data-nosnippet>4079</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4080 id=4080 data-nosnippet>4080</a>    }
+<a href=#4081 id=4081 data-nosnippet>4081</a>
+<a href=#4082 id=4082 data-nosnippet>4082</a>    <span class="attr">#[test]
+<a href=#4083 id=4083 data-nosnippet>4083</a>    </span><span class="kw">fn </span>test_datum_long_convert_to_timestamptz() {
+<a href=#4084 id=4084 data-nosnippet>4084</a>        <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#4085 id=4085 data-nosnippet>4085</a>
+<a href=#4086 id=4086 data-nosnippet>4086</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#4087 id=4087 data-nosnippet>4087</a>
+<a href=#4088 id=4088 data-nosnippet>4088</a>        <span class="kw">let </span>expected = Datum::timestamptz_micros(<span class="number">12345</span>);
+<a href=#4089 id=4089 data-nosnippet>4089</a>
+<a href=#4090 id=4090 data-nosnippet>4090</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4091 id=4091 data-nosnippet>4091</a>    }
+<a href=#4092 id=4092 data-nosnippet>4092</a>
+<a href=#4093 id=4093 data-nosnippet>4093</a>    <span class="attr">#[test]
+<a href=#4094 id=4094 data-nosnippet>4094</a>    </span><span class="kw">fn </span>test_datum_decimal_convert_to_long() {
+<a href=#4095 id=4095 data-nosnippet>4095</a>        <span class="kw">let </span>datum = Datum::decimal(<span class="number">12345</span>).unwrap();
+<a href=#4096 id=4096 data-nosnippet>4096</a>
+<a href=#4097 id=4097 data-nosnippet>4097</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4098 id=4098 data-nosnippet>4098</a>
+<a href=#4099 id=4099 data-nosnippet>4099</a>        <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
+<a href=#4100 id=4100 data-nosnippet>4100</a>
+<a href=#4101 id=4101 data-nosnippet>4101</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4102 id=4102 data-nosnippet>4102</a>    }
+<a href=#4103 id=4103 data-nosnippet>4103</a>
+<a href=#4104 id=4104 data-nosnippet>4104</a>    <span class="attr">#[test]
+<a href=#4105 id=4105 data-nosnippet>4105</a>    </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_above_max() {
+<a href=#4106 id=4106 data-nosnippet>4106</a>        <span class="kw">let </span>datum = Datum::decimal(LONG_MAX <span class="kw">as </span>i128 + <span class="number">1</span>).unwrap();
+<a href=#4107 id=4107 data-nosnippet>4107</a>
+<a href=#4108 id=4108 data-nosnippet>4108</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4109 id=4109 data-nosnippet>4109</a>
+<a href=#4110 id=4110 data-nosnippet>4110</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax);
+<a href=#4111 id=4111 data-nosnippet>4111</a>
+<a href=#4112 id=4112 data-nosnippet>4112</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4113 id=4113 data-nosnippet>4113</a>    }
+<a href=#4114 id=4114 data-nosnippet>4114</a>
+<a href=#4115 id=4115 data-nosnippet>4115</a>    <span class="attr">#[test]
+<a href=#4116 id=4116 data-nosnippet>4116</a>    </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_below_min() {
+<a href=#4117 id=4117 data-nosnippet>4117</a>        <span class="kw">let </span>datum = Datum::decimal(LONG_MIN <span class="kw">as </span>i128 - <span class="number">1</span>).unwrap();
+<a href=#4118 id=4118 data-nosnippet>4118</a>
+<a href=#4119 id=4119 data-nosnippet>4119</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4120 id=4120 data-nosnippet>4120</a>
+<a href=#4121 id=4121 data-nosnippet>4121</a>        <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin);
+<a href=#4122 id=4122 data-nosnippet>4122</a>
+<a href=#4123 id=4123 data-nosnippet>4123</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4124 id=4124 data-nosnippet>4124</a>    }
+<a href=#4125 id=4125 data-nosnippet>4125</a>
+<a href=#4126 id=4126 data-nosnippet>4126</a>    <span class="attr">#[test]
+<a href=#4127 id=4127 data-nosnippet>4127</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_boolean() {
+<a href=#4128 id=4128 data-nosnippet>4128</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"true"</span>);
+<a href=#4129 id=4129 data-nosnippet>4129</a>
+<a href=#4130 id=4130 data-nosnippet>4130</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Boolean)).unwrap();
+<a href=#4131 id=4131 data-nosnippet>4131</a>
+<a href=#4132 id=4132 data-nosnippet>4132</a>        <span class="kw">let </span>expected = Datum::bool(<span class="bool-val">true</span>);
+<a href=#4133 id=4133 data-nosnippet>4133</a>
+<a href=#4134 id=4134 data-nosnippet>4134</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4135 id=4135 data-nosnippet>4135</a>    }
+<a href=#4136 id=4136 data-nosnippet>4136</a>
+<a href=#4137 id=4137 data-nosnippet>4137</a>    <span class="attr">#[test]
+<a href=#4138 id=4138 data-nosnippet>4138</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_int() {
+<a href=#4139 id=4139 data-nosnippet>4139</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#4140 id=4140 data-nosnippet>4140</a>
+<a href=#4141 id=4141 data-nosnippet>4141</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4142 id=4142 data-nosnippet>4142</a>
+<a href=#4143 id=4143 data-nosnippet>4143</a>        <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
+<a href=#4144 id=4144 data-nosnippet>4144</a>
+<a href=#4145 id=4145 data-nosnippet>4145</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4146 id=4146 data-nosnippet>4146</a>    }
+<a href=#4147 id=4147 data-nosnippet>4147</a>
+<a href=#4148 id=4148 data-nosnippet>4148</a>    <span class="attr">#[test]
+<a href=#4149 id=4149 data-nosnippet>4149</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_long() {
+<a href=#4150 id=4150 data-nosnippet>4150</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#4151 id=4151 data-nosnippet>4151</a>
+<a href=#4152 id=4152 data-nosnippet>4152</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4153 id=4153 data-nosnippet>4153</a>
+<a href=#4154 id=4154 data-nosnippet>4154</a>        <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
+<a href=#4155 id=4155 data-nosnippet>4155</a>
+<a href=#4156 id=4156 data-nosnippet>4156</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4157 id=4157 data-nosnippet>4157</a>    }
+<a href=#4158 id=4158 data-nosnippet>4158</a>
+<a href=#4159 id=4159 data-nosnippet>4159</a>    <span class="attr">#[test]
+<a href=#4160 id=4160 data-nosnippet>4160</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_timestamp() {
+<a href=#4161 id=4161 data-nosnippet>4161</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000"</span>);
+<a href=#4162 id=4162 data-nosnippet>4162</a>
+<a href=#4163 id=4163 data-nosnippet>4163</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#4164 id=4164 data-nosnippet>4164</a>
+<a href=#4165 id=4165 data-nosnippet>4165</a>        <span class="kw">let </span>expected = Datum::timestamp_micros(-<span class="number">1407990900000000</span>);
+<a href=#4166 id=4166 data-nosnippet>4166</a>
+<a href=#4167 id=4167 data-nosnippet>4167</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4168 id=4168 data-nosnippet>4168</a>    }
+<a href=#4169 id=4169 data-nosnippet>4169</a>
+<a href=#4170 id=4170 data-nosnippet>4170</a>    <span class="attr">#[test]
+<a href=#4171 id=4171 data-nosnippet>4171</a>    </span><span class="kw">fn </span>test_datum_string_convert_to_timestamptz() {
+<a href=#4172 id=4172 data-nosnippet>4172</a>        <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000 UTC"</span>);
+<a href=#4173 id=4173 data-nosnippet>4173</a>
+<a href=#4174 id=4174 data-nosnippet>4174</a>        <span class="kw">let </span>result = datum.to(<span class="kw-2">&amp;</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#4175 id=4175 data-nosnippet>4175</a>
+<a href=#4176 id=4176 data-nosnippet>4176</a>        <span class="kw">let </span>expected = Datum::timestamptz_micros(-<span class="number">1407990900000000</span>);
+<a href=#4177 id=4177 data-nosnippet>4177</a>
+<a href=#4178 id=4178 data-nosnippet>4178</a>        <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4179 id=4179 data-nosnippet>4179</a>    }
+<a href=#4180 id=4180 data-nosnippet>4180</a>
+<a href=#4181 id=4181 data-nosnippet>4181</a>    <span class="attr">#[test]
+<a href=#4182 id=4182 data-nosnippet>4182</a>    </span><span class="kw">fn </span>test_iceberg_float_order() {
+<a href=#4183 id=4183 data-nosnippet>4183</a>        <span class="comment">// Test float ordering
+<a href=#4184 id=4184 data-nosnippet>4184</a>        </span><span class="kw">let </span>float_values = <span class="macro">vec!</span>[
+<a href=#4185 id=4185 data-nosnippet>4185</a>            Datum::float(f32::NAN),
+<a href=#4186 id=4186 data-nosnippet>4186</a>            Datum::float(-f32::NAN),
+<a href=#4187 id=4187 data-nosnippet>4187</a>            Datum::float(f32::MAX),
+<a href=#4188 id=4188 data-nosnippet>4188</a>            Datum::float(f32::MIN),
+<a href=#4189 id=4189 data-nosnippet>4189</a>            Datum::float(f32::INFINITY),
+<a href=#4190 id=4190 data-nosnippet>4190</a>            Datum::float(-f32::INFINITY),
+<a href=#4191 id=4191 data-nosnippet>4191</a>            Datum::float(<span class="number">1.0</span>),
+<a href=#4192 id=4192 data-nosnippet>4192</a>            Datum::float(-<span class="number">1.0</span>),
+<a href=#4193 id=4193 data-nosnippet>4193</a>            Datum::float(<span class="number">0.0</span>),
+<a href=#4194 id=4194 data-nosnippet>4194</a>            Datum::float(-<span class="number">0.0</span>),
+<a href=#4195 id=4195 data-nosnippet>4195</a>        ];
+<a href=#4196 id=4196 data-nosnippet>4196</a>
+<a href=#4197 id=4197 data-nosnippet>4197</a>        <span class="kw">let </span><span class="kw-2">mut </span>float_sorted = float_values.clone();
+<a href=#4198 id=4198 data-nosnippet>4198</a>        float_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
+<a href=#4199 id=4199 data-nosnippet>4199</a>
+<a href=#4200 id=4200 data-nosnippet>4200</a>        <span class="kw">let </span>float_expected = <span class="macro">vec!</span>[
+<a href=#4201 id=4201 data-nosnippet>4201</a>            Datum::float(-f32::NAN),
+<a href=#4202 id=4202 data-nosnippet>4202</a>            Datum::float(-f32::INFINITY),
+<a href=#4203 id=4203 data-nosnippet>4203</a>            Datum::float(f32::MIN),
+<a href=#4204 id=4204 data-nosnippet>4204</a>            Datum::float(-<span class="number">1.0</span>),
+<a href=#4205 id=4205 data-nosnippet>4205</a>            Datum::float(-<span class="number">0.0</span>),
+<a href=#4206 id=4206 data-nosnippet>4206</a>            Datum::float(<span class="number">0.0</span>),
+<a href=#4207 id=4207 data-nosnippet>4207</a>            Datum::float(<span class="number">1.0</span>),
+<a href=#4208 id=4208 data-nosnippet>4208</a>            Datum::float(f32::MAX),
+<a href=#4209 id=4209 data-nosnippet>4209</a>            Datum::float(f32::INFINITY),
+<a href=#4210 id=4210 data-nosnippet>4210</a>            Datum::float(f32::NAN),
+<a href=#4211 id=4211 data-nosnippet>4211</a>        ];
+<a href=#4212 id=4212 data-nosnippet>4212</a>
+<a href=#4213 id=4213 data-nosnippet>4213</a>        <span class="macro">assert_eq!</span>(float_sorted, float_expected);
+<a href=#4214 id=4214 data-nosnippet>4214</a>
+<a href=#4215 id=4215 data-nosnippet>4215</a>        <span class="comment">// Test double ordering
+<a href=#4216 id=4216 data-nosnippet>4216</a>        </span><span class="kw">let </span>double_values = <span class="macro">vec!</span>[
+<a href=#4217 id=4217 data-nosnippet>4217</a>            Datum::double(f64::NAN),
+<a href=#4218 id=4218 data-nosnippet>4218</a>            Datum::double(-f64::NAN),
+<a href=#4219 id=4219 data-nosnippet>4219</a>            Datum::double(f64::INFINITY),
+<a href=#4220 id=4220 data-nosnippet>4220</a>            Datum::double(-f64::INFINITY),
+<a href=#4221 id=4221 data-nosnippet>4221</a>            Datum::double(f64::MAX),
+<a href=#4222 id=4222 data-nosnippet>4222</a>            Datum::double(f64::MIN),
+<a href=#4223 id=4223 data-nosnippet>4223</a>            Datum::double(<span class="number">1.0</span>),
+<a href=#4224 id=4224 data-nosnippet>4224</a>            Datum::double(-<span class="number">1.0</span>),
+<a href=#4225 id=4225 data-nosnippet>4225</a>            Datum::double(<span class="number">0.0</span>),
+<a href=#4226 id=4226 data-nosnippet>4226</a>            Datum::double(-<span class="number">0.0</span>),
+<a href=#4227 id=4227 data-nosnippet>4227</a>        ];
+<a href=#4228 id=4228 data-nosnippet>4228</a>
+<a href=#4229 id=4229 data-nosnippet>4229</a>        <span class="kw">let </span><span class="kw-2">mut </span>double_sorted = double_values.clone();
+<a href=#4230 id=4230 data-nosnippet>4230</a>        double_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
+<a href=#4231 id=4231 data-nosnippet>4231</a>
+<a href=#4232 id=4232 data-nosnippet>4232</a>        <span class="kw">let </span>double_expected = <span class="macro">vec!</span>[
+<a href=#4233 id=4233 data-nosnippet>4233</a>            Datum::double(-f64::NAN),
+<a href=#4234 id=4234 data-nosnippet>4234</a>            Datum::double(-f64::INFINITY),
+<a href=#4235 id=4235 data-nosnippet>4235</a>            Datum::double(f64::MIN),
+<a href=#4236 id=4236 data-nosnippet>4236</a>            Datum::double(-<span class="number">1.0</span>),
+<a href=#4237 id=4237 data-nosnippet>4237</a>            Datum::double(-<span class="number">0.0</span>),
+<a href=#4238 id=4238 data-nosnippet>4238</a>            Datum::double(<span class="number">0.0</span>),
+<a href=#4239 id=4239 data-nosnippet>4239</a>            Datum::double(<span class="number">1.0</span>),
+<a href=#4240 id=4240 data-nosnippet>4240</a>            Datum::double(f64::MAX),
+<a href=#4241 id=4241 data-nosnippet>4241</a>            Datum::double(f64::INFINITY),
+<a href=#4242 id=4242 data-nosnippet>4242</a>            Datum::double(f64::NAN),
+<a href=#4243 id=4243 data-nosnippet>4243</a>        ];
+<a href=#4244 id=4244 data-nosnippet>4244</a>
+<a href=#4245 id=4245 data-nosnippet>4245</a>        <span class="macro">assert_eq!</span>(double_sorted, double_expected);
+<a href=#4246 id=4246 data-nosnippet>4246</a>    }
+<a href=#4247 id=4247 data-nosnippet>4247</a>
+<a href=#4248 id=4248 data-nosnippet>4248</a>    <span class="doccomment">/// Test Date deserialization from JSON as number (days since epoch).
+<a href=#4249 id=4249 data-nosnippet>4249</a>    ///
+<a href=#4250 id=4250 data-nosnippet>4250</a>    /// This reproduces the scenario from Iceberg Java's TestAddFilesProcedure where:
+<a href=#4251 id=4251 data-nosnippet>4251</a>    /// - Date partition columns have initial_default values in manifests
+<a href=#4252 id=4252 data-nosnippet>4252</a>    /// - These values are serialized as days since epoch (e.g., 18628 for 2021-01-01)
+<a href=#4253 id=4253 data-nosnippet>4253</a>    /// - The JSON schema includes: {"type":"date","initial-default":18628}
+<a href=#4254 id=4254 data-nosnippet>4254</a>    ///
+<a href=#4255 id=4255 data-nosnippet>4255</a>    /// Prior to this fix, Date values in JSON were only parsed from String format ("2021-01-01"),
+<a href=#4256 id=4256 data-nosnippet>4256</a>    /// causing initial_default values to be lost during schema deserialization.
+<a href=#4257 id=4257 data-nosnippet>4257</a>    ///
+<a href=#4258 id=4258 data-nosnippet>4258</a>    /// This test ensures both formats are supported:
+<a href=#4259 id=4259 data-nosnippet>4259</a>    /// - String format: "2021-01-01" (used in table metadata)
+<a href=#4260 id=4260 data-nosnippet>4260</a>    /// - Number format: 18628 (used in initial-default values from add_files)
+<a href=#4261 id=4261 data-nosnippet>4261</a>    ///
+<a href=#4262 id=4262 data-nosnippet>4262</a>    /// See: Iceberg Java TestAddFilesProcedure.addDataPartitionedByDateToPartitioned()
+<a href=#4263 id=4263 data-nosnippet>4263</a>    </span><span class="attr">#[test]
+<a href=#4264 id=4264 data-nosnippet>4264</a>    </span><span class="kw">fn </span>test_date_from_json_as_number() {
+<a href=#4265 id=4265 data-nosnippet>4265</a>        <span class="kw">use </span>serde_json::json;
+<a href=#4266 id=4266 data-nosnippet>4266</a>
+<a href=#4267 id=4267 data-nosnippet>4267</a>        <span class="comment">// Test Date as number (days since epoch) - used in initial-default from add_files
+<a href=#4268 id=4268 data-nosnippet>4268</a>        </span><span class="kw">let </span>date_number = <span class="macro">json!</span>(<span class="number">18628</span>); <span class="comment">// 2021-01-01 is 18628 days since 1970-01-01
+<a href=#4269 id=4269 data-nosnippet>4269</a>        </span><span class="kw">let </span>result =
+<a href=#4270 id=4270 data-nosnippet>4270</a>            Literal::try_from_json(date_number, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date)).unwrap();
+<a href=#4271 id=4271 data-nosnippet>4271</a>        <span class="macro">assert_eq!</span>(
+<a href=#4272 id=4272 data-nosnippet>4272</a>            result,
+<a href=#4273 id=4273 data-nosnippet>4273</a>            <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
+<a href=#4274 id=4274 data-nosnippet>4274</a>        );
+<a href=#4275 id=4275 data-nosnippet>4275</a>
+<a href=#4276 id=4276 data-nosnippet>4276</a>        <span class="comment">// Test Date as string - traditional format
+<a href=#4277 id=4277 data-nosnippet>4277</a>        </span><span class="kw">let </span>date_string = <span class="macro">json!</span>(<span class="string">"2021-01-01"</span>);
+<a href=#4278 id=4278 data-nosnippet>4278</a>        <span class="kw">let </span>result =
+<a href=#4279 id=4279 data-nosnippet>4279</a>            Literal::try_from_json(date_string, <span class="kw-2">&amp;</span>Type::Primitive(PrimitiveType::Date)).unwrap();
+<a href=#4280 id=4280 data-nosnippet>4280</a>        <span class="macro">assert_eq!</span>(
+<a href=#4281 id=4281 data-nosnippet>4281</a>            result,
+<a href=#4282 id=4282 data-nosnippet>4282</a>            <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
+<a href=#4283 id=4283 data-nosnippet>4283</a>        );
+<a href=#4284 id=4284 data-nosnippet>4284</a>
+<a href=#4285 id=4285 data-nosnippet>4285</a>        <span class="comment">// Both formats should produce the same Literal value
+<a href=#4286 id=4286 data-nosnippet>4286</a>    </span>}
+<a href=#4287 id=4287 data-nosnippet>4287</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file