@@ -3,6 +3,8 @@ import { ColumnsBlockType, TDengineTypeCode, TDengineTypeName } from './constant
33import { ErrorCode , TaosResultError , WebSocketQueryInterFaceError } from "./wsError" ;
44import { appendRune } from "./ut8Helper"
55import logger from "./log" ;
6+ import { decimalToString } from "./utils" ;
7+ import { TMQRawDataSchema } from "../tmq/constant" ;
68
79export interface TDengineMeta {
810 name : string ,
@@ -29,7 +31,9 @@ export class TaosResult {
2931 private _precision : number | null | undefined ;
3032 protected _affectRows : number | null | undefined ;
3133 private _totalTime = 0 ;
32-
34+ private fields_precisions ?: Array < bigint > | null ;
35+ private fields_scales ?: Array < bigint > | null ;
36+
3337 /** unit nano seconds */
3438 private _timing : bigint | null | undefined ;
3539 constructor ( queryResponse ?: WSQueryResponse ) {
@@ -65,6 +69,8 @@ export class TaosResult {
6569 this . _timing = queryResponse . timing
6670 this . _precision = queryResponse . precision
6771 this . _totalTime = queryResponse . totalTime
72+ this . fields_precisions = queryResponse . fields_precisions
73+ this . fields_scales = queryResponse . fields_scales
6874 }
6975
7076 public setPrecision ( precision : number ) {
@@ -134,6 +140,14 @@ export class TaosResult {
134140 this . _timing = this . _timing + timing
135141 }
136142 }
143+
144+ public getFieldsScales ( index : number ) : bigint | null {
145+ if ( this . fields_scales ) {
146+ return this . fields_scales [ index ] ;
147+ }
148+ return null ;
149+ }
150+
137151 /**
138152 * Mapping the WebSocket response type code to TDengine's type name.
139153 */
@@ -201,7 +215,7 @@ export function parseBlock(blocks: WSFetchBlockResponse, taosResult: TaosResult)
201215 if ( bitFlag == 1 ) {
202216 row . push ( "NULL" )
203217 } else {
204- row . push ( readSolidData ( dataView , colDataHead , metaList [ j ] ) )
218+ row . push ( readSolidData ( dataView , colDataHead , metaList [ j ] , taosResult . getFieldsScales ( j ) ) ) ;
205219 }
206220
207221 colBlockHead = colBlockHead + bitMapSize + dataView . getInt32 ( INT_32_SIZE * j , true )
@@ -261,7 +275,7 @@ export function _isVarType(metaType: number): Number {
261275 }
262276}
263277export function readSolidDataToArray ( dataBuffer : DataView , colBlockHead :number ,
264- rows :number , metaType : number , bitMapArr : Uint8Array ) : any [ ] {
278+ rows :number , metaType : number , bitMapArr : Uint8Array , startOffset : number , colIndex : number ) : any [ ] {
265279
266280 let result :any [ ] = [ ]
267281 switch ( metaType ) {
@@ -369,14 +383,40 @@ export function readSolidDataToArray(dataBuffer: DataView, colBlockHead:number,
369383 }
370384 break ;
371385 }
386+ case TDengineTypeCode . DECIMAL64 : {
387+ let scale = getScaleFromRowBlock ( dataBuffer , colIndex , startOffset ) ;
388+ for ( let i = 0 ; i < rows ; i ++ , colBlockHead += 8 ) {
389+ if ( isNull ( bitMapArr , i ) ) {
390+ result . push ( null ) ;
391+ } else {
392+ let decimalVal = dataBuffer . getBigInt64 ( colBlockHead , true )
393+ result . push ( decimalToString ( decimalVal . toString ( ) , BigInt ( scale ) ) ) ;
394+ }
395+ }
396+ break ;
397+ }
398+ case TDengineTypeCode . DECIMAL : {
399+ let scale = getScaleFromRowBlock ( dataBuffer , colIndex , startOffset ) ;
400+ for ( let i = 0 ; i < rows ; i ++ , colBlockHead += 16 ) {
401+ if ( isNull ( bitMapArr , i ) ) {
402+ result . push ( null ) ;
403+ } else {
404+ let decimalHighPart = dataBuffer . getBigInt64 ( colBlockHead + 8 , true ) ;
405+ const decimalLowPart = dataBuffer . getBigUint64 ( colBlockHead , true ) ;
406+ const decimalCombined = ( decimalHighPart << 64n ) | decimalLowPart ;
407+ result . push ( decimalToString ( decimalCombined . toString ( ) , BigInt ( scale ) ) ) ;
408+ }
409+ }
410+ break ;
411+ }
372412 default : {
373- throw new WebSocketQueryInterFaceError ( ErrorCode . ERR_UNSUPPORTED_TDENGINE_TYPE , `unspported type ${ metaType } ` )
413+ throw new WebSocketQueryInterFaceError ( ErrorCode . ERR_UNSUPPORTED_TDENGINE_TYPE , `unsupported type ${ metaType } ` )
374414 }
375415 }
376416 return result ;
377417
378418}
379- export function readSolidData ( dataBuffer : DataView , colDataHead : number , meta : ResponseMeta ) : Number | Boolean | BigInt {
419+ export function readSolidData ( dataBuffer : DataView , colDataHead : number , meta : ResponseMeta , fields_scale : bigint | null ) : Number | Boolean | BigInt | string {
380420
381421 switch ( meta . type ) {
382422 case TDengineTypeCode . BOOL : {
@@ -416,8 +456,18 @@ export function readSolidData(dataBuffer: DataView, colDataHead: number, meta: R
416456 return dataBuffer . getBigInt64 ( colDataHead , true ) ;
417457 // could change
418458 }
459+ case TDengineTypeCode . DECIMAL : {
460+ let decimalHighPart = dataBuffer . getBigInt64 ( colDataHead + 8 , true ) ;
461+ const decimalLowPart = dataBuffer . getBigUint64 ( colDataHead , true ) ;
462+ const decimalCombined = ( decimalHighPart << 64n ) | decimalLowPart ;
463+ return decimalToString ( decimalCombined . toString ( ) , fields_scale ) ;
464+ }
465+ case TDengineTypeCode . DECIMAL64 : {
466+ let decimalVal = dataBuffer . getBigInt64 ( colDataHead , true ) ;
467+ return decimalToString ( decimalVal . toString ( ) , fields_scale ) ;
468+ }
419469 default : {
420- throw new WebSocketQueryInterFaceError ( ErrorCode . ERR_UNSUPPORTED_TDENGINE_TYPE , `unspported type ${ meta . type } for column ${ meta . name } ` )
470+ throw new WebSocketQueryInterFaceError ( ErrorCode . ERR_UNSUPPORTED_TDENGINE_TYPE , `unsupported type ${ meta . type } for column ${ meta . name } ` )
421471 }
422472 }
423473}
@@ -480,4 +530,12 @@ function bitPos(n:number):number {
480530
481531export function bitmapLen ( n : number ) : number {
482532 return ( ( n ) + ( ( 1 << 3 ) - 1 ) ) >> 3
533+ }
534+
535+ function getScaleFromRowBlock ( buffer : DataView , colIndex : number , startOffset : number ) : number {
536+ // for decimal: |___bytes___|__empty__|___prec___|__scale___|
537+ let backupPos = buffer . byteOffset + startOffset + 28 + colIndex * 5 + 1 ;
538+ let scaleBuffer = new DataView ( buffer . buffer , backupPos ) ;
539+ let scale = scaleBuffer . getInt32 ( 0 , true ) ;
540+ return scale & 0xFF ;
483541}
0 commit comments