#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near :( - sql

I try to upload my backup SQL ( 10 days ago ) and get the following error:
Error
SQL query:
INSERT INTO `tlc_2_icl_strings` (`id`, `language`, `context`, `name`, `value`, `string_package_id`, `type`, `title`, `status`, `gettext_context`, `domain_name_context_md5`) VALUES
(339, 'en', 'us', 'ff242757e5c1e721795821ecbb4faa47', 'Menu Hover Text Color', NULL, 'LINE', NULL, 0, '', 'd17598730ad5b89d5156deab80901e2c'),
(340, 'en', 'us', 'cc5873ef6cc4407707d02137e62bca9c', 'Dropdown Background Color', NULL, 'LINE', NULL, 0, '', '6bc21a9c11719c10eb36ceaccde586d5'),
(341, 'en', 'us', '7438cef42306265c506b8c08ea81e169', 'Dropdown Text Color', NULL, 'LINE', NULL, 0, '', 'e3b512326d7eaf37193cc6d27acae76d'),
(342, 'en', 'us', 'bb38a8990bde7186a9f94d255f2c558b', 'Dropdown Hover Background Color', NULL, 'LINE', NULL, 0, '', '83dd52f7f96bcfb5677d842d86006ce7'),
(343, 'en', 'us', '5f71e49358bad1a47d34b1004ab9535f', 'Dropdown Hover Text Color', NULL, 'LINE', NULL, 0, '', '4de2db7c374f895b6d2e07b2e6490202'),
(344, 'en', 'us', '83a985eb08f189a5a39f866a9c8627a9', 'Dropdown Active Background Color',[...]
MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''cc348e437dc74681e343' at line 91
I don't know what to do! Thank you in advance...

Related

How use alternative font with writeHTMLCell

I am using TCPDF library and I would like to use a different font after setting "setFont".
PS: in the following example Titillium font has already been converted to tcpdf.
This is my code:
$pdf->SetTextColor(0,0,0);
$pdf->setFont('Arial','',10);
$html = <<<EOD
<div style="font-family:'Titillium Web';">Hello!</div>
EOD;
$pdf->writeHTMLCell('', '', 10, 10, $html, '', 0, '', true, '', true);
This still contains the Arial font inside.
I also tried :
$pdf->SetTextColor(0,0,0);
$pdf->setFont('Arial','',10);
$html = <<<EOD
<style>
.usefont{ font-family:'Titillium Web'; }
</style>
<div class="usefont">Hello!</div>
EOD;
$pdf->writeHTMLCell('', '', 10, 10, $html, '', 0, '', true, '', true);
but nothing.
Any idea?

Update SQL table with json object

I have the following json object:-
{'follow_up_timestamp': '2021-09-21 22:16:36', 'id_fu': '', 'redcap_survey_identifier': '', 'nps': '76', 'improve': 'test', 'dowell': 'test', 'follow_up_complete': 'Complete', 'australian_hospital_patient_experience_question_se_timestamp': '[not completed]', 'more_qu': 'Yes', 'views': 'Always', 'needs': 'Always', 'unmet_need': '', 'cared': '', 'involvement': '', 'informed': 'Sometimes', 'team_communication': 'Sometimes', 'pain': '', 'confident': '', 'harm_distress': '', 'harm_discussed': '', 'quality': 'Average', 'comments': 'hhj', 'australian_hospital_patient_experience_question_se_complete': 'Incomplete'}
I want to place this into the json column of an SQL database - the column is JSON dtype nvarchar(max)
update Table_Json
SET JSON="{'follow_up_timestamp': '2021-09-21 22:16:36', 'id_fu': '','redcap_survey_identifier': '', 'nps': '76', 'improve': 'test', 'dowell': 'test', 'follow_up_complete': 'Complete', 'australian_hospital_patient_experience_question_se_timestamp': '[not completed]', 'more_qu': 'Yes', 'views': 'Always', 'needs': 'Always', 'unmet_need': '', 'cared': '', 'involvement': '', 'informed': 'Sometimes', 'team_communication': 'Sometimes', 'pain': '', 'confident': '', 'harm_distress': '', 'harm_discussed': '', 'quality': 'Average', 'comments': 'hhj', 'australian_hospital_patient_experience_question_se_complete': 'Incomplete'}"
but I am getting the following error.
Msg 103, Level 15, State 4, Line 3
The identifier that starts with '{'follow...... is too long. Maximum length is 128
I understood nvarchar(max) would store 2GB and nvarchar(8000) 8kb... my json object is certainly not that big.
New to SQL - obviously doing something stupid! please help!
The error message is telling you that it thinks the JSON string you provided is the name of a column, and column names cannot be longer than 128 characters. This is because you are using SET JSON=“blah blah blah” instead of SET JSON=‘blah blah blah’ (notice the difference between single quotes and double quotes).
When inserting a string into a SQL statement you must use single quotes ‘
This means you will have to change all the single quotes in your JSON string to double quotes “, or escape all the single quotes in the string to double-single-quotes ‘’

I don't know why it results in `undefined` when I used tweet_mode='extended' in Twitter API get function() on Node.js

I have a few question.
I would like to get twitter full-text, so I used get() function but it truncate when it returned.
like this :
'RT #Journeyto100k_: Google was not the first search engine, but quickly became the standard. Internet explorer even came preloaded on every…',
'RT #ApolloCurrency: Check out our latest blog post! In case you missed it. \n\n"Apollonauts Unveil Wiki…',
I used tweet_mode ='extended' and retweeted_status to get property full_text
but it didn't work.
let keyword1 = T.get('search/tweets', {
q: 'Crypto Currency crypto currency since:2019-04-15', count: 100, request: tweet_mode='extended' },async function (err, data, response) {
let addr;
let text = data.statuses.map(retweeted_status=>retweeted_status.text);
console.log(text);
I expect the output of get() result to be full-text, but the actual output is text truncated.
+ In further more,
data obejct has 'full-text' property, but it returns text truncated.
like this :
{ created_at: 'Fri Apr 19 04:22:40 +0000 2019',
id: 1119093934167212000,
id_str: '1119093934167212032',
full_text:
'RT #Drife_official: DRIFE presented at Trybe’s first annual Endless Dappathon\n #trybe_social \n#cryptocurrency #drife…',
truncated: false,
display_text_range: [Array],
entities: [Object],
metadata: [Object],
source:
'Twitter Web Client',
in_reply_to_status_id: null,
in_reply_to_status_id_str: null,
in_reply_to_user_id: null,
in_reply_to_user_id_str: null,
in_reply_to_screen_name: null,
user: [Object],
geo: null,
coordinates: null,
place: null,
contributors: null,
retweeted_status: [Object],
is_quote_status: false,
retweet_count: 330,
favorite_count: 0,
favorited: false,
retweeted: false,
possibly_sensitive: false,
lang: 'en' },
I found solution.
T.get('search/tweets', {
q, count, tweet_mode: 'extended'},async function (err, data, response) {
let text = data.statuses.map(status=>status.full_text);
I have missed full_text instead of text.
and ONLY RT(retwitt)is truncated. another didn't truncate.

Regex / Parse PostgreSQL names

Going through PostgreSQL Names and Identifiers, I'm trying to figure out the following:
Is it possible to implement a regular expression (or parse it otherwise) to check whether a PostgreSQL name / identifier needs to be wrapped in double-quotes or not? And if possible, also to check if it is a Unicode-style name or not.
I need to inject an identifier name into an SQL query, and I would like to wrap this into double quotes only if the name needs it, because I read that adding quotes where they are not needed in fact changes the name format (see updates below).
UPDATE-1:
Ultimately, I need to implement the following function:
function prepareSQLName(name) {
if (/* this is a regular name*/) {
return name;
}
if (/* this is a unicode name */) {
return 'U&"' + name + '"';
} else {
/* needs double quotes only */
return '"' + name + '"';
}
}
One of the major points of concern - processing non-English names. For example, the following is a perfectly valid PostgreSQL (in Russian) that doesn't require wrapping anything into double quotes:
create table жирафы(вес int, рост int, возраст int, имя text);
select имя, вес from жирафы order by рост;
UPDATE-2:
Examples of why it is such a big deal...
CREATE TABLE Test1(name text);
-- can be queried as:
SELECT * FROM Test1
SELECT * FROM test1
SELECT * FROM "test1"
-- but not as:
SELECT * FROM "Test1"
another one:
CREATE TABLE "Test2"(name text);
-- can be queried only as:
SELECT * FROM "Test2"
And it gets even trickier for Unicode-formatted names, ones that require U& in front.
var XRegExp = require('xregexp');
var isUnquotedIdentifier = new XRegExp('^[\pL_][\pL\pM_0-9$]*$');
var reservedWords = new Set(['A', 'ABORT', 'ABS', 'ABSENT', 'ABSOLUTE', 'ACCESS', 'ACCORDING', 'ACTION', 'ADA', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALL', 'ALLOCATE', 'ALSO', 'ALTER', 'ALWAYS', 'ANALYSE', 'ANALYZE', 'AND', 'ANY', 'ARE', 'ARRAY', 'ARRAY_AGG', 'ARRAY_MAX_CARDINALITY', 'AS', 'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT', 'ASYMMETRIC', 'AT', 'ATOMIC', 'ATTRIBUTE', 'ATTRIBUTES', 'AUTHORIZATION', 'AVG', 'BACKWARD', 'BASE64', 'BEFORE', 'BEGIN', 'BEGIN_FRAME', 'BEGIN_PARTITION', 'BERNOULLI', 'BETWEEN', 'BIGINT', 'BINARY', 'BIT', 'BIT_LENGTH', 'BLOB', 'BLOCKED', 'BOM', 'BOOLEAN', 'BOTH', 'BREADTH', 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CEIL', 'CEILING', 'CHAIN', 'CHAR', 'CHARACTER', 'CHARACTERISTICS', 'CHARACTERS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG', 'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE', 'CLUSTER', 'COALESCE', 'COBOL', 'COLLATE', 'COLLATION', 'COLLATION_CATALOG', 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLLECT', 'COLUMN', 'COLUMNS', 'COLUMN_NAME', 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT', 'COMMENTS', 'COMMIT', 'COMMITTED', 'CONCURRENTLY', 'CONDITION', 'CONDITION_NUMBER', 'CONFIGURATION', 'CONFLICT', 'CONNECT', 'CONNECTION', 'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRAINT_CATALOG', 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA', 'CONSTRUCTOR', 'CONTAINS', 'CONTENT', 'CONTINUE', 'CONTROL', 'CONVERSION', 'CONVERT', 'COPY', 'CORR', 'CORRESPONDING', 'COST', 'COUNT', 'COVAR_POP', 'COVAR_SAMP', 'CREATE', 'CROSS', 'CSV', 'CUBE', 'CUME_DIST', 'CURRENT', 'CURRENT_CATALOG', 'CURRENT_DATE', 'CURRENT_DEFAULT_TRANSFORM_GROUP', 'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_ROW', 'CURRENT_SCHEMA', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_TRANSFORM_GROUP_FOR_TYPE', 'CURRENT_USER', 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE', 'DATALINK', 'DATE', 'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY', 'DB', 'DEALLOCATE', 'DEC', 'DECIMAL', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE', 'DEFERRED', 'DEFINED', 'DEFINER', 'DEGREE', 'DELETE', 'DELIMITER', 'DELIMITERS', 'DENSE_RANK', 'DEPTH', 'DEREF', 'DERIVED', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DETERMINISTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISABLE', 'DISCARD', 'DISCONNECT', 'DISPATCH', 'DISTINCT', 'DLNEWCOPY', 'DLPREVIOUSCOPY', 'DLURLCOMPLETE', 'DLURLCOMPLETEONLY', 'DLURLCOMPLETEWRITE', 'DLURLPATH', 'DLURLPATHONLY', 'DLURLPATHWRITE', 'DLURLSCHEME', 'DLURLSERVER', 'DLVALUE', 'DO', 'DOCUMENT', 'DOMAIN', 'DOUBLE', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION', 'DYNAMIC_FUNCTION_CODE', 'EACH', 'ELEMENT', 'ELSE', 'EMPTY', 'ENABLE', 'ENCODING', 'ENCRYPTED', 'END', 'END-EXEC', 'END_FRAME', 'END_PARTITION', 'ENFORCED', 'ENUM', 'EQUALS', 'ESCAPE', 'EVENT', 'EVERY', 'EXCEPT', 'EXCEPTION', 'EXCLUDE', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTS', 'EXP', 'EXPLAIN', 'EXPRESSION', 'EXTENSION', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FAMILY', 'FETCH', 'FILE', 'FILTER', 'FINAL', 'FIRST', 'FIRST_VALUE', 'FLAG', 'FLOAT', 'FLOOR', 'FOLLOWING', 'FOR', 'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FRAME_ROW', 'FREE', 'FREEZE', 'FROM', 'FS', 'FULL', 'FUNCTION', 'FUNCTIONS', 'FUSION', 'G', 'GENERAL', 'GENERATED', 'GET', 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED', 'GREATEST', 'GROUP', 'GROUPING', 'GROUPS', 'HANDLER', 'HAVING', 'HEADER', 'HEX', 'HIERARCHY', 'HOLD', 'HOUR', 'ID', 'IDENTITY', 'IF', 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMEDIATELY', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT', 'IMPORT', 'IN', 'INCLUDING', 'INCREMENT', 'INDENT', 'INDEX', 'INDEXES', 'INDICATOR', 'INHERIT', 'INHERITS', 'INITIALLY', 'INLINE', 'INNER', 'INOUT', 'INPUT', 'INSENSITIVE', 'INSERT', 'INSTANCE', 'INSTANTIABLE', 'INSTEAD', 'INT', 'INTEGER', 'INTEGRITY', 'INTERSECT', 'INTERSECTION', 'INTERVAL', 'INTO', 'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'JOIN', 'K', 'KEY', 'KEY_MEMBER', 'KEY_TYPE', 'LABEL', 'LAG', 'LANGUAGE', 'LARGE', 'LAST', 'LAST_VALUE', 'LATERAL', 'LEAD', 'LEADING', 'LEAKPROOF', 'LEAST', 'LEFT', 'LENGTH', 'LEVEL', 'LIBRARY', 'LIKE', 'LIKE_REGEX', 'LIMIT', 'LINK', 'LISTEN', 'LN', 'LOAD', 'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION', 'LOCATOR', 'LOCK', 'LOCKED', 'LOGGED', 'LOWER', 'M', 'MAP', 'MAPPING', 'MATCH', 'MATCHED', 'MATERIALIZED', 'MAX', 'MAXVALUE', 'MAX_CARDINALITY', 'MEMBER', 'MERGE', 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 'MESSAGE_TEXT', 'METHOD', 'MIN', 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 'MODULE', 'MONTH', 'MORE', 'MOVE', 'MULTISET', 'MUMPS', 'NAME', 'NAMES', 'NAMESPACE', 'NATIONAL', 'NATURAL', 'NCHAR', 'NCLOB', 'NESTING', 'NEW', 'NEXT', 'NFC', 'NFD', 'NFKC', 'NFKD', 'NIL', 'NO', 'NONE', 'NORMALIZE', 'NORMALIZED', 'NOT', 'NOTHING', 'NOTIFY', 'NOTNULL', 'NOWAIT', 'NTH_VALUE', 'NTILE', 'NULL', 'NULLABLE', 'NULLIF', 'NULLS', 'NUMBER', 'NUMERIC', 'OBJECT', 'OCCURRENCES_REGEX', 'OCTETS', 'OCTET_LENGTH', 'OF', 'OFF', 'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPERATOR', 'OPTION', 'OPTIONS', 'OR', 'ORDER', 'ORDERING', 'ORDINALITY', 'OTHERS', 'OUT', 'OUTER', 'OUTPUT', 'OVER', 'OVERLAPS', 'OVERLAY', 'OVERRIDING', 'OWNED', 'OWNER', 'P', 'PAD', 'PARAMETER', 'PARAMETER_MODE', 'PARAMETER_NAME', 'PARAMETER_ORDINAL_POSITION', 'PARAMETER_SPECIFIC_CATALOG', 'PARAMETER_SPECIFIC_NAME', 'PARAMETER_SPECIFIC_SCHEMA', 'PARSER', 'PARTIAL', 'PARTITION', 'PASCAL', 'PASSING', 'PASSTHROUGH', 'PASSWORD', 'PATH', 'PERCENT', 'PERCENTILE_CONT', 'PERCENTILE_DISC', 'PERCENT_RANK', 'PERIOD', 'PERMISSION', 'PLACING', 'PLANS', 'PLI', 'POLICY', 'PORTION', 'POSITION', 'POSITION_REGEX', 'POWER', 'PRECEDES', 'PRECEDING', 'PRECISION', 'PREPARE', 'PREPARED', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL', 'PROCEDURE', 'PROGRAM', 'PUBLIC', 'QUOTE', 'RANGE', 'RANK', 'READ', 'READS', 'REAL', 'REASSIGN', 'RECHECK', 'RECOVERY', 'RECURSIVE', 'REF', 'REFERENCES', 'REFERENCING', 'REFRESH', 'REGR_AVGX', 'REGR_AVGY', 'REGR_COUNT', 'REGR_INTERCEPT', 'REGR_R2', 'REGR_SLOPE', 'REGR_SXX', 'REGR_SXY', 'REGR_SYY', 'REINDEX', 'RELATIVE', 'RELEASE', 'RENAME', 'REPEATABLE', 'REPLACE', 'REPLICA', 'REQUIRING', 'RESET', 'RESPECT', 'RESTART', 'RESTORE', 'RESTRICT', 'RESULT', 'RETURN', 'RETURNED_CARDINALITY', 'RETURNED_LENGTH', 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE', 'RETURNING', 'RETURNS', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE', 'ROUTINE_CATALOG', 'ROUTINE_NAME', 'ROUTINE_SCHEMA', 'ROW', 'ROWS', 'ROW_COUNT', 'ROW_NUMBER', 'RULE', 'SAVEPOINT', 'SCALE', 'SCHEMA', 'SCHEMA_NAME', 'SCOPE', 'SCOPE_CATALOG', 'SCOPE_NAME', 'SCOPE_SCHEMA', 'SCROLL', 'SEARCH', 'SECOND', 'SECTION', 'SECURITY', 'SELECT', 'SELECTIVE', 'SELF', 'SENSITIVE', 'SEQUENCE', 'SEQUENCES', 'SERIALIZABLE', 'SERVER', 'SERVER_NAME', 'SESSION', 'SESSION_USER', 'SET', 'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE', 'SKIP', 'SMALLINT', 'SNAPSHOT', 'SOME', 'SOURCE', 'SPACE', 'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME', 'SQL', 'SQLCODE', 'SQLERROR', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'SQRT', 'STABLE', 'STANDALONE', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STDDEV_POP', 'STDDEV_SAMP', 'STDIN', 'STDOUT', 'STORAGE', 'STRICT', 'STRIP', 'STRUCTURE', 'STYLE', 'SUBCLASS_ORIGIN', 'SUBMULTISET', 'SUBSTRING', 'SUBSTRING_REGEX', 'SUCCEEDS', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM', 'SYSTEM_TIME', 'SYSTEM_USER', 'T', 'TABLE', 'TABLES', 'TABLESAMPLE', 'TABLESPACE', 'TABLE_NAME', 'TEMP', 'TEMPLATE', 'TEMPORARY', 'TEXT', 'THEN', 'TIES', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE', 'TO', 'TOKEN', 'TOP_LEVEL_COUNT', 'TRAILING', 'TRANSACTION', 'TRANSACTIONS_COMMITTED', 'TRANSACTIONS_ROLLED_BACK', 'TRANSACTION_ACTIVE', 'TRANSFORM', 'TRANSFORMS', 'TRANSLATE', 'TRANSLATE_REGEX', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRIGGER_CATALOG', 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRIM_ARRAY', 'TRUE', 'TRUNCATE', 'TRUSTED', 'TYPE', 'TYPES', 'UESCAPE', 'UNBOUNDED', 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLINK', 'UNLISTEN', 'UNLOGGED', 'UNNAMED', 'UNNEST', 'UNTIL', 'UNTYPED', 'UPDATE', 'UPPER', 'URI', 'USAGE', 'USER', 'USER_DEFINED_TYPE_CATALOG', 'USER_DEFINED_TYPE_CODE', 'USER_DEFINED_TYPE_NAME', 'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM', 'VALID', 'VALIDATE', 'VALIDATOR', 'VALUE', 'VALUES', 'VALUE_OF', 'VARBINARY', 'VARCHAR', 'VARIADIC', 'VARYING', 'VAR_POP', 'VAR_SAMP', 'VERBOSE', 'VERSION', 'VERSIONING', 'VIEW', 'VIEWS', 'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE', 'WHITESPACE', 'WIDTH_BUCKET', 'WINDOW', 'WITH', 'WITHIN', 'WITHOUT', 'WORK', 'WRAPPER', 'WRITE', 'XML', 'XMLAGG', 'XMLATTRIBUTES', 'XMLBINARY', 'XMLCAST', 'XMLCOMMENT', 'XMLCONCAT', 'XMLDECLARATION', 'XMLDOCUMENT', 'XMLELEMENT', 'XMLEXISTS', 'XMLFOREST', 'XMLITERATE', 'XMLNAMESPACES', 'XMLPARSE', 'XMLPI', 'XMLQUERY', 'XMLROOT', 'XMLSCHEMA', 'XMLSERIALIZE', 'XMLTABLE', 'XMLTEXT', 'XMLVALIDATE', 'YEAR', 'YES', 'ZONE']);
function prepareSQLName(name) {
if (isUnquotedIdentifier.test(name) && !reservedWords.has(name.toUpperCase()))
return name;
// Let's quote name:
return '"' + name.replace(/"/g, '""') + '"';
}
console.log(prepareSQLName('simple')); //simple
console.log(prepareSQLName('to "quote')); //"to ""quote"
console.log(prepareSQLName('простий')); //простий
console.log(prepareSQLName('в "лапки')); //"в ""лапки"
Notes:
We need xregexp module, because built-in RegExp class doesn't support testing of Unicode categories (\pL a.k.a. p{L} and \pM a.k.a \p{M}). Still, detecting letters is not 100%-clear (see "Details on detecting letters").
List of key words is taken from here. Using this list may be non-ideal solution, as not all of these identifiers are really prohibited for use in all possible cases (i.e. sometimes it may quote table name that is allowed to be unquoted, e.g. abs). On the other hand, this task cannot be solved ideally without adding namePurpose second parameter to prepareSQLName function (as some of these identifiers are allowed for use in specific cases only).
You do not need special handling of non-ASCII, if you want non-English letters to remain non-escaped (they may be non-escaped as in SELECT "ім'я" FROM користувачі). The only thing to be checked is that identifiers containing something other than letters/digits/_/$ should be quoted (as "ім'я"). But you may also additionally escape all non-ASCII characters, if you wish:
var isUnquotedIdentifier = new RegExp('^[A-Za-z_][A-Za-z_0-9$]*$');
var reservedWords = new Set(['A', 'ABORT', 'ABS', 'ABSENT', 'ABSOLUTE', 'ACCESS', 'ACCORDING', 'ACTION', 'ADA', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALL', 'ALLOCATE', 'ALSO', 'ALTER', 'ALWAYS', 'ANALYSE', 'ANALYZE', 'AND', 'ANY', 'ARE', 'ARRAY', 'ARRAY_AGG', 'ARRAY_MAX_CARDINALITY', 'AS', 'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT', 'ASYMMETRIC', 'AT', 'ATOMIC', 'ATTRIBUTE', 'ATTRIBUTES', 'AUTHORIZATION', 'AVG', 'BACKWARD', 'BASE64', 'BEFORE', 'BEGIN', 'BEGIN_FRAME', 'BEGIN_PARTITION', 'BERNOULLI', 'BETWEEN', 'BIGINT', 'BINARY', 'BIT', 'BIT_LENGTH', 'BLOB', 'BLOCKED', 'BOM', 'BOOLEAN', 'BOTH', 'BREADTH', 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CEIL', 'CEILING', 'CHAIN', 'CHAR', 'CHARACTER', 'CHARACTERISTICS', 'CHARACTERS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG', 'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE', 'CLUSTER', 'COALESCE', 'COBOL', 'COLLATE', 'COLLATION', 'COLLATION_CATALOG', 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLLECT', 'COLUMN', 'COLUMNS', 'COLUMN_NAME', 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT', 'COMMENTS', 'COMMIT', 'COMMITTED', 'CONCURRENTLY', 'CONDITION', 'CONDITION_NUMBER', 'CONFIGURATION', 'CONFLICT', 'CONNECT', 'CONNECTION', 'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRAINT_CATALOG', 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA', 'CONSTRUCTOR', 'CONTAINS', 'CONTENT', 'CONTINUE', 'CONTROL', 'CONVERSION', 'CONVERT', 'COPY', 'CORR', 'CORRESPONDING', 'COST', 'COUNT', 'COVAR_POP', 'COVAR_SAMP', 'CREATE', 'CROSS', 'CSV', 'CUBE', 'CUME_DIST', 'CURRENT', 'CURRENT_CATALOG', 'CURRENT_DATE', 'CURRENT_DEFAULT_TRANSFORM_GROUP', 'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_ROW', 'CURRENT_SCHEMA', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_TRANSFORM_GROUP_FOR_TYPE', 'CURRENT_USER', 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE', 'DATALINK', 'DATE', 'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY', 'DB', 'DEALLOCATE', 'DEC', 'DECIMAL', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE', 'DEFERRED', 'DEFINED', 'DEFINER', 'DEGREE', 'DELETE', 'DELIMITER', 'DELIMITERS', 'DENSE_RANK', 'DEPTH', 'DEREF', 'DERIVED', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DETERMINISTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISABLE', 'DISCARD', 'DISCONNECT', 'DISPATCH', 'DISTINCT', 'DLNEWCOPY', 'DLPREVIOUSCOPY', 'DLURLCOMPLETE', 'DLURLCOMPLETEONLY', 'DLURLCOMPLETEWRITE', 'DLURLPATH', 'DLURLPATHONLY', 'DLURLPATHWRITE', 'DLURLSCHEME', 'DLURLSERVER', 'DLVALUE', 'DO', 'DOCUMENT', 'DOMAIN', 'DOUBLE', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION', 'DYNAMIC_FUNCTION_CODE', 'EACH', 'ELEMENT', 'ELSE', 'EMPTY', 'ENABLE', 'ENCODING', 'ENCRYPTED', 'END', 'END-EXEC', 'END_FRAME', 'END_PARTITION', 'ENFORCED', 'ENUM', 'EQUALS', 'ESCAPE', 'EVENT', 'EVERY', 'EXCEPT', 'EXCEPTION', 'EXCLUDE', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTS', 'EXP', 'EXPLAIN', 'EXPRESSION', 'EXTENSION', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FAMILY', 'FETCH', 'FILE', 'FILTER', 'FINAL', 'FIRST', 'FIRST_VALUE', 'FLAG', 'FLOAT', 'FLOOR', 'FOLLOWING', 'FOR', 'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FRAME_ROW', 'FREE', 'FREEZE', 'FROM', 'FS', 'FULL', 'FUNCTION', 'FUNCTIONS', 'FUSION', 'G', 'GENERAL', 'GENERATED', 'GET', 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED', 'GREATEST', 'GROUP', 'GROUPING', 'GROUPS', 'HANDLER', 'HAVING', 'HEADER', 'HEX', 'HIERARCHY', 'HOLD', 'HOUR', 'ID', 'IDENTITY', 'IF', 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMEDIATELY', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT', 'IMPORT', 'IN', 'INCLUDING', 'INCREMENT', 'INDENT', 'INDEX', 'INDEXES', 'INDICATOR', 'INHERIT', 'INHERITS', 'INITIALLY', 'INLINE', 'INNER', 'INOUT', 'INPUT', 'INSENSITIVE', 'INSERT', 'INSTANCE', 'INSTANTIABLE', 'INSTEAD', 'INT', 'INTEGER', 'INTEGRITY', 'INTERSECT', 'INTERSECTION', 'INTERVAL', 'INTO', 'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'JOIN', 'K', 'KEY', 'KEY_MEMBER', 'KEY_TYPE', 'LABEL', 'LAG', 'LANGUAGE', 'LARGE', 'LAST', 'LAST_VALUE', 'LATERAL', 'LEAD', 'LEADING', 'LEAKPROOF', 'LEAST', 'LEFT', 'LENGTH', 'LEVEL', 'LIBRARY', 'LIKE', 'LIKE_REGEX', 'LIMIT', 'LINK', 'LISTEN', 'LN', 'LOAD', 'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION', 'LOCATOR', 'LOCK', 'LOCKED', 'LOGGED', 'LOWER', 'M', 'MAP', 'MAPPING', 'MATCH', 'MATCHED', 'MATERIALIZED', 'MAX', 'MAXVALUE', 'MAX_CARDINALITY', 'MEMBER', 'MERGE', 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 'MESSAGE_TEXT', 'METHOD', 'MIN', 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 'MODULE', 'MONTH', 'MORE', 'MOVE', 'MULTISET', 'MUMPS', 'NAME', 'NAMES', 'NAMESPACE', 'NATIONAL', 'NATURAL', 'NCHAR', 'NCLOB', 'NESTING', 'NEW', 'NEXT', 'NFC', 'NFD', 'NFKC', 'NFKD', 'NIL', 'NO', 'NONE', 'NORMALIZE', 'NORMALIZED', 'NOT', 'NOTHING', 'NOTIFY', 'NOTNULL', 'NOWAIT', 'NTH_VALUE', 'NTILE', 'NULL', 'NULLABLE', 'NULLIF', 'NULLS', 'NUMBER', 'NUMERIC', 'OBJECT', 'OCCURRENCES_REGEX', 'OCTETS', 'OCTET_LENGTH', 'OF', 'OFF', 'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPERATOR', 'OPTION', 'OPTIONS', 'OR', 'ORDER', 'ORDERING', 'ORDINALITY', 'OTHERS', 'OUT', 'OUTER', 'OUTPUT', 'OVER', 'OVERLAPS', 'OVERLAY', 'OVERRIDING', 'OWNED', 'OWNER', 'P', 'PAD', 'PARAMETER', 'PARAMETER_MODE', 'PARAMETER_NAME', 'PARAMETER_ORDINAL_POSITION', 'PARAMETER_SPECIFIC_CATALOG', 'PARAMETER_SPECIFIC_NAME', 'PARAMETER_SPECIFIC_SCHEMA', 'PARSER', 'PARTIAL', 'PARTITION', 'PASCAL', 'PASSING', 'PASSTHROUGH', 'PASSWORD', 'PATH', 'PERCENT', 'PERCENTILE_CONT', 'PERCENTILE_DISC', 'PERCENT_RANK', 'PERIOD', 'PERMISSION', 'PLACING', 'PLANS', 'PLI', 'POLICY', 'PORTION', 'POSITION', 'POSITION_REGEX', 'POWER', 'PRECEDES', 'PRECEDING', 'PRECISION', 'PREPARE', 'PREPARED', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL', 'PROCEDURE', 'PROGRAM', 'PUBLIC', 'QUOTE', 'RANGE', 'RANK', 'READ', 'READS', 'REAL', 'REASSIGN', 'RECHECK', 'RECOVERY', 'RECURSIVE', 'REF', 'REFERENCES', 'REFERENCING', 'REFRESH', 'REGR_AVGX', 'REGR_AVGY', 'REGR_COUNT', 'REGR_INTERCEPT', 'REGR_R2', 'REGR_SLOPE', 'REGR_SXX', 'REGR_SXY', 'REGR_SYY', 'REINDEX', 'RELATIVE', 'RELEASE', 'RENAME', 'REPEATABLE', 'REPLACE', 'REPLICA', 'REQUIRING', 'RESET', 'RESPECT', 'RESTART', 'RESTORE', 'RESTRICT', 'RESULT', 'RETURN', 'RETURNED_CARDINALITY', 'RETURNED_LENGTH', 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE', 'RETURNING', 'RETURNS', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE', 'ROUTINE_CATALOG', 'ROUTINE_NAME', 'ROUTINE_SCHEMA', 'ROW', 'ROWS', 'ROW_COUNT', 'ROW_NUMBER', 'RULE', 'SAVEPOINT', 'SCALE', 'SCHEMA', 'SCHEMA_NAME', 'SCOPE', 'SCOPE_CATALOG', 'SCOPE_NAME', 'SCOPE_SCHEMA', 'SCROLL', 'SEARCH', 'SECOND', 'SECTION', 'SECURITY', 'SELECT', 'SELECTIVE', 'SELF', 'SENSITIVE', 'SEQUENCE', 'SEQUENCES', 'SERIALIZABLE', 'SERVER', 'SERVER_NAME', 'SESSION', 'SESSION_USER', 'SET', 'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE', 'SKIP', 'SMALLINT', 'SNAPSHOT', 'SOME', 'SOURCE', 'SPACE', 'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME', 'SQL', 'SQLCODE', 'SQLERROR', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'SQRT', 'STABLE', 'STANDALONE', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STDDEV_POP', 'STDDEV_SAMP', 'STDIN', 'STDOUT', 'STORAGE', 'STRICT', 'STRIP', 'STRUCTURE', 'STYLE', 'SUBCLASS_ORIGIN', 'SUBMULTISET', 'SUBSTRING', 'SUBSTRING_REGEX', 'SUCCEEDS', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM', 'SYSTEM_TIME', 'SYSTEM_USER', 'T', 'TABLE', 'TABLES', 'TABLESAMPLE', 'TABLESPACE', 'TABLE_NAME', 'TEMP', 'TEMPLATE', 'TEMPORARY', 'TEXT', 'THEN', 'TIES', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE', 'TO', 'TOKEN', 'TOP_LEVEL_COUNT', 'TRAILING', 'TRANSACTION', 'TRANSACTIONS_COMMITTED', 'TRANSACTIONS_ROLLED_BACK', 'TRANSACTION_ACTIVE', 'TRANSFORM', 'TRANSFORMS', 'TRANSLATE', 'TRANSLATE_REGEX', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRIGGER_CATALOG', 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRIM_ARRAY', 'TRUE', 'TRUNCATE', 'TRUSTED', 'TYPE', 'TYPES', 'UESCAPE', 'UNBOUNDED', 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLINK', 'UNLISTEN', 'UNLOGGED', 'UNNAMED', 'UNNEST', 'UNTIL', 'UNTYPED', 'UPDATE', 'UPPER', 'URI', 'USAGE', 'USER', 'USER_DEFINED_TYPE_CATALOG', 'USER_DEFINED_TYPE_CODE', 'USER_DEFINED_TYPE_NAME', 'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM', 'VALID', 'VALIDATE', 'VALIDATOR', 'VALUE', 'VALUES', 'VALUE_OF', 'VARBINARY', 'VARCHAR', 'VARIADIC', 'VARYING', 'VAR_POP', 'VAR_SAMP', 'VERBOSE', 'VERSION', 'VERSIONING', 'VIEW', 'VIEWS', 'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE', 'WHITESPACE', 'WIDTH_BUCKET', 'WINDOW', 'WITH', 'WITHIN', 'WITHOUT', 'WORK', 'WRAPPER', 'WRITE', 'XML', 'XMLAGG', 'XMLATTRIBUTES', 'XMLBINARY', 'XMLCAST', 'XMLCOMMENT', 'XMLCONCAT', 'XMLDECLARATION', 'XMLDOCUMENT', 'XMLELEMENT', 'XMLEXISTS', 'XMLFOREST', 'XMLITERATE', 'XMLNAMESPACES', 'XMLPARSE', 'XMLPI', 'XMLQUERY', 'XMLROOT', 'XMLSCHEMA', 'XMLSERIALIZE', 'XMLTABLE', 'XMLTEXT', 'XMLVALIDATE', 'YEAR', 'YES', 'ZONE']);
function prepareSQLName(name) {
if (isUnquotedIdentifier.test(name) && !reservedWords.has(name.toUpperCase()))
return name;
// Let's quote (and possibly escape) name:
var reallyEscaped = false;
var escapedName = '';
for (var i = 0; i!=name.length; ++i) {
var charCode = name.charCodeAt(i);
if (charCode<128) {
var char = name.charAt(i);
escapedName += char=='"' ? '""' : char;
}
else {
reallyEscaped = true;
escapedName += '\\' + ('0000' + charCode.toString(16)).slice(-4);
}
}
return reallyEscaped ? 'U&"' + escapedName + '"' : '"' + escapedName + '"';
}
console.log(prepareSQLName('simple')); //simple
console.log(prepareSQLName('to "quote')); //"to ""quote"
console.log(prepareSQLName('простий')); //U&"\043f\0440\043e\0441\0442\0438\0439"
console.log(prepareSQLName('в "лапки')); //U&"\0432 ""\043b\0430\043f\043a\0438"
I recommend you to lowercase name by calling name = name.toLowerCase(); before quoting it. Without doing this you'll need to take care about the fact that hello and HeLLo would be treated as same name, but hello world and HeLLo WoRld as different (because the latter two will got quoted). But doing this will make your code incompatible with code that doesn't forcibly lowercase all names (i.e. you won't be able to access entities with non-all-lowercase names that contain something other than letter, digit, underscore or dollar sign).
Details on detecting letters:
I'm not sure about this, but AFAIK different versions of Unicode standard can have different sets of code points for letters (i.e. some code point that is considered as letter in one version of Unicode standard may be considered as non-letter by other version of Unicode standard). If that's true, you'll get weird SQL syntax error, if JavaScript considers some code point as non-English letter and therefore sends it unquoted, while PostgreSQL considers it to be non-letter at all and therefore doesn't expect it outside quotes (e.g. due to older Unicode libraries within PostgreSQL server). To overcome this, you can either forcibly quote every non-ASCII character (by replacing \pL with A-Za-z), or at least ensure that JavaScript's definition of letter isn't wider than PostgreSQL (by replacing \pL with explicit code range list for specific Unicode version like here for Unicode 6.3.0).
De facto PostgreSQL allows almost any Unicode character (except for the forbidden characters within ASCII range and invalid surrogates) to be used within unquoted identifiers -- not just letters/digits/_/$ -- and even non-ASCII whitespace and unassigned code points are in fact allowed (although official documentation says nothing about that). This is probably done to prevent future compatibility issues (e.g. the one described in the strikeout text). The reasonable behavior at our side in this case would be to send only letters/digits/_/$ to PostgreSQL in unquoted form (as official documentation suggests), but now we don't need to worry about following exact version of Unicode standard for detecting them.
The question still remaining is whether we should treat only \pL as letters, or \pL\pM* too (the former may include letter with diacritic only if it's represented by single code point, while the latter includes all kinds of letters with diacritics). De jure official documentation says nothing for this question, while de facto PostgreSQL accepts almost any Unicode character. Probably, in such case the latter is more reasonable (that's why I replaced ^[\pL_][\pL_0-9$]*$ from original version of the first code listing with ^[\pL_][\pL\pM_0-9$]*$).
Resume:
Whether to escape (U&"\044F") or not to escape ("я") a character within quoted identifier -- it's absolutely the matter of your taste (per documentation, any character except for NUL may appear non-escaped in quoted identifier, but NUL isn't allowed within identifiers anyway).
Whether to quote ("hello") or not to quote (hello) an identifier:
an identifier must be quoted if it contains any ASCII character other than English letter, digit 0 to 9, underscore sign or dollar sign, or if it starts from any ASCII character other than English letter or underscore sign;
an identifier should be quoted if it contains any non-ASCII character other than letter of any language, with or without diacritics; de facto such identifier will be accepted even without quoting, but such behavior isn't mentioned in documentation and may be changed in future;
otherwise it's your choice whether to quote an identifier or no; if you prefer case insensitivity, you may tend to first listing (which does quoting at the minimum and no escaping), if you unlike non-ASCII characters, you may tend to second listing (which quotes and escapes every non-ASCII character, even officially allowed).
Given Bobby Tables won't be rearing his ugly head, you could try something like this, which expands upon klin's good attempt:
CREATE OR REPLACE FUNCTION prepareSQLName(VARCHAR(255), BOOLEAN)
RETURNS VARCHAR(255) LANGUAGE PLPGSQL AS $$
BEGIN
IF ($2) THEN
EXECUTE 'SELECT * FROM ' || $1;
ELSE
EXECUTE 'CREATE TEMP TABLE ' || $1 || ' (ID INT) ON COMMIT DROP';
END IF;
RETURN $1;
EXCEPTION WHEN OTHERS THEN
IF LEFT($1, 1) <> '"' AND prepareSQLName('"' || $1 || '"', $2) = '"' || $1 || '"' THEN
RETURN '"' || $1 || '"';
ELSE
RETURN NULL;
END IF;
END $$;
Explanation
The question seems to include two cases:
Finding out whether an identifier is valid for an existing table
...and...
Finding out whether an identifier can be used for a new
table or column name.
Hence the second boolean parameter in the function: This determines whether an attempt is made to select from an existing table (if true) or create a new temporary table (if false) - in both cases, first using the supplied identifier (first parameter value) as-is.
If no errors occurred the function simply returns the supplied identifier. If an error occurred, a second recursive call is made to see if wrapping in quotes helps the situation. If so, the quoted version is returned. But if this also caused an error then the identifier is deemed unusable in any form and NULL is returned.
See SQL Fiddle Demo for some example usage.
Additional Findings - Unicode table names
For the record, I wanted to find out how unicode behaved and which unicode characters are and aren't acceptable in the quoted form described in the link you posted. To do this, I tried similar selects to yours and found the Test3 table created in its quoted unicode form (CREATE TABLE U&"\0054\0065\0073\0074\0033" (ID INT);) behaved exactly the same as the quoted "Test2" table.
Also tried running this to find which characters can be used:
DO $do$
DECLARE chr VARCHAR(9);
BEGIN
FOR i IN 0..9999 LOOP
chr := 'U&"\' || LPAD(CAST(i AS VARCHAR(4)), 4, '0') || '"';
IF prepareSQLName(chr, FALSE) IS NULL THEN
RAISE NOTICE 'NOT OK: %', chr;
END IF;
END LOOP;
END $do$;
It raises just one notice:
NOTICE: NOT OK: U&"\0000"
This shows the only unicode character that can't be used in a table name is the NUL character.

Why won't this insert query work? [closed]

Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 8 years ago.
Improve this question
I am very new in Microsoft SQL Server and I have the following problem.
On a database I have a very big table named VulnerabilityAlertDocument and I have to do an insert on this table.
So I have created the following insert query:
INSERT INTO VulnerabilityAlertDocument (
[Id], [VulnerabilityAlertId], [SourceId], [BugTraqID], [Title],
[StatusID], [CVE], [Published], [LastUpdated], [Remote],[Local],
[Credibility],[Classification],[Availability], [Ease], [Authentication],
[CVSS2_BaseScore], [CVSS2_TemporalScore], [CVSS2_BaseVector],
[CVSS2_TemporalVector], [CVSS1_BaseScore], [CVSS1_TemporalScore],
[NVD_CVSS2_BaseScore], [NVD_CVSS2_ComponentString], [ImpactRating],
[Severity], [EaseofExploit], [UrgencyRating], [LastChange],
[ShortSummary], [Impact], [TechnicalDescription], [AttackScenario],
[Exploit], [Credit], [URL], [AlertStatusId], [Type], [DetailLevel],
[Language], [dd]
VALUES ('10000', '10000', 'TEST', '12345', 'TEST TITLE', '46967', 'TEST CVE',
'2010-12-19 00:00:00.000', '2011-06-29 20:49:07.000', 'Yes','No',
'Vendor Confirmed', 'Boundary Condition Error', 'Always',
'No Exploit Available', 'Not Required', 'N.A.', 'N.A.', 'N.A.', 'N.A.'
'N.A.', 'N.A.', 'N.A.', 'N.A.', '6', '7,8', '0', '6,8', 'N.A.',
'TEST SHORT SUMMARY', 'TEST IMPACT', 'TEST TECHNICAL DESCRIPTION',
'TEST ATTACK SCENARIO', 'TEST EXPLOIT', 'TEST CREDIT', '46967', '-1',
'-1', '-1', 'NULL');
I followed the syntax as shown here: http://technet.microsoft.com/it-it/library/ms174633.aspx
But it doesn't work. When I execute that INSERT command I obtain the following message error:
Msg 156, Level 15, State 1, Line 2 Incorrect syntax near the keyword
*'VALUES'.*
Why? What could be the problem? How can I solve it?
You are missing closing parenthisis ) just before VALUES.
try this
INSERT INTO VulnerabilityAlertDocument ([Id], [VulnerabilityAlertId], [SourceId], [BugTraqID], [Title], [StatusID], [CVE], [Published], [LastUpdated], [Remote], [Local], [Credibility], [Classification], [Availability], [Ease], [Authentication], [CVSS2_BaseScore], [CVSS2_TemporalScore], [CVSS2_BaseVector], [CVSS2_TemporalVector], [CVSS1_BaseScore], [CVSS1_TemporalScore], [NVD_CVSS2_BaseScore], [NVD_CVSS2_ComponentString], [ImpactRating], [Severity], [EaseofExploit], [UrgencyRating], [LastChange], [ShortSummary], [Impact], [TechnicalDescription], [AttackScenario], [Exploit], [Credit], [URL], [AlertStatusId], [Type], [DetailLevel], [Language], [dd])
VALUES('10000', '10000', 'TEST', '12345', 'TEST TITLE', '46967', 'TEST CVE', '2010-12-19 00:00:00.000', '2011-06-29 20:49:07.000', 'Yes', 'No', 'Vendor Confirmed', 'Boundary Condition Error', 'Always', 'No Exploit Available', 'Not Required', 'N.A.', 'N.A.', 'N.A.', 'N.A.' 'N.A.', 'N.A.', 'N.A.', 'N.A.', '6', '7,8', '0', '6,8', 'N.A.', 'TEST SHORT SUMMARY', 'TEST IMPACT', 'TEST TECHNICAL DESCRIPTION', 'TEST ATTACK SCENARIO', 'TEST EXPLOIT', 'TEST CREDIT', '46967', '-1', '-1', '-1', 'NULL');