Skip to content
Written with Claude
IMPORTANT

As you may notice, this page and pretty much the entire website were obviously created with the help of AI. I wonder how you could tell? Was it a big "Written With Claude" badge on every page? I moved it to the top now (with the help of AI of course) to make it even more obvious. There are a few blogposts that were written by me manually, the old-fashioned way, I hope there will be more in the future, and those have a similar "Human Written" badge. This project (not the website), on the other hand, is a very, very different story. It took me more than two years of painstaking and unpaid work in my own free time. A story that, hopefully, I will tell someday. But meanwhile, what would you like me to do? To create a complex documentation website with a bunch of highly technical articles with the help of AI and fake it, to give you an illusion that I also did that manually? Like the half of itnernet is doing at this point? How does that makes any sense? Is that even fair to you? Or maybe to create this website manually, the old-fashioned way, just for you? While working a paid job for a salary, most of you wouldn't even get up in the morning. Would you like me to sing you a song while we're at it? For your personal entertainment? Seriously, get a grip. Do you find this information less valuable because of the way this website was created? I give my best to fix it to keep the information as accurate as possible, and I think it is very accurate at this point. If you find some mistakes, inaccurancies or problems, there is a comment section at the bottom of every page, which I also made with the help of the AI. And I woould very much appreciate if you leave your feedback there. Look, I'm just a guy who likes SQL, that's all. If you don't approve of how this website was constructed and the use of AI tools, I suggest closing this page and never wever coming back. And good riddance. And I would ban your access if I could know how. Thank you for your attention to this matter.

RAW

Also known as

raw_mode, raw_results (with or without @ prefix)

Return raw text output instead of JSON formatting.

Syntax

@raw

Examples

Basic Raw Output

sql
create function get_plain_text()
returns text
language sql
as $$select 'Hello, World!'$$;

comment on function get_plain_text() is
'HTTP GET
@raw';

Response: Hello, World! (plain text, no JSON wrapping)

Raw with Multiple Columns

sql
create function get_user_info()
returns table(name text, email text)
language sql
as $$select name, email from users limit 1$$;

comment on function get_user_info() is
'HTTP GET
@raw';

Response: JohnDoe john@example.com (values concatenated)

CSV Export

sql
create function export_users_csv()
returns table(id int, name text, email text)
language sql
as $$select id, name, email from users$$;

comment on function export_users_csv() is
'HTTP GET
@raw
@separator ,
@new_line \n
@columns
Content-Type: text/csv';

Response:

id,name,email
1,John Doe,john@example.com
2,Jane Smith,jane@example.com

Tab-Separated Values

sql
create function export_tsv()
returns table(col1 text, col2 text, col3 text)
language sql
as $$select * from my_table$$;

comment on function export_tsv() is
'HTTP GET
@raw
@separator \t
@new_line \n
Content-Type: text/tab-separated-values';

Pipe-Delimited Format

sql
create function export_data()
returns table(a text, b text, c text)
language sql
as $$...$$;

comment on function export_data() is
'HTTP GET
@raw
@separator |
@new_line \n';

Response:

value1|value2|value3
value4|value5|value6

Download as File

sql
create function download_report()
returns table(data text)
language sql
as $$...$$;

comment on function download_report() is
'HTTP GET
@raw
Content-Type: text/csv
Content-Disposition: attachment; filename="report.csv"';

Browser will download the response as a file.

Dynamic CSV Download

Use {param_name} template syntax in headers for dynamic content type and filename:

sql
create function export_data(_type text, _file text)
returns table(id int, name text, email text)
language sql
as $$select id, name, email from users$$;

comment on function export_data(text, text) is
'HTTP GET
@raw
@separator ,
@new_line \n
@columns
Content-Type: {_type}
Content-Disposition: attachment; filename={_file}';

Request: GET /api/export-data?_type=text/csv&_file=users.csv

Response headers:

Content-Type: text/csv
Content-Disposition: attachment; filename=users.csv

Response body:

id,name,email
1,John Doe,john@example.com
2,Jane Smith,jane@example.com

Behavior

  • Returns content as plain text instead of JSON
  • Multiple columns are concatenated (use separator to delimit)
  • Multiple rows are concatenated (use new_line to delimit)
  • Use with Content-Type header to set appropriate media type

Comments

Released under the MIT License.