Skip to content

Commit 443e158

Browse files
committed
support geometry type for create table
1 parent 8b56ed3 commit 443e158

File tree

23 files changed

+620
-67
lines changed

23 files changed

+620
-67
lines changed

Cargo.lock

+80-23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/setup/dev_setup.sh

+58
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,62 @@ function install_mysql_client {
327327
esac
328328
}
329329

330+
function install_sqlite3 {
331+
PACKAGE_MANAGER=$1
332+
333+
echo "==> installing sqlite3..."
334+
335+
case "$PACKAGE_MANAGER" in
336+
apt-get)
337+
install_pkg libsqlite3-dev "$PACKAGE_MANAGER"
338+
;;
339+
pacman)
340+
install_pkg sqlite "$PACKAGE_MANAGER"
341+
;;
342+
apk)
343+
install_pkg sqlite-dev "$PACKAGE_MANAGER"
344+
;;
345+
yum | dnf)
346+
install_pkg sqlite-devel "$PACKAGE_MANAGER"
347+
;;
348+
brew)
349+
install_pkg sqlite "$PACKAGE_MANAGER"
350+
;;
351+
*)
352+
echo "Unable to install sqlite3 with package manager: $PACKAGE_MANAGER"
353+
exit 1
354+
;;
355+
esac
356+
}
357+
358+
function install_libtiff {
359+
PACKAGE_MANAGER=$1
360+
361+
echo "==> installing libtiff..."
362+
363+
case "$PACKAGE_MANAGER" in
364+
apt-get)
365+
install_pkg libtiff-dev "$PACKAGE_MANAGER"
366+
;;
367+
pacman)
368+
install_pkg libtiff "$PACKAGE_MANAGER"
369+
;;
370+
apk)
371+
install_pkg tiff-dev "$PACKAGE_MANAGER"
372+
;;
373+
yum | dnf)
374+
install_pkg libtiff-devel "$PACKAGE_MANAGER"
375+
;;
376+
brew)
377+
install_pkg libtiff "$PACKAGE_MANAGER"
378+
;;
379+
*)
380+
echo "Unable to install libtiff with package manager: $PACKAGE_MANAGER"
381+
exit 1
382+
;;
383+
esac
384+
}
385+
330386
function install_rustup {
331387
RUST_TOOLCHAIN=$1
332388

@@ -556,6 +612,8 @@ if [[ "$INSTALL_BUILD_TOOLS" == "true" ]]; then
556612
install_pkg llvm "$PACKAGE_MANAGER"
557613
install_ziglang "$PACKAGE_MANAGER"
558614
install_python3 "$PACKAGE_MANAGER"
615+
install_sqlite3 "$PACKAGE_MANAGER"
616+
install_libtiff "$PACKAGE_MANAGER"
559617

560618
# Any call to cargo will make rustup install the correct toolchain
561619
cargo version

src/common/io/src/geometry.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,25 @@ use geozero::CoordDimensions;
1919
use geozero::ToWkb;
2020
use wkt::TryFromWkt;
2121

22-
pub fn parse_to_ewkb(buf: &[u8]) -> Result<Vec<u8>> {
22+
pub fn parse_to_ewkb(buf: &[u8], srid: Option<i32>) -> Result<Vec<u8>> {
2323
let wkt = std::str::from_utf8(buf).map_err(|e| ErrorCode::GeometryError(e.to_string()))?;
24-
let mut srid: Option<i32> = None;
2524
let input_wkt = wkt.trim().to_ascii_uppercase();
2625

2726
let parts: Vec<&str> = input_wkt.split(';').collect();
2827

29-
if input_wkt.starts_with("SRID=") && parts.len() == 2 {
30-
srid = Some(parts[0].replace("SRID=", "").parse()?);
31-
}
28+
let parsed_srid: Option<i32> = srid.or_else(|| {
29+
if input_wkt.starts_with("SRID=") && parts.len() == 2 {
30+
parts[0].replace("SRID=", "").parse().ok()
31+
} else {
32+
None
33+
}
34+
});
3235

3336
let geo_part = if parts.len() == 2 { parts[1] } else { parts[0] };
3437

3538
let geom: Geometry<f64> = Geometry::try_from_wkt_str(geo_part)
3639
.map_err(|e| ErrorCode::GeometryError(e.to_string()))?;
3740

38-
geom.to_ewkb(CoordDimensions::xy(), srid)
41+
geom.to_ewkb(CoordDimensions::xy(), parsed_srid)
3942
.map_err(ErrorCode::from)
4043
}

src/query/ast/src/ast/expr.rs

+4
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ pub enum TypeName {
322322
fields_type: Vec<TypeName>,
323323
},
324324
Variant,
325+
Geometry,
325326
Nullable(Box<TypeName>),
326327
NotNull(Box<TypeName>),
327328
}
@@ -899,6 +900,9 @@ impl Display for TypeName {
899900
TypeName::Variant => {
900901
write!(f, "VARIANT")?;
901902
}
903+
TypeName::Geometry => {
904+
write!(f, "GEOMETRY")?;
905+
}
902906
TypeName::Nullable(ty) => {
903907
write!(f, "{} NULL", ty)?;
904908
}

src/query/ast/src/parser/expr.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,7 @@ pub fn type_name(i: Input) -> IResult<TypeName> {
15861586
rule! { ( STRING | VARCHAR | CHAR | CHARACTER | TEXT ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
15871587
);
15881588
let ty_variant = value(TypeName::Variant, rule! { VARIANT | JSON });
1589+
let ty_geometry = value(TypeName::Geometry, rule! { GEOMETRY });
15891590
map_res(
15901591
alt((
15911592
rule! {
@@ -1614,6 +1615,7 @@ pub fn type_name(i: Input) -> IResult<TypeName> {
16141615
| #ty_binary
16151616
| #ty_string
16161617
| #ty_variant
1618+
| #ty_geometry
16171619
| #ty_nullable
16181620
) ~ #nullable? : "type name" },
16191621
)),

src/query/ast/src/parser/token.rs

+2
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,8 @@ pub enum TokenKind {
597597
FUSE,
598598
#[token("GENERATED", ignore(ascii_case))]
599599
GENERATED,
600+
#[token("GEOMETRY", ignore(ascii_case))]
601+
GEOMETRY,
600602
#[token("GLOBAL", ignore(ascii_case))]
601603
GLOBAL,
602604
#[token("GRAPH", ignore(ascii_case))]

src/query/formats/src/field_decoder/fast_values.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ impl FastFieldDecoderValues {
490490
) -> Result<()> {
491491
let mut buf = Vec::new();
492492
self.read_string_inner(reader, &mut buf, positions)?;
493-
let geom = parse_to_ewkb(&buf)?;
493+
let geom = parse_to_ewkb(&buf, None)?;
494494
column.put_slice(geom.as_bytes());
495495
column.commit_row();
496496
Ok(())

src/query/formats/src/field_decoder/json_ast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ impl FieldJsonAstDecoder {
330330
fn read_geometry(&self, column: &mut BinaryColumnBuilder, value: &Value) -> Result<()> {
331331
match value {
332332
Value::String(v) => {
333-
let geom = parse_to_ewkb(v.as_bytes())?;
333+
let geom = parse_to_ewkb(v.as_bytes(), None)?;
334334
column.put_slice(&geom);
335335
column.commit_row();
336336
Ok(())

src/query/formats/src/field_decoder/nested.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ impl NestedValues {
327327
) -> Result<()> {
328328
let mut buf = Vec::new();
329329
self.read_string_inner(reader, &mut buf)?;
330-
let geom = parse_to_ewkb(&buf)?;
330+
let geom = parse_to_ewkb(&buf, None)?;
331331
column.put_slice(geom.as_bytes());
332332
column.commit_row();
333333
Ok(())

src/query/formats/src/field_decoder/separated_text.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ impl SeparatedTextDecoder {
345345
}
346346

347347
fn read_geometry(&self, column: &mut BinaryColumnBuilder, data: &[u8]) -> Result<()> {
348-
let geom = parse_to_ewkb(data)?;
348+
let geom = parse_to_ewkb(data, None)?;
349349
column.put_slice(geom.as_bytes());
350350
column.commit_row();
351351
Ok(())

0 commit comments

Comments
 (0)