
/*
 * 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.
 */

package org.apache.carbondata.cluster.sdv.generated

import org.apache.spark.sql.{AnalysisException, Row}
import org.apache.spark.sql.common.util._
import org.scalatest.BeforeAndAfterAll

/**
 * Test Class for AlterTableTestCase to verify all scenerios
 */

class TableCommentAlterTableTestCase extends QueryTest with BeforeAndAfterAll {


  //Check create table with table comment
  test("TableCommentAlterTable_001_01", Include) {
    sql(s"""drop table if exists table_comment""").collect
    sql(s"""	create table table_comment(id int, name string) comment "This is table comment" STORED BY 'carbondata'""").collect
    val result =   sql("describe formatted table_comment")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "This is table comment")
  }

  //Check create table with comment as numeric/alphanumeric/special symbols
  test("TableCommentAlterTable_001_02", Include) {
    sql(s"""drop table if exists table_comment_special""").collect
    sql(s"""create table table_comment_special(id int, name string) comment "3432432 @This $$$$ is table comment #$$%^&*@# 34234" STORED BY 'carbondata'""").collect
    val result =   sql("describe formatted table_comment_special")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "3432432 @This $$ is table comment #$%^&*@# 34234")
  }

  //Check create table with comment as blank
  test("TableCommentAlterTable_001_03", Include) {
    sql(s"""drop table if exists table_comment_alphabets""").collect
    sql(s"""create table table_comment_alphabets(id int, name string) comment "" STORED BY 'carbondata'""").collect
    val result =   sql("describe formatted table_comment")
    checkExistence(result, true, "Comment")
  }

  //Check create table with comment as high values
  test("TableCommentAlterTable_001_04", Include) {
    sql(s"""drop table if exists table_comment_high""").collect
    sql(s"""create table table_comment_high(id int, name string) comment "This is table comment jgfhdsjgfhsjdgjfsdgfbcfgr763  23x4bt23n8z30bt20t49ct4cb3g93t53945ctbugebgec4c3trbcu4grehrvsgyabrgyuwarcnrwbrcwe rwergrburygwae rwaeuigrwawewrcargw7aer wr766tznzYQEqoie weqeqewqeqweqweqweewqeqwe" STORED BY 'carbondata'""").collect
    val result =   sql("describe formatted table_comment_high")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "This is table comment jgfhdsjgfhsjdgjfsdgfbcfgr763  23x4bt23n8z30bt20t49ct4cb3g93t53945ctbugebgec4c3trbcu4grehrvsgyabrgyuwarcnrwbrcwe rwergrburygwae rwaeuigrwawewrcargw7aer wr766tznzYQEqoie weqeqewqeqweqweqweewqeqwe")
  }

  //Check create table with comment in the table properties
  test("TableCommentAlterTable_001_05", Include) {
    sql(s"""drop table if exists table_comment_asprop""").collect
    sql(s"""create table table_comment_asprop (imei string,num bigint,game double,date timestamp,Profit decimal(3,2)) STORED BY 'carbondata' TBLPROPERTIES('comment'='This is table comment..!!')""").collect
    val result =   sql("describe formatted table_comment")
    checkExistence(result, true, "Comment")
    checkExistence(result, false, "This is table comment..!!")
  }

  //Check create table with comment after stored by clause
  test("TableCommentAlterTable_001_06", Include) {
    intercept[AnalysisException] {
      sql("create table table_comment_afterstoredby (id int, name string) STORED BY 'carbondata' comment 'This is table comment'")
    }
  }

  //Check the comment by "describe formatted"
  test("TableCommentAlterTable_001_07", Include) {
    sql(s"""drop table if exists table_comment""").collect
    sql(s"""	create table table_comment(id int, name string) comment "This is table comment" STORED BY 'carbondata'""").collect
    val result =   sql("describe formatted table_comment")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "This is table comment")
  }

  //Check SET Command by using alter command
  test("TableCommentAlterTable_001_08", Include) {
    sql(s"""drop table if exists table_comment_set""").collect
    sql(s"""create table table_comment_set (id int, name string) STORED BY 'carbondata'""").collect
    sql(s"""alter table table_comment_set SET TBLPROPERTIES ('comment'='This table comment is SET by alter table set')""").collect
    val result =   sql("describe formatted table_comment_set")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "This table comment is SET by alter table set")
  }

  //Check UNSET Command by using alter command
  test("TableCommentAlterTable_001_09", Include) {
    sql(s"""drop table if exists table_comment_unset""").collect
    sql(s"""create table table_comment_unset(id int, name string) comment "This is table comment" STORED BY 'carbondata'""").collect
    val result1 =   sql("describe formatted table_comment_unset")
    checkExistence(result1, true, "Comment")
    checkExistence(result1, true, "This is table comment")

    sql(s"""alter table table_comment_unset UNSET TBLPROPERTIES IF EXISTS ('comment')""").collect
    val result2 =   sql("describe formatted table_comment_unset")
    checkExistence(result2, true, "Comment")
    checkExistence(result2, false, "This is table comment")
  }

  //Check RENAME by using alter command
  test("TableCommentAlterTable_001_10", Include) {
    sql(s"""drop table if exists table_comment_rename1""").collect
    sql(s"""create table table_comment_rename1 (id int, name string) STORED BY 'carbondata'""").collect
    sql(s"""alter table table_comment_rename1 rename to table_comment_rename2""").collect
    val result =   sql("describe formatted table_comment_rename2")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "table_comment")
  }

  //Check ADD Columns by using alter command
  test("TableCommentAlterTable_001_11", Include) {
    sql(s"""drop table if exists table_add_column """).collect
    sql(s"""create table table_add_column (name string, country string, upd_time timestamp) stored by 'carbondata'""").collect
    sql(s"""alter table table_add_column add columns (id bigint)""").collect
    val result =   sql("describe table_add_column ")
    checkExistence(result, true, "id")
    checkExistence(result, true, "bigint")
  }

  //Check CHANGE DATA TYPE by using alter command
  test("TableCommentAlterTable_001_12", Include) {
    sql(s"""drop table if exists table_change_datatype""").collect
    sql(s"""create table table_change_datatype (name string, id decimal(3,2),country string) stored by 'carbondata'""").collect
    sql(s"""alter table table_change_datatype change id id decimal(10,4)""").collect
    val result =   sql("describe formatted table_change_datatype")
    checkExistence(result, true, "Comment")
    checkExistence(result, true, "decimal(10,4)")
  }

}