├── .github └── workflows │ └── rust.yml ├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── cli ├── Cargo.toml └── src │ └── main.rs ├── go ├── go.mod ├── go.sum └── main.go ├── playground ├── .eslintrc.json ├── .gitignore ├── .husky │ └── pre-commit ├── App.tsx ├── Cargo.toml ├── Makefile ├── bun.lockb ├── index.tsx ├── package.json ├── public │ └── index.html ├── src │ └── lib.rs └── tsconfig.json ├── server ├── .gitkeep ├── Cargo.toml └── src │ ├── auth.rs │ ├── lib.rs │ ├── query_request.rs │ └── server.rs └── sf ├── Cargo.toml └── src ├── error.rs ├── expr.rs ├── lib.rs ├── parser.rs ├── plan.rs ├── processor.rs └── value.rs /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: rust 2 | 3 | on: 4 | push: 5 | paths: 6 | - "cli/**" 7 | - "sf/**" 8 | - "server/**" 9 | 10 | jobs: 11 | test: 12 | name: run test 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions-rs/toolchain@v1 17 | with: 18 | toolchain: stable 19 | components: rustfmt, clippy 20 | - uses: actions-rs/cargo@v1 21 | with: 22 | command: fmt 23 | args: --all -- --check 24 | - uses: actions-rs/cargo@v1 25 | with: 26 | command: clippy 27 | - uses: actions-rs/cargo@v1 28 | with: 29 | command: test 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries 6 | # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html 7 | Cargo.lock 8 | 9 | # These are backup files generated by rustfmt 10 | **/*.rs.bk 11 | 12 | 13 | # Added by cargo 14 | 15 | /target 16 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = ["server", "cli", "playground", "sf"] 3 | default-members = ["cli"] 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 sivchari 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # snowflake-emulator 2 | Snowflake emulator written in Rust 3 | -------------------------------------------------------------------------------- /cli/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cli" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | server = {path = "../server"} 10 | -------------------------------------------------------------------------------- /cli/src/main.rs: -------------------------------------------------------------------------------- 1 | use server::server; 2 | 3 | fn main() -> std::io::Result<()> { 4 | server::run("localhost", 8000) 5 | } 6 | -------------------------------------------------------------------------------- /go/go.mod: -------------------------------------------------------------------------------- 1 | module sf 2 | 3 | go 1.19 4 | 5 | require github.com/snowflakedb/gosnowflake v1.6.13 6 | 7 | require ( 8 | github.com/Azure/azure-pipeline-go v0.2.3 // indirect 9 | github.com/Azure/azure-storage-blob-go v0.15.0 // indirect 10 | github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect 11 | github.com/aws/aws-sdk-go-v2 v1.16.13 // indirect 12 | github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.6 // indirect 13 | github.com/aws/aws-sdk-go-v2/credentials v1.12.17 // indirect 14 | github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.30 // indirect 15 | github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.20 // indirect 16 | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.14 // indirect 17 | github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.11 // indirect 18 | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.7 // indirect 19 | github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.15 // indirect 20 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.14 // indirect 21 | github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.14 // indirect 22 | github.com/aws/aws-sdk-go-v2/service/s3 v1.27.8 // indirect 23 | github.com/aws/smithy-go v1.13.1 // indirect 24 | github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect 25 | github.com/gabriel-vasile/mimetype v1.4.1 // indirect 26 | github.com/google/flatbuffers v2.0.8+incompatible // indirect 27 | github.com/google/uuid v1.3.0 // indirect 28 | github.com/jmespath/go-jmespath v0.4.0 // indirect 29 | github.com/klauspost/compress v1.15.9 // indirect 30 | github.com/mattn/go-ieproxy v0.0.7 // indirect 31 | github.com/pierrec/lz4/v4 v4.1.15 // indirect 32 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect 33 | github.com/sirupsen/logrus v1.9.0 // indirect 34 | golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect 35 | golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b // indirect 36 | golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect 37 | golang.org/x/text v0.3.7 // indirect 38 | golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect 39 | ) 40 | -------------------------------------------------------------------------------- /go/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 4 | gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= 5 | github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= 6 | github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= 7 | github.com/Azure/azure-storage-blob-go v0.15.0 h1:rXtgp8tN1p29GvpGgfJetavIG0V7OgcSXPpwp3tx6qk= 8 | github.com/Azure/azure-storage-blob-go v0.15.0/go.mod h1:vbjsVbX0dlxnRc4FFMPsS9BsJWPcne7GB7onqlPvz58= 9 | github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= 10 | github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 11 | github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= 12 | github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= 13 | github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= 14 | github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 15 | github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= 16 | github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= 17 | github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= 18 | github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= 19 | github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 20 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 21 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 22 | github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 23 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 24 | github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 h1:q4dksr6ICHXqG5hm0ZW5IHyeEJXoIJSOZeBLmWPNeIQ= 25 | github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= 26 | github.com/aws/aws-sdk-go-v2 v1.16.13 h1:HgF7OX2q0gSZtcXoo9DMEA8A2Qk/GCxmWyM0RI7Yz2Y= 27 | github.com/aws/aws-sdk-go-v2 v1.16.13/go.mod h1:xSyvSnzh0KLs5H4HJGeIEsNYemUWdNIl0b/rP6SIsLU= 28 | github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.6 h1:PPefqpze5qW/eqdgK5RqtOTQi5GhXpSxitbGqImAQ1I= 29 | github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.6/go.mod h1:bcLsAUI2iDC8zC52XQvczR/zpaC1q/wP32p3wwvqGVo= 30 | github.com/aws/aws-sdk-go-v2/config v1.17.4 h1:9HY1wbShqObySCHP2Z07blfrSWVX+nVxCZmUuLZKcG8= 31 | github.com/aws/aws-sdk-go-v2/config v1.17.4/go.mod h1:ul+ru+huVpfduF9XRmGUq82T8T3K+nIFQuF6F+L+548= 32 | github.com/aws/aws-sdk-go-v2/credentials v1.12.17 h1:htUjIJOQcvIUR0jC4eLkdis1DfaLL4EUbIKUFqh2WFA= 33 | github.com/aws/aws-sdk-go-v2/credentials v1.12.17/go.mod h1:jd1mvJulXY7ccHvcSiJceYhv06yWIIRkJnwWEA4IX+g= 34 | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.14 h1:NZwZFtxXGOEIiCd8jWN55lexakug543CaO68bTpoLwg= 35 | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.14/go.mod h1:5CU57SyF5jZLSIw4OOll0PG83ThXwNdkRFOc0EltD/0= 36 | github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.30 h1:Rtd+R7uWtQg5+bZ72x1g1ENjQykhFKnayo6Lv/QpxFU= 37 | github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.30/go.mod h1:Fbi0PULkPycJg44P9rwhQUGknk8Fl6DUTXcCaSZ6FeI= 38 | github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.20 h1:Rk8eqZSdFovt8Id+O+i2qT0c3CY13DPn2SfGOEVlxNs= 39 | github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.20/go.mod h1:gdZ5gRUaxThXIZyZQ8MTtgYBk2jbHgp05BO3GcD9Cwc= 40 | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.14 h1:6Yxuq9yrkoLYab5JXqJnto9tdRuIcYVdR+eiKjsJYWU= 41 | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.14/go.mod h1:GEV9jaDPIgayiU+uevxwozcvUOjc+P4aHE2BeSjm2vE= 42 | github.com/aws/aws-sdk-go-v2/internal/ini v1.3.21 h1:lpwSbLKYTuABo6SyUoC25xAmfO3/TehGS2SmD1EtOL0= 43 | github.com/aws/aws-sdk-go-v2/internal/ini v1.3.21/go.mod h1:Q0pktZjvRZk77TBto6yAvUAi7fcse1bdcMctBDVGgBw= 44 | github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.11 h1:zFriLANEIFWl/TQvPqhRASnU8Xr9fzshPL0OY7e1DpM= 45 | github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.11/go.mod h1:EAtoA46xWR2I0fROMCsb0lgC4kYfgaK9EBrCv9hIHYM= 46 | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.7 h1:f0l2kujaZ0UyqwfKdtPaYQs8vzFmLbtPhWDNYeEY4ho= 47 | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.7/go.mod h1:aGaU7sKr91r4yZCi+4fWpsDepAzy8A6u/1enpD3K6mM= 48 | github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.15 h1:xw0EMeNfAdmiFX3Ix9OOdqW/S2GPeV3WAYKHr2qR/W4= 49 | github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.15/go.mod h1:SvmZIJp6fx7Yua+4hhigLm5kVRDWo56Cj+j8FvVl6M8= 50 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.14 h1:c5hJNN2DkK1gAytcKp7LkiKNDJeevFSboPezEHAM4Ro= 51 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.14/go.mod h1:8qOLjqMzY/S1kh3myDXA1yxK5eD4uN8aOJgKpgvc4OM= 52 | github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.14 h1:sGFyMilgKmgg8TsGMUXApIvIrbc9SZs2sFrbdugL21c= 53 | github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.14/go.mod h1:QWqlQbLB0GYO6hDDUwPKr2VKr7C6lpCdOzs92IVYQmk= 54 | github.com/aws/aws-sdk-go-v2/service/s3 v1.27.8 h1:zYpocIndjdPRURWkq/Rschy8WpC+vL0f74z+lJhEpJk= 55 | github.com/aws/aws-sdk-go-v2/service/s3 v1.27.8/go.mod h1:aljgUlqAplymnhQNEcyx/fjUmQtOXCsS6Ry+ySpCcA8= 56 | github.com/aws/aws-sdk-go-v2/service/sso v1.11.20 h1:3raP0UC9rvRyY4/cc4o4F3jTrNo94AYiarNUGNnq6dU= 57 | github.com/aws/aws-sdk-go-v2/service/sso v1.11.20/go.mod h1:hPsROgDdgY/NQ1gPt7VJWG0GjSnalDC0DkkMfGEw2gc= 58 | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.2 h1:/SYpdjjAtraymql+/r719OgjxezdanAQiLb/NMxDb04= 59 | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.2/go.mod h1:5cxfDYtY2mDOlmesy4yycb6lwyy1U/iAUOHKhQLKw/E= 60 | github.com/aws/aws-sdk-go-v2/service/sts v1.16.16 h1:otZvq9r+xjPL7qU/luX2QdBamiN+oSZURRi4sAKymO8= 61 | github.com/aws/aws-sdk-go-v2/service/sts v1.16.16/go.mod h1:Y9iBgT1w2vHtYzJEkwD6FqILjDSsvbxcW/+wIYxyse4= 62 | github.com/aws/smithy-go v1.13.1 h1:q09BdpUiaqpothcv393ACfWJJHzlzjB5HaNL1XHKmoQ= 63 | github.com/aws/smithy-go v1.13.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= 64 | github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= 65 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 66 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 67 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 68 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 69 | github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 70 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 71 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 72 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 73 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 74 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 75 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 76 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 77 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 78 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 79 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 80 | github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 81 | github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 82 | github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 83 | github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8= 84 | github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 85 | github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= 86 | github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= 87 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 88 | github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= 89 | github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= 90 | github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= 91 | github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 92 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 93 | github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= 94 | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= 95 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 96 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 97 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 98 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 99 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 100 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 101 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 102 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 103 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 104 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 105 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 106 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 107 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 108 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 109 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 110 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 111 | github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 112 | github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM= 113 | github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 114 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 115 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 116 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 117 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 118 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 119 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 120 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 121 | github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= 122 | github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 123 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 124 | github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 125 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= 126 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 127 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= 128 | github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= 129 | github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= 130 | github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= 131 | github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= 132 | github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 133 | github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 134 | github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= 135 | github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= 136 | github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= 137 | github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= 138 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 139 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 140 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 141 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 142 | github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= 143 | github.com/mattn/go-ieproxy v0.0.7 h1:d2hBmNUJOAf2aGgzMQtz1wBByJQvRk72/1TXBiCVHXU= 144 | github.com/mattn/go-ieproxy v0.0.7/go.mod h1:6ZpRmhBaYuBX1U2za+9rC9iCGLsSp2tftelZne7CPko= 145 | github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= 146 | github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= 147 | github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 148 | github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= 149 | github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 150 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= 151 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 152 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 153 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 154 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 155 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 156 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 157 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 158 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 159 | github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= 160 | github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= 161 | github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 162 | github.com/snowflakedb/gosnowflake v1.6.13 h1:r8iozak/p3P2jYfjF3EbeteqMMzPWjwmVrdENJDW6EI= 163 | github.com/snowflakedb/gosnowflake v1.6.13/go.mod h1:BoZ0gnLERaUEiziH4Dumim10LN8cvoaCKovsAfhxzrE= 164 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 165 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 166 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 167 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 168 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 169 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 170 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 171 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 172 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 173 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 174 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 175 | golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 176 | golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 177 | golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= 178 | golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 179 | golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 180 | golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 181 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 182 | golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 183 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 184 | golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3 h1:n9HxLrNxWWtEb1cA950nuEEj3QnKbtsCJ6KjcgisNUs= 185 | golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= 186 | golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 187 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 188 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 189 | golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 190 | golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 191 | golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 192 | golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 193 | golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 194 | golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 195 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 196 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 197 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 198 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 199 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 200 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 201 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 202 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 203 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 204 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 205 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 206 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 207 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 208 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 209 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 210 | golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 211 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 212 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 213 | golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 214 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 215 | golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 216 | golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 217 | golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= 218 | golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 219 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 220 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 221 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 222 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 223 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 224 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 225 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 226 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 227 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 228 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 229 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 230 | golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 231 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 232 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 233 | golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 234 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 235 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 236 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 237 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 238 | golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 239 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 240 | golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 241 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 242 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 243 | golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= 244 | golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 245 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 246 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 247 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 248 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 249 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 250 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 251 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 252 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 253 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 254 | golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 255 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 256 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 257 | golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 258 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 259 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 260 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 261 | golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 262 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 263 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 264 | golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 265 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 266 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 267 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 268 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 269 | golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= 270 | golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= 271 | gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= 272 | gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= 273 | gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= 274 | gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= 275 | gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= 276 | gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= 277 | gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= 278 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 279 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 280 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 281 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 282 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 283 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 284 | google.golang.org/genproto v0.0.0-20210630183607-d20f26d13c79/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= 285 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 286 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 287 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 288 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 289 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= 290 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 291 | google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 292 | google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= 293 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 294 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 295 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 296 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 297 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 298 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 299 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 300 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 301 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 302 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 303 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 304 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 305 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 306 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 307 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 308 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 309 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 310 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= 311 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 312 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 313 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 314 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 315 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 316 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 317 | -------------------------------------------------------------------------------- /go/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "database/sql" 5 | "log" 6 | 7 | sf "github.com/snowflakedb/gosnowflake" 8 | ) 9 | 10 | func main() { 11 | cfg := &sf.Config{ 12 | Account: "account", 13 | User: "user", 14 | Password: "password", 15 | Database: "database", 16 | Schema: "scheme", 17 | Protocol: "http", 18 | Host: "localhost", 19 | Port: 8000, 20 | } 21 | dsn, _ := sf.DSN(cfg) 22 | db, _ := sql.Open("snowflake", dsn) 23 | if err := db.Ping(); err != nil { 24 | panic(err) 25 | } 26 | rows, err := db.Query("SELECT id, name FROM personal2") 27 | if err != nil { 28 | panic(err) 29 | } 30 | type dest struct { 31 | ID int 32 | Name string 33 | } 34 | 35 | var d dest 36 | for rows.Next() { 37 | if err := rows.Scan(&d.ID, &d.Name); err != nil { 38 | log.Println(err) 39 | break 40 | } 41 | } 42 | 43 | log.Println(d) 44 | 45 | log.Println("end") 46 | } 47 | -------------------------------------------------------------------------------- /playground/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:react/recommended", 9 | "plugin:@typescript-eslint/recommended" 10 | ], 11 | "overrides": [], 12 | "parser": "@typescript-eslint/parser", 13 | "parserOptions": { 14 | "ecmaVersion": "latest", 15 | "sourceType": "module" 16 | }, 17 | "plugins": [ 18 | "react", 19 | "@typescript-eslint" 20 | ], 21 | "rules": { 22 | "react/jsx-uses-react": "off", 23 | "react/react-in-jsx-scope": "off" 24 | }, 25 | "ignorePatterns": [ 26 | "node_modules/", 27 | "wasm/" 28 | ] 29 | } -------------------------------------------------------------------------------- /playground/.gitignore: -------------------------------------------------------------------------------- 1 | **/*.trace 2 | **/*.zip 3 | **/*.tar.gz 4 | **/*.tgz 5 | **/*.log 6 | 7 | package-lock.json 8 | **/*.bun 9 | 10 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 11 | 12 | # dependencies 13 | /node_modules 14 | /.pnp 15 | .pnp.js 16 | 17 | # testing 18 | /coverage 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | .env.local 26 | .env.development.local 27 | .env.test.local 28 | .env.production.local 29 | 30 | npm-debug.log* 31 | yarn-debug.log* 32 | yarn-error.log* 33 | -------------------------------------------------------------------------------- /playground/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | cd playground && bun run lint 5 | -------------------------------------------------------------------------------- /playground/App.tsx: -------------------------------------------------------------------------------- 1 | import { ChangeEvent, useState } from 'react'; 2 | import init, { exec_query } from './wasm'; 3 | 4 | const App: React.FC = () => { 5 | const [rows, setRows] = useState(''); 6 | const [query, setQuery] = useState(''); 7 | const execQuery = (q: string) => { 8 | init().then(() => { 9 | setRows(exec_query(q)); 10 | }) 11 | } 12 | return ( 13 |
14 |

