Skip to content

Instantly share code, notes, and snippets.

@eidosam
Created October 24, 2019 11:20
Show Gist options
  • Save eidosam/762dc860aa3ada340bd34104e57e3a7c to your computer and use it in GitHub Desktop.
Save eidosam/762dc860aa3ada340bd34104e57e3a7c to your computer and use it in GitHub Desktop.
WebAssembly C-program in BigQuery Standard SQL UDF
CREATE TEMP FUNCTION
sum_asm(x INT64, y INT64)
RETURNS INT64
LANGUAGE js AS """
const sourceBuffer = new Uint8Array([
0, 97, 115, 109, 1, 0, 0, 0, 1, 139, 128, 128, 128, 0, 2, 96, 1, 127, 0, 96, 2, 127, 127, 1,
127, 2, 254, 128, 128, 128, 0, 7, 3, 101, 110, 118, 8, 83, 84, 65, 67, 75, 84, 79, 80, 3, 127,
0, 3, 101, 110, 118, 9, 83, 84, 65, 67, 75, 95, 77, 65, 88, 3, 127, 0, 3, 101, 110, 118, 18,
97, 98, 111, 114, 116, 83, 116, 97, 99, 107, 79, 118, 101, 114, 102, 108, 111, 119, 0, 0, 3,
101, 110, 118, 6, 109, 101, 109, 111, 114, 121, 2, 1, 128, 2, 128, 2, 3, 101, 110, 118, 5, 116,
97, 98, 108, 101, 1, 112, 1, 0, 0, 3, 101, 110, 118, 10, 109, 101, 109, 111, 114, 121, 66, 97,
115, 101, 3, 127, 0, 3, 101, 110, 118, 9, 116, 97, 98, 108, 101, 66, 97, 115, 101, 3, 127, 0,
3, 130, 128, 128, 128, 0, 1, 1, 6, 147, 128, 128, 128, 0, 3, 127, 1, 35, 0, 11, 127, 1, 35, 1,
11, 125, 1, 67, 0, 0, 0, 0, 11, 7, 136, 128, 128, 128, 0, 1, 4, 95, 115, 117, 109, 0, 1, 9, 129,
128, 128, 128, 0, 0, 10, 196, 128, 128, 128, 0, 1, 190, 128, 128, 128, 0, 1, 7, 127, 2, 64, 35,
4, 33, 8, 35, 4, 65, 16, 106, 36, 4, 35, 4, 35, 5, 78, 4, 64, 65, 16, 16, 0, 11, 32, 0, 33, 2,
32, 1, 33, 3, 32, 2, 33, 4, 32, 3, 33, 5, 32, 4, 32, 5, 106, 33, 6, 32, 8, 36, 4, 32, 6, 15, 0,
11, 0, 11
]);
const waModule = new WebAssembly.Module(sourceBuffer);
const waMemory = new WebAssembly.Memory({ initial: 256, maximum: 256 });
const waTable = new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' });
const waImports = {
env: {
STACKTOP: 0,
STACK_MAX: waMemory.buffer.byteLength,
memory: waMemory,
table: waTable,
tableBase: 0,
abortStackOverflow: () => { throw new Error('overflow'); },
memoryBase: 1024
}
};
const waInstance = new WebAssembly.Instance(waModule, waImports);
const sum = waInstance.exports._sum;
return sum(x, y);
""";
SELECT
sum_asm(7, 60)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment