# 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.

[default initial_logical_plan]
COPY test FROM 'test.txt'
--
TopLevelPlan
+-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter="\t",
| escape_strings=true]
+-output_attributes=
  +-[]
==

COPY tESt FROM 'test.txt' WITH (delimiter '123')
--
ERROR: DELIMITER is not a single character (1 : 43)
COPY tESt FROM 'test.txt' WITH (delimiter '123')
                                          ^
==

COPY tESt FROM 'test.txt' WITH (delimiter 'd', escape_strings false)
--
TopLevelPlan
+-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter="d",
| escape_strings=false]
+-output_attributes=
  +-[]
==

COPY test TO 'test.txt';
--
TopLevelPlan
+-plan=CopyTo[file_name=@test.txt,format=TEXT,column_delimiter="\t",
| escape_strings=true,null_string=\N]
| +-input=TableReference[relation_name=Test,relation_alias=test]
|   +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
|   +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
|   +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
|   +-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
|   +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
|   +-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
+-output_attributes=
  +-[]
==

COPY test TO stdout WITH (FORMAT 'CSV');
--
TopLevelPlan
+-plan=CopyTo[file_name=$stdout,format=CSV,column_delimiter=",",header=true,
| quote="]
| +-input=TableReference[relation_name=Test,relation_alias=test]
|   +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
|   +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
|   +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
|   +-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
|   +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
|   +-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
+-output_attributes=
  +-[]
==

COPY
  SELECT SUM(int_col) AS sum_int,
         AVG(double_col) AS avg_dbl
  FROM test
  GROUP BY char_col
  UNION ALL
  SELECT 1, 2.0
  FROM generate_series(1, 1)
TO 'test.txt' WITH (DELIMITER ',');
--
TopLevelPlan
+-plan=CopyTo[file_name=@test.txt,format=TEXT,column_delimiter=",",
| escape_strings=true,null_string=\N]
| +-input=UnionAll[set_operation_type=UnionAll]
|   +-operands=
|   | +-Project
|   | | +-input=Project
|   | | | +-input=Aggregate
|   | | | | +-input=TableReference[relation_name=Test,relation_alias=test]
|   | | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
|   | | | | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
|   | | | | | +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
|   | | | | | +-AttributeReference[id=3,name=double_col,relation=test,
|   | | | | | | type=Double NULL]
|   | | | | | +-AttributeReference[id=4,name=char_col,relation=test,
|   | | | | | | type=Char(20)]
|   | | | | | +-AttributeReference[id=5,name=vchar_col,relation=test,
|   | | | | |   type=VarChar(20) NULL]
|   | | | | +-grouping_expressions=
|   | | | | | +-AttributeReference[id=4,name=char_col,relation=test,
|   | | | | |   type=Char(20)]
|   | | | | +-aggregate_expressions=
|   | | | |   +-Alias[id=6,name=,alias=$aggregate0,relation=$aggregate,
|   | | | |   | type=Long NULL]
|   | | | |   | +-AggregateFunction[function=SUM]
|   | | | |   |   +-AttributeReference[id=0,name=int_col,relation=test,
|   | | | |   |     type=Int NULL]
|   | | | |   +-Alias[id=7,name=,alias=$aggregate1,relation=$aggregate,
|   | | | |     type=Double NULL]
|   | | | |     +-AggregateFunction[function=AVG]
|   | | | |       +-AttributeReference[id=3,name=double_col,relation=test,
|   | | | |         type=Double NULL]
|   | | | +-project_list=
|   | | |   +-Alias[id=6,name=sum_int,relation=,type=Long NULL]
|   | | |   | +-AttributeReference[id=6,name=,alias=$aggregate0,
|   | | |   |   relation=$aggregate,type=Long NULL]
|   | | |   +-Alias[id=7,name=avg_dbl,relation=,type=Double NULL]
|   | | |     +-AttributeReference[id=7,name=,alias=$aggregate1,
|   | | |       relation=$aggregate,type=Double NULL]
|   | | +-project_list=
|   | |   +-AttributeReference[id=6,name=sum_int,relation=,type=Long NULL]
|   | |   +-AttributeReference[id=7,name=avg_dbl,relation=,type=Double NULL]
|   | +-Project
|   |   +-input=Project
|   |   | +-input=TableGenerator[function_name=generate_series]
|   |   | | +-AttributeReference[id=8,name=generate_series,
|   |   | |   relation=generate_series,type=Int]
|   |   | +-project_list=
|   |   |   +-Alias[id=9,name=,alias=1,relation=,type=Int]
|   |   |   | +-Literal[value=1,type=Int]
|   |   |   +-Alias[id=10,name=,alias=2.0,relation=,type=Double]
|   |   |     +-Literal[value=2,type=Double]
|   |   +-project_list=
|   |     +-Alias[id=11,name=,alias=1,relation=,type=Long NULL]
|   |     | +-Cast[target_type=Long NULL]
|   |     |   +-operand=AttributeReference[id=9,name=,alias=1,relation=,type=Int]
|   |     +-Alias[id=12,name=,alias=2.0,relation=,type=Double NULL]
|   |       +-Cast[target_type=Double NULL]
|   |         +-operand=AttributeReference[id=10,name=,alias=2.0,relation=,
|   |           type=Double]
|   +-project_attributes=
|     +-AttributeReference[id=13,name=sum_int,relation=,type=Long NULL]
|     +-AttributeReference[id=14,name=avg_dbl,relation=,type=Double NULL]
+-output_attributes=
  +-[]
==

COPY undefined_table FROM 'test.txt'
--
ERROR: Unrecognized relation undefined_table (1 : 6)
COPY undefined_table FROM 'test.txt...
     ^
==

COPY test FROM 'test.txt' WITH (FORMAT 'CSV')
--
ERROR: Unsupported file format: csv (1 : 40)
COPY test FROM 'test.txt' WITH (FORMAT 'CSV')
                                       ^
==

COPY test FROM 'test.txt' WITH (XXX 'YY');
--
ERROR: Unsupported copy option: xxx (1 : 33)
COPY test FROM 'test.txt' WITH (XXX 'YY');
                                ^
==

COPY test TO 'test.txt' WITH (QUOTE '$');
--
ERROR: Unsupported copy option "quote" for file format TEXT (1 : 31)
COPY test TO 'test.txt' WITH (QUOTE '$');
                              ^
==

COPY test TO 'test.txt' WITH (FORMAT 'CSV', ESCAPE_STRINGS TRUE);
--
ERROR: Unsupported copy option "escape_strings" for file format CSV (1 : 45)
... test TO 'test.txt' WITH (FORMAT 'CSV', ESCAPE_STRINGS TRUE);
                                           ^
==

COPY test TO 'test.txt' WITH (FORMAT CSV, QUOTE '$$');
--
ERROR: QUOTE is not a single character (1 : 49)
...test TO 'test.txt' WITH (FORMAT CSV, QUOTE '$$');
                                              ^
==

COPY test TO 'test.txt' WITH (FORMAT 'TEXT', QUOTE '"');
--
ERROR: Unsupported copy option "quote" for file format TEXT (1 : 46)
...test TO 'test.txt' WITH (FORMAT 'TEXT', QUOTE '"');
                                           ^
==
