(request: {
queries: Q;
queryKey: QueryKey;
requestOptions?: RequestInit;
sessionVariables?: SessionVariables;
requestTimeoutMs?: number;
/** Overrides the currently configured environment, only used in test */
httpAddress?: string;
})
| 223 | * https://github.com/MaterializeInc/console/issues/1176 |
| 224 | */ |
| 225 | export async function executeSqlV2< |
| 226 | Q extends CompiledQuery | CompiledQueryList, |
| 227 | >(request: { |
| 228 | queries: Q; |
| 229 | queryKey: QueryKey; |
| 230 | requestOptions?: RequestInit; |
| 231 | sessionVariables?: SessionVariables; |
| 232 | requestTimeoutMs?: number; |
| 233 | /** Overrides the currently configured environment, only used in test */ |
| 234 | httpAddress?: string; |
| 235 | }): Promise<ExecuteSqlReturnType<Q>> { |
| 236 | const sqlRequest = buildExtendedSqlRequest(request.queries); |
| 237 | const httpAddress = await getHttpAddress(request); |
| 238 | const url = buildExecuteSqlUrl(httpAddress); |
| 239 | |
| 240 | url.searchParams.append( |
| 241 | "options", |
| 242 | JSON.stringify(buildSessionVariables(request.sessionVariables)), |
| 243 | ); |
| 244 | |
| 245 | // TODO: Put query_key in a custom header rather than a search param |
| 246 | url.searchParams.append("query_key", hashKey(request.queryKey)); |
| 247 | |
| 248 | const { |
| 249 | headers: headersOverride, |
| 250 | signal, |
| 251 | ...restRequestOptions |
| 252 | } = request.requestOptions ?? {}; |
| 253 | |
| 254 | const signals = [ |
| 255 | AbortSignal.timeout(request.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT), |
| 256 | ]; |
| 257 | if (signal) { |
| 258 | signals.push(signal); |
| 259 | } |
| 260 | |
| 261 | const response = await apiClient.mzApiFetch(url.toString(), { |
| 262 | method: "POST", |
| 263 | headers: { |
| 264 | "Content-Type": "application/json", |
| 265 | ...headersOverride, |
| 266 | }, |
| 267 | body: JSON.stringify(sqlRequest), |
| 268 | signal: anySignal(signals), |
| 269 | ...restRequestOptions, |
| 270 | }); |
| 271 | |
| 272 | const responseText = await response.text(); |
| 273 | |
| 274 | const isFetchFailure = !response.ok; |
| 275 | |
| 276 | if (isFetchFailure) { |
| 277 | if (response.status === 401) { |
| 278 | // Should never happen |
| 279 | throw new Error(UNAUTHORIZED_ERROR, { |
| 280 | cause: { status: response.status }, |
| 281 | }); |
| 282 | } |
no test coverage detected