diff --git a/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js b/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js index 75f5fdfef3d33..b364312a6c89d 100644 --- a/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js +++ b/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js @@ -97,7 +97,7 @@ class ScaffoldingTemplate { const items = descriptor.map(desc => this.render(desc, level + 1)).join(', '); return `[${items}]`; } else if (typeof descriptor === 'string') { - return "`" + descriptor + "`"; + return `\`${descriptor.replace(/`/g, '\\`')}\``; } else if (descriptor instanceof MemberReference) { return descriptor.member; } else if (typeof descriptor === 'object') { diff --git a/packages/cubejs-schema-compiler/test/ScaffoldingSchemaTest.js b/packages/cubejs-schema-compiler/test/ScaffoldingSchemaTest.js index 7f36f52415331..26af8e4825e2c 100644 --- a/packages/cubejs-schema-compiler/test/ScaffoldingSchemaTest.js +++ b/packages/cubejs-schema-compiler/test/ScaffoldingSchemaTest.js @@ -6,6 +6,10 @@ const driver = { quoteIdentifier: (name) => `"${name}"` }; +const mySqlDriver = { + quoteIdentifier: (name) => `\`${name}\`` +}; + describe('ScaffoldingSchema', () => { it('schema', () => { const schema = new ScaffoldingSchema({ @@ -399,6 +403,64 @@ describe('ScaffoldingSchema', () => { } } }); +` + } + ]); + }); + + it('escaping back tick', () => { + const template = new ScaffoldingTemplate({ + public: { + someOrders: [{ + "name": "id", + "type": "integer", + "attributes": [] + }, { + "name": "amount", + "type": "integer", + "attributes": [] + }, { + "name": "someDimension", + "type": "string", + "attributes": [] + }] + } + }, mySqlDriver); + template.generateFilesByTableNames(['public.someOrders']).should.be.deepEqual([ + { + fileName: 'SomeOrders.js', + content: `cube(\`SomeOrders\`, { + sql: \`SELECT * FROM public.\\\`someOrders\\\`\`, + + joins: { + + }, + + measures: { + count: { + type: \`count\`, + drillMembers: [id] + }, + + amount: { + sql: \`amount\`, + type: \`sum\` + } + }, + + dimensions: { + id: { + sql: \`id\`, + type: \`number\`, + primaryKey: true + }, + + somedimension: { + sql: \`\${CUBE}.\\\`someDimension\\\`\`, + type: \`string\` + } + } +}); ` } ]);