code: def column_definition(self, tree):
      data_type = None
      array_type = None
      dimensions = None
      column_constraint_information = ColConstraintInfo()
      not_null_set = False
  
      for child in tree.children:
          if isinstance(child, Tree):
              if child.data.endswith("data_type"):
                  data_type, array_type, dimensions = self.visit(child)
              elif child.data.endswith("column_constraint"):
                  return_type = self.visit(child)
                  if return_type == ColumnConstraintEnum.UNIQUE:
                      column_constraint_information.unique = True
                      column_constraint_information.nullable = False
                      not_null_set = True
                  elif return_type == ColumnConstraintEnum.NOTNULL:
                      column_constraint_information.nullable = False
                      not_null_set = True
  
      if not not_null_set:
          column_constraint_information.nullable = True
  
      return (
          data_type,
          array_type,
          dimensions,
          column_constraint_information,
      )
  
imports: from lark import Tree
  from evadb.catalog.catalog_type import ColumnType, NdArrayType, VectorStoreType
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.parser.create_index_statement import CreateIndexStatement
  from evadb.parser.create_statement import ColConstraintInfo, ColumnDefinition, CreateDatabaseStatement, CreateJobStatement, CreateTableStatement
  from evadb.parser.table_ref import TableRef
  from evadb.parser.types import ColumnConstraintEnum
label_desc: Use image node_id 4 for calling the CreateTable obj's underlying member method code with example usage: obj.column_definition(tree) and returns: data_type,  array_type,  dimensions,  column_constraint_information