Ortrud R. Oellermann

63 papers Journal 62
YearRankTypeTitle / Venue / Authors
2024 J jnl
Discuss. Math. Graph Theory
Johan P. de Wet, Jean E. Dunbar, Marietjie Frick, Ortrud R. Oellermann
2023 J jnl
Discuss. Math. Graph Theory
MacKenzie Carr, Christina M. Mynhardt, Ortrud R. Oellermann
2023 J jnl
Discuss. Math. Graph Theory
Lucas Mol, Matthew J. H. Murphy, Ortrud R. Oellermann
2022 J jnl
Bull. ICA
Lucas Mol, Ortrud R. Oellermann, Vibhav Oswal
2021 J jnl
Discret. Appl. Math.
Rocío M. Casablanca, Lucas Mol, Ortrud R. Oellermann
2021 J jnl
CoRR
Lucas Mol, Ortrud R. Oellermann, Vibhav Oswal
2021 J jnl
Discret. Math.
Nadia Benakli, Novi H. Bong, Shonda Dueck, Linda Eroh, Beth Novick, Ortrud R. Oellermann
2020 J jnl
Australas. J Comb.
Kristaps J. Balodis, Lucas Mol, Ortrud R. Oellermann, Matthew E. Kroeker
2020 J jnl
CoRR
Lucas Mol, Matthew J. H. Murphy, Ortrud R. Oellermann
2020 J jnl
Discret. Appl. Math.
Lucas Mol, Matthew J. H. Murphy, Ortrud R. Oellermann
2019 J jnl
J. Graph Theory
Lucas Mol, Ortrud R. Oellermann
2018 J jnl
Australas. J Comb.
Matthew E. Kroeker, Lucas Mol, Ortrud R. Oellermann
2018 J jnl
Discret. Math.
Jason I. Brown, Lucas Mol, Ortrud R. Oellermann
2018 J jnl
J. Graph Theory
Alexander M. Stephens, Ortrud R. Oellermann
2017 J jnl
Discret. Appl. Math.
Gaia Moravcik, Ortrud R. Oellermann, Samuel Yusim
2017 J jnl
Graphs Comb.
Susan A. van Aardt, Jean E. Dunbar, Marietjie Frick, Ortrud R. Oellermann, Johan P. de Wet
2017 J jnl
Discret. Appl. Math.
Philip Lafrance, Ortrud R. Oellermann, Timothy Pressey
2016 J jnl
Graphs Comb.
Philip Lafrance, Ortrud R. Oellermann, Timothy Pressey
2016 J jnl
Discret. Appl. Math.
Susan A. van Aardt, Marietjie Frick, Ortrud R. Oellermann, Johan P. de Wet
2016 J jnl
Discret. Appl. Math.
Adam Borchert, Skylar Nicol, Ortrud R. Oellermann
2016 J jnl
Discret. Appl. Math.
Yunior Ramírez-Cruz, Ortrud R. Oellermann, Juan A. Rodríguez-Velázquez
2015 J jnl
Discret. Math.
Jason I. Brown, Ortrud R. Oellermann
2014 J jnl
Graphs Comb.
Jason I. Brown, Ortrud R. Oellermann
2014 J jnl
Discret. Math.
Juan Alberto Rodríguez-Velázquez, Ismael González Yero, Dorota Kuziak, Ortrud R. Oellermann
2014 J jnl
Electron. Notes Discret. Math.
Yunior Ramírez-Cruz, Ortrud R. Oellermann, Juan Alberto Rodríguez-Velázquez
2012 J jnl
Discuss. Math. Graph Theory
José Cáceres, Ortrud R. Oellermann, María Luz Puertas
2012 J jnl
Discret. Math.
Morten Hegner Nielsen, Ortrud R. Oellermann
2011 ch.
Structural Analysis of Complex Networks
Wayne Goddard, Ortrud R. Oellermann
2011 J jnl
Electron. J. Comb.
Frank Bullock, Peter Dankelmann, Marietjie Frick, Michael A. Henning, Ortrud R. Oellermann, Susan A. van Aardt
2011 J jnl
Discret. Math.
Morten Hegner Nielsen, Ortrud R. Oellermann
2010 J jnl
Discret. Math.
Susan A. van Aardt, Jean E. Dunbar, Marietjie Frick, Peter Katrenic, Morten Hegner Nielsen, Ortrud R. Oellermann
2009 J jnl
Eur. J. Comb.
Michael A. Henning, Morten Hegner Nielsen, Ortrud R. Oellermann
2009 J jnl
Discret. Math.
José Cáceres, Ortrud R. Oellermann
2009 J jnl
SIAM J. Discret. Math.
Morten Hegner Nielsen, Ortrud R. Oellermann
2008 J jnl
Electron. J. Comb.
Marietjie Frick, Susan A. van Aardt, Jean E. Dunbar, Morten Hegner Nielsen, Ortrud R. Oellermann
2008 J jnl
Discret. Math.
Linda Eroh, Ortrud R. Oellermann
2007 J jnl
Discret. Math.
Ortrud R. Oellermann, María Luz Puertas
2007 J jnl
Discret. Appl. Math.
Ortrud R. Oellermann, Joel Peters-Fransen
2006 J jnl
Ars Comb.
Ortrud R. Oellermann, Charlene D. Pawluck, Anna Stokke
2006 J jnl
Discret. Math.
Melodie Fehr, Shonda Gosselin, Ortrud R. Oellermann
2005 J jnl
Ars Comb.
Peter Dankelmann, Ortrud R. Oellermann
2005 J jnl
Discret. Math.
José Cáceres, Alberto Márquez, Ortrud R. Oellermann, María Luz Puertas
2005 J jnl
Discuss. Math. Graph Theory
Marietjie Frick, Susan A. van Aardt, Gcina Dlamini, Jean E. Dunbar, Ortrud R. Oellermann
2001 J jnl
Australas. J Comb.
Michael A. Henning, Ortrud R. Oellermann
2000 J jnl
Discret. Math.
Wayne Goddard, Michael A. Henning, Ortrud R. Oellermann
1999 J jnl
Discret. Math.
David P. Day, Ortrud R. Oellermann, Henda C. Swart
1996 J jnl
Discret. Math.
Michael A. Henning, Ortrud R. Oellermann, Henda C. Swart
1996 J jnl
J. Graph Theory
Peter Dankelmann, Ortrud R. Oellermann, Henda C. Swart
1996 J jnl
Discret. Math.
Michael A. Henning, Ortrud R. Oellermann, Henda C. Swart
1995 J jnl
J. Graph Theory
Ortrud R. Oellermann
1994 J jnl
Discret. Math.
David P. Day, Ortrud R. Oellermann, Henda C. Swart
1994 J jnl
Discret. Math.
Wayne Goddard, Ortrud R. Oellermann, Henda C. Swart
1991 J jnl
Networks
Ortrud R. Oellermann
1991 J jnl
J. Comb. Theory B
Wayne Goddard, Grzegorz Kubicki, Ortrud R. Oellermann, Songlin Tian
1990 J jnl
J. Graph Theory
Ortrud R. Oellermann, Songlin Tian
1989 J jnl
Graphs Comb.
Gary Chartrand, Ortrud R. Oellermann, Farrokh Saba, Hung Bin Zou
1988 J jnl
Discret. Math.
Ortrud R. Oellermann
1987 J jnl
J. Graph Theory
Yousef Alavi, Gary Chartrand, Fan R. K. Chung, Paul Erdös, Ronald L. Graham, Ortrud R. Oellermann
1987 J jnl
Graphs Comb.
Ortrud R. Oellermann
1986 J jnl
J. Graph Theory
Linda M. Lesniak, Ortrud R. Oellermann
1986 J jnl
Discret. Math.
Yousef Alavi, Gary Chartrand, Ortrud R. Oellermann, Linda M. Lesniak
1985 J jnl
Graphs Comb.
Gary Chartrand, Frank Harary, Ortrud R. Oellermann
1985 J jnl
Graphs Comb.
Gary Chartrand, Ortrud R. Oellermann, Sergio Ruiz
notebooks/redb-clickhouse-TEST.ipynb
← Index notebooks/redb-clickhouse-TEST.ipynb plaintext
Truncated preview: showing the first 16384 bytes out of 5988848 total.
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Definitions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import clickhouse_connect"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "ch_TEST_client = clickhouse_connect.get_client(host='e.rationaledge.io', port=443, username='default', password='werioubTGwvf0-dsbv_', database='redb', verify=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "ch_TEST_BETA_client = clickhouse_connect.get_client(host='k.rationaledge.io', port=443, username='default', password='werioubTGwvf0-dsbv_', database='default', verify=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<bound method HttpClient.close_connections of <clickhouse_connect.driver.httpclient.HttpClient object at 0x105fd64d0>>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ch_TEST_BETA_client.close_connections"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<clickhouse_connect.driver.summary.QuerySummary at 0x11f900810>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ch_TEST_BETA_client.command(\"\"\"\n",
    "RENAME DATABASE redb TO orig_redb;\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DB Creation (schema 2025-08-02)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ch_TEST_client.command(\"\"\"\n",
    "CREATE DATABASE IF NOT EXISTS redb;\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define General Tables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "### CREATE FULL REDB DATABASE\n",
    "def create_redb_with_all_tables(client):\n",
    "    client.command(\"\"\"\n",
    "        CREATE DATABASE IF NOT EXISTS redb\n",
    "    \"\"\")\n",
    "    create_all_general_tables(client)\n",
    "    create_all_pe_tables(client)\n",
    "\n",
    "#### CREATE FULL TABLES\n",
    "def create_all_general_tables(client):\n",
    "    create_basic_properties_dbtable(client)\n",
    "    create_hashes_dbtable(client)\n",
    "    create_capa_dbtable(client)\n",
    "    create_die_dbtable(client)\n",
    "    create_extra_findings_dbtable(client)\n",
    "\n",
    "\n",
    "##################################\n",
    "#### CREATE INDIVIDUAL TABLES ####\n",
    "##################################\n",
    "\n",
    "#### GENERAL TABLES ####\n",
    "# All tables have SETTINGS index_granularity = 8192\n",
    "def create_basic_properties_dbtable(client):\n",
    "    # Create samples_metadata table\n",
    "    client.command(\"\"\"\n",
    "        CREATE TABLE IF NOT EXISTS redb_basic_properties (\n",
    "            sha256 FixedString(64), -- primary key\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            filename Nullable(String),\n",
    "            sample_name String,\n",
    "            filesize UInt64,\n",
    "            file_entropy Float64,\n",
    "            filetype LowCardinality(String),\n",
    "            filetype_mime LowCardinality(String),\n",
    "            filetype_magika LowCardinality(String),\n",
    "            analysis_date DateTime64(3, 'UTC'),\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        PRIMARY KEY (sha256)\n",
    "        ORDER BY (sha256)\n",
    "    \"\"\")\n",
    "\n",
    "def create_hashes_dbtable(client):\n",
    "    # Create hashes table\n",
    "    client.command(\"\"\"\n",
    "        CREATE TABLE IF NOT EXISTS redb_hashes (\n",
    "            sha256 FixedString(64), -- primary key\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            ssdeep_hash Nullable(String),\n",
    "            tlsh_hash Nullable(String),\n",
    "            authentihash Nullable(String),\n",
    "            imphash Nullable(String),\n",
    "            impfuzzy Nullable(String),\n",
    "            typerefhash Nullable(String),\n",
    "            richhash Nullable(String),\n",
    "            richpe_hash Nullable(String),\n",
    "            richpv_hash Nullable(String),\n",
    "            richpv_hash_sorted Nullable(String),\n",
    "            dhash Nullable(String),\n",
    "            analysis_date DateTime64(3, 'UTC')\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        PRIMARY KEY (sha256)\n",
    "        ORDER BY (sha256)\n",
    "    \"\"\")\n",
    "\n",
    "def create_capa_dbtable(client):\n",
    "    # Create sample_capabilities table\n",
    "    client.command(\"\"\"\n",
    "        SET enable_json_type = 1;\n",
    "    \"\"\")\n",
    "    client.command(\"\"\"\n",
    "        -- Base table for CAPA analysis results\n",
    "        CREATE TABLE IF NOT EXISTS redb_capa (\n",
    "            sha256 FixedString(64),\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            analysis_date DateTime64(3, 'UTC'),\n",
    "            -- Store full JSON dumps as strings for flexibility\n",
    "            capa_dump JSON CODEC(ZSTD(3)),\n",
    "            attack_dump JSON CODEC(ZSTD(3)),\n",
    "            mbc_dump JSON CODEC(ZSTD(3))\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        ORDER BY sha256;\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        -- Normalized table for capabilities and namespaces\n",
    "        CREATE TABLE IF NOT EXISTS redb_capa_capabilities (\n",
    "            sha256 FixedString(64),\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            analysis_date DateTime64(3, 'UTC'),\n",
    "            namespace LowCardinality(String),\n",
    "            capability LowCardinality(String)\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        ORDER BY (sha256, namespace, capability);\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        -- Materialized view for capability statistics\n",
    "        CREATE MATERIALIZED VIEW IF NOT EXISTS redb_capa_capabilities_stats (\n",
    "            namespace LowCardinality(String),\n",
    "            capability LowCardinality(String),\n",
    "            samples_bitmap AggregateFunction(groupBitmap, UInt64),\n",
    "            occurrence_count UInt64\n",
    "        ) ENGINE = AggregatingMergeTree()\n",
    "        ORDER BY (namespace, capability)\n",
    "        AS SELECT\n",
    "            namespace,\n",
    "            capability,\n",
    "            groupBitmapState(cityHash64(sha256)) as samples_bitmap,\n",
    "            count() as occurrence_count\n",
    "        FROM redb_capa_capabilities\n",
    "        GROUP BY namespace, capability;\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        -- Normalized table for MITRE ATT&CK mappings\n",
    "        CREATE TABLE IF NOT EXISTS redb_capa_attack (\n",
    "            sha256 FixedString(64),\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            analysis_date DateTime64(3, 'UTC'),\n",
    "            tactic LowCardinality(String),\n",
    "            technique LowCardinality(String),\n",
    "            technique_id LowCardinality(String)\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        ORDER BY (sha256, tactic, technique_id);\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        -- Materialized view for ATT&CK statistics\n",
    "        CREATE MATERIALIZED VIEW IF NOT EXISTS redb_capa_attack_stats (\n",
    "            tactic LowCardinality(String),\n",
    "            technique LowCardinality(String),\n",
    "            technique_id LowCardinality(String),\n",
    "            samples_bitmap AggregateFunction(groupBitmap, UInt64),\n",
    "            occurrence_count UInt64\n",
    "        ) ENGINE = AggregatingMergeTree()\n",
    "        ORDER BY (tactic, technique_id)\n",
    "        AS SELECT\n",
    "            tactic,\n",
    "            technique,\n",
    "            technique_id,\n",
    "            groupBitmapState(cityHash64(sha256)) as samples_bitmap,\n",
    "            count() as occurrence_count\n",
    "        FROM redb_capa_attack\n",
    "        GROUP BY tactic, technique, technique_id;\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        -- Normalized table for MBC mappings\n",
    "        CREATE TABLE IF NOT EXISTS redb_capa_mbc (\n",
    "            sha256 FixedString(64),\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            analysis_date DateTime64(3, 'UTC'),\n",
    "            objective LowCardinality(String),\n",
    "            behavior LowCardinality(String),\n",
    "            behavior_id LowCardinality(String)\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        ORDER BY (sha256, objective, behavior_id);\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        -- Materialized view for MBC statistics\n",
    "        CREATE MATERIALIZED VIEW IF NOT EXISTS redb_capa_mbc_stats (\n",
    "            objective LowCardinality(String),\n",
    "            behavior LowCardinality(String),\n",
    "            behavior_id LowCardinality(String),\n",
    "            samples_bitmap AggregateFunction(groupBitmap, UInt64),\n",
    "            occurrence_count UInt64\n",
    "        ) ENGINE = AggregatingMergeTree()\n",
    "        ORDER BY (objective, behavior_id)\n",
    "        AS SELECT\n",
    "            objective,\n",
    "            behavior,\n",
    "            behavior_id,\n",
    "            groupBitmapState(cityHash64(sha256)) as samples_bitmap,\n",
    "            count() as occurrence_count\n",
    "        FROM redb_capa_mbc\n",
    "        GROUP BY objective, behavior, behavior_id;\n",
    "    \"\"\")\n",
    "\n",
    "def create_die_dbtable(client):\n",
    "    # Create sample_die table\n",
    "    client.command(\"\"\"\n",
    "        SET enable_json_type = 1;\n",
    "    \"\"\")\n",
    "    client.command(\"\"\"\n",
    "        CREATE TABLE IF NOT EXISTS redb_die (\n",
    "            sha256 FixedString(64),\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            die_info JSON CODEC(ZSTD(3)),\n",
    "            analysis_date DateTime64(3, 'UTC')\n",
    "        ) ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        PRIMARY KEY (sha256)\n",
    "        ORDER BY (sha256)\n",
    "    \"\"\")\n",
    "\n",
    "    client.command(\"\"\"\n",
    "        CREATE MATERIALIZED VIEW redb_die_mv\n",
    "        (\n",
    "            sha256 FixedString(64),\n",
    "            md5 FixedString(32),\n",
    "            sha1 FixedString(40),\n",
    "            analysis_date DateTime64(3, 'UTC'),\n",
    "            compiler LowCardinality(Nullable(String)),\n",
    "            compiler_full Nullable(String),\n",
    "            format LowCardinality(Nullable(String)),\n",
    "            format_full Nullable(String),\n",
    "            installer LowCardinality(Nullable(String)),\n",
    "            installer_full Nullable(String),\n",
    "            joiner LowCardinality(Nullable(String)),\n",
    "            joiner_full Nullable(String),\n",
    "            language LowCardinality(Nullable(String)),\n",
    "            language_full Nullable(String),\n",
    "            library LowCardinality(Nullable(String)),\n",
    "            library_full Nullable(String),\n",
    "            linker LowCardinality(Nullable(String)),\n",
    "            linker_full Nullable(String),\n",
    "            operation_system LowCardinality(Nullable(String)),\n",
    "            operation_system_full Nullable(String),\n",
    "            packer LowCardinality(Nullable(String)),\n",
    "            packer_full Nullable(String),\n",
    "            protector LowCardinality(Nullable(String)),\n",
    "            protector_full Nullable(String),\n",
    "            sfx LowCardinality(Nullable(String)),\n",
    "            sfx_full Nullable(String),\n",
    "            sign_tool LowCardinality(Nullable(String)),\n",
    "            sign_tool_full Nullable(String),\n",
    "            stub LowCardinality(Nullable(String)),\n",
    "            stub_full Nullable(String),\n",
    "            tool LowCardinality(Nullable(String)),\n",
    "            tool_full Nullable(String),   \n",
    "            -- overlay JSON CODEC(ZSTD(3)),\n",
    "            -- resource JSON CODEC(ZSTD(3)),\n",
    "            has_overlay UInt8,\n",
    "            has_resources UInt8,\n",
    "            is_packed UInt8\n",
    "        )\n",
    "        ENGINE = ReplacingMergeTree(analysis_date)\n",
    "        ORDER BY (sha256)\n",
    "        POPULATE\n",
    "        AS SELECT\n",
    "            sha256,\n",
    "            md5,\n",
    "            sha1,\n",
    "            analysis_date,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'compiler'), '') AS compiler,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'compiler(full)'), '') AS compiler_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'format'), '') AS format,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'format(full)'), '') AS format_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'installer'), '') AS installer,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'installer(full)'), '') AS installer_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'joiner'), '') AS joiner,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'joiner(full)'), '') AS joiner_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'language'), '') AS language,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'language(full)'), '') AS language_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'library'), '') AS library,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'library(full)'), '') AS library_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'linker'), '') AS linker,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'linker(full)'), '') AS linker_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'operation_system'), '') AS operation_system,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'operation_system(full)'), '') AS operation_system_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'packer'), '') AS packer,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'packer(full)'), '') AS packer_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'protector'), '') AS protector,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'protector(full)'), '') AS protector_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'sfx'), '') AS sfx,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'sfx(full)'), '') AS sfx_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'sign_tool'), '') AS sign_tool,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'sign_tool(full)'), '') AS sign_tool_full,\n",
    "            nullIf(JSONExtractString(toString(die_info), 'stub'), '') AS stub,\n",
    "            nullIf(JSONExtractString(toString(die_info),