Snowflake Playground

15 |

Query

16 | ) => setQuery(e.target.value)} /> 17 | 18 |

Result

19 |

{rows}

20 |
21 | ); 22 | } 23 | 24 | export default App; 25 | -------------------------------------------------------------------------------- /playground/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "playground" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | wasm-bindgen = {version = "0.2.63", features = ["serde-serialize"]} 10 | sf = {path = "../sf"} 11 | 12 | [lib] 13 | crate-type = ["cdylib"] 14 | 15 | -------------------------------------------------------------------------------- /playground/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: build 2 | build: 3 | wasm-pack build --target web --out-dir wasm 4 | -------------------------------------------------------------------------------- /playground/bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivchari/snowflake-emulator/6814a42f83cb0a820775cbb79593ca419bf14cb1/playground/bun.lockb -------------------------------------------------------------------------------- /playground/index.tsx: -------------------------------------------------------------------------------- 1 | import App from './App'; 2 | import * as ReactDOM from 'react-dom'; 3 | 4 | ReactDOM.render(, document.getElementById('root')); 5 | 6 | -------------------------------------------------------------------------------- /playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground", 3 | "version": "0.1.2", 4 | "dependencies": { 5 | "react": "^18.2.0", 6 | "react-dom": "^18.2.0" 7 | }, 8 | "scripts": { 9 | "lint": "eslint ." 10 | }, 11 | "eslintConfig": { 12 | "extends": [ 13 | "react-app" 14 | ] 15 | }, 16 | "devDependencies": { 17 | "@types/node": "^18.7.14", 18 | "@types/react": "^18.0.18", 19 | "@types/react-dom": "^18.0.6", 20 | "@typescript-eslint/eslint-plugin": "^5.36.1", 21 | "@typescript-eslint/parser": "^5.36.1", 22 | "bun-types": "^0.1.10", 23 | "eslint": "^8.23.0", 24 | "eslint-plugin-react": "^7.31.5", 25 | "husky": "^8.0.1", 26 | "react-refresh": "0.10.0", 27 | "typescript": "^4.8.2" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /playground/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Snowflake Playground 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /playground/src/lib.rs: -------------------------------------------------------------------------------- 1 | use sf; 2 | use wasm_bindgen::prelude::*; 3 | 4 | #[wasm_bindgen] 5 | extern "C" { 6 | pub fn alert(s: &str); 7 | } 8 | 9 | #[wasm_bindgen] 10 | pub fn greet(name: &str) { 11 | alert(&format!("Hello, {}!", name)); 12 | } 13 | 14 | #[wasm_bindgen] 15 | pub fn exec_query(query: &str) -> String { 16 | let stmt = sf::parser::query_to_statment(&query).unwrap(); 17 | let plan = sf::plan::statement_to_plan(&stmt).unwrap(); 18 | let rows = plan.execute_plan().unwrap(); 19 | let string_rows = rows 20 | .rowsets 21 | .iter() 22 | .map(|r| r.join("|")) 23 | .collect::>() 24 | .join("|"); 25 | let string_rowtypesname = rows 26 | .rowtypes 27 | .iter() 28 | .map(|r| format!("{}", r.name)) 29 | .collect::>() 30 | .join("|"); 31 | let string_rowtypes = rows 32 | .rowtypes 33 | .iter() 34 | .map(|r| format!("{}", r.r#type)) 35 | .collect::>() 36 | .join("|"); 37 | format!( 38 | "rows: {} 39 | name: {} 40 | types: {}", 41 | string_rows, string_rowtypesname, string_rowtypes 42 | ) 43 | } 44 | -------------------------------------------------------------------------------- /playground/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": [ 4 | "ES2017", 5 | "DOM" 6 | ], 7 | "jsx": "react-jsx" 8 | }, 9 | "include": [ 10 | "**/*.ts", 11 | "**/*.tsx" 12 | ], 13 | "exclude": [ 14 | "node_modules", 15 | "tests" 16 | ] 17 | } -------------------------------------------------------------------------------- /server/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivchari/snowflake-emulator/6814a42f83cb0a820775cbb79593ca419bf14cb1/server/.gitkeep -------------------------------------------------------------------------------- /server/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "server" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | actix-web = "4" 10 | futures = "0.3.5" 11 | serde = { version = "^1.0.101", features = ["derive"] } 12 | serde_json = "^1.0.41" 13 | sf = { path = "../sf" } 14 | sqlx = { version = "0.6", features = ["sqlite", "chrono", "runtime-actix-native-tls", "decimal", "json"], default-features = false } 15 | 16 | -------------------------------------------------------------------------------- /server/src/auth.rs: -------------------------------------------------------------------------------- 1 | use actix_web::{post, HttpRequest, HttpResponse}; 2 | use serde::Serialize; 3 | 4 | #[derive(Serialize)] 5 | struct AuthResponse { 6 | data: AuthResponseMain, 7 | message: String, 8 | code: String, 9 | success: bool, 10 | } 11 | 12 | #[derive(Serialize)] 13 | struct AuthResponseMain { 14 | token: String, 15 | master_validity_in_seconds: String, 16 | display_user_name: String, 17 | server_version: String, 18 | first_login: bool, 19 | rem_me_token: String, 20 | rem_me_validity_in_seconds: String, 21 | health_check_interval: String, 22 | new_client_for_upgrade: String, 23 | session_id: String, 24 | parameters: Vec, 25 | session_info: String, 26 | } 27 | 28 | #[derive(Serialize)] 29 | struct Parameter { 30 | name: String, 31 | value: String, 32 | } 33 | 34 | #[derive(Serialize)] 35 | struct AuthResponseSessionInfo { 36 | database_name: String, 37 | schema_name: String, 38 | ware_house_name: String, 39 | role_name: String, 40 | } 41 | 42 | // TODO: Deserialize a request body. 43 | #[post("/session/v1/login-request")] 44 | async fn handler(_req: HttpRequest) -> HttpResponse { 45 | let auth = AuthResponse { 46 | data: AuthResponseMain { 47 | token: "".to_string(), 48 | master_validity_in_seconds: "".to_string(), 49 | display_user_name: "".to_string(), 50 | server_version: "".to_string(), 51 | first_login: true, 52 | rem_me_token: "".to_string(), 53 | rem_me_validity_in_seconds: "".to_string(), 54 | health_check_interval: "".to_string(), 55 | new_client_for_upgrade: "".to_string(), 56 | session_id: "".to_string(), 57 | parameters: vec![], 58 | session_info: "".to_string(), 59 | }, 60 | message: "".to_string(), 61 | code: "".to_string(), 62 | success: true, 63 | }; 64 | 65 | let body = serde_json::to_string(&auth).unwrap(); 66 | 67 | HttpResponse::Ok() 68 | .content_type("application/json") 69 | .body(body) 70 | } 71 | -------------------------------------------------------------------------------- /server/src/lib.rs: -------------------------------------------------------------------------------- 1 | mod auth; 2 | mod query_request; 3 | pub mod server; 4 | -------------------------------------------------------------------------------- /server/src/query_request.rs: -------------------------------------------------------------------------------- 1 | use actix_web::{post, web, HttpResponse, Result}; 2 | use futures::TryStreamExt; 3 | use serde::{Deserialize, Serialize}; 4 | use sf::{parser, plan}; 5 | use sqlx::sqlite::{SqliteColumn, SqliteRow}; 6 | use sqlx::{Column, Row}; 7 | use std::sync::Arc; 8 | 9 | use crate::server::Context; 10 | 11 | #[derive(Deserialize, Debug)] 12 | #[serde(rename_all = "camelCase")] 13 | struct QueryRequest { 14 | sql_text: String, 15 | async_exec: bool, 16 | sequence_id: u32, 17 | is_internal: bool, 18 | } 19 | 20 | #[derive(Serialize)] 21 | struct ExecResponse { 22 | data: ExecResponseData, 23 | message: String, 24 | code: String, 25 | success: bool, 26 | } 27 | 28 | #[derive(Serialize)] 29 | struct ExecResponseData { 30 | rowtype: Vec, 31 | rowset: Vec>, 32 | } 33 | 34 | #[derive(Serialize)] 35 | struct RowType { 36 | name: String, 37 | r#type: String, 38 | } 39 | 40 | fn extract_value(row: &SqliteRow, col: &SqliteColumn) -> String { 41 | let column_name = col.name(); 42 | if let Ok(value) = row.try_get(column_name) { 43 | let value: Option = value; 44 | value.unwrap() 45 | } else if let Ok(value) = row.try_get(column_name) { 46 | let value: Option<&str> = value; 47 | value.unwrap().to_string() 48 | } else if let Ok(value) = row.try_get(column_name) { 49 | let value: Option = value; 50 | value.unwrap().to_string() 51 | } else { 52 | "NULL".to_string() 53 | } 54 | } 55 | 56 | #[post("/queries/v1/query-request")] 57 | async fn handler( 58 | ctx: web::Data>, 59 | query_request: web::Json, 60 | ) -> Result { 61 | // exec sqlite 62 | let mut rowtypes = vec![]; 63 | let mut rowsets = vec![]; 64 | let mut rows = sqlx::query(&query_request.sql_text).fetch(&ctx.pool.clone()); 65 | while let Some(row) = rows.try_next().await.unwrap() { 66 | rowtypes = row 67 | .columns() 68 | .iter() 69 | .map(|c| RowType { 70 | name: c.name().to_string(), 71 | r#type: c.type_info().to_string(), 72 | }) 73 | .collect(); 74 | let mut rowset = vec![]; 75 | for column in row.columns() { 76 | rowset.push(extract_value(&row, &column)); 77 | } 78 | rowsets.push(rowset); 79 | } 80 | let exec_response = ExecResponse { 81 | data: ExecResponseData { 82 | rowtype: rowtypes 83 | .iter() 84 | .map(|r| RowType { 85 | name: r.name.clone(), 86 | r#type: r.r#type.clone(), 87 | }) 88 | .collect(), 89 | rowset: rowsets, 90 | }, 91 | message: format!( 92 | "{} and {} and {} and {}", 93 | query_request.sql_text, 94 | query_request.async_exec, 95 | query_request.is_internal, 96 | query_request.sequence_id 97 | ) 98 | .to_string(), 99 | code: "".to_string(), 100 | success: true, 101 | }; 102 | let body = serde_json::to_string(&exec_response).unwrap(); 103 | Ok(HttpResponse::Ok() 104 | .content_type("application/json") 105 | .body(body)) 106 | 107 | // fail: following code 108 | // let stmt = parser::query_to_statment(&query_request.sql_text).unwrap(); 109 | // let plan = plan::statement_to_plan(&stmt).unwrap(); 110 | // let rows = plan.execute_plan().unwrap(); 111 | // let exec_response = ExecResponse { 112 | // data: ExecResponseData { 113 | // rowtype: rows 114 | // .rowtypes 115 | // .iter() 116 | // .map(|r| RowType { 117 | // name: r.name.clone(), 118 | // r#type: r.r#type.clone(), 119 | // }) 120 | // .collect(), 121 | // rowset: rows.rowsets, 122 | // }, 123 | // message: format!( 124 | // "{} and {} and {} and {}", 125 | // query_request.sql_text, 126 | // query_request.async_exec, 127 | // query_request.is_internal, 128 | // query_request.sequence_id 129 | // ) 130 | // .to_string(), 131 | // code: "".to_string(), 132 | // success: true, 133 | // }; 134 | // let body = serde_json::to_string(&exec_response).unwrap(); 135 | // Ok(HttpResponse::Ok() 136 | // .content_type("application/json") 137 | // .body(body)) 138 | } 139 | -------------------------------------------------------------------------------- /server/src/server.rs: -------------------------------------------------------------------------------- 1 | use actix_web::{web, App, HttpServer}; 2 | use sqlx::sqlite::{SqlitePool, SqlitePoolOptions}; 3 | use std::fs::remove_file; 4 | use std::sync::Arc; 5 | 6 | use crate::{auth, query_request}; 7 | 8 | #[actix_web::main] 9 | pub async fn run(host: &str, port: u16) -> std::io::Result<()> { 10 | let ctx = Arc::new(Context::new().await); 11 | HttpServer::new(move || { 12 | App::new() 13 | .app_data(web::Data::new(ctx.clone())) 14 | .service(auth::handler) 15 | .service(query_request::handler) 16 | }) 17 | .bind((host, port))? 18 | .run() 19 | .await?; 20 | remove_file("sqlite://snowflake-emulator.db") 21 | } 22 | 23 | pub struct Context { 24 | pub pool: SqlitePool, 25 | } 26 | 27 | impl Context { 28 | pub async fn new() -> Self { 29 | let pool = SqlitePoolOptions::new() 30 | .connect("sqlite://snowflake-emulator.db?mode=rwc") 31 | .await 32 | .unwrap(); 33 | Self { pool } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sf/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "sf" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | sqlparser = "0.22.0" 10 | 11 | -------------------------------------------------------------------------------- /sf/src/error.rs: -------------------------------------------------------------------------------- 1 | use sqlparser::parser; 2 | use sqlparser::tokenizer; 3 | use std::fmt; 4 | 5 | #[derive(Debug)] 6 | pub enum Error { 7 | NotImplemented(String), 8 | ParserError(parser::ParserError), 9 | TokenizerError(tokenizer::TokenizerError), 10 | } 11 | 12 | impl From for Error { 13 | fn from(error: parser::ParserError) -> Self { 14 | Error::ParserError(error) 15 | } 16 | } 17 | 18 | impl From for Error { 19 | fn from(error: tokenizer::TokenizerError) -> Self { 20 | Error::TokenizerError(error) 21 | } 22 | } 23 | 24 | impl fmt::Display for Error { 25 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 26 | match self { 27 | Error::NotImplemented(msg) => write!(f, "Not implemented error {}", msg), 28 | Error::ParserError(msg) => write!(f, "ParserError {}", msg), 29 | Error::TokenizerError(msg) => write!(f, "TokenizerError {}", msg), 30 | } 31 | } 32 | } 33 | 34 | pub type Result = std::result::Result; 35 | -------------------------------------------------------------------------------- /sf/src/expr.rs: -------------------------------------------------------------------------------- 1 | use crate::error::{Error, Result}; 2 | use crate::value::*; 3 | use sqlparser::ast; 4 | 5 | #[derive(Debug, PartialEq, Eq)] 6 | pub enum Expr { 7 | Value(Value), 8 | Identifier { value: String, column_name: String }, 9 | } 10 | 11 | pub fn ast_to_expr(expr: &ast::Expr) -> Result { 12 | match expr { 13 | ast::Expr::Value(value) => match value { 14 | ast::Value::Number(ref n, ref l) => Ok(Expr::Value(Value::Number(n.to_string(), *l))), 15 | ast::Value::SingleQuotedString(ref s) => Ok(Expr::Value(Value::String(s.to_string()))), 16 | ast::Value::Boolean(ref b) => Ok(Expr::Value(Value::Boolean(*b))), 17 | _ => { 18 | return Err(Error::NotImplemented( 19 | "this expr is not supported".to_string(), 20 | )) 21 | } 22 | }, 23 | ast::Expr::Identifier(ref i) => { 24 | let value = i.value.to_string(); 25 | let column_name = match i.quote_style { 26 | Some(_) => i.value.to_string(), 27 | None => "".to_string(), 28 | }; 29 | Ok(Expr::Identifier { value, column_name }) 30 | } 31 | _ => { 32 | return Err(Error::NotImplemented( 33 | "this expr is not supported".to_string(), 34 | )) 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sf/src/lib.rs: -------------------------------------------------------------------------------- 1 | mod error; 2 | mod expr; 3 | pub mod parser; 4 | pub mod plan; 5 | pub mod processor; 6 | mod value; 7 | -------------------------------------------------------------------------------- /sf/src/parser.rs: -------------------------------------------------------------------------------- 1 | use crate::error::Result; 2 | use sqlparser::ast; 3 | use sqlparser::dialect::SnowflakeDialect; 4 | use sqlparser::parser; 5 | use sqlparser::tokenizer; 6 | 7 | pub fn query_to_statment(query: &str) -> Result { 8 | let dialect = SnowflakeDialect {}; 9 | let mut tokenizer = tokenizer::Tokenizer::new(&dialect, query); 10 | let tokens = tokenizer.tokenize()?; 11 | let mut parser = parser::Parser::new(tokens, &dialect); 12 | let stmt = parser.parse_statement()?; 13 | Ok(stmt) 14 | } 15 | 16 | #[cfg(test)] 17 | mod test { 18 | use super::*; 19 | use sqlparser::{ast, keywords::NO}; 20 | 21 | #[test] 22 | fn parse_select1() { 23 | let query = "SELECT 1;"; 24 | let stmt = query_to_statment(query).unwrap(); 25 | let expected = ast::Statement::Query(Box::new(ast::Query { 26 | with: None, 27 | body: Box::new(ast::SetExpr::Select(Box::new(ast::Select { 28 | distinct: false, 29 | top: None, 30 | projection: vec![ast::SelectItem::UnnamedExpr(ast::Expr::Value( 31 | ast::Value::Number("1".to_string(), false), 32 | ))], 33 | into: None, 34 | from: vec![], 35 | lateral_views: vec![], 36 | selection: None, 37 | group_by: vec![], 38 | cluster_by: vec![], 39 | distribute_by: vec![], 40 | sort_by: vec![], 41 | having: None, 42 | qualify: None, 43 | }))), 44 | order_by: vec![], 45 | limit: None, 46 | offset: None, 47 | fetch: None, 48 | lock: None, 49 | })); 50 | assert_eq!(expected, stmt); 51 | } 52 | 53 | #[test] 54 | fn parse_simple() { 55 | let query = r#"SELECT 1, a, "b", 'c', true FROM t;"#; 56 | let stmt = query_to_statment(query).unwrap(); 57 | let expected = ast::Statement::Query(Box::new(ast::Query { 58 | with: None, 59 | body: Box::new(ast::SetExpr::Select(Box::new(ast::Select { 60 | distinct: false, 61 | top: None, 62 | projection: vec![ 63 | ast::SelectItem::UnnamedExpr(ast::Expr::Value(ast::Value::Number( 64 | "1".to_string(), 65 | false, 66 | ))), 67 | ast::SelectItem::UnnamedExpr(ast::Expr::Identifier(ast::Ident { 68 | value: "a".to_string(), 69 | quote_style: None, 70 | })), 71 | ast::SelectItem::UnnamedExpr(ast::Expr::Identifier(ast::Ident { 72 | value: "b".to_string(), 73 | quote_style: Some('"'), 74 | })), 75 | ast::SelectItem::UnnamedExpr(ast::Expr::Value(ast::Value::SingleQuotedString( 76 | "c".to_string(), 77 | ))), 78 | ast::SelectItem::UnnamedExpr(ast::Expr::Value(ast::Value::Boolean(true))), 79 | ], 80 | into: None, 81 | from: vec![ast::TableWithJoins { 82 | relation: ast::TableFactor::Table { 83 | name: ast::ObjectName(vec![ast::Ident { 84 | value: "t".to_string(), 85 | quote_style: None, 86 | }]), 87 | alias: None, 88 | args: None, 89 | with_hints: vec![], 90 | }, 91 | joins: vec![], 92 | }], 93 | lateral_views: vec![], 94 | selection: None, 95 | group_by: vec![], 96 | cluster_by: vec![], 97 | distribute_by: vec![], 98 | sort_by: vec![], 99 | having: None, 100 | qualify: None, 101 | }))), 102 | order_by: vec![], 103 | limit: None, 104 | offset: None, 105 | fetch: None, 106 | lock: None, 107 | })); 108 | assert_eq!(expected, stmt); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /sf/src/plan.rs: -------------------------------------------------------------------------------- 1 | use crate::error::{Error, Result}; 2 | use crate::expr::*; 3 | use sqlparser::ast; 4 | 5 | #[derive(Debug)] 6 | pub enum Plan { 7 | Select { exprs: Vec }, 8 | } 9 | 10 | pub fn statement_to_plan(stmt: &ast::Statement) -> Result { 11 | match stmt { 12 | ast::Statement::Query(ref query) => query_to_plan(query), 13 | _ => Err(Error::NotImplemented( 14 | "the type is not supported, now".to_string(), 15 | )), 16 | } 17 | } 18 | 19 | pub fn query_to_plan(query: &ast::Query) -> Result { 20 | match query.body.as_ref() { 21 | ast::SetExpr::Select(ref select) => { 22 | let mut exprs: Vec = Vec::new(); 23 | for p in select.projection.iter() { 24 | match p { 25 | // TODO: refactor 26 | ast::SelectItem::UnnamedExpr(ref expr) => { 27 | let expr = ast_to_expr(expr)?; 28 | exprs.push(expr); 29 | } 30 | _ => { 31 | return Err(Error::NotImplemented( 32 | "this expr is not supported".to_string(), 33 | )) 34 | } 35 | } 36 | } 37 | Ok(Plan::Select { exprs }) 38 | } 39 | _ => { 40 | return Err(Error::NotImplemented( 41 | "the type is not supported, now".to_string(), 42 | )) 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /sf/src/processor.rs: -------------------------------------------------------------------------------- 1 | use crate::error::Result; 2 | use crate::expr; 3 | use crate::plan; 4 | use crate::value; 5 | 6 | // TODO: impl Iterator 7 | #[derive(Debug)] 8 | pub struct Rows { 9 | pub rowsets: Vec>, 10 | pub rowtypes: Vec, 11 | } 12 | 13 | #[derive(Debug)] 14 | pub struct RowType { 15 | pub name: String, 16 | pub r#type: String, 17 | } 18 | 19 | // rowtypes: [int, string, bool] 20 | // rowsets: [["1", "a", "true"], ["2", "b", "false"]] 21 | impl plan::Plan { 22 | pub fn execute_plan(&self) -> Result { 23 | let mut rowsets: Vec> = Vec::new(); 24 | match self { 25 | plan::Plan::Select { ref exprs } => { 26 | let mut rows: Vec = Vec::new(); 27 | let mut rowtypes: Vec = Vec::new(); 28 | for expr in exprs.iter() { 29 | match expr { 30 | expr::Expr::Value(ref value) => match value { 31 | value::Value::Number(ref n, ref l) => { 32 | rows.push(n.to_string()); 33 | match *l { 34 | true => rowtypes.push(RowType { 35 | name: n.to_string(), 36 | r#type: "float".to_string(), 37 | }), 38 | false => rowtypes.push(RowType { 39 | name: n.to_string(), 40 | r#type: "number".to_string(), 41 | }), 42 | } 43 | } 44 | value::Value::String(ref s) => { 45 | rows.push(s.to_string()); 46 | rowtypes.push(RowType { 47 | name: s.to_string(), 48 | r#type: "string".to_string(), 49 | }); 50 | } 51 | value::Value::Boolean(ref b) => { 52 | rows.push(b.to_string()); 53 | rowtypes.push(RowType { 54 | name: b.to_string(), 55 | r#type: "boolean".to_string(), 56 | }); 57 | } 58 | }, 59 | expr::Expr::Identifier { 60 | ref value, 61 | ref column_name, 62 | } => { 63 | rows.push(value.to_string()); 64 | let name = match column_name.as_str() { 65 | "" => value.to_string(), 66 | _ => column_name.to_string(), 67 | }; 68 | rowtypes.push(RowType { 69 | name, 70 | r#type: "string".to_string(), 71 | }); 72 | } 73 | } 74 | } 75 | rowsets.push(rows); 76 | Ok(Rows { rowsets, rowtypes }) 77 | } 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /sf/src/value.rs: -------------------------------------------------------------------------------- 1 | use std::fmt; 2 | 3 | #[derive(Debug, PartialEq, Eq, Clone)] 4 | pub enum Value { 5 | // e.g. 6 | // 1 -> Number("1", false) 7 | // 1.5 -> Number("1.5", true) 8 | Number(String, bool), 9 | String(String), 10 | Boolean(bool), 11 | } 12 | 13 | impl fmt::Display for Value { 14 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 15 | match self { 16 | Value::Number(ref n, l) => write!(f, "{}{long}", n, long = if *l { "L" } else { "" }), 17 | Value::String(ref s) => write!(f, "'{}'", s), 18 | Value::Boolean(ref b) => write!(f, "{}", b), 19 | } 20 | } 21 | } 22 | --------------------------------------------------------------------------------