()
| 589 | } |
| 590 | #[tokio::test] |
| 591 | async fn copy_to_external_object_store_test() -> Result<()> { |
| 592 | let aws_envs = vec![ |
| 593 | "AWS_ENDPOINT", |
| 594 | "AWS_ACCESS_KEY_ID", |
| 595 | "AWS_SECRET_ACCESS_KEY", |
| 596 | "AWS_ALLOW_HTTP", |
| 597 | ]; |
| 598 | for aws_env in aws_envs { |
| 599 | if std::env::var(aws_env).is_err() { |
| 600 | eprint!("aws envs not set, skipping s3 test"); |
| 601 | return Ok(()); |
| 602 | } |
| 603 | } |
| 604 | |
| 605 | let locations = vec![ |
| 606 | "s3://bucket/path/file.parquet", |
| 607 | "oss://bucket/path/file.parquet", |
| 608 | "cos://bucket/path/file.parquet", |
| 609 | "gcs://bucket/path/file.parquet", |
| 610 | ]; |
| 611 | let ctx = SessionContext::new(); |
| 612 | let task_ctx = ctx.task_ctx(); |
| 613 | let dialect = &task_ctx.session_config().options().sql_parser.dialect; |
| 614 | let dialect = dialect_from_str(dialect).ok_or_else(|| { |
| 615 | plan_datafusion_err!( |
| 616 | "Unsupported SQL dialect: {dialect}. Available dialects: \ |
| 617 | Generic, MySQL, PostgreSQL, Hive, SQLite, Snowflake, Redshift, \ |
| 618 | MsSQL, ClickHouse, BigQuery, Ansi, DuckDB, Databricks." |
| 619 | ) |
| 620 | })?; |
| 621 | for location in locations { |
| 622 | let sql = format!("copy (values (1,2)) to '{location}' STORED AS PARQUET;"); |
| 623 | let statements = DFParser::parse_sql_with_dialect(&sql, dialect.as_ref())?; |
| 624 | for statement in statements { |
| 625 | //Should not fail |
| 626 | let mut plan = create_plan(&ctx, statement, false).await?; |
| 627 | if let LogicalPlan::Copy(copy_to) = &mut plan { |
| 628 | assert_eq!(copy_to.output_url, location); |
| 629 | assert_eq!(copy_to.file_type.get_ext(), "parquet".to_string()); |
| 630 | ctx.runtime_env() |
| 631 | .object_store_registry |
| 632 | .get_store(&Url::parse(©_to.output_url).unwrap())?; |
| 633 | } else { |
| 634 | return plan_err!("LogicalPlan is not a CopyTo"); |
| 635 | } |
| 636 | } |
| 637 | } |
| 638 | Ok(()) |
| 639 | } |
| 640 | |
| 641 | #[tokio::test] |
| 642 | async fn copy_to_object_store_table_s3() -> Result<()> { |
nothing calls this directly
no test coverage detected
searching dependent graphs…