{"format":1,"manifest":{"name":"sql-mysql-postgres-snippets","publisher":"vyloxi","version":"1.0.0","displayName":"SQL for MySQL and Postgres","description":"Tables, indexes, upserts, JSON, window functions, CTEs, users and admin queries for MySQL and PostgreSQL.","engines":{"ferrum":"^0.1.0"},"categories":["Snippets"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","contributes":{"snippets":[{"language":"SQL","path":"snippets/sql.json"},{"language":"SQL Dialects","path":"snippets/sql-dialects.json"}]}},"files":{"icon.png":{"encoding":"base64","content":"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"},"snippets/sql.json":{"encoding":"utf8","content":"{\n  \"Postgres: table with uuid\": {\n    \"prefix\": \"pgtable\",\n    \"body\": [\n      \"CREATE TABLE ${1:items} (\",\n      \"  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\",\n      \"  ${2:name} TEXT NOT NULL,\",\n      \"  created_at TIMESTAMPTZ NOT NULL DEFAULT now()\",\n      \");\"\n    ],\n    \"description\": \"A Postgres table\"\n  },\n  \"MySQL: table\": {\n    \"prefix\": \"mytable\",\n    \"body\": [\n      \"CREATE TABLE ${1:items} (\",\n      \"  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,\",\n      \"  ${2:name} VARCHAR(255) NOT NULL,\",\n      \"  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\",\n      \") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\"\n    ],\n    \"description\": \"A MySQL table\"\n  },\n  \"Postgres: upsert\": {\n    \"prefix\": \"pgupsert\",\n    \"body\": [\n      \"INSERT INTO ${1:items} (${2:id}, ${3:name})\",\n      \"VALUES (${4:1}, ${5:'a'})\",\n      \"ON CONFLICT (${2:id}) DO UPDATE SET ${3:name} = EXCLUDED.${3:name};\"\n    ],\n    \"description\": \"INSERT ... ON CONFLICT\"\n  },\n  \"MySQL: upsert\": {\n    \"prefix\": \"myupsert\",\n    \"body\": [\n      \"INSERT INTO ${1:items} (${2:id}, ${3:name})\",\n      \"VALUES (${4:1}, ${5:'a'})\",\n      \"ON DUPLICATE KEY UPDATE ${3:name} = VALUES(${3:name});\"\n    ],\n    \"description\": \"INSERT ... ON DUPLICATE KEY\"\n  },\n  \"Foreign key\": {\n    \"prefix\": \"fk\",\n    \"body\": [\n      \"ALTER TABLE ${1:orders}\",\n      \"  ADD CONSTRAINT fk_${1:orders}_${2:user}\",\n      \"  FOREIGN KEY (${2:user_id}) REFERENCES ${3:users}(id) ON DELETE CASCADE;\"\n    ],\n    \"description\": \"A foreign key\"\n  },\n  \"Index\": {\n    \"prefix\": \"idx\",\n    \"body\": [\n      \"CREATE INDEX ${1:idx_name} ON ${2:table} (${3:column});\"\n    ],\n    \"description\": \"An index\"\n  },\n  \"Postgres: partial index\": {\n    \"prefix\": \"pgidx\",\n    \"body\": [\n      \"CREATE INDEX ${1:idx_name} ON ${2:table} (${3:column}) WHERE ${4:deleted_at IS NULL};\"\n    ],\n    \"description\": \"A partial index\"\n  },\n  \"Postgres: JSONB query\": {\n    \"prefix\": \"pgjson\",\n    \"body\": [\n      \"SELECT ${1:data}->>'${2:key}' AS ${2:key}\",\n      \"FROM ${3:table}\",\n      \"WHERE ${1:data} @> '{\\\"${4:status}\\\": \\\"${5:active}\\\"}';\"\n    ],\n    \"description\": \"Query a JSONB column\"\n  },\n  \"MySQL: JSON extract\": {\n    \"prefix\": \"myjson\",\n    \"body\": [\n      \"SELECT JSON_UNQUOTE(JSON_EXTRACT(${1:data}, '$.${2:key}')) AS ${2:key}\",\n      \"FROM ${3:table};\"\n    ],\n    \"description\": \"Query a JSON column\"\n  },\n  \"CTE\": {\n    \"prefix\": \"cte\",\n    \"body\": [\n      \"WITH ${1:recent} AS (\",\n      \"  SELECT * FROM ${2:table} WHERE ${3:created_at} > now() - interval '7 days'\",\n      \")\",\n      \"SELECT * FROM ${1:recent};\"\n    ],\n    \"description\": \"A common table expression\"\n  },\n  \"Recursive CTE\": {\n    \"prefix\": \"rcte\",\n    \"body\": [\n      \"WITH RECURSIVE ${1:tree} AS (\",\n      \"  SELECT id, parent_id, 1 AS depth FROM ${2:nodes} WHERE parent_id IS NULL\",\n      \"  UNION ALL\",\n      \"  SELECT n.id, n.parent_id, t.depth + 1 FROM ${2:nodes} n JOIN ${1:tree} t ON n.parent_id = t.id\",\n      \")\",\n      \"SELECT * FROM ${1:tree};\"\n    ],\n    \"description\": \"A recursive CTE\"\n  },\n  \"Window: row number\": {\n    \"prefix\": \"winrow\",\n    \"body\": [\n      \"SELECT *, ROW_NUMBER() OVER (PARTITION BY ${1:group_id} ORDER BY ${2:created_at} DESC) AS rn\",\n      \"FROM ${3:table};\"\n    ],\n    \"description\": \"ROW_NUMBER per group\"\n  },\n  \"Top N per group\": {\n    \"prefix\": \"topn\",\n    \"body\": [\n      \"SELECT * FROM (\",\n      \"  SELECT *, ROW_NUMBER() OVER (PARTITION BY ${1:group_id} ORDER BY ${2:created_at} DESC) AS rn\",\n      \"  FROM ${3:table}\",\n      \") t WHERE rn = 1;\"\n    ],\n    \"description\": \"The newest row per group\"\n  },\n  \"Pagination\": {\n    \"prefix\": \"page\",\n    \"body\": [\n      \"SELECT * FROM ${1:table} ORDER BY ${2:id} LIMIT ${3:20} OFFSET ${4:0};\"\n    ],\n    \"description\": \"LIMIT and OFFSET\"\n  },\n  \"Duplicates\": {\n    \"prefix\": \"dups\",\n    \"body\": [\n      \"SELECT ${1:email}, COUNT(*) AS n FROM ${2:users} GROUP BY ${1:email} HAVING COUNT(*) > 1;\"\n    ],\n    \"description\": \"Find duplicates\"\n  },\n  \"Postgres: explain\": {\n    \"prefix\": \"pgexplain\",\n    \"body\": [\n      \"EXPLAIN (ANALYZE, BUFFERS) ${1:SELECT 1};\"\n    ],\n    \"description\": \"EXPLAIN ANALYZE\"\n  },\n  \"MySQL: explain\": {\n    \"prefix\": \"myexplain\",\n    \"body\": [\n      \"EXPLAIN ${1:SELECT 1};\"\n    ],\n    \"description\": \"EXPLAIN\"\n  },\n  \"Postgres: create user\": {\n    \"prefix\": \"pguser\",\n    \"body\": [\n      \"CREATE ROLE ${1:app} LOGIN PASSWORD '${2:change-me}';\",\n      \"GRANT CONNECT ON DATABASE ${3:db} TO ${1:app};\",\n      \"GRANT USAGE ON SCHEMA public TO ${1:app};\",\n      \"GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO ${1:app};\"\n    ],\n    \"description\": \"A role with privileges\"\n  },\n  \"MySQL: create user\": {\n    \"prefix\": \"myuser\",\n    \"body\": [\n      \"CREATE USER '${1:app}'@'%' IDENTIFIED BY '${2:change-me}';\",\n      \"GRANT SELECT, INSERT, UPDATE, DELETE ON ${3:db}.* TO '${1:app}'@'%';\",\n      \"FLUSH PRIVILEGES;\"\n    ],\n    \"description\": \"A user with privileges\"\n  },\n  \"Table sizes (Postgres)\": {\n    \"prefix\": \"pgsize\",\n    \"body\": [\n      \"SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) AS size FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 20;\"\n    ],\n    \"description\": \"Largest tables\"\n  },\n  \"Table sizes (MySQL)\": {\n    \"prefix\": \"mysize\",\n    \"body\": [\n      \"SELECT table_name, ROUND((data_length + index_length) / 1024 / 1024, 1) AS mb FROM information_schema.tables WHERE table_schema = DATABASE() ORDER BY mb DESC LIMIT 20;\"\n    ],\n    \"description\": \"Largest tables\"\n  },\n  \"Updated at trigger (Postgres)\": {\n    \"prefix\": \"pgtrig\",\n    \"body\": [\n      \"CREATE OR REPLACE FUNCTION set_updated_at() RETURNS trigger AS $$\",\n      \"BEGIN\",\n      \"  NEW.updated_at = now();\",\n      \"  RETURN NEW;\",\n      \"END;\",\n      \"$$ LANGUAGE plpgsql;\",\n      \"\",\n      \"CREATE TRIGGER ${1:items}_updated BEFORE UPDATE ON ${1:items} FOR EACH ROW EXECUTE FUNCTION set_updated_at();\"\n    ],\n    \"description\": \"Keep updated_at fresh\"\n  }\n}\n"},"snippets/sql-dialects.json":{"encoding":"utf8","content":"{\n  \"Postgres: table with uuid\": {\n    \"prefix\": \"pgtable\",\n    \"body\": [\n      \"CREATE TABLE ${1:items} (\",\n      \"  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\",\n      \"  ${2:name} TEXT NOT NULL,\",\n      \"  created_at TIMESTAMPTZ NOT NULL DEFAULT now()\",\n      \");\"\n    ],\n    \"description\": \"A Postgres table\"\n  },\n  \"MySQL: table\": {\n    \"prefix\": \"mytable\",\n    \"body\": [\n      \"CREATE TABLE ${1:items} (\",\n      \"  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,\",\n      \"  ${2:name} VARCHAR(255) NOT NULL,\",\n      \"  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\",\n      \") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\"\n    ],\n    \"description\": \"A MySQL table\"\n  },\n  \"Postgres: upsert\": {\n    \"prefix\": \"pgupsert\",\n    \"body\": [\n      \"INSERT INTO ${1:items} (${2:id}, ${3:name})\",\n      \"VALUES (${4:1}, ${5:'a'})\",\n      \"ON CONFLICT (${2:id}) DO UPDATE SET ${3:name} = EXCLUDED.${3:name};\"\n    ],\n    \"description\": \"INSERT ... ON CONFLICT\"\n  },\n  \"MySQL: upsert\": {\n    \"prefix\": \"myupsert\",\n    \"body\": [\n      \"INSERT INTO ${1:items} (${2:id}, ${3:name})\",\n      \"VALUES (${4:1}, ${5:'a'})\",\n      \"ON DUPLICATE KEY UPDATE ${3:name} = VALUES(${3:name});\"\n    ],\n    \"description\": \"INSERT ... ON DUPLICATE KEY\"\n  },\n  \"Foreign key\": {\n    \"prefix\": \"fk\",\n    \"body\": [\n      \"ALTER TABLE ${1:orders}\",\n      \"  ADD CONSTRAINT fk_${1:orders}_${2:user}\",\n      \"  FOREIGN KEY (${2:user_id}) REFERENCES ${3:users}(id) ON DELETE CASCADE;\"\n    ],\n    \"description\": \"A foreign key\"\n  },\n  \"Index\": {\n    \"prefix\": \"idx\",\n    \"body\": [\n      \"CREATE INDEX ${1:idx_name} ON ${2:table} (${3:column});\"\n    ],\n    \"description\": \"An index\"\n  },\n  \"Postgres: partial index\": {\n    \"prefix\": \"pgidx\",\n    \"body\": [\n      \"CREATE INDEX ${1:idx_name} ON ${2:table} (${3:column}) WHERE ${4:deleted_at IS NULL};\"\n    ],\n    \"description\": \"A partial index\"\n  },\n  \"Postgres: JSONB query\": {\n    \"prefix\": \"pgjson\",\n    \"body\": [\n      \"SELECT ${1:data}->>'${2:key}' AS ${2:key}\",\n      \"FROM ${3:table}\",\n      \"WHERE ${1:data} @> '{\\\"${4:status}\\\": \\\"${5:active}\\\"}';\"\n    ],\n    \"description\": \"Query a JSONB column\"\n  },\n  \"MySQL: JSON extract\": {\n    \"prefix\": \"myjson\",\n    \"body\": [\n      \"SELECT JSON_UNQUOTE(JSON_EXTRACT(${1:data}, '$.${2:key}')) AS ${2:key}\",\n      \"FROM ${3:table};\"\n    ],\n    \"description\": \"Query a JSON column\"\n  },\n  \"CTE\": {\n    \"prefix\": \"cte\",\n    \"body\": [\n      \"WITH ${1:recent} AS (\",\n      \"  SELECT * FROM ${2:table} WHERE ${3:created_at} > now() - interval '7 days'\",\n      \")\",\n      \"SELECT * FROM ${1:recent};\"\n    ],\n    \"description\": \"A common table expression\"\n  },\n  \"Recursive CTE\": {\n    \"prefix\": \"rcte\",\n    \"body\": [\n      \"WITH RECURSIVE ${1:tree} AS (\",\n      \"  SELECT id, parent_id, 1 AS depth FROM ${2:nodes} WHERE parent_id IS NULL\",\n      \"  UNION ALL\",\n      \"  SELECT n.id, n.parent_id, t.depth + 1 FROM ${2:nodes} n JOIN ${1:tree} t ON n.parent_id = t.id\",\n      \")\",\n      \"SELECT * FROM ${1:tree};\"\n    ],\n    \"description\": \"A recursive CTE\"\n  },\n  \"Window: row number\": {\n    \"prefix\": \"winrow\",\n    \"body\": [\n      \"SELECT *, ROW_NUMBER() OVER (PARTITION BY ${1:group_id} ORDER BY ${2:created_at} DESC) AS rn\",\n      \"FROM ${3:table};\"\n    ],\n    \"description\": \"ROW_NUMBER per group\"\n  },\n  \"Top N per group\": {\n    \"prefix\": \"topn\",\n    \"body\": [\n      \"SELECT * FROM (\",\n      \"  SELECT *, ROW_NUMBER() OVER (PARTITION BY ${1:group_id} ORDER BY ${2:created_at} DESC) AS rn\",\n      \"  FROM ${3:table}\",\n      \") t WHERE rn = 1;\"\n    ],\n    \"description\": \"The newest row per group\"\n  },\n  \"Pagination\": {\n    \"prefix\": \"page\",\n    \"body\": [\n      \"SELECT * FROM ${1:table} ORDER BY ${2:id} LIMIT ${3:20} OFFSET ${4:0};\"\n    ],\n    \"description\": \"LIMIT and OFFSET\"\n  },\n  \"Duplicates\": {\n    \"prefix\": \"dups\",\n    \"body\": [\n      \"SELECT ${1:email}, COUNT(*) AS n FROM ${2:users} GROUP BY ${1:email} HAVING COUNT(*) > 1;\"\n    ],\n    \"description\": \"Find duplicates\"\n  },\n  \"Postgres: explain\": {\n    \"prefix\": \"pgexplain\",\n    \"body\": [\n      \"EXPLAIN (ANALYZE, BUFFERS) ${1:SELECT 1};\"\n    ],\n    \"description\": \"EXPLAIN ANALYZE\"\n  },\n  \"MySQL: explain\": {\n    \"prefix\": \"myexplain\",\n    \"body\": [\n      \"EXPLAIN ${1:SELECT 1};\"\n    ],\n    \"description\": \"EXPLAIN\"\n  },\n  \"Postgres: create user\": {\n    \"prefix\": \"pguser\",\n    \"body\": [\n      \"CREATE ROLE ${1:app} LOGIN PASSWORD '${2:change-me}';\",\n      \"GRANT CONNECT ON DATABASE ${3:db} TO ${1:app};\",\n      \"GRANT USAGE ON SCHEMA public TO ${1:app};\",\n      \"GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO ${1:app};\"\n    ],\n    \"description\": \"A role with privileges\"\n  },\n  \"MySQL: create user\": {\n    \"prefix\": \"myuser\",\n    \"body\": [\n      \"CREATE USER '${1:app}'@'%' IDENTIFIED BY '${2:change-me}';\",\n      \"GRANT SELECT, INSERT, UPDATE, DELETE ON ${3:db}.* TO '${1:app}'@'%';\",\n      \"FLUSH PRIVILEGES;\"\n    ],\n    \"description\": \"A user with privileges\"\n  },\n  \"Table sizes (Postgres)\": {\n    \"prefix\": \"pgsize\",\n    \"body\": [\n      \"SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) AS size FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 20;\"\n    ],\n    \"description\": \"Largest tables\"\n  },\n  \"Table sizes (MySQL)\": {\n    \"prefix\": \"mysize\",\n    \"body\": [\n      \"SELECT table_name, ROUND((data_length + index_length) / 1024 / 1024, 1) AS mb FROM information_schema.tables WHERE table_schema = DATABASE() ORDER BY mb DESC LIMIT 20;\"\n    ],\n    \"description\": \"Largest tables\"\n  },\n  \"Updated at trigger (Postgres)\": {\n    \"prefix\": \"pgtrig\",\n    \"body\": [\n      \"CREATE OR REPLACE FUNCTION set_updated_at() RETURNS trigger AS $$\",\n      \"BEGIN\",\n      \"  NEW.updated_at = now();\",\n      \"  RETURN NEW;\",\n      \"END;\",\n      \"$$ LANGUAGE plpgsql;\",\n      \"\",\n      \"CREATE TRIGGER ${1:items}_updated BEFORE UPDATE ON ${1:items} FOR EACH ROW EXECUTE FUNCTION set_updated_at();\"\n    ],\n    \"description\": \"Keep updated_at fresh\"\n  }\n}\n"},"README.md":{"encoding":"utf8","content":"# SQL for MySQL and Postgres\n\nTables, indexes, upserts, JSON, window functions, CTEs, users and admin queries for MySQL and PostgreSQL.\n\nType a prefix and press Tab. 44 snippets.\n\n| Language | Prefix | What it inserts |\n| --- | --- | --- |\n| SQL | `pgtable` | A Postgres table |\n| SQL | `mytable` | A MySQL table |\n| SQL | `pgupsert` | INSERT ... ON CONFLICT |\n| SQL | `myupsert` | INSERT ... ON DUPLICATE KEY |\n| SQL | `fk` | A foreign key |\n| SQL | `idx` | An index |\n| SQL | `pgidx` | A partial index |\n| SQL | `pgjson` | Query a JSONB column |\n| SQL | `myjson` | Query a JSON column |\n| SQL | `cte` | A common table expression |\n| SQL | `rcte` | A recursive CTE |\n| SQL | `winrow` | ROW_NUMBER per group |\n| SQL | `topn` | The newest row per group |\n| SQL | `page` | LIMIT and OFFSET |\n| SQL | `dups` | Find duplicates |\n| SQL | `pgexplain` | EXPLAIN ANALYZE |\n| SQL | `myexplain` | EXPLAIN |\n| SQL | `pguser` | A role with privileges |\n| SQL | `myuser` | A user with privileges |\n| SQL | `pgsize` | Largest tables |\n| SQL | `mysize` | Largest tables |\n| SQL | `pgtrig` | Keep updated_at fresh |\n| SQL Dialects | `pgtable` | A Postgres table |\n| SQL Dialects | `mytable` | A MySQL table |\n| SQL Dialects | `pgupsert` | INSERT ... ON CONFLICT |\n| SQL Dialects | `myupsert` | INSERT ... ON DUPLICATE KEY |\n| SQL Dialects | `fk` | A foreign key |\n| SQL Dialects | `idx` | An index |\n| SQL Dialects | `pgidx` | A partial index |\n| SQL Dialects | `pgjson` | Query a JSONB column |\n| SQL Dialects | `myjson` | Query a JSON column |\n| SQL Dialects | `cte` | A common table expression |\n| SQL Dialects | `rcte` | A recursive CTE |\n| SQL Dialects | `winrow` | ROW_NUMBER per group |\n| SQL Dialects | `topn` | The newest row per group |\n| SQL Dialects | `page` | LIMIT and OFFSET |\n| SQL Dialects | `dups` | Find duplicates |\n| SQL Dialects | `pgexplain` | EXPLAIN ANALYZE |\n| SQL Dialects | `myexplain` | EXPLAIN |\n| SQL Dialects | `pguser` | A role with privileges |\n| SQL Dialects | `myuser` | A user with privileges |\n| SQL Dialects | `pgsize` | Largest tables |\n| SQL Dialects | `mysize` | Largest tables |\n| SQL Dialects | `pgtrig` | Keep updated_at fresh |\n\nThis extension runs no code and asks for no permissions.\n"}}}