/**
 * END USER LICENSE AGREEMENT (“EULA”)
 *
 * READ THIS AGREEMENT CAREFULLY (date: 9/13/2011):
 * http://www.akiban.com/licensing/20110913
 *
 * BY INSTALLING OR USING ALL OR ANY PORTION OF THE SOFTWARE, YOU ARE ACCEPTING
 * ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. YOU AGREE THAT THIS
 * AGREEMENT IS ENFORCEABLE LIKE ANY WRITTEN AGREEMENT SIGNED BY YOU.
 *
 * IF YOU HAVE PAID A LICENSE FEE FOR USE OF THE SOFTWARE AND DO NOT AGREE TO
 * THESE TERMS, YOU MAY RETURN THE SOFTWARE FOR A FULL REFUND PROVIDED YOU (A)
 * DO NOT USE THE SOFTWARE AND (B) RETURN THE SOFTWARE WITHIN THIRTY (30) DAYS
 * OF YOUR INITIAL PURCHASE.
 *
 * IF YOU WISH TO USE THE SOFTWARE AS AN EMPLOYEE, CONTRACTOR, OR AGENT OF A
 * CORPORATION, PARTNERSHIP OR SIMILAR ENTITY, THEN YOU MUST BE AUTHORIZED TO
 * SIGN FOR AND BIND THE ENTITY IN ORDER TO ACCEPT THE TERMS OF THIS AGREEMENT.
 * THE LICENSES GRANTED UNDER THIS AGREEMENT ARE EXPRESSLY CONDITIONED UPON
 * ACCEPTANCE BY SUCH AUTHORIZED PERSONNEL.
 *
 * IF YOU HAVE ENTERED INTO A SEPARATE WRITTEN LICENSE AGREEMENT WITH AKIBAN FOR
 * USE OF THE SOFTWARE, THE TERMS AND CONDITIONS OF SUCH OTHER AGREEMENT SHALL
 * PREVAIL OVER ANY CONFLICTING TERMS OR CONDITIONS IN THIS AGREEMENT.
 */
package com.akiban.server.types3.common.funcs;

import com.akiban.server.types3.*;
import com.akiban.server.types3.pvalue.PValueSource;
import com.akiban.server.types3.pvalue.PValueTarget;
import com.akiban.server.types3.texpressions.TInputSetBuilder;
import com.akiban.server.types3.texpressions.TOverloadBase;

public abstract class Hex extends TOverloadBase {

    public static TOverload[] create(TClass stringType, TClass numericType) {
        TOverload stringHex =
                new Hex(stringType, numericType) {

                    @Override
                    protected void buildInputSets(TInputSetBuilder builder) {
                        builder.covers(this.stringType, 0);
                    }

                    @Override
                    protected void doEvaluate(TExecutionContext context, LazyList<? extends PValueSource> inputs, PValueTarget output) {
                        String st = (String) inputs.get(0).getObject();
                        StringBuilder builder = new StringBuilder();

                        for (byte ch : st.getBytes()) {
                            builder.append(String.format("%02X", ch));
                        }
                        output.putObject(builder.toString());
                    }
                };
        TOverload numericHex =
                new Hex(stringType, numericType) {

                    @Override
                    protected void buildInputSets(TInputSetBuilder builder) {
                        builder.covers(this.numericType, 0);
                    }

                    @Override
                    protected void doEvaluate(TExecutionContext context, LazyList<? extends PValueSource> inputs, PValueTarget output) {
                        output.putObject(Long.toHexString(inputs.get(0).getInt64()));
                    }
                };
        return new TOverload[]{stringHex, numericHex};
    }
    protected final TClass numericType;
    protected final TClass stringType;

    public Hex(TClass stringType, TClass numericType) {
        this.stringType = stringType;
        this.numericType = numericType;
    }

    @Override
    public String overloadName() {
        return "HEX";
    }

    @Override
    public TOverloadResult resultType() {
        return TOverloadResult.fixed(stringType.instance());
    }
}

@@ -1309,16 +1309,138 @@
 pes3.*;%0A
+import com.akiban.server.types3.common.types.StringAttribute;%0Aimport com.akiban.server.types3.common.types.StringFactory;%0A
 import c
@@ -1659,16 +1659,49 @@
 oadBase;
+%0Aimport java.nio.charset.Charset;
 %0A%0Apublic
@@ -2404,16 +2404,313 @@
 lder();%0A
+                        int charsetId = context.inputTInstanceAt(0).attribute(StringAttribute.CHARSET);%0A                        String charsetName = (StringFactory.Charset.values())%5BcharsetId%5D.name();%0A                        %0A                        Charset charset = Charset.forName(charsetName);
 %0A       
@@ -2753,16 +2753,23 @@
 etBytes(
+charset
 )) %7B%0A   

use correct charset