# MySQL Arguments use `?` placeholders. Name the parameters by adding comments before the statement: ```sql -- ? name1 (text) -- ? name2 (int) = 0 SELECT * FROM users WHERE name = ? AND age > ?; ``` ## Receiving an S3Object as a script parameter Declare the arg with type `(s3object)`. Windmill renders an S3 file picker for it, downloads the file, and binds it as JSON text — Parquet/CSV files are decoded server-side into a JSON array of records, JSON/JSONL pass through. Consume with `JSON_TABLE`: ```sql -- ? file (s3object) SELECT id, name FROM JSON_TABLE(?, '$[*]' COLUMNS (id INT PATH '$.id', name VARCHAR(200) PATH '$.name') ) AS r; ``` ## Streaming query results to S3 Add a `-- s3` directive at the top of the script to stream the result set to S3 instead of returning rows. Windmill writes the file and returns its `S3Object` as the script result. ```sql -- s3 prefix=exports/users format=parquet SELECT id, name FROM users; ``` All keys are optional: `prefix` (object key prefix), `storage` (named storage — omit to use the workspace default), `format` (`json` (default), `parquet`, or `csv`). Use this for large result sets — rows stream directly to S3 instead of being buffered as the script return value.