class OdbcTableMeta {
    /** Catalog name. */
    private final String catalog;

    /** Schema name. */
    private final String schema;

    /** Table name. */
    private final String table;

    /** Table type. */
    private final String tableType;

    /**
     * @param catalog Catalog name.
     * @param schema Schema name.
     * @param table Table name.
     * @param tableType Table type.
     */
    public OdbcTableMeta(String catalog, String schema, String table, String tableType) {
        this.catalog = catalog;
        this.schema = OdbcUtils.addQuotationMarksIfNeeded(schema);
        this.table = table;
        this.tableType = tableType;
    }

    /** {@inheritDoc} */
    @Override public int hashCode() {<FILL_FUNCTION_BODY>}

    /** {@inheritDoc} */
    @Override public boolean equals(Object o) {
        if (o instanceof OdbcTableMeta) {
            OdbcTableMeta other = (OdbcTableMeta)o;

            return this == other ||
                    Objects.equals(catalog, other.catalog) && Objects.equals(schema, other.schema) &&
                    Objects.equals(table, other.table) && Objects.equals(tableType, other.tableType);
        }

        return false;
    }

    /**
     * Write in a binary format.
     *
     * @param writer Binary writer.
     */
    public void writeBinary(BinaryRawWriterEx writer) {
        writer.writeString(catalog);
        writer.writeString(schema);
        writer.writeString(table);
        writer.writeString(tableType);
    }
}

        int hash = Objects.hashCode(catalog);

        hash = 31 * hash + Objects.hashCode(schema);
        hash = 31 * hash + Objects.hashCode(table);
        hash = 31 * hash + Objects.hashCode(tableType);

        return hash;
    
<no_super_class>