1*6dbdd20aSAndroid Build Coastguard Worker# PerfettoSQL Built-ins 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerThese are functions built into C++ which reduce the amount of boilerplate which 4*6dbdd20aSAndroid Build Coastguard Workerneeds to be written in SQL. 5*6dbdd20aSAndroid Build Coastguard Worker 6*6dbdd20aSAndroid Build Coastguard Worker## Profile Functions 7*6dbdd20aSAndroid Build Coastguard Worker 8*6dbdd20aSAndroid Build Coastguard Worker### STACK_FROM_STACK_PROFILE_FRAME 9*6dbdd20aSAndroid Build Coastguard Worker 10*6dbdd20aSAndroid Build Coastguard Worker`STACK_FROM_STACK_PROFILE_FRAME(frame_id)` 11*6dbdd20aSAndroid Build Coastguard Worker 12*6dbdd20aSAndroid Build Coastguard Worker#### Description 13*6dbdd20aSAndroid Build Coastguard Worker 14*6dbdd20aSAndroid Build Coastguard WorkerCreates a stack with just the frame referenced by `frame_id` (reference to the 15*6dbdd20aSAndroid Build Coastguard Worker[stack_profile_frame](sql-tables.autogen#stack_profile_frame) table) 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker#### Return Type 18*6dbdd20aSAndroid Build Coastguard Worker 19*6dbdd20aSAndroid Build Coastguard Worker`BYTES` 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard Worker#### Arguments 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard WorkerArgument | Type | Description 24*6dbdd20aSAndroid Build Coastguard Worker-------- | ---- | ----------- 25*6dbdd20aSAndroid Build Coastguard Workerframe_id | StackProfileFrameTable::Id | reference to the [stack_profile_frame](sql-tables.autogen#stack_profile_frame) table 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard Worker### STACK_FROM_STACK_PROFILE_CALLSITE 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Worker`STACK_FROM_STACK_PROFILE_CALLSITE(callsite_id)` 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker#### Description 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard WorkerCreates a stack by taking a `callsite_id` (reference to the 34*6dbdd20aSAndroid Build Coastguard Worker[stack_profile_callsite]](sql-tables.autogen#stack_profile_callsite) table) and 35*6dbdd20aSAndroid Build Coastguard Workergenerating a list of frames (by walking the 36*6dbdd20aSAndroid Build Coastguard Worker[stack_profile_callsite]](sql-tables.autogen#stack_profile_callsite) table) 37*6dbdd20aSAndroid Build Coastguard Worker 38*6dbdd20aSAndroid Build Coastguard Worker#### Return Type 39*6dbdd20aSAndroid Build Coastguard Worker 40*6dbdd20aSAndroid Build Coastguard Worker`BYTES` 41*6dbdd20aSAndroid Build Coastguard Worker 42*6dbdd20aSAndroid Build Coastguard Worker#### Arguments 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard WorkerArgument | Type | Description 45*6dbdd20aSAndroid Build Coastguard Worker-------- | ---- | ----------- 46*6dbdd20aSAndroid Build Coastguard Workercallsite_id | StackProfileCallsiteTable::Id | reference to the [stack_profile_callsite]](sql-tables.autogen#stack_profile_callsite) table 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Worker### CAT_STACKS 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard Worker`CAT_STACKS(([root [[,level_1 [, ...]], leaf]])` 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker#### Description 53*6dbdd20aSAndroid Build Coastguard Worker 54*6dbdd20aSAndroid Build Coastguard WorkerCreates a Stack by concatenating other Stacks. Also accepts STRING values for 55*6dbdd20aSAndroid Build Coastguard Workerwhich it generates a fake Frame. Null values are just ignored. 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker#### Return Type 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker`BYTES` 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker#### Arguments 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard WorkerArgument | Type | Description 64*6dbdd20aSAndroid Build Coastguard Worker-------- | ---- | ----------- 65*6dbdd20aSAndroid Build Coastguard Workerroot | BYTES or STRING | Stack or STRING for which a fake Frame is generated 66*6dbdd20aSAndroid Build Coastguard Worker... | BYTES or STRING | Stack or STRING for which a fake Frame is generated 67*6dbdd20aSAndroid Build Coastguard Workerleaf | BYTES or STRING | Stack or STRING for which a fake Frame is generated 68*6dbdd20aSAndroid Build Coastguard Worker 69*6dbdd20aSAndroid Build Coastguard Worker### EXPERIMENTAL_PROFILE 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker`EXPERIMENTAL_PROFILE(stack [,sample_type, sample_units, sample_value]*)` 72*6dbdd20aSAndroid Build Coastguard Worker 73*6dbdd20aSAndroid Build Coastguard Worker#### Description 74*6dbdd20aSAndroid Build Coastguard Worker 75*6dbdd20aSAndroid Build Coastguard WorkerAggregation function that generates a profile in 76*6dbdd20aSAndroid Build Coastguard Worker[pprof](https://github.com/google/pprof) format from the given samples. 77*6dbdd20aSAndroid Build Coastguard Worker 78*6dbdd20aSAndroid Build Coastguard Worker#### Return Type 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard Worker`BYTES` ([pprof](https://github.com/google/pprof) data) 81*6dbdd20aSAndroid Build Coastguard Worker 82*6dbdd20aSAndroid Build Coastguard Worker#### Arguments 83*6dbdd20aSAndroid Build Coastguard Worker 84*6dbdd20aSAndroid Build Coastguard WorkerArgument | Type | Description 85*6dbdd20aSAndroid Build Coastguard Worker-------- | ---- | ----------- 86*6dbdd20aSAndroid Build Coastguard Workerstack | BYTES | Stack or string for which a fake Frame is generated 87*6dbdd20aSAndroid Build Coastguard Workersample_type | STRING | Type of the sample value (e.g. size, time) 88*6dbdd20aSAndroid Build Coastguard Workersample_units | STRING | Units of the sample value (e.g. bytes, count) 89*6dbdd20aSAndroid Build Coastguard Workersample_value | LONG | Value for the sample 90*6dbdd20aSAndroid Build Coastguard Worker 91*6dbdd20aSAndroid Build Coastguard WorkerMultiple samples can be specified. 92*6dbdd20aSAndroid Build Coastguard Worker 93*6dbdd20aSAndroid Build Coastguard WorkerIf only the `stack` argument is present, a `"samples"`, `"count"`, and `1` are 94*6dbdd20aSAndroid Build Coastguard Workerused as defaults for `sample_type`, `sample_units`, and `sample_value` 95*6dbdd20aSAndroid Build Coastguard Worker respectively. 96*6dbdd20aSAndroid Build Coastguard Worker 97*6dbdd20aSAndroid Build Coastguard Worker#### Example 98*6dbdd20aSAndroid Build Coastguard Worker 99*6dbdd20aSAndroid Build Coastguard WorkerCPU profile 100*6dbdd20aSAndroid Build Coastguard Worker 101*6dbdd20aSAndroid Build Coastguard Worker```sql 102*6dbdd20aSAndroid Build Coastguard WorkerSELECT 103*6dbdd20aSAndroid Build Coastguard Worker perf_session_id, 104*6dbdd20aSAndroid Build Coastguard Worker EXPERIMENTAL_PROFILE( 105*6dbdd20aSAndroid Build Coastguard Worker STACK_FROM_STACK_PROFILE_CALLSITE(callsite_id), 106*6dbdd20aSAndroid Build Coastguard Worker 'samples', 107*6dbdd20aSAndroid Build Coastguard Worker 'count', 108*6dbdd20aSAndroid Build Coastguard Worker 1) AS profile 109*6dbdd20aSAndroid Build Coastguard WorkerFROM perf_sample 110*6dbdd20aSAndroid Build Coastguard WorkerGROUP BY perf_session_id 111*6dbdd20aSAndroid Build Coastguard Worker``` 112*6dbdd20aSAndroid Build Coastguard Worker 113*6dbdd20aSAndroid Build Coastguard WorkerHeap profile 114*6dbdd20aSAndroid Build Coastguard Worker 115*6dbdd20aSAndroid Build Coastguard Worker```sql 116*6dbdd20aSAndroid Build Coastguard WorkerSELECT 117*6dbdd20aSAndroid Build Coastguard Worker EXPERIMENTAL_PROFILE( 118*6dbdd20aSAndroid Build Coastguard Worker CAT_STACKS(heap_name, STACK_FROM_STACK_PROFILE_CALLSITE(callsite_id)), 119*6dbdd20aSAndroid Build Coastguard Worker 'count', 120*6dbdd20aSAndroid Build Coastguard Worker 'count', 121*6dbdd20aSAndroid Build Coastguard Worker count, 122*6dbdd20aSAndroid Build Coastguard Worker 'size', 123*6dbdd20aSAndroid Build Coastguard Worker 'bytes', 124*6dbdd20aSAndroid Build Coastguard Worker size) AS profile 125*6dbdd20aSAndroid Build Coastguard WorkerFROM heap_profile_allocation 126*6dbdd20aSAndroid Build Coastguard WorkerWHERE size >= 0 AND count >= 0 127*6dbdd20aSAndroid Build Coastguard Worker```