class_docstr: This handler handles connection and execution of the Firebird statements.
docstr: Returns a list of entity columns.
  Args:
      table_name (str): name of one of tables returned by self.get_tables()
  Returns:
      HandlerResponse
docstr_tok: ["Returns","a","list","of","entity","columns",".","Args",":","table_name","(","str",")",":","name","of","one","of","tables","returned","by","self.get_tables","(",")","Returns",":","HandlerResponse"]
code: def get_columns(self, table_name: str) -> StatusResponse:
      """
      Returns a list of entity columns.
      Args:
          table_name (str): name of one of tables returned by self.get_tables()
      Returns:
          HandlerResponse
      """
  
      query = f"""
              SELECT
                RF.RDB$FIELD_NAME FIELD_NAME,
                CASE F.RDB$FIELD_TYPE
                  WHEN 7 THEN
                    CASE F.RDB$FIELD_SUB_TYPE
                      WHEN 0 THEN 'SMALLINT'
                      WHEN 1 THEN 'NUMERIC(' || F.RDB$FIELD_PRECISION || ', ' || (-F.RDB$FIELD_SCALE) || ')'
                      WHEN 2 THEN 'DECIMAL'
                    END
                  WHEN 8 THEN
                    CASE F.RDB$FIELD_SUB_TYPE
                      WHEN 0 THEN 'INTEGER'
                      WHEN 1 THEN 'NUMERIC('  || F.RDB$FIELD_PRECISION || ', ' || (-F.RDB$FIELD_SCALE) || ')'
                      WHEN 2 THEN 'DECIMAL'
                    END
                  WHEN 9 THEN 'QUAD'
                  WHEN 10 THEN 'FLOAT'
                  WHEN 12 THEN 'DATE'
                  WHEN 13 THEN 'TIME'
                  WHEN 14 THEN 'CHAR(' || (TRUNC(F.RDB$FIELD_LENGTH / CH.RDB$BYTES_PER_CHARACTER)) || ') '
                  WHEN 16 THEN
                    CASE F.RDB$FIELD_SUB_TYPE
                      WHEN 0 THEN 'BIGINT'
                      WHEN 1 THEN 'NUMERIC(' || F.RDB$FIELD_PRECISION || ', ' || (-F.RDB$FIELD_SCALE) || ')'
                      WHEN 2 THEN 'DECIMAL'
                    END
                  WHEN 27 THEN 'DOUBLE'
                  WHEN 35 THEN 'TIMESTAMP'
                  WHEN 37 THEN 'VARCHAR(' || (TRUNC(F.RDB$FIELD_LENGTH / CH.RDB$BYTES_PER_CHARACTER)) || ')'
                  WHEN 40 THEN 'CSTRING' || (TRUNC(F.RDB$FIELD_LENGTH / CH.RDB$BYTES_PER_CHARACTER)) || ')'
                  WHEN 45 THEN 'BLOB_ID'
                  WHEN 261 THEN 'BLOB SUB_TYPE ' || F.RDB$FIELD_SUB_TYPE
                  ELSE 'RDB$FIELD_TYPE: ' || F.RDB$FIELD_TYPE || '?'
                END FIELD_TYPE,
                IIF(COALESCE(RF.RDB$NULL_FLAG, 0) = 0, NULL, 'NOT NULL') FIELD_NULL,
                CH.RDB$CHARACTER_SET_NAME FIELD_CHARSET,
                DCO.RDB$COLLATION_NAME FIELD_COLLATION,
                COALESCE(RF.RDB$DEFAULT_SOURCE, F.RDB$DEFAULT_SOURCE) FIELD_DEFAULT,
                F.RDB$VALIDATION_SOURCE FIELD_CHECK,
                RF.RDB$DESCRIPTION FIELD_DESCRIPTION
              FROM RDB$RELATION_FIELDS RF
              JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE)
              LEFT OUTER JOIN RDB$CHARACTER_SETS CH ON (CH.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID)
              LEFT OUTER JOIN RDB$COLLATIONS DCO ON ((DCO.RDB$COLLATION_ID = F.RDB$COLLATION_ID) AND (DCO.RDB$CHARACTER_SET_ID = F.RDB$CHARACTER_SET_ID))
              WHERE (RF.RDB$RELATION_NAME = '{table_name.upper()}') AND (COALESCE(RF.RDB$SYSTEM_FLAG, 0) = 0)
              ORDER BY RF.RDB$FIELD_POSITION;
          """
      result = self.native_query(query)
      df = result.data_frame
      result.data_frame = df.rename(
          columns={
              "FIELD_NAME": "column_name",
              "FIELD_TYPE": "data_type",
          }
      )
      return result
  
imports: from typing import Optional
  from collections import OrderedDict
  import pandas
  import fdb
  from mindsdb_sql import parse_sql
  from sqlalchemy_firebird.base import FBDialect
  from mindsdb_sql.render.sqlalchemy_render import SqlalchemyRender
  from mindsdb.integrations.libs.base import DatabaseHandler
  from mindsdb_sql.parser.ast.base import ASTNode
  from mindsdb.utilities import log
  from mindsdb.integrations.libs.response import HandlerStatusResponse, HandlerResponse, RESPONSE_TYPE
  from mindsdb.integrations.libs.const import HANDLER_CONNECTION_ARG_TYPE
label_desc: Use image node_id 9 for calling the FirebirdHandler obj's underlying member method code with example usage: obj.get_columns(table_name) and returns: result