This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new b6dbb8d8b [sqllogictest] Support `pg_typeof` (#5148)
b6dbb8d8b is described below
commit b6dbb8d8b896861d23dcc17a8a4b3e0e4276db7e
Author: Yevhenii Melnyk <[email protected]>
AuthorDate: Wed Feb 1 23:16:39 2023 +0100
[sqllogictest] Support `pg_typeof` (#5148)
* [sqllogictest] Support `pg_typeof`
* add newline
* Add a license header
---
datafusion/core/Cargo.toml | 1 +
.../sqllogictests/src/engines/postgres/mod.rs | 4 +
.../sqllogictests/src/engines/postgres/types.rs | 44 +++++
.../pg_compat/pg_compat_type_coercion.slt | 178 +++++++++++++++++++++
4 files changed, 227 insertions(+)
diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml
index 6b59e48cc..6cde4aa8e 100644
--- a/datafusion/core/Cargo.toml
+++ b/datafusion/core/Cargo.toml
@@ -113,6 +113,7 @@ doc-comment = "0.3"
env_logger = "0.10"
half = "2.2.1"
parquet-test-utils = { path = "../../parquet-test-utils" }
+postgres-protocol = "0.6.4"
postgres-types = { version = "0.2.4", features = ["derive", "with-chrono-0_4"]
}
rstest = "0.16.0"
rust_decimal = { version = "1.27.0", features = ["tokio-pg"] }
diff --git a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs
b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs
index 2d7f02b40..84adde90d 100644
--- a/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs
+++ b/datafusion/core/tests/sqllogictests/src/engines/postgres/mod.rs
@@ -30,6 +30,9 @@ use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
use postgres_types::Type;
use rust_decimal::Decimal;
use tokio_postgres::{Column, Row};
+use types::PgRegtype;
+
+mod types;
// default connect string, can be overridden by the `PG_URL` environment
variable
const PG_URI: &str = "postgresql://[email protected]/test";
@@ -245,6 +248,7 @@ fn cell_to_string(row: &Row, column: &Column, idx: usize)
-> String {
}
Type::FLOAT4 => make_string!(row, idx, f32, f32_to_str),
Type::FLOAT8 => make_string!(row, idx, f64, f64_to_str),
+ Type::REGTYPE => make_string!(row, idx, PgRegtype),
_ => unimplemented!("Unsupported type: {}", column.type_().name()),
}
}
diff --git a/datafusion/core/tests/sqllogictests/src/engines/postgres/types.rs
b/datafusion/core/tests/sqllogictests/src/engines/postgres/types.rs
new file mode 100644
index 000000000..0c66150d1
--- /dev/null
+++ b/datafusion/core/tests/sqllogictests/src/engines/postgres/types.rs
@@ -0,0 +1,44 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use postgres_types::Type;
+use tokio_postgres::types::FromSql;
+
+pub struct PgRegtype {
+ value: String,
+}
+
+impl<'a> FromSql<'a> for PgRegtype {
+ fn from_sql(
+ _: &Type,
+ buf: &'a [u8],
+ ) -> Result<Self, Box<dyn std::error::Error + Sync + Send>> {
+ let oid = postgres_protocol::types::oid_from_sql(buf)?;
+ let value = Type::from_oid(oid).ok_or("bad type")?.to_string();
+ Ok(PgRegtype { value })
+ }
+
+ fn accepts(ty: &Type) -> bool {
+ matches!(*ty, Type::REGTYPE)
+ }
+}
+
+impl ToString for PgRegtype {
+ fn to_string(&self) -> String {
+ self.value.clone()
+ }
+}
diff --git
a/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt
b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt
new file mode 100644
index 000000000..aee35e08f
--- /dev/null
+++
b/datafusion/core/tests/sqllogictests/test_files/pg_compat/pg_compat_type_coercion.slt
@@ -0,0 +1,178 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+query ??
+select true and true, false and false;
+----
+true false
+
+
+onlyif DataFusion
+query ??
+select arrow_typeof(true and true), arrow_typeof(false and false);
+----
+Boolean Boolean
+
+
+onlyif postgres
+query ??
+select pg_typeof(true and true), pg_typeof(false and false);
+----
+bool bool
+
+
+query ??
+select true or true, false or false;
+----
+true false
+
+
+onlyif DataFusion
+query ??
+select arrow_typeof(true or true), arrow_typeof(false or false);
+----
+Boolean Boolean
+
+
+onlyif postgres
+query ??
+select pg_typeof(true or true), pg_typeof(false or false);
+----
+bool bool
+
+
+query ??
+select false and true, true and false;
+----
+false false
+
+
+onlyif DataFusion
+query ??
+select arrow_typeof(false and true), arrow_typeof(true and false);
+----
+Boolean Boolean
+
+
+onlyif postgres
+query ??
+select pg_typeof(false and true), pg_typeof(true and false);
+----
+bool bool
+
+
+query ??
+select false or true, true or false;
+----
+true true
+
+
+onlyif DataFusion
+query ??
+select arrow_typeof(false or true), arrow_typeof(true or false);
+----
+Boolean Boolean
+
+
+onlyif postgres
+query ??
+select pg_typeof(false or true), pg_typeof(true or false);
+----
+bool bool
+
+
+# TODO: run for DataFusion as well after #4335
+onlyif postgres
+query ??
+select null and null, null or null;
+----
+NULL NULL
+
+
+# TODO: uncomment after #4335
+#onlyif DataFusion
+#query ??
+#select arrow_typeof(null and null), arrow_typeof(null or null);
+#----
+#Boolean Boolean
+
+
+onlyif postgres
+query ??
+select pg_typeof(null and null), pg_typeof(null or null);
+----
+bool bool
+
+
+onlyif postgres
+query ????
+select true and null,
+ false and null,
+ null and true,
+ null and false;
+----
+NULL false NULL false
+
+
+onlyif DataFusion
+query ????
+select arrow_typeof(true and null),
+ arrow_typeof(false and null),
+ arrow_typeof(null and true),
+ arrow_typeof(null and false);
+----
+Boolean Boolean Boolean Boolean
+
+
+onlyif postgres
+query ????
+select pg_typeof(true and null),
+ pg_typeof(false and null),
+ pg_typeof(null and true),
+ pg_typeof(null and false);
+----
+bool bool bool bool
+
+
+onlyif postgres
+query ????
+select true or null,
+ false or null,
+ null or true,
+ null or false;
+----
+true NULL true NULL
+
+
+onlyif DataFusion
+query ????
+select arrow_typeof(true or null),
+ arrow_typeof(false or null),
+ arrow_typeof(null or true),
+ arrow_typeof(null or false);
+----
+Boolean Boolean Boolean Boolean
+
+
+onlyif postgres
+query ????
+select pg_typeof(true or null),
+ pg_typeof(false or null),
+ pg_typeof(null or true),
+ pg_typeof(null or false);
+----
+bool bool bool bool