Skip to content

Commit 50b55e3

Browse files
authored
Add Ion Scan (#544)
1 parent b970752 commit 50b55e3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+897
-469
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ opt-level = 3
3939
[profile.release.build-override]
4040
opt-level = 3
4141

42+
[profile.dev.package]
43+
insta.opt-level = 3
44+
similar.opt-level = 3
45+
4246
[profile.bench]
4347
debug = true
4448
lto = true

extension/partiql-extension-ion-functions/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,15 @@ itertools = "0.13"
3131
unicase = "2.7"
3232
rust_decimal = { version = "1.36.0", default-features = false, features = ["std"] }
3333
ion-rs_old = { version = "0.18", package = "ion-rs" }
34-
ion-rs = { version = "1.0.0-rc.10", features = ["experimental"] }
34+
ion-rs = { version = "1.0.0-rc.11", features = ["experimental"] }
3535
time = { version = "0.3", features = ["macros"] }
3636
once_cell = "1"
3737
regex = "1.10"
3838
thiserror = "1.0"
3939
delegate = "0.13"
4040
zstd = "0.13"
4141
flate2 = "1.0"
42+
insta = "1"
4243

4344
[dev-dependencies]
4445
partiql-parser = { path = "../../partiql-parser", version = "0.11.*" }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{data: 1}
2+
{data: "foo"}
3+
{data: ["a", 1, null]}
4+
{data: {a: 1, b: {{}}, }}
5+
{data: (sym::var 1 2 3)}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{data: 1}
2+
{data: "foo"}
3+
{data: ["a", 1, null]}
4+
{data: {a: 1, b: {{}}, }}
5+
{data: (sym::var 1 2 3} // **NOTE** the unclosed SExp; should cause a parse error
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
1
2+
"foo"
3+
["a", 1, null]
4+
{a: 1, b: {{}}, }
5+
(sym::var 1 2 3)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use flate2::read::GzDecoder;
2+
use std::io::{BufReader, Read, Seek, SeekFrom};
3+
use zstd::Decoder;
4+
5+
pub(crate) enum BufferType<'a, I: 'a + Read + 'static> {
6+
Gzip(BufReader<GzDecoder<I>>),
7+
Zstd(BufReader<Decoder<'a, BufReader<I>>>),
8+
Unknown(BufReader<I>),
9+
}
10+
11+
pub(crate) fn infer_buffer_type<'a, I: 'a + Read + Seek + 'static>(
12+
mut reader: I,
13+
) -> BufferType<'a, I> {
14+
let mut header: [u8; 4] = [0; 4];
15+
reader.read_exact(&mut header).expect("file header");
16+
reader.seek(SeekFrom::Start(0)).expect("file seek");
17+
18+
if header.starts_with(&[0x1f, 0x8b]) {
19+
// Cf. https://datatracker.ietf.org/doc/html/rfc1952#page-6 section 2.3.1
20+
BufferType::Gzip(BufReader::new(flate2::read::GzDecoder::new(reader)))
21+
} else if header.starts_with(&[0x28, 0xB5, 0x2F, 0xFD]) {
22+
// Cf. https://datatracker.ietf.org/doc/rfc8478/ section 3.1.1
23+
BufferType::Zstd(BufReader::new(
24+
zstd::Decoder::new(reader).expect("zstd reader creation"),
25+
))
26+
} else {
27+
BufferType::Unknown(BufReader::new(reader))
28+
}
29+
}

0 commit comments

Comments
 (0)