diff --git a/sample/snowflake/CUSTOMER.md b/sample/snowflake/CUSTOMER.md
new file mode 100644
index 000000000..e659c1df7
--- /dev/null
+++ b/sample/snowflake/CUSTOMER.md
@@ -0,0 +1,42 @@
+# CUSTOMER
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE CUSTOMER (
+ C_CUSTKEY NUMBER(38,0) NOT NULL,
+ C_NAME VARCHAR(25) NOT NULL,
+ C_ADDRESS VARCHAR(40) NOT NULL,
+ C_NATIONKEY NUMBER(38,0) NOT NULL,
+ C_PHONE VARCHAR(15) NOT NULL,
+ C_ACCTBAL NUMBER(12,2) NOT NULL,
+ C_MKTSEGMENT VARCHAR(10),
+ C_COMMENT VARCHAR(117)
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| C_CUSTKEY | NUMBER | | false | [ORDERS](ORDERS.md) | | |
+| C_NAME | TEXT | | false | | | |
+| C_ADDRESS | TEXT | | false | | | |
+| C_NATIONKEY | NUMBER | | false | | [NATION](NATION.md) | |
+| C_PHONE | TEXT | | false | | | |
+| C_ACCTBAL | NUMBER | | false | | | |
+| C_MKTSEGMENT | TEXT | | true | | | |
+| C_COMMENT | TEXT | | true | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/CUSTOMER.svg b/sample/snowflake/CUSTOMER.svg
new file mode 100644
index 000000000..31500e878
--- /dev/null
+++ b/sample/snowflake/CUSTOMER.svg
@@ -0,0 +1,118 @@
+
+
+
+
+
diff --git a/sample/snowflake/LINEITEM.md b/sample/snowflake/LINEITEM.md
new file mode 100644
index 000000000..be1b5c054
--- /dev/null
+++ b/sample/snowflake/LINEITEM.md
@@ -0,0 +1,58 @@
+# LINEITEM
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE LINEITEM (
+ L_ORDERKEY NUMBER(38,0) NOT NULL,
+ L_PARTKEY NUMBER(38,0) NOT NULL,
+ L_SUPPKEY NUMBER(38,0) NOT NULL,
+ L_LINENUMBER NUMBER(38,0) NOT NULL,
+ L_QUANTITY NUMBER(12,2) NOT NULL,
+ L_EXTENDEDPRICE NUMBER(12,2) NOT NULL,
+ L_DISCOUNT NUMBER(12,2) NOT NULL,
+ L_TAX NUMBER(12,2) NOT NULL,
+ L_RETURNFLAG VARCHAR(1) NOT NULL,
+ L_LINESTATUS VARCHAR(1) NOT NULL,
+ L_SHIPDATE DATE NOT NULL,
+ L_COMMITDATE DATE NOT NULL,
+ L_RECEIPTDATE DATE NOT NULL,
+ L_SHIPINSTRUCT VARCHAR(25) NOT NULL,
+ L_SHIPMODE VARCHAR(10) NOT NULL,
+ L_COMMENT VARCHAR(44) NOT NULL
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| L_ORDERKEY | NUMBER | | false | | [ORDERS](ORDERS.md) | |
+| L_PARTKEY | NUMBER | | false | | [PARTSUPP](PARTSUPP.md) | |
+| L_SUPPKEY | NUMBER | | false | | [PARTSUPP](PARTSUPP.md) | |
+| L_LINENUMBER | NUMBER | | false | | | |
+| L_QUANTITY | NUMBER | | false | | | |
+| L_EXTENDEDPRICE | NUMBER | | false | | | |
+| L_DISCOUNT | NUMBER | | false | | | |
+| L_TAX | NUMBER | | false | | | |
+| L_RETURNFLAG | TEXT | | false | | | |
+| L_LINESTATUS | TEXT | | false | | | |
+| L_SHIPDATE | DATE | | false | | | |
+| L_COMMITDATE | DATE | | false | | | |
+| L_RECEIPTDATE | DATE | | false | | | |
+| L_SHIPINSTRUCT | TEXT | | false | | | |
+| L_SHIPMODE | TEXT | | false | | | |
+| L_COMMENT | TEXT | | false | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/LINEITEM.svg b/sample/snowflake/LINEITEM.svg
new file mode 100644
index 000000000..becc396a4
--- /dev/null
+++ b/sample/snowflake/LINEITEM.svg
@@ -0,0 +1,145 @@
+
+
+
+
+
diff --git a/sample/snowflake/NATION.md b/sample/snowflake/NATION.md
new file mode 100644
index 000000000..cb0bb2dca
--- /dev/null
+++ b/sample/snowflake/NATION.md
@@ -0,0 +1,34 @@
+# NATION
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE NATION (
+ N_NATIONKEY NUMBER(38,0) NOT NULL,
+ N_NAME VARCHAR(25) NOT NULL,
+ N_REGIONKEY NUMBER(38,0) NOT NULL,
+ N_COMMENT VARCHAR(152)
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| N_NATIONKEY | NUMBER | | false | [CUSTOMER](CUSTOMER.md) [SUPPLIER](SUPPLIER.md) | | |
+| N_NAME | TEXT | | false | | | |
+| N_REGIONKEY | NUMBER | | false | | [REGION](REGION.md) | |
+| N_COMMENT | TEXT | | true | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/NATION.svg b/sample/snowflake/NATION.svg
new file mode 100644
index 000000000..e0938019f
--- /dev/null
+++ b/sample/snowflake/NATION.svg
@@ -0,0 +1,137 @@
+
+
+
+
+
diff --git a/sample/snowflake/ORDERS.md b/sample/snowflake/ORDERS.md
new file mode 100644
index 000000000..a96574987
--- /dev/null
+++ b/sample/snowflake/ORDERS.md
@@ -0,0 +1,44 @@
+# ORDERS
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE ORDERS (
+ O_ORDERKEY NUMBER(38,0) NOT NULL,
+ O_CUSTKEY NUMBER(38,0) NOT NULL,
+ O_ORDERSTATUS VARCHAR(1) NOT NULL,
+ O_TOTALPRICE NUMBER(12,2) NOT NULL,
+ O_ORDERDATE DATE NOT NULL,
+ O_ORDERPRIORITY VARCHAR(15) NOT NULL,
+ O_CLERK VARCHAR(15) NOT NULL,
+ O_SHIPPRIORITY NUMBER(38,0) NOT NULL,
+ O_COMMENT VARCHAR(79) NOT NULL
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| O_ORDERKEY | NUMBER | | false | [LINEITEM](LINEITEM.md) | | |
+| O_CUSTKEY | NUMBER | | false | | [CUSTOMER](CUSTOMER.md) | |
+| O_ORDERSTATUS | TEXT | | false | | | |
+| O_TOTALPRICE | NUMBER | | false | | | |
+| O_ORDERDATE | DATE | | false | | | |
+| O_ORDERPRIORITY | TEXT | | false | | | |
+| O_CLERK | TEXT | | false | | | |
+| O_SHIPPRIORITY | NUMBER | | false | | | |
+| O_COMMENT | TEXT | | false | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/ORDERS.svg b/sample/snowflake/ORDERS.svg
new file mode 100644
index 000000000..1498606ac
--- /dev/null
+++ b/sample/snowflake/ORDERS.svg
@@ -0,0 +1,154 @@
+
+
+
+
+
diff --git a/sample/snowflake/PART.md b/sample/snowflake/PART.md
new file mode 100644
index 000000000..45d58c501
--- /dev/null
+++ b/sample/snowflake/PART.md
@@ -0,0 +1,44 @@
+# PART
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE PART (
+ P_PARTKEY NUMBER(38,0) NOT NULL,
+ P_NAME VARCHAR(55) NOT NULL,
+ P_MFGR VARCHAR(25) NOT NULL,
+ P_BRAND VARCHAR(10) NOT NULL,
+ P_TYPE VARCHAR(25) NOT NULL,
+ P_SIZE NUMBER(38,0) NOT NULL,
+ P_CONTAINER VARCHAR(10) NOT NULL,
+ P_RETAILPRICE NUMBER(12,2) NOT NULL,
+ P_COMMENT VARCHAR(23)
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| P_PARTKEY | NUMBER | | false | [PARTSUPP](PARTSUPP.md) | | |
+| P_NAME | TEXT | | false | | | |
+| P_MFGR | TEXT | | false | | | |
+| P_BRAND | TEXT | | false | | | |
+| P_TYPE | TEXT | | false | | | |
+| P_SIZE | NUMBER | | false | | | |
+| P_CONTAINER | TEXT | | false | | | |
+| P_RETAILPRICE | NUMBER | | false | | | |
+| P_COMMENT | TEXT | | true | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/PART.svg b/sample/snowflake/PART.svg
new file mode 100644
index 000000000..760e07e2d
--- /dev/null
+++ b/sample/snowflake/PART.svg
@@ -0,0 +1,81 @@
+
+
+
+
+
diff --git a/sample/snowflake/PARTSUPP.md b/sample/snowflake/PARTSUPP.md
new file mode 100644
index 000000000..3f2fbd418
--- /dev/null
+++ b/sample/snowflake/PARTSUPP.md
@@ -0,0 +1,36 @@
+# PARTSUPP
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE PARTSUPP (
+ PS_PARTKEY NUMBER(38,0) NOT NULL,
+ PS_SUPPKEY NUMBER(38,0) NOT NULL,
+ PS_AVAILQTY NUMBER(38,0) NOT NULL,
+ PS_SUPPLYCOST NUMBER(12,2) NOT NULL,
+ PS_COMMENT VARCHAR(199)
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| PS_PARTKEY | NUMBER | | false | [LINEITEM](LINEITEM.md) | [PART](PART.md) | |
+| PS_SUPPKEY | NUMBER | | false | [LINEITEM](LINEITEM.md) | [SUPPLIER](SUPPLIER.md) | |
+| PS_AVAILQTY | NUMBER | | false | | | |
+| PS_SUPPLYCOST | NUMBER | | false | | | |
+| PS_COMMENT | TEXT | | true | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/PARTSUPP.svg b/sample/snowflake/PARTSUPP.svg
new file mode 100644
index 000000000..9fb219437
--- /dev/null
+++ b/sample/snowflake/PARTSUPP.svg
@@ -0,0 +1,182 @@
+
+
+
+
+
diff --git a/sample/snowflake/README.md b/sample/snowflake/README.md
new file mode 100644
index 000000000..f38479f83
--- /dev/null
+++ b/sample/snowflake/README.md
@@ -0,0 +1,22 @@
+# TPCH_SF1
+
+## Tables
+
+| Name | Columns | Comment | Type |
+| ---- | ------- | ------- | ---- |
+| [CUSTOMER](CUSTOMER.md) | 8 | | BASE TABLE |
+| [LINEITEM](LINEITEM.md) | 16 | | BASE TABLE |
+| [NATION](NATION.md) | 4 | | BASE TABLE |
+| [ORDERS](ORDERS.md) | 9 | | BASE TABLE |
+| [PART](PART.md) | 9 | | BASE TABLE |
+| [PARTSUPP](PARTSUPP.md) | 5 | | BASE TABLE |
+| [REGION](REGION.md) | 3 | | BASE TABLE |
+| [SUPPLIER](SUPPLIER.md) | 7 | | BASE TABLE |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/REGION.md b/sample/snowflake/REGION.md
new file mode 100644
index 000000000..e3c212870
--- /dev/null
+++ b/sample/snowflake/REGION.md
@@ -0,0 +1,32 @@
+# REGION
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE REGION (
+ R_REGIONKEY NUMBER(38,0) NOT NULL,
+ R_NAME VARCHAR(25) NOT NULL,
+ R_COMMENT VARCHAR(152)
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| R_REGIONKEY | NUMBER | | false | [NATION](NATION.md) | | |
+| R_NAME | TEXT | | false | | | |
+| R_COMMENT | TEXT | | true | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/REGION.svg b/sample/snowflake/REGION.svg
new file mode 100644
index 000000000..3e5848ced
--- /dev/null
+++ b/sample/snowflake/REGION.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
diff --git a/sample/snowflake/SUPPLIER.md b/sample/snowflake/SUPPLIER.md
new file mode 100644
index 000000000..afd40c7f3
--- /dev/null
+++ b/sample/snowflake/SUPPLIER.md
@@ -0,0 +1,40 @@
+# SUPPLIER
+
+## Description
+
+
+Table Definition
+
+```sql
+create or replace TABLE SUPPLIER (
+ S_SUPPKEY NUMBER(38,0) NOT NULL,
+ S_NAME VARCHAR(25) NOT NULL,
+ S_ADDRESS VARCHAR(40) NOT NULL,
+ S_NATIONKEY NUMBER(38,0) NOT NULL,
+ S_PHONE VARCHAR(15) NOT NULL,
+ S_ACCTBAL NUMBER(12,2) NOT NULL,
+ S_COMMENT VARCHAR(101)
+);
+```
+
+
+
+## Columns
+
+| Name | Type | Default | Nullable | Children | Parents | Comment |
+| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
+| S_SUPPKEY | NUMBER | | false | [PARTSUPP](PARTSUPP.md) | | |
+| S_NAME | TEXT | | false | | | |
+| S_ADDRESS | TEXT | | false | | | |
+| S_NATIONKEY | NUMBER | | false | | [NATION](NATION.md) | |
+| S_PHONE | TEXT | | false | | | |
+| S_ACCTBAL | NUMBER | | false | | | |
+| S_COMMENT | TEXT | | true | | | |
+
+## Relations
+
+
+
+---
+
+> Generated by [tbls](https://github.com/k1LoW/tbls)
diff --git a/sample/snowflake/SUPPLIER.svg b/sample/snowflake/SUPPLIER.svg
new file mode 100644
index 000000000..6814e6356
--- /dev/null
+++ b/sample/snowflake/SUPPLIER.svg
@@ -0,0 +1,103 @@
+
+
+
+
+
diff --git a/sample/snowflake/schema.svg b/sample/snowflake/schema.svg
new file mode 100644
index 000000000..23e16dd5e
--- /dev/null
+++ b/sample/snowflake/schema.svg
@@ -0,0 +1,324 @@
+
+
+
+
+
diff --git a/testdata/snowflake_tpch_sf1.sql b/testdata/snowflake_tpch_sf1.sql
new file mode 100644
index 000000000..ef80860c2
--- /dev/null
+++ b/testdata/snowflake_tpch_sf1.sql
@@ -0,0 +1,88 @@
+-- ref: https://docs.snowflake.com/en/user-guide/sample-data-tpch.html#database-entities-relationships-and-characteristics
+CREATE OR REPLACE SCHEMA TPCH_SF1;
+USE SCHEMA TPCH_SF1;
+
+CREATE OR REPLACE TABLE CUSTOMER (
+ C_CUSTKEY NUMBER(38,0) NOT NULL
+ , C_NAME VARCHAR(25) NOT NULL
+ , C_ADDRESS VARCHAR(40) NOT NULL
+ , C_NATIONKEY NUMBER(38,0) NOT NULL
+ , C_PHONE VARCHAR(15) NOT NULL
+ , C_ACCTBAL NUMBER(12,2) NOT NULL
+ , C_MKTSEGMENT VARCHAR(10)
+ , C_COMMENT VARCHAR(117)
+);
+
+CREATE OR REPLACE TABLE LINEITEM (
+ L_ORDERKEY NUMBER(38,0) NOT NULL
+ , L_PARTKEY NUMBER(38,0) NOT NULL
+ , L_SUPPKEY NUMBER(38,0) NOT NULL
+ , L_LINENUMBER NUMBER(38,0) NOT NULL
+ , L_QUANTITY NUMBER(12,2) NOT NULL
+ , L_EXTENDEDPRICE NUMBER(12,2) NOT NULL
+ , L_DISCOUNT NUMBER(12,2) NOT NULL
+ , L_TAX NUMBER(12,2) NOT NULL
+ , L_RETURNFLAG VARCHAR(1) NOT NULL
+ , L_LINESTATUS VARCHAR(1) NOT NULL
+ , L_SHIPDATE DATE NOT NULL
+ , L_COMMITDATE DATE NOT NULL
+ , L_RECEIPTDATE DATE NOT NULL
+ , L_SHIPINSTRUCT VARCHAR(25) NOT NULL
+ , L_SHIPMODE VARCHAR(10) NOT NULL
+ , L_COMMENT VARCHAR(44) NOT NULL
+);
+
+CREATE OR REPLACE TABLE NATION (
+ N_NATIONKEY NUMBER(38,0) NOT NULL
+ , N_NAME VARCHAR(25) NOT NULL
+ , N_REGIONKEY NUMBER(38,0) NOT NULL
+ , N_COMMENT VARCHAR(152)
+);
+
+CREATE OR REPLACE TABLE ORDERS (
+ O_ORDERKEY NUMBER(38,0) NOT NULL
+ , O_CUSTKEY NUMBER(38,0) NOT NULL
+ , O_ORDERSTATUS VARCHAR(1) NOT NULL
+ , O_TOTALPRICE NUMBER(12,2) NOT NULL
+ , O_ORDERDATE DATE NOT NULL
+ , O_ORDERPRIORITY VARCHAR(15) NOT NULL
+ , O_CLERK VARCHAR(15) NOT NULL
+ , O_SHIPPRIORITY NUMBER(38,0) NOT NULL
+ , O_COMMENT VARCHAR(79) NOT NULL
+);
+
+CREATE OR REPLACE TABLE PART (
+ P_PARTKEY NUMBER(38,0) NOT NULL
+ , P_NAME VARCHAR(55) NOT NULL
+ , P_MFGR VARCHAR(25) NOT NULL
+ , P_BRAND VARCHAR(10) NOT NULL
+ , P_TYPE VARCHAR(25) NOT NULL
+ , P_SIZE NUMBER(38,0) NOT NULL
+ , P_CONTAINER VARCHAR(10) NOT NULL
+ , P_RETAILPRICE NUMBER(12,2) NOT NULL
+ , P_COMMENT VARCHAR(23)
+);
+
+CREATE OR REPLACE TABLE PARTSUPP (
+ PS_PARTKEY NUMBER(38,0) NOT NULL
+ , PS_SUPPKEY NUMBER(38,0) NOT NULL
+ , PS_AVAILQTY NUMBER(38,0) NOT NULL
+ , PS_SUPPLYCOST NUMBER(12,2) NOT NULL
+ , PS_COMMENT VARCHAR(199)
+);
+
+CREATE OR REPLACE TABLE REGION (
+ R_REGIONKEY NUMBER(38,0) NOT NULL
+ , R_NAME VARCHAR(25) NOT NULL
+ , R_COMMENT VARCHAR(152)
+);
+
+CREATE OR REPLACE TABLE SUPPLIER (
+ S_SUPPKEY NUMBER(38,0) NOT NULL
+ , S_NAME VARCHAR(25) NOT NULL
+ , S_ADDRESS VARCHAR(40) NOT NULL
+ , S_NATIONKEY NUMBER(38,0) NOT NULL
+ , S_PHONE VARCHAR(15) NOT NULL
+ , S_ACCTBAL NUMBER(12,2) NOT NULL
+ , S_COMMENT VARCHAR(101)
+);
diff --git a/testdata/snowflake_tpch_sf1.yml b/testdata/snowflake_tpch_sf1.yml
new file mode 100644
index 000000000..26e20e635
--- /dev/null
+++ b/testdata/snowflake_tpch_sf1.yml
@@ -0,0 +1,60 @@
+docPath: sample/snowflake
+relations:
+ -
+ table: CUSTOMER
+ columns:
+ - C_NATIONKEY
+ parentTable: NATION
+ parentColumns:
+ - N_NATIONKEY
+ -
+ table: LINEITEM
+ columns:
+ - L_PARTKEY
+ - L_SUPPKEY
+ parentTable: PARTSUPP
+ parentColumns:
+ - PS_PARTKEY
+ - PS_SUPPKEY
+ -
+ table: LINEITEM
+ columns:
+ - L_ORDERKEY
+ parentTable: ORDERS
+ parentColumns:
+ - O_ORDERKEY
+ -
+ table: NATION
+ columns:
+ - N_REGIONKEY
+ parentTable: REGION
+ parentColumns:
+ - R_REGIONKEY
+ -
+ table: ORDERS
+ columns:
+ - O_CUSTKEY
+ parentTable: CUSTOMER
+ parentColumns:
+ - C_CUSTKEY
+ -
+ table: PARTSUPP
+ columns:
+ - PS_PARTKEY
+ parentTable: PART
+ parentColumns:
+ - P_PARTKEY
+ -
+ table: PARTSUPP
+ columns:
+ - PS_SUPPKEY
+ parentTable: SUPPLIER
+ parentColumns:
+ - S_SUPPKEY
+ -
+ table: SUPPLIER
+ columns:
+ - S_NATIONKEY
+ parentTable: NATION
+ parentColumns:
+ - N_NATIONKEY