grafana/public/app/plugins/datasource/postgres/sqlUtil.ts
Zoltán Bedi 62c30dea4d
MySQL: Quote identifiers that include special characters (#61135)
* SQL: toRawSQL required and escape table

* Fix autocomplete for MySQL

* Change the way we escape for builder

* Rework escape ident to be smart instead

* Fix A11y for alias

* Add first e2e test

* Add test for code editor

* Add doc

* Review comments

* Move functions to sqlUtil
2023-01-31 18:16:28 +01:00

86 lines
2.3 KiB
TypeScript

import { isEmpty } from 'lodash';
import { RAQBFieldTypes, SQLQuery } from 'app/features/plugins/sql/types';
import { createSelectClause, haveColumns } from 'app/features/plugins/sql/utils/sql.utils';
export function getFieldConfig(type: string): { raqbFieldType: RAQBFieldTypes; icon: string } {
switch (type) {
case 'boolean': {
return { raqbFieldType: 'boolean', icon: 'toggle-off' };
}
case 'bit':
case 'bit varying':
case 'character':
case 'character varying':
case 'text': {
return { raqbFieldType: 'text', icon: 'text' };
}
case 'smallint':
case 'integer':
case 'bigint':
case 'decimal':
case 'numeric':
case 'real':
case 'double precision':
case 'serial':
case 'bigserial':
case 'smallserial': {
return { raqbFieldType: 'number', icon: 'calculator-alt' };
}
case 'date': {
return { raqbFieldType: 'date', icon: 'clock-nine' };
}
case 'time':
case 'time with time zone':
case 'time without time zone':
case 'interval': {
return { raqbFieldType: 'time', icon: 'clock-nine' };
}
case 'timestamp':
case 'timestamp with time zone':
case 'timestamp without time zone': {
return { raqbFieldType: 'datetime', icon: 'clock-nine' };
}
default:
return { raqbFieldType: 'text', icon: 'text' };
}
}
export function toRawSql({ sql, table }: SQLQuery): string {
let rawQuery = '';
// Return early with empty string if there is no sql column
if (!sql || !haveColumns(sql.columns)) {
return rawQuery;
}
rawQuery += createSelectClause(sql.columns);
if (table) {
rawQuery += `FROM ${table} `;
}
if (sql.whereString) {
rawQuery += `WHERE ${sql.whereString} `;
}
if (sql.groupBy?.[0]?.property.name) {
const groupBy = sql.groupBy.map((g) => g.property.name).filter((g) => !isEmpty(g));
rawQuery += `GROUP BY ${groupBy.join(', ')} `;
}
if (sql.orderBy?.property.name) {
rawQuery += `ORDER BY ${sql.orderBy.property.name} `;
}
if (sql.orderBy?.property.name && sql.orderByDirection) {
rawQuery += `${sql.orderByDirection} `;
}
// Altough LIMIT 0 doesn't make sense, it is still possible to have LIMIT 0
if (sql.limit !== undefined && sql.limit >= 0) {
rawQuery += `LIMIT ${sql.limit} `;
}
return rawQuery;
}