class ValueStringIgnoreCase extends ValueString {

    private static final ValueStringIgnoreCase EMPTY = new ValueStringIgnoreCase("");
    private int hash;

    protected ValueStringIgnoreCase(String value) {
        super(value);
    }

    @Override
    public int getType() {
        return Value.STRING_IGNORECASE;
    }

    @Override
    protected int compareSecure(Value o, CompareMode mode) {
        ValueStringIgnoreCase v = (ValueStringIgnoreCase) o;
        return mode.compareString(value, v.value, true);
    }

    @Override
    public boolean equals(Object other) {
        return other instanceof ValueString && value.equalsIgnoreCase(((ValueString) other).value);
    }

    @Override
    public int hashCode() {
        if (hash == 0) {
            // this is locale sensitive
            hash = value.toUpperCase().hashCode();
        }
        return hash;
    }

    @Override
    public String getSQL() {
        return "CAST(" + StringUtils.quoteStringSQL(value) + " AS VARCHAR_IGNORECASE)";
    }

    /**
     * Get or create a case insensitive string value for the given string.
     * The value will have the same case as the passed string.
     *
     * @param s the string
     * @return the value
     */
    public static ValueStringIgnoreCase get(String s) {<FILL_FUNCTION_BODY>}

    @Override
    protected ValueString getNew(String s) {
        return ValueStringIgnoreCase.get(s);
    }
}

        if (s.length() == 0) {
            return EMPTY;
        }
        ValueStringIgnoreCase obj = new ValueStringIgnoreCase(StringUtils.cache(s));
        if (s.length() > SysProperties.OBJECT_CACHE_MAX_PER_ELEMENT_SIZE) {
            return obj;
        }
        ValueStringIgnoreCase cache = (ValueStringIgnoreCase) Value.cache(obj);
        // the cached object could have the wrong case
        // (it would still be 'equal', but we don't like to store it)
        if (cache.value.equals(s)) {
            return cache;
        }
        return obj;
    
<methods>public com.lealone.db.value.Value convertPrecision(long, boolean) ,public boolean equals(java.lang.Object) ,public static com.lealone.db.value.ValueString get(java.lang.String) ,public static com.lealone.db.value.Value get(java.lang.String, boolean) ,public int getDisplaySize() ,public int getMemory() ,public java.lang.Object getObject() ,public long getPrecision() ,public java.lang.String getSQL() ,public java.lang.String getString() ,public int getType() ,public int hashCode() ,public void set(java.sql.PreparedStatement, int) throws java.sql.SQLException<variables>private static final com.lealone.db.value.ValueString EMPTY,public static final com.lealone.db.value.ValueString.StringDataType type,protected final non-sealed java.lang.String value