Does anyone know a better way of identifying/differentiating between a view or query written in Legacy or Standard SQL, using the BigQuery API?
You can try and use javascript regex to identify the type of the SQL.
You can use the below code snippet as a baseline
isStandardSql(idString) {
let isStandard, fullId, partialId, projectId = '';
// This 'if' checks if the provided idString is of type standard and makes sure there is only one ':' in the expression (as in legacy syntax)
const splitted = idString.split(/[:.]/g);
if (splitted.length > 3) {
const __ret = this.try2findProjectId(idString, projectId);
idString = __ret.idString;
projectId = __ret.projectId;
}
if ((idString.match(/:/g))) {
// Regex that checks if the format of the id match legacy
let matched = idString.match(/([\[]([^[]|[\[][\]])*[\]])/g);
if (matched && matched[0]) {
fullId = projectId + matched[0].substring(1, idString.length - 1);
isStandard = false;
} else {
this.errorMessage("First Regex", idString);
}
// Same as the first only that here instead of ':' we are looking for '.' and we want to make sure there is more than 1 (as in standard syntax)
} else if ((idString.match(/\./g) && idString.match(/\./g).length === 2)) {
// Regex that checks if the format of the id match standard
let matched = idString.match(/(`([^`]|``)*`)/g);// ? idString.match(/(`([^`]|``)*`)/g) : [idString];
if (matched && matched[0]) {
fullId = projectId + matched[0].substring(1, idString.length - 1);
isStandard = true
} else if(!matched && idString){
fullId = projectId + idString;
isStandard = true;
}
else {
this.errorMessage("Second Regex", idString);
}
}
else {//projectID.dataset
// In case of id without projectId of proxy "use" project.dataset
if(splitted.length === 2) {
fullId = '';
if (idString[0] === '[' && idString[idString.length - 1] === ']') {
isStandard = false;
}
else if (idString[0] === '`' && idString[idString.length - 1] === '`') {
isStandard = true;
}
partialId = idString.replace(/`|\[|\]/g, '')
}
else {
this.errorMessage("Third Regex", idString);
}
}
// Return values is flag the determine the type (standard or legacy) and id without staring/ ending chars (``, [])
return {
isStandard,
fullId: fullId,
partialId: partialId
};
}
try2findProjectId(idString, projectId)
{
let numOfInstances = 0
for (let i = idString.length; i > 0; i--) {
const char = idString[i - 1]
if (char === ':' || char === '.') {
numOfInstances++
if (numOfInstances === 2) {
projectId = idString.substring(1, i - 1)
idString = idString.substring(i - 1, idString.length)
idString = idString[idString.length - 1] === '`' ? '`' + idString : idString
idString = idString[idString.length - 1] === ']' ? '[' + idString : idString
}
}
}
return {idString, projectId}
